PUS: Implement serialization for TC[8, 128] (Direct Command) #62
@@ -1,6 +1,8 @@
|
||||
#ifndef FSFW_PUS_SERVICE8FUNCTIONMANAGEMENT_H_
|
||||
#define FSFW_PUS_SERVICE8FUNCTIONMANAGEMENT_H_
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#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,
|
||||
|
||||
@@ -1,11 +1,14 @@
|
||||
#ifndef FSFW_PUS_SERVICEPACKETS_SERVICE8PACKETS_H_
|
||||
#define FSFW_PUS_SERVICEPACKETS_SERVICE8PACKETS_H_
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#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;
|
||||
|
||||
Reference in New Issue
Block a user