Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct MessageHeader {
- unsigned preamble:16; // 0x55ff
- unsigned retransmissionFlag:1;
- unsigned payloadLength:7;
- unsigned replyFlag:1;
- unsigned messageType:7;
- unsigned destinationDeviceType:4;
- unsigned destinationAddress:12;
- unsigned sourceDeviceType:4;
- unsigned sourceAddress:12;
- unsigned messageID:8; // must be randomly generated
- };
- // Message: Header + Payload + Checksum
- enum MessageType {
- DoorbellOutdoor = 0x01,
- EndCall = 0x02,
- AcceptCall = 0x03,
- ManualVideo = 0x04,
- Light = 0x09,
- Call = 0x0a,
- Door = 0x0d,
- DoorbellIndoor = 0x11,
- Actor = 0x16,
- Video = 0x52,
- };
- enum DeviceType {
- IndoorStation = 0x1,
- OutdoorStation = 0x2,
- Gateway = 0x3,
- Relay = 0x4,
- Actor = 0x8,
- Video = 0x9,
- };
- uint8_t calculateChecksum(uint8_t *data, uint8_t length) {
- uint8_t checksum = 0;
- for (uint8_t i = 0; i < length; i++)
- checksum = nextChecksum(*data++, checksum);
- return ~checksum & 0xff;
- }
- uint8_t nextChecksum(uint8_t data, uint8_t lastChecksum) {
- uint16_t temp = lastChecksum ^ data;
- temp = temp ^
- (uint16_t)(((uint32_t)temp << 0x11) >> 0x10) ^
- (uint16_t)(((uint32_t)temp << 0x12) >> 0x10) ^
- (uint16_t)(((uint32_t)temp << 0x13) >> 0x10) ^
- (uint16_t)(((uint32_t)temp << 0x14) >> 0x10) ^
- (uint16_t)(((uint32_t)temp << 0x15) >> 0x10) ^
- (uint16_t)(((uint32_t)temp << 0x16) >> 0x10) ^
- (uint16_t)(((uint32_t)temp << 0x17) >> 0x10);
- return (temp & 0xfe) ^ ((temp >> 8) & 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement