diff --git a/inc/Message.hpp b/inc/Message.hpp index ce2c59444540b6becd2955b73842abf58e723cbf..6ccef49af55ff352e780df7c238c3862f726d1d9 100644 --- a/inc/Message.hpp +++ b/inc/Message.hpp @@ -78,6 +78,16 @@ public: */ void appendString(uint8_t size, const char *value); + /** + * Appends \p size bytes to the message + * + * @param size The amount of byte to append + * @param value An array containing at least \p size bytes + * @todo See if more than uint8_t strings will be supported + * @todo Is uint16_t size too much or not enough? It has to be defined + */ + void appendString(uint16_t size, uint8_t *value); + /** * Reads the next \p numBits bits from the the message in a big-endian format * @param numBits @@ -108,6 +118,15 @@ public: */ void readString(char *string, uint8_t size); + /** + * Reads the next \p size bytes from the message, and stores them into the allocated \p string + * + * NOTE: We assume that \p string is already allocated, and its size is at least + * ECSS_MAX_STRING_SIZE. This function does placs a \0 at the end of the created string + * @todo Is uint16_t size too much or not enough? It has to be defined + */ + void readString(uint8_t *value, uint16_t size); + public: Message(uint8_t serviceType, uint8_t messageType, PacketType packetType, uint16_t applicationId); @@ -243,11 +262,8 @@ public: * PTC = 7, PFC = 0 */ void appendOctetString(uint16_t size, uint8_t *byteString) { - assert(size < ECSS_MAX_STRING_SIZE); - - for (std::size_t i = 0; i < size; i++) { - appendByte(byteString[i]); - } + appendUint16(size); + appendString(size, byteString); } /** @@ -385,12 +401,8 @@ public: * * PTC = 7, PFC = 0 */ - void readOctetString(uint8_t *byteString, uint16_t size) { - assert(size < ECSS_MAX_STRING_SIZE); - - for (std::size_t i = 0; i < size; i++) { - byteString[i] = readByte(); - } + void readOctetString(uint16_t size, uint8_t *byteString) { + readString(byteString, size); } /** diff --git a/src/Message.cpp b/src/Message.cpp index 292ec6953655cc1bb6efb00b792eaf094fd583fc..0e95ad323ef0e8b8ea4b53cf1b09c35ee734c398 100644 --- a/src/Message.cpp +++ b/src/Message.cpp @@ -74,6 +74,15 @@ void Message::appendString(uint8_t size, const char *value) { dataSize += size; } +void Message::appendString(uint16_t size, uint8_t *value) { + assert(dataSize + size <= ECSS_MAX_MESSAGE_SIZE); + assert(size < ECSS_MAX_STRING_SIZE); + + memcpy(data + dataSize, value, size); + + dataSize += size; +} + uint16_t Message::readBits(uint8_t numBits) { assert(numBits <= 16); // TODO: Add assert @@ -135,7 +144,16 @@ void Message::readString(char *string, uint8_t size) { assert(size < ECSS_MAX_STRING_SIZE); memcpy(string, data + readPosition, size); - string[size] = '\0'; + string[size] = '\0'; // todo: Use that for now to avoid problems. Later to be removed + + readPosition += size; +} + +void Message::readString(uint8_t *string, uint16_t size) { + assert(readPosition + size <= ECSS_MAX_MESSAGE_SIZE); + assert(size < ECSS_MAX_STRING_SIZE); + + memcpy(string, data + readPosition, size); readPosition += size; } diff --git a/src/Services/MemoryManagementService.cpp b/src/Services/MemoryManagementService.cpp index 72c086a5235e66cb800df007d17b73dbdd046849..5ba62e649188647ef3c6ae0fdae03e8c457bab97 100644 --- a/src/Services/MemoryManagementService.cpp +++ b/src/Services/MemoryManagementService.cpp @@ -108,7 +108,6 @@ void MemoryManagementService::RawDataMemoryManagement::dumpRawData(Message &requ // This part is repeated N-times (N = iteration count) report.appendUint64(startAddress); // Start address - report.appendUint16(readLength); // Data read length report.appendOctetString(readLength, readData); // Save the read data } // todo: implement and append the checksum part of the reporting packet diff --git a/src/main.cpp b/src/main.cpp index d1a628e2f096860828513438193cf7579d694aba..f9bf03e44f053f43426d2412914b80ad7aabde49 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -56,10 +56,8 @@ int main() { rcvPack.appendEnum8(MemoryManagementService::MemoryID::RAM); // Memory ID rcvPack.appendUint16(2); // Iteration count rcvPack.appendUint64(reinterpret_cast<uint64_t >(pStr)); // Start address - rcvPack.appendUint16(2); // Data length to append rcvPack.appendOctetString(2, data); rcvPack.appendUint64(reinterpret_cast<uint64_t >(pStr + 1)); // Start address - rcvPack.appendUint16(1); rcvPack.appendOctetString(1, data); memMangService.rawDataMemorySubservice.loadRawData(rcvPack); diff --git a/test/Services/MemoryManagementService.cpp b/test/Services/MemoryManagementService.cpp index 824866cb0891f0a3516495e67e993e1ffca7766e..984c51f958e6c860e086a5b89ec5831a6600f641 100644 --- a/test/Services/MemoryManagementService.cpp +++ b/test/Services/MemoryManagementService.cpp @@ -17,10 +17,8 @@ TEST_CASE("TM[6,2]", "[service][st06]") { receivedPacket.appendEnum8(MemoryManagementService::MemoryID::RAM); // Memory ID receivedPacket.appendUint16(2); // Iteration count receivedPacket.appendUint64(reinterpret_cast<uint64_t >(pStr)); // Start address - receivedPacket.appendUint16(2); // Data length to append receivedPacket.appendOctetString(2, data); receivedPacket.appendUint64(reinterpret_cast<uint64_t >(pStr + 2)); // Start address - receivedPacket.appendUint16(1); receivedPacket.appendOctetString(1, data); memMangService.rawDataMemorySubservice.loadRawData(receivedPacket); @@ -62,7 +60,7 @@ TEST_CASE("TM[6,5]", "[service][st06]") { CHECK(response.readUint64() == reinterpret_cast<uint64_t >(testString_1)); readSize = sizeof(testString_1)/ sizeof(testString_1[0]); CHECK(response.readUint16() == readSize); - response.readOctetString(checkString, readSize); + response.readOctetString(readSize, checkString); CHECK(checkString[0] == 'F'); CHECK(checkString[1] == 'S'); CHECK(checkString[2] == 't'); @@ -73,7 +71,7 @@ TEST_CASE("TM[6,5]", "[service][st06]") { CHECK(response.readUint64() == reinterpret_cast<uint64_t >(testString_2)); readSize = sizeof(testString_2)/ sizeof(testString_2[0]); CHECK(response.readUint16() == readSize); - response.readOctetString(checkString, readSize); + response.readOctetString(readSize, checkString); CHECK(checkString[0] == 'S'); CHECK(checkString[1] == 'e'); CHECK(checkString[2] == 'c'); @@ -86,7 +84,7 @@ TEST_CASE("TM[6,5]", "[service][st06]") { CHECK(response.readUint64() == reinterpret_cast<uint64_t >(testString_3)); readSize = sizeof(testString_3)/ sizeof(testString_3[0]); CHECK(response.readUint16() == readSize); - response.readOctetString(checkString, readSize); + response.readOctetString(readSize, checkString); CHECK(checkString[0] == 5); CHECK(checkString[1] == 8); }