diff --git a/.gitignore b/.gitignore index a15b9233fb1eaf13a108d3a161c2d72f9c52a510..47e3242aa7cbc3177f1176fe4b1fc4d47ddf4aa5 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,4 @@ __pycache__ # IDEs .vscode +.DS_Store diff --git a/inc/Message.hpp b/inc/Message.hpp index 327a9de4a3298fa0eb4bc344f0e5f1c1e5465aa3..f0b682b72ac88d037de60a3a8302de0edb523234 100644 --- a/inc/Message.hpp +++ b/inc/Message.hpp @@ -757,7 +757,14 @@ template <> inline void Message::append(const etl::istring& value) { appendOctetString(value); } - +template <typename T> +inline void Message::append(const T& value) { + append(std::underlying_type_t<T>(value)); +} +template <typename T> +inline T Message::read() { + return static_cast<T>(read<std::underlying_type_t<T>>()); +} template <> inline uint8_t Message::read() { return readUint8(); diff --git a/test/MessageTests.cpp b/test/MessageTests.cpp index f8d8c48856cfc75b6bf60174afea991f66bc999a..840d3e2eda157742842af5e106ef7b252afc1471 100644 --- a/test/MessageTests.cpp +++ b/test/MessageTests.cpp @@ -395,3 +395,64 @@ TEST_CASE("Packet sequence counter", "[message]") { CHECK(message2.packetSequenceCount == 0); } } + +TEST_CASE("Storing and retrieving enums in Messages") { + enum ActiveBus : uint8_t { + Main = 0x0, + Redundant = 0x1 + }; + + SECTION("Using Enums in parameters") { + auto parameter1 = Parameter<ActiveBus>(Redundant); + auto parameter2 = Parameter<ActiveBus>(Main); + Message message; + + parameter1.appendValueToMessage(message); + parameter2.setValueFromMessage(message); + + CHECK(parameter1.getValue() == parameter2.getValue()); + } + + SECTION("Using Enums in variables") { + ActiveBus variable1 = Redundant; + ActiveBus variable2 = Main; + Message message; + + message.append(variable1); + variable2 = message.read<ActiveBus>(); + + CHECK(variable1 == variable2); + } + + SECTION("Another type of enum") { + enum Numbers : uint64_t { + First = 1577829600, + Second = 1667045679 + }; + + auto parameter1 = Parameter<Numbers>(First); + auto parameter2 = Parameter<Numbers>(Second); + Message message; + + parameter1.appendValueToMessage(message); + parameter2.setValueFromMessage(message); + + CHECK(parameter1.getValue() == parameter2.getValue()); + } + + SECTION("Another type of enum") { + enum MemoryPartitionUsed : bool { + first = false, + second = true + }; + + auto parameter3 = Parameter<MemoryPartitionUsed>(first); + auto parameter4 = Parameter<MemoryPartitionUsed>(second); + Message message; + + parameter3.appendValueToMessage(message); + parameter4.setValueFromMessage(message); + + CHECK(parameter3.getValue() == parameter4.getValue()); + } +}