From e4665c9394bcb23f3121e962a00046a64b3b530f Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Mon, 24 Jul 2023 10:52:38 +0200 Subject: [PATCH] continue with the msg to user / put request architecture --- src/fsfw/cfdp/handler/CMakeLists.txt | 5 ++- src/fsfw/cfdp/handler/MsgToUserParser.cpp | 1 + src/fsfw/cfdp/handler/MsgToUserParser.h | 1 + src/fsfw/cfdp/handler/PutRequest.cpp | 47 ++++++++++++++++++++++- src/fsfw/cfdp/handler/PutRequest.h | 33 +++++++++------- 5 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 src/fsfw/cfdp/handler/MsgToUserParser.cpp create mode 100644 src/fsfw/cfdp/handler/MsgToUserParser.h diff --git a/src/fsfw/cfdp/handler/CMakeLists.txt b/src/fsfw/cfdp/handler/CMakeLists.txt index ddbcc470..710c5862 100644 --- a/src/fsfw/cfdp/handler/CMakeLists.txt +++ b/src/fsfw/cfdp/handler/CMakeLists.txt @@ -1,3 +1,4 @@ target_sources( - ${LIB_FSFW_NAME} PRIVATE SourceHandler.cpp DestHandler.cpp PutRequest.cpp - FaultHandlerBase.cpp UserBase.cpp) + ${LIB_FSFW_NAME} + PRIVATE SourceHandler.cpp DestHandler.cpp PutRequest.cpp MsgToUserParser.cpp + FaultHandlerBase.cpp UserBase.cpp) diff --git a/src/fsfw/cfdp/handler/MsgToUserParser.cpp b/src/fsfw/cfdp/handler/MsgToUserParser.cpp new file mode 100644 index 00000000..6477a37a --- /dev/null +++ b/src/fsfw/cfdp/handler/MsgToUserParser.cpp @@ -0,0 +1 @@ +#include "MsgToUserParser.h" diff --git a/src/fsfw/cfdp/handler/MsgToUserParser.h b/src/fsfw/cfdp/handler/MsgToUserParser.h new file mode 100644 index 00000000..6f70f09b --- /dev/null +++ b/src/fsfw/cfdp/handler/MsgToUserParser.h @@ -0,0 +1 @@ +#pragma once diff --git a/src/fsfw/cfdp/handler/PutRequest.cpp b/src/fsfw/cfdp/handler/PutRequest.cpp index cf75c7d1..0952f43b 100644 --- a/src/fsfw/cfdp/handler/PutRequest.cpp +++ b/src/fsfw/cfdp/handler/PutRequest.cpp @@ -1,10 +1,55 @@ #include "PutRequest.h" +using namespace returnvalue; [[nodiscard]] bool cfdp::PutRequest::isMetadataOnly() const { - return !destNameSize.has_value() and !sourceNameSize.has_value(); + return destNameSize > 0 and sourceNameSize > 0; } ReturnValue_t cfdp::PutRequest::serialize(uint8_t **buffer, size_t *size, size_t maxSize, SerializeIF::Endianness streamEndianness) const { + ReturnValue_t result = destId.serialize(buffer, size, maxSize, streamEndianness); + if (result != OK) { + return result; + } + if (*size + 1 > maxSize) { + return SerializeIF::BUFFER_TOO_SHORT; + } + **buffer = metadataOnly; + *size += 1; + if (transmissionMode) { + **buffer = transmissionMode; + *size += 1; + *buffer += 1; + } + if (!metadataOnly) { + result = SerializeAdapter::serialize(&sourceNameSize, buffer, size, maxSize, streamEndianness); + if (result != OK) { + return result; + } + if (*size + sourceNameSize > maxSize) { + return SerializeIF::BUFFER_TOO_SHORT; + } + std::memcpy(*buffer, sourceName, sourceNameSize); + *buffer += sourceNameSize; + *size += sourceNameSize; + result = SerializeAdapter::serialize(&destNameSize, buffer, size, maxSize, streamEndianness); + if (result != OK) { + return result; + } + std::memcpy(*buffer, destName, destNameSize); + *buffer += destNameSize; + *size += destNameSize; + if (*size + 1 > maxSize) { + **buffer = transmissionMode; + *size += 1; + *buffer += 1; + } + if (*size + 1 > maxSize) { + **buffer = closureRequested; + *size += 1; + *buffer += 1; + } + } + return returnvalue::OK; } ReturnValue_t cfdp::PutRequest::deSerialize(const uint8_t **buffer, size_t *size, diff --git a/src/fsfw/cfdp/handler/PutRequest.h b/src/fsfw/cfdp/handler/PutRequest.h index ec13eab6..5f47a7ad 100644 --- a/src/fsfw/cfdp/handler/PutRequest.h +++ b/src/fsfw/cfdp/handler/PutRequest.h @@ -9,24 +9,31 @@ namespace cfdp { -class PutRequest: public SerializeIF { +class PutRequest : public SerializeIF { public: EntityId destId; - std::optional transmissionMode; - char destName[524]{}; - std::optional destNameSize; - char sourceName[524]{}; - std::optional sourceNameSize; - std::optional closureRequested; - std::vector messagesToUser; - std::vector fsRequest; + bool metadataOnly = true; + char* destName = nullptr; + uint64_t destNameSize = 0; + char* sourceName = nullptr; + uint64_t sourceNameSize = 0; + TransmissionMode transmissionMode = TransmissionMode::UNACKNOWLEDGED; + bool closureRequested = false; - [[nodiscard]] ReturnValue_t serialize(uint8_t **buffer, size_t *size, size_t maxSize, - Endianness streamEndianness) const override; - ReturnValue_t deSerialize(const uint8_t **buffer, size_t *size, - Endianness streamEndianness) override; + [[nodiscard]] ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize, + Endianness streamEndianness) const override; + ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size, + Endianness streamEndianness) override; [[nodiscard]] size_t getSerializedSize() const override; [[nodiscard]] bool isMetadataOnly() const; + + private: + size_t msgsToUsersTotalSize = 0; + uint32_t numOfMsgsToUser = 0; + uint8_t* messagesToUserStartPtr = nullptr; + size_t fsRequestsTotalSize = 0; + uint32_t numOfFsRequests = 0; + uint8_t* fsRequest = nullptr; }; } // namespace cfdp