Add support for parsing activate scene packets

This commit is contained in:
2024-04-19 15:07:47 +10:00
parent ce46892fde
commit 80b40cafcb
3 changed files with 25 additions and 1 deletions

View File

@@ -14,6 +14,7 @@ enum class PacketType {
MOVE_TO_SAVED_POSITION, MOVE_TO_SAVED_POSITION,
FIELDS, FIELDS,
FIELD_COMMAND, FIELD_COMMAND,
ACTIVATE_SCENE,
UNKNOWN UNKNOWN
}; };
@@ -35,7 +36,11 @@ struct FieldsParameters {
std::vector<Field> fields; std::vector<Field> fields;
}; };
using PacketParameters = std::variant<std::monostate, FieldsParameters>; struct ActivateSceneParameters {
uint8_t sceneID;
};
using PacketParameters = std::variant<std::monostate, FieldsParameters, ActivateSceneParameters>;
struct BroadcastHeader { struct BroadcastHeader {
uint16_t source; uint16_t source;

View File

@@ -74,6 +74,9 @@ bool PacketParser::parsePacket(const uint8_t *buffer, Packet& packet)
std::vector<Field> fields; std::vector<Field> fields;
parseFields(buffer, fields); parseFields(buffer, fields);
packet.parameters = FieldsParameters{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 { } else {
packet.type = PacketType::UNKNOWN; packet.type = PacketType::UNKNOWN;
packet.parameters = std::monostate{}; packet.parameters = std::monostate{};

View File

@@ -166,6 +166,21 @@ void test_broadcast_source_address()
delete[] packet_data; 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<ActivateSceneParameters>(packet.parameters);
TEST_ASSERT_EQUAL_HEX8(0x1B, parameters.sceneID);
delete[] packet_data;
}
int runUnityTests(void) int runUnityTests(void)
{ {
UNITY_BEGIN(); UNITY_BEGIN();
@@ -179,6 +194,7 @@ int runUnityTests(void)
RUN_TEST(test_unicast_source_address); RUN_TEST(test_unicast_source_address);
RUN_TEST(test_unicast_destination_address); RUN_TEST(test_unicast_destination_address);
RUN_TEST(test_broadcast_source_address); RUN_TEST(test_broadcast_source_address);
RUN_TEST(test_parse_activate_scene);
return UNITY_END(); return UNITY_END();
} }