diff --git a/inc/Services/LargePacketTransferService.hpp b/inc/Services/LargePacketTransferService.hpp index 0e8746eb732deca05d855fc297f929cbd2a766a6..e3219472881dfb84e59541aafa3d7c3c48725511 100644 --- a/inc/Services/LargePacketTransferService.hpp +++ b/inc/Services/LargePacketTransferService.hpp @@ -69,6 +69,13 @@ public: * @param string This will change when these function will be modified */ String<ECSS_MAX_FIXED_OCTET_STRING_SIZE> lastUplinkPart(const String<ECSS_MAX_FIXED_OCTET_STRING_SIZE>& string); + + /** + * Function that splits large messages + * @param Message that is exceeds the standards and has to be split down + * @param largeMessageTransactionIdentifier that is a value we assign to this splitting of the large message + */ + void split(Message& message, uint16_t largeMessageTransactionIdentifier); }; #endif // ECSS_SERVICES_LARGEPACKETTRANSFERSERVICE_HPP diff --git a/src/Services/LargePacketTransferService.cpp b/src/Services/LargePacketTransferService.cpp index 06fdad2604656bcd34feba03808e5c644b05c584..15b0e3c3609c41f242a6f6830f570b5598a30f9a 100644 --- a/src/Services/LargePacketTransferService.cpp +++ b/src/Services/LargePacketTransferService.cpp @@ -53,3 +53,38 @@ LargePacketTransferService::lastUplinkPart(const String<ECSS_MAX_FIXED_OCTET_STR // TC[13, 11] return string; } + +void LargePacketTransferService::split(Message& message, uint16_t largeMessageTransactionIdentifier) { + //TODO: Should this be uint32? + uint16_t size = message.dataSize; + uint16_t positionCounter = 0; + uint16_t parts = (size/ECSS_MAX_FIXED_OCTET_STRING_SIZE) + 1; + String<ECSS_MAX_FIXED_OCTET_STRING_SIZE> stringPart(""); + uint8_t dataPart[ECSS_MAX_FIXED_OCTET_STRING_SIZE]; + + for (uint16_t i = 0; i < ECSS_MAX_FIXED_OCTET_STRING_SIZE; i++){ + dataPart[i] = message.data[positionCounter]; + positionCounter++; + } + stringPart = dataPart; + firstDownlinkPartReport(largeMessageTransactionIdentifier, 0, stringPart); + + for (uint16_t part = 1; part < (parts - 1u); part++){ + for (uint16_t i = 0; i < ECSS_MAX_FIXED_OCTET_STRING_SIZE; i++){ + dataPart[i] = message.data[positionCounter]; + positionCounter++; + } + stringPart = dataPart; + intermediateDownlinkPartReport(largeMessageTransactionIdentifier, part, stringPart); + } + + for (uint16_t i = 0; i < ECSS_MAX_FIXED_OCTET_STRING_SIZE; i++){ + if (message.dataSize == positionCounter){ + dataPart[i] = 0; // To prevent from filling the rest of the String with garbage info + } + dataPart[i] = message.data[positionCounter]; + positionCounter++; + } + stringPart = dataPart; + lastDownlinkPartReport(largeMessageTransactionIdentifier, (parts - 1u), stringPart); +} diff --git a/test/Services/LargePacketTransferService.cpp b/test/Services/LargePacketTransferService.cpp index 1171f2f302ca19a16b1e52f7009e3cd1ac2fb622..4d75409acdf09ea4a9a41c973c31423b77c2b575 100644 --- a/test/Services/LargePacketTransferService.cpp +++ b/test/Services/LargePacketTransferService.cpp @@ -4,6 +4,7 @@ #include "ServiceTests.hpp" #include <cstring> #include <etl/String.hpp> +#include "ECSS_Definitions.hpp" LargePacketTransferService& lPT = Services.largePacketTransferService; @@ -17,7 +18,7 @@ TEST_CASE("First Downlink Part Report TM[13,1]", "[service][st13]") { CHECK(report.readUint16() == 1); CHECK(report.readUint16() == 1); uint8_t string2[ECSS_MAX_FIXED_OCTET_STRING_SIZE]; - printf("%d", report.readOctetString(string2)); + report.readOctetString(string2); auto a = String<ECSS_MAX_FIXED_OCTET_STRING_SIZE>(string2, 8); CHECK(string.compare(a) == 0); } @@ -66,3 +67,24 @@ TEST_CASE("Last Uplink Part TC[13,11]", "[service][st13]") { String<256> string = "12345678"; CHECK(string.compare(lPT.lastUplinkPart(string)) == 0); } + +TEST_CASE("Split function", "[no][service]") { + Message message(13, 0, Message::TC, 0); + for (uint16_t i = 0; i < 800; i++){ + message.appendUint8(UINT8_MAX); + } + uint16_t largeMessageTransactionIdentifier = 1; + lPT.split(message, largeMessageTransactionIdentifier); + Message message5(13, 0, Message::TC, 0); + + for (int i = 0; i < 4; i++){ + uint16_t partSequenceNumber = i; + CHECK(largeMessageTransactionIdentifier == ServiceTests::get(i).readUint16()); + CHECK(partSequenceNumber == ServiceTests::get(i).readUint16()); + CHECK(ECSS_MAX_FIXED_OCTET_STRING_SIZE == ServiceTests::get(i).readUint16()); + for (int j = 0; j < 256; j++){ + message5.appendUint8(ServiceTests::get(i).readUint8()); + } + } + CHECK(message == message5); +}