diff --git a/src/fsfw/pus/Service8FunctionManagement.h b/src/fsfw/pus/Service8FunctionManagement.h index 0ec715b8..eb42ef44 100644 --- a/src/fsfw/pus/Service8FunctionManagement.h +++ b/src/fsfw/pus/Service8FunctionManagement.h @@ -1,6 +1,8 @@ #ifndef FSFW_PUS_SERVICE8FUNCTIONMANAGEMENT_H_ #define FSFW_PUS_SERVICE8FUNCTIONMANAGEMENT_H_ +#include + #include "fsfw/action/ActionMessage.h" #include "fsfw/tmtcservices/CommandingServiceBase.h" @@ -35,6 +37,13 @@ class Service8FunctionManagement : public CommandingServiceBase { uint16_t commandTimeoutSeconds = 60); ~Service8FunctionManagement() override; + enum class Subservice : uint8_t { + //!< [EXPORT] : [COMMAND] Functional commanding + COMMAND_DIRECT_COMMANDING = 128, + //!< [EXPORT] : [REPLY] Data reply + REPLY_DIRECT_COMMANDING_DATA = 130, + }; + protected: /* CSB abstract functions implementation . See CSB documentation. */ ReturnValue_t isValidSubservice(uint8_t subservice) override; @@ -48,13 +57,6 @@ class Service8FunctionManagement : public CommandingServiceBase { bool* isStep) override; private: - enum class Subservice { - //!< [EXPORT] : [COMMAND] Functional commanding - COMMAND_DIRECT_COMMANDING = 128, - //!< [EXPORT] : [REPLY] Data reply - REPLY_DIRECT_COMMANDING_DATA = 130, - }; - ReturnValue_t checkInterfaceAndAcquireMessageQueue(MessageQueueId_t* messageQueueToSet, object_id_t* objectId); ReturnValue_t prepareDirectCommand(CommandMessage* message, const uint8_t* tcData, diff --git a/src/fsfw/pus/servicepackets/Service8Packets.h b/src/fsfw/pus/servicepackets/Service8Packets.h index 981ef439..52b7b63a 100644 --- a/src/fsfw/pus/servicepackets/Service8Packets.h +++ b/src/fsfw/pus/servicepackets/Service8Packets.h @@ -1,11 +1,14 @@ #ifndef FSFW_PUS_SERVICEPACKETS_SERVICE8PACKETS_H_ #define FSFW_PUS_SERVICEPACKETS_SERVICE8PACKETS_H_ +#include + #include "../../action/ActionMessage.h" #include "../../objectmanager/SystemObjectIF.h" +#include "../../returnvalues/returnvalue.h" #include "../../serialize/SerialBufferAdapter.h" -#include "../../serialize/SerialFixedArrayListAdapter.h" #include "../../serialize/SerialLinkedListAdapter.h" +#include "../../serialize/SerializeAdapter.h" #include "../../serialize/SerializeElement.h" /** @@ -22,14 +25,41 @@ class DirectCommand parametersSize = size; } + DirectCommand() : parametersSize(0), parameterBuffer(nullptr) {} + ActionId_t getActionId() const { return actionId; } + void setActionId(ActionId_t actionId) { this->actionId = actionId; } object_id_t getObjectId() const { return objectId; } + void setObjectId(object_id_t objectId) { this->objectId = objectId; } const uint8_t* getParameters() { return parameterBuffer; } + // The given pointer is not deallocated and must outlive the DirectCommand! + void setParameters(const uint8_t* parameters, uint32_t parametersSize) { + this->parameterBuffer = parameters; + this->parametersSize = parametersSize; + } uint32_t getParametersSize() const { return parametersSize; } + // ^SerializeIF + virtual ReturnValue_t serialize(uint8_t** buffer, size_t* size, size_t maxSize, + Endianness streamEndianness) const override { + auto const oldSize = *size; + auto result = SerializeAdapter::serialize(&objectId, buffer, size, maxSize, streamEndianness); + if (result != returnvalue::OK) return result; + result = SerializeAdapter::serialize(&actionId, buffer, size, maxSize - ((*size) - oldSize), + streamEndianness); + if (result != returnvalue::OK) return result; + + auto remainingSize = maxSize - ((*size) - oldSize); + if (remainingSize < parametersSize) return returnvalue::FAILED; + memcpy(*buffer, parameterBuffer, parametersSize); + *size += parametersSize; + + return returnvalue::OK; + } + private: DirectCommand(const DirectCommand& command); object_id_t objectId = 0;