From 18639220b8b2b62dee8d153d288cbbb30cd80bf6 Mon Sep 17 00:00:00 2001 From: Matt Way Date: Fri, 15 Dec 2023 22:39:52 +1100 Subject: [PATCH] Support building fetch position packets --- lib/PacketBuilder/include/PacketBuilder.h | 3 ++- lib/PacketBuilder/src/PacketBuilder.cpp | 32 ++++++++++++++++++----- src/main.cpp | 2 +- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/lib/PacketBuilder/include/PacketBuilder.h b/lib/PacketBuilder/include/PacketBuilder.h index 382a8a8..54df287 100644 --- a/lib/PacketBuilder/include/PacketBuilder.h +++ b/lib/PacketBuilder/include/PacketBuilder.h @@ -12,7 +12,8 @@ public: void buildUpPacket(uint8_t *buffer, uint16_t shadeID); void buildDownPacket(uint8_t *buffer, uint16_t shadeID); void buildStopPacket(uint8_t *buffer, uint16_t shadeID); - void buildPositionPacket(uint8_t *buffer, uint16_t shadeID, float percentage); + void buildSetPositionPacket(uint8_t *buffer, uint16_t shadeID, float percentage); + void buildFetchPositionPacket(uint8_t *buffer, uint16_t shadeID); private: uint16_t address; diff --git a/lib/PacketBuilder/src/PacketBuilder.cpp b/lib/PacketBuilder/src/PacketBuilder.cpp index 2dc9c99..bd1a03a 100644 --- a/lib/PacketBuilder/src/PacketBuilder.cpp +++ b/lib/PacketBuilder/src/PacketBuilder.cpp @@ -66,7 +66,7 @@ void PacketBuilder::buildStopPacket(uint8_t *buffer, uint16_t shadeID) incrementRollingCodes(); } -void PacketBuilder::buildPositionPacket(uint8_t *buffer, uint16_t shadeID, float percentage) +void PacketBuilder::buildSetPositionPacket(uint8_t *buffer, uint16_t shadeID, float percentage) { setPacketSize(buffer, 0x15); setConstants(buffer); @@ -75,12 +75,12 @@ void PacketBuilder::buildPositionPacket(uint8_t *buffer, uint16_t shadeID, float setDestinationAddress(buffer, shadeID); setRollingCodes(buffer); - buffer[16] = 0x3F; // Command - buffer[17] = 0x5A; // Empty? + buffer[16] = 0x3F; // Field command + buffer[17] = 0x5A; // Constant - buffer[18] = 0x04; // Constant in this size packet? - buffer[19] = 0x40; // Constant in this size packet? - buffer[20] = 0x50; // Constant in this size packet? + buffer[18] = 0x04; // Field of 4 bytes + buffer[19] = 0x40; // Field type (0x40 is set) + buffer[20] = 0x50; // ID of position field uint16_t position = (uint16_t)(0xFFFF * percentage); @@ -92,6 +92,26 @@ void PacketBuilder::buildPositionPacket(uint8_t *buffer, uint16_t shadeID, float incrementRollingCodes(); } + void PacketBuilder::buildFetchPositionPacket(uint8_t *buffer, uint16_t shadeID) { + setPacketSize(buffer, 0x13); + setConstants(buffer); + setProtocolVersion(buffer, protocolVersion); + setSourceAddress(buffer, address); + setDestinationAddress(buffer, shadeID); + setRollingCodes(buffer); + + buffer[16] = 0x3F; // Field command + buffer[17] = 0x5A; // Constant + + buffer[18] = 0x02; // Field of 2 bytes + buffer[19] = 0x3F; // Field type (0x3F is fetch) + buffer[20] = 0x50; // ID of position field + + calculateCRC(buffer); + + incrementRollingCodes(); + } + void PacketBuilder::setPacketSize(uint8_t *buffer, uint8_t length) { buffer[1] = length; // Packet size } diff --git a/src/main.cpp b/src/main.cpp index 0a4ef66..4e4cbab 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -173,7 +173,7 @@ void onConnectionEstablished() { client.subscribe("hotdog/test_mqtt_blind/set_position", [] (const String &payload) { uint16_t shadeID = 0x4EF1; float percentage = payload.toInt() / 100.0f; - hubPacketBuilder.buildPositionPacket(buffer, shadeID, percentage); + hubPacketBuilder.buildSetPositionPacket(buffer, shadeID, percentage); sendCommand(buffer); });