Update packet building logic to work with header byte
This commit is contained in:
@@ -7,6 +7,9 @@
|
||||
#define VERSION_5 (0x05)
|
||||
#define VERSION_6 (0x06)
|
||||
|
||||
#define REMOTE_ID (0x369E)
|
||||
#define HUB_ID (0x0000)
|
||||
|
||||
uint8_t rollingCode1 = 0xAC;
|
||||
uint8_t rollingCode2 = 0x82;
|
||||
|
||||
@@ -16,129 +19,124 @@ CRC16 crc(0x755B, 0x0, 0xBA68, false, false);
|
||||
|
||||
void setPacketLength(uint8_t);
|
||||
void setConstants();
|
||||
void setSourceRemoteAddress();
|
||||
void setHubSourceAddress();
|
||||
void setSourceAddress(uint16_t);
|
||||
void setTargetAddress(uint16_t);
|
||||
void setRollingCodes();
|
||||
void setProtocolVersion(uint8_t);
|
||||
void calculateCRC();
|
||||
|
||||
|
||||
void constructUpPacket()
|
||||
void constructUpPacket(uint16_t shadeID)
|
||||
{
|
||||
setPacketLength(LENGTH_17);
|
||||
setConstants();
|
||||
setSourceRemoteAddress();
|
||||
setSourceAddress(REMOTE_ID);
|
||||
setTargetAddress(shadeID);
|
||||
setRollingCodes();
|
||||
setProtocolVersion(VERSION_6);
|
||||
|
||||
buf[11] = 0x04; // Shade ID (group 4 for now)
|
||||
buf[12] = 0x00; // Shade ID
|
||||
|
||||
buf[16] = 0x55; // Command
|
||||
buf[17] = 0x00; // Empty?
|
||||
buf[16] = 0x52; // ?
|
||||
buf[17] = 0x55; // Command
|
||||
buf[18] = 0x00; // Empty?
|
||||
|
||||
calculateCRC();
|
||||
}
|
||||
|
||||
void constructDownPacket()
|
||||
void constructDownPacket(uint16_t shadeID)
|
||||
{
|
||||
setPacketLength(LENGTH_17);
|
||||
setConstants();
|
||||
setSourceRemoteAddress();
|
||||
setSourceAddress(REMOTE_ID);
|
||||
setTargetAddress(shadeID);
|
||||
setRollingCodes();
|
||||
setProtocolVersion(VERSION_6);
|
||||
|
||||
buf[11] = 0x04; // Shade ID (group 4 for now)
|
||||
buf[12] = 0x00; // Shade ID
|
||||
|
||||
buf[16] = 0x44; // Command
|
||||
buf[17] = 0x00; // Empty?
|
||||
buf[16] = 0x52; // ?
|
||||
buf[17] = 0x44; // Command
|
||||
buf[18] = 0x00; // Empty?
|
||||
|
||||
calculateCRC();
|
||||
}
|
||||
|
||||
void constructStopPacket()
|
||||
void constructStopPacket(uint16_t shadeID)
|
||||
{
|
||||
setPacketLength(LENGTH_17);
|
||||
setConstants();
|
||||
setSourceRemoteAddress();
|
||||
setSourceAddress(REMOTE_ID);
|
||||
setTargetAddress(shadeID);
|
||||
setRollingCodes();
|
||||
setProtocolVersion(VERSION_6);
|
||||
|
||||
buf[11] = 0x04; // Shade ID (group 4 for now)
|
||||
buf[12] = 0x00; // Shade ID
|
||||
|
||||
buf[16] = 0x53; // Command
|
||||
buf[17] = 0x00; // Empty?
|
||||
buf[16] = 0x52; // ?
|
||||
buf[17] = 0x53; // Command
|
||||
buf[18] = 0x00; // Empty?
|
||||
|
||||
calculateCRC();
|
||||
}
|
||||
|
||||
void constructPositionPacket(float percentage)
|
||||
void constructPositionPacket(uint16_t shadeID, float percentage)
|
||||
{
|
||||
setPacketLength(LENGTH_21);
|
||||
setConstants();
|
||||
setHubSourceAddress(); // TODO: Will this source address work?
|
||||
setSourceAddress(HUB_ID);
|
||||
setTargetAddress(shadeID);
|
||||
setRollingCodes();
|
||||
setProtocolVersion(VERSION_5);
|
||||
|
||||
buf[11] = 0x4E; // Shade ID?
|
||||
buf[12] = 0xF1; // Shade ID?
|
||||
buf[16] = 0x3F; // Command
|
||||
buf[17] = 0x5A; // Empty?
|
||||
|
||||
buf[15] = 0x3F; // Command
|
||||
buf[16] = 0x5A; // Empty?
|
||||
|
||||
buf[17] = 0x04; // Constant in this size packet?
|
||||
buf[18] = 0x40; // Constant in this size packet?
|
||||
buf[19] = 0x50; // Constant in this size packet?
|
||||
buf[18] = 0x04; // Constant in this size packet?
|
||||
buf[19] = 0x40; // Constant in this size packet?
|
||||
buf[20] = 0x50; // Constant in this size packet?
|
||||
|
||||
uint16_t position = (uint16_t)(0xFFFF * percentage);
|
||||
|
||||
buf[20] = (uint8_t)(position & 0x00FF);
|
||||
buf[21] = (uint8_t)((position & 0xFF00) >> 8);
|
||||
buf[21] = (uint8_t)(position & 0x00FF);
|
||||
buf[22] = (uint8_t)((position & 0xFF00) >> 8);
|
||||
|
||||
calculateCRC();
|
||||
}
|
||||
|
||||
void setPacketLength(uint8_t length) {
|
||||
buf[0] = length; // Packet size
|
||||
buf[1] = length; // Packet size
|
||||
}
|
||||
|
||||
void setConstants() {
|
||||
buf[1] = 0x00; // Constant?
|
||||
buf[2] = 0x05; // Constant?
|
||||
buf[0] = 0xC0; // Header byte
|
||||
|
||||
buf[4] = 0xff; // Constant?
|
||||
buf[5] = 0xff; // Constant?
|
||||
buf[2] = 0x00; // Constant when sending, can be 0x10 when receiving a packet
|
||||
buf[3] = 0x05; // Constant
|
||||
|
||||
buf[8] = 0x86; // Constant?
|
||||
buf[5] = 0xFF; // Constant
|
||||
buf[6] = 0xFF; // Constant
|
||||
|
||||
buf[15] = 0x52; // Constant?
|
||||
buf[9] = 0x86; // Constant?
|
||||
}
|
||||
|
||||
void setSourceRemoteAddress() {
|
||||
buf[6] = 0x36; // Source address?
|
||||
buf[7] = 0x9e; // Source address?
|
||||
void setSourceAddress(uint16_t sourceID) {
|
||||
// Physical source address (could be the address of a repeater when receiving a packet)
|
||||
buf[7] = (uint8_t)((sourceID & 0xFF00) >> 8);
|
||||
buf[8] = (uint8_t)(sourceID & 0x00FF);
|
||||
|
||||
buf[13] = 0x36; // Source address again?
|
||||
buf[14] = 0x9e; // Source address again?
|
||||
// Logical source address (usually the same as the physical source address)
|
||||
buf[14] = (uint8_t)((sourceID & 0xFF00) >> 8);
|
||||
buf[15] = (uint8_t)(sourceID & 0x00FF);
|
||||
}
|
||||
|
||||
void setHubSourceAddress() {
|
||||
buf[6] = 0x00; // Source address?
|
||||
buf[7] = 0x00; // Source address?
|
||||
|
||||
buf[13] = 0x00; // Source address again?
|
||||
buf[14] = 0x00; // Source address again?
|
||||
void setTargetAddress(uint16_t targetID) {
|
||||
// Logical target address
|
||||
buf[12] = (uint8_t)((targetID & 0xFF00) >> 8);
|
||||
buf[13] = (uint8_t)(targetID & 0x00FF);
|
||||
}
|
||||
|
||||
void setRollingCodes() {
|
||||
buf[3] = rollingCode1; // Rolling code 1
|
||||
buf[10] = rollingCode2; // Rolling code 2
|
||||
buf[4] = rollingCode1; // Rolling code 1
|
||||
buf[11] = rollingCode2; // Rolling code 2
|
||||
}
|
||||
|
||||
void setProtocolVersion(uint8_t version) {
|
||||
buf[9] = version; // Protocol version?
|
||||
buf[10] = version; // Protocol version?
|
||||
}
|
||||
|
||||
void calculateCRC() { // must be called after the buffer has been filled
|
||||
@@ -165,8 +163,8 @@ void calculateCRC() { // must be called after the buffer has been filled
|
||||
uint8_t checksum1 = (uint8_t)((result & 0xFF00) >> 8);
|
||||
uint8_t checksum2 = (uint8_t)(result & 0x00FF);
|
||||
|
||||
buf[length + 1] = checksum1; // Checksum
|
||||
buf[length + 2] = checksum2; // Checksum
|
||||
buf[length + 2] = checksum1; // Checksum
|
||||
buf[length + 3] = checksum2; // Checksum
|
||||
}
|
||||
|
||||
void printHex(uint8_t num) { //print a byte as two hex chars
|
||||
|
||||
Reference in New Issue
Block a user