diff --git a/src/fsfw/cfdp/handler/ReservedMessageParser.cpp b/src/fsfw/cfdp/handler/ReservedMessageParser.cpp index 93254483..4f3785f4 100644 --- a/src/fsfw/cfdp/handler/ReservedMessageParser.cpp +++ b/src/fsfw/cfdp/handler/ReservedMessageParser.cpp @@ -28,7 +28,7 @@ ReturnValue_t cfdp::ReservedMessageParser::parse(const uint8_t* msgsToUserPtr, return result; } uint8_t messageType = 0; - if (tlv.isReservedCfdpMessage(messageType)) { + if (tlv.isReservedCfdpMessage(messageType, ¤tPtr, deserSize)) { if (messageType == static_cast(ProxyOpMessageType::PUT_REQUEST)) { cfdp::Lv entityIdLv; result = entityIdLv.deSerialize(¤tPtr, &deserSize, SerializeIF::Endianness::NETWORK); diff --git a/src/fsfw/cfdp/tlv/Lv.cpp b/src/fsfw/cfdp/tlv/Lv.cpp index e7fa414a..215b9b3b 100644 --- a/src/fsfw/cfdp/tlv/Lv.cpp +++ b/src/fsfw/cfdp/tlv/Lv.cpp @@ -49,10 +49,8 @@ ReturnValue_t cfdp::Lv::serialize(uint8_t** buffer, size_t* size, size_t maxSize } size_t cfdp::Lv::getSerializedSize() const { - if (zeroLen) { + if (zeroLen or value.getConstBuffer() == nullptr) { return 1; - } else if (value.getConstBuffer() == nullptr) { - return 0; } return value.getSerializedSize(); } @@ -85,7 +83,7 @@ ReturnValue_t cfdp::Lv::deSerialize(const uint8_t** buffer, size_t* size, const uint8_t* cfdp::Lv::getValue(size_t* size) const { if (size != nullptr) { // Length without length field - *size = value.getSerializedSize() - 1; + *size = getSerializedSize() - 1; } return value.getConstBuffer(); } diff --git a/src/fsfw/cfdp/tlv/MessageToUserTlv.cpp b/src/fsfw/cfdp/tlv/MessageToUserTlv.cpp index ef3ae8f2..eaf17b67 100644 --- a/src/fsfw/cfdp/tlv/MessageToUserTlv.cpp +++ b/src/fsfw/cfdp/tlv/MessageToUserTlv.cpp @@ -11,12 +11,17 @@ MessageToUserTlv::MessageToUserTlv(const std::vector& data) MessageToUserTlv::MessageToUserTlv(const uint8_t* value, size_t size) : Tlv(cfdp::TlvType::MSG_TO_USER, value, size) {} -bool MessageToUserTlv::isReservedCfdpMessage(uint8_t& messageType) const { +bool MessageToUserTlv::isReservedCfdpMessage(uint8_t& messageType, const uint8_t** msgDataStart, + size_t& msgLen) const { if (cfdp::Tlv::getLengthField() < 5) { return false; } if (std::strcmp(reinterpret_cast(getValue()), "cfdp") == 0) { messageType = getValue()[4]; + if (msgDataStart != nullptr) { + *msgDataStart = getValue() + 5; + } + msgLen = cfdp::Tlv::getSerializedSize() - 5; return true; } return false; diff --git a/src/fsfw/cfdp/tlv/MessageToUserTlv.h b/src/fsfw/cfdp/tlv/MessageToUserTlv.h index 64b80d61..7018a386 100644 --- a/src/fsfw/cfdp/tlv/MessageToUserTlv.h +++ b/src/fsfw/cfdp/tlv/MessageToUserTlv.h @@ -12,7 +12,8 @@ class MessageToUserTlv : public cfdp::Tlv { MessageToUserTlv(const uint8_t* value, size_t size); explicit MessageToUserTlv(const std::vector& data); - bool isReservedCfdpMessage(uint8_t& messageType) const; + bool isReservedCfdpMessage(uint8_t& messageType, const uint8_t** msgDataStart, + size_t& msgLen) const; private: }; diff --git a/src/fsfw/objectmanager/ObjectManager.cpp b/src/fsfw/objectmanager/ObjectManager.cpp index 2193d3a5..f2b45d59 100644 --- a/src/fsfw/objectmanager/ObjectManager.cpp +++ b/src/fsfw/objectmanager/ObjectManager.cpp @@ -116,8 +116,8 @@ void ObjectManager::initialize() { << std::dec << std::setfill(' ') << std::endl; #else sif::printError( - "ObjectManager::initialize: Object 0x%08x failed to initialize with code 0x%04x\n", var, - it.first); + "ObjectManager::initialize: Object 0x%08x failed to initialize with code 0x%04x\n", + it.first, result); #endif #endif errorCount++; diff --git a/unittests/cfdp/handler/testReservedMsgParser.cpp b/unittests/cfdp/handler/testReservedMsgParser.cpp index 035cef5f..e7f8da8b 100644 --- a/unittests/cfdp/handler/testReservedMsgParser.cpp +++ b/unittests/cfdp/handler/testReservedMsgParser.cpp @@ -5,6 +5,7 @@ #include "fsfw/cfdp/tlv/Lv.h" #include "fsfw/cfdp/tlv/ReservedMessageCreator.h" #include "fsfw/cfdp/tlv/StringLv.h" +#include "fsfw/globalfunctions/arrayprinter.h" #include "mocks/MessageQueueMock.h" #include "mocks/StorageManagerMock.h" @@ -20,6 +21,7 @@ TEST_CASE("Reserved Message Parser", "[cfdp]") { StorageManagerMock ipcStore(0, storeCfg); std::array buffer{}; uint8_t msgBuf[32]{}; + EntityId entityId(cfdp::WidthInBytes::ONE_BYTE, 5); uint8_t* msgBufPtr = msgBuf; size_t serLen = 0; @@ -35,7 +37,8 @@ TEST_CASE("Reserved Message Parser", "[cfdp]") { serLen = 0; ReturnValue_t result = creator.serializeBe(buffer.data(), serLen, buffer.size()); CHECK(result == returnvalue::OK); + arrayprinter::print(buffer.data(), serLen); ReservedMessageParser parser(ipcStore, msgQueue, destQueueId); - CHECK(parser.parse(buffer.data(), buffer.max_size()) == OK); + CHECK(parser.parse(buffer.data(), serLen) == OK); }