diff --git a/include/PacketTypes.h b/include/PacketTypes.h index 97bca6c..db78a40 100644 --- a/include/PacketTypes.h +++ b/include/PacketTypes.h @@ -14,6 +14,7 @@ enum class PacketType { MOVE_TO_SAVED_POSITION, FIELDS, FIELD_COMMAND, + ACTIVATE_SCENE, UNKNOWN }; @@ -35,7 +36,11 @@ struct FieldsParameters { std::vector fields; }; -using PacketParameters = std::variant; +struct ActivateSceneParameters { + uint8_t sceneID; +}; + +using PacketParameters = std::variant; struct BroadcastHeader { uint16_t source; diff --git a/src/PacketParser.cpp b/src/PacketParser.cpp index a85904e..5980faa 100644 --- a/src/PacketParser.cpp +++ b/src/PacketParser.cpp @@ -74,6 +74,9 @@ bool PacketParser::parsePacket(const uint8_t *buffer, Packet& packet) std::vector fields; parseFields(buffer, fields); packet.parameters = FieldsParameters{fields}; + } else if (buffer[dataOffset + 0] == 0x53 && buffer[dataOffset + 1] == 0x47) { + packet.type = PacketType::ACTIVATE_SCENE; + packet.parameters = ActivateSceneParameters{buffer[dataOffset + 2]}; } else { packet.type = PacketType::UNKNOWN; packet.parameters = std::monostate{}; diff --git a/test/test_packet_parser/test_packet_parser.cpp b/test/test_packet_parser/test_packet_parser.cpp index e975821..91eeb61 100644 --- a/test/test_packet_parser/test_packet_parser.cpp +++ b/test/test_packet_parser/test_packet_parser.cpp @@ -166,6 +166,21 @@ void test_broadcast_source_address() delete[] packet_data; } +void test_parse_activate_scene() +{ + const uint8_t* packet_data = hex_string_to_array("C00F0005A1FFFF00008604FF000053471B446B"); + + Packet packet; + + run_parse_test(packet_data, packet); + + auto parameters = std::get(packet.parameters); + + TEST_ASSERT_EQUAL_HEX8(0x1B, parameters.sceneID); + + delete[] packet_data; +} + int runUnityTests(void) { UNITY_BEGIN(); @@ -179,6 +194,7 @@ int runUnityTests(void) RUN_TEST(test_unicast_source_address); RUN_TEST(test_unicast_destination_address); RUN_TEST(test_broadcast_source_address); + RUN_TEST(test_parse_activate_scene); return UNITY_END(); }