From a7d7ba331a1cf4f5819a1a6c0ebff599b0d2d101 Mon Sep 17 00:00:00 2001 From: athatheo <vostidi@hotmail.com> Date: Wed, 13 Mar 2019 14:01:18 +0000 Subject: [PATCH] Merge branch 'master' of gitlab.com:acubesat/obc/ecss-services into ECSS_Telemetry_Packet Ecss telemetry packet `parseTM` See merge request acubesat/obc/ecss-services!19 # Conflicts: # src/Services/EventActionService.cpp --- inc/MessageParser.hpp | 11 +++++++++++ src/MessageParser.cpp | 23 ++++++++++++++++++++++- test/MessageParser.cpp | 14 ++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/inc/MessageParser.hpp b/inc/MessageParser.hpp index 5c43505f..c8c162f0 100644 --- a/inc/MessageParser.hpp +++ b/inc/MessageParser.hpp @@ -64,6 +64,17 @@ private: * @param message The Message to modify based on the header */ void parseTC(uint8_t *data, uint16_t length, Message &message); + + /** + * Parse the ECSS Telemetry packet secondary header + * + * As specified in section 7.4.3.1 of the standard + * + * @param data The data of the header (not null-terminated) + * @param length The size of the header + * @param message The Message to modify based on the header + */ + void parseTM(uint8_t *data, uint16_t length, Message &message); }; diff --git a/src/MessageParser.cpp b/src/MessageParser.cpp index ff933f68..6472871e 100644 --- a/src/MessageParser.cpp +++ b/src/MessageParser.cpp @@ -48,7 +48,7 @@ Message MessageParser::parse(uint8_t *data, uint32_t length) { if (packetType == Message::TC) { parseTC(data + 6, packetDataLength, message); } else { - assert(false); // Not implemented yet + parseTM(data + 6, packetDataLength, message); } return message; @@ -82,3 +82,24 @@ Message MessageParser::parseRequestTC(String<ECSS_EVENT_SERVICE_STRING_SIZE> dat parseTC(dataInt, ECSS_EVENT_SERVICE_STRING_SIZE, message); return message; } + +void MessageParser::parseTM(uint8_t *data, uint16_t length, Message &message) { + ErrorHandler::assertRequest(length >= 5, message, ErrorHandler::UnacceptableMessage); + + // Individual fields of the TM header + uint8_t pusVersion = data[0] >> 4; + uint8_t serviceType = data[1]; + uint8_t messageType = data[2]; + + ErrorHandler::assertRequest(pusVersion == 2, message, ErrorHandler::UnacceptableMessage); + + // Remove the length of the header + length -= 5; + + // Copy the data to the message + // TODO: See if memcpy is needed for this + message.serviceType = serviceType; + message.messageType = messageType; + memcpy(message.data, data + 5, length); + message.dataSize = length; +} diff --git a/test/MessageParser.cpp b/test/MessageParser.cpp index ace886d2..ccf84c7a 100644 --- a/test/MessageParser.cpp +++ b/test/MessageParser.cpp @@ -110,3 +110,17 @@ TEST_CASE("TC message parsing", "[MessageParser]") { TEST_CASE("TC data parsing into a message", "[MessageParser]") { } + +TEST_CASE("TM message parsing", "[MessageParser]") { + MessageParser messageParser; + uint8_t packet[] = {0x08, 0x02, 0xc0, 0x4d, 0x00, 0x0c, 0x20, 0x16, 0x11, 0x00, 0x00, 0x68, + 0x65, 0x6c, 0x6c, 0x6f, + 0x68, 0x69}; + Message message = messageParser.parse(packet, 18); + CHECK(message.packetType == Message::TM); + CHECK(message.applicationId == 2); + CHECK(message.dataSize == 7); + CHECK(message.serviceType == 22); + CHECK(message.messageType == 17); + CHECK(memcmp(message.data, "hellohi", 7) == 0); +} -- GitLab