#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEPACKETS_H_ #define MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEPACKETS_H_ #include "fsfw/serialize/SerialBufferAdapter.h" #include "fsfw/serialize/SerializeElement.h" #include "fsfw/serialize/SerialLinkedListAdapter.h" namespace GOMSPACE{ static const uint16_t IGNORE_CHECKSUM = 0x0bb0; /* CSP port to ping gomspace devices. */ static const uint8_t PING_PORT = 1; static const uint8_t REBOOT_PORT = 4; /* CSP port of gomspace devices to request or set parameters */ static const uint8_t PARAM_PORT = 7; } /** * @brief A serial linked list adapter implementation to generate ping * messages for gomspace devices. * * @details A ping request simply sends back the received data provided by the * data buffer. cspPort and querySize are only informations required * by the CspComI and other than the data array not physically * transmitted to the target device. */ class CspPing : public SerialLinkedListAdapter { public: /** * @brief Constructor * * @param querySize_ The size of bytes replied by the ping request. * Amounts to the number of bytes send. * @param parameters_ Pointer to data which should be sent to the device. * All data will be sent back by the ping target. * @param paramterCount_ Number of bytes to send with the ping request. */ CspPing(uint16_t querySize_, const uint8_t* parameters_, uint8_t parameterCount_) : querySize(querySize_), data(parameters_, parameterCount_) { setLinks(); } private: CspPing(const CspPing &command); void setLinks() { setStart(&cspPort); cspPort.setNext(&querySize); querySize.setNext(&data); } SerializeElement cspPort = GOMSPACE::PING_PORT; SerializeElement querySize; SerializeElement> data; }; /** * @brief A serial linked list adapter implementation of the gs_rparam_query_t * struct defined in rparam.h. Can be used to build the message to set * a parameter in gomspace devices. * * @note cspPort and querySize will not be sent with the CSP packet to the * gomspace device but are required for the CspComIF to get the port * and the size to query. */ class CspSetParamCommand : public SerialLinkedListAdapter { public: CspSetParamCommand(uint8_t action_, uint8_t tableId_, uint16_t addresslength_, uint16_t checksum_, uint16_t seq_, uint16_t total_, uint16_t addr_, const uint8_t* parameters_, uint8_t parameterCount_) : action(action_), tableId(tableId_), addresslength(addresslength_), checksum( checksum_), seq(seq_), total(total_), addr(addr_), parameters( parameters_, parameterCount_) { setLinks(); } private: CspSetParamCommand(const CspSetParamCommand &command); void setLinks() { setStart(&cspPort); cspPort.setNext(&querySize); querySize.setNext(&action); action.setNext(&tableId); tableId.setNext(&addresslength); addresslength.setNext(&checksum); checksum.setNext(&seq); seq.setNext(&addr); addr.setNext(¶meters); } SerializeElement cspPort = GOMSPACE::PARAM_PORT; /* Only parameters are set. No data will be queried with this command */ SerializeElement querySize = 0; SerializeElement action; SerializeElement tableId; SerializeElement addresslength; SerializeElement checksum; SerializeElement seq; SerializeElement total; SerializeElement addr; SerializeElement> parameters; }; /** * @brief This class can be used to generate a get param command for the * gomspace devices which will be sent to the device communication * interface object. * * @note cspPort and querySize only serve as information for the CspComIF * and will not be transmitted physically to the target device. */ class CspGetParamCommand : public SerialLinkedListAdapter { public: CspGetParamCommand(uint16_t querySize_, uint8_t action_, uint8_t tableId_, uint16_t addresslength_, uint16_t checksum_, uint16_t seq_, uint16_t total_, uint16_t addr_) : querySize(querySize_), action(action_), tableId(tableId_), addresslength( addresslength_), checksum(checksum_), seq(seq_), total( total_), addr(addr_) { fixedValuesInit(); setLinks(); } private: CspGetParamCommand(const CspGetParamCommand &command); void setLinks() { setStart(&cspPort); cspPort.setNext(&querySize); querySize.setNext(&action); action.setNext(&tableId); tableId.setNext(&addresslength); addresslength.setNext(&checksum); checksum.setNext(&seq); seq.setNext(&total); total.setNext(&addr); } void fixedValuesInit(){ cspPort.entry = GOMSPACE::PARAM_PORT; } SerializeElement cspPort; SerializeElement querySize; // size of bytes to query /* Following information will also be physically transmitted to the target * device*/ SerializeElement action; SerializeElement tableId; SerializeElement addresslength; // size of address SerializeElement checksum; SerializeElement seq; SerializeElement total; SerializeElement addr; }; /** * @brief This class can be used to deserialize replies from gomspace devices * and extract the relevant data. */ class CspGetParamReply : public SerialLinkedListAdapter { public: /* The size of the header of a gomspace CSP packet. */ static const uint8_t GS_HDR_LENGTH = 12; /** * @brief Constructor * * @param payloadBuffer Pointer to a buffer to store the payload data of * the CSP packet. * @param payloadBufferSz The size of the payload buffer where the payload * data will be stored. */ CspGetParamReply(uint8_t* payloadBuffer_, uint8_t payloadBufferSz_) : payload(payloadBuffer_, payloadBufferSz_) { setLinks(); } uint8_t getAction(){ return action; } uint8_t getTableId(){ return tableId; } uint16_t getLength(){ return length; } uint16_t getAddress(){ return addr; } private: CspGetParamReply(const CspGetParamReply &reply); void setLinks() { setStart(&action); action.setNext(&tableId); seq.setNext(&addr); addr.setNext(&payload); } SerializeElement action; SerializeElement tableId; SerializeElement length; //length of payload data SerializeElement checksum; SerializeElement seq; SerializeElement total; SerializeElement addr; SerializeElement> payload; }; /** * @brief This class generates telemetry packets containing data from * CSP get-parameter-replies. */ class ParamReply : public SerialLinkedListAdapter { public: /** * @brief Constructor * * @param payloadBuffer Pointer to a buffer to store the payload data of * the CSP packet. * @param payloadBufferSz The size of the payload buffer where the payload * data will be stored. */ ParamReply(uint8_t action_, uint8_t tableId_, uint16_t addr_, uint16_t length_, uint8_t* payloadBuffer_, uint8_t payloadBufferSz_) : payload(payloadBuffer_, payloadBufferSz_) { setLinks(); } private: ParamReply(const CspGetParamReply &reply); void setLinks() { setStart(&action); action.setNext(&tableId); tableId.setNext(&addr); addr.setNext(&length); length.setNext(&payload); } SerializeElement action; SerializeElement tableId; SerializeElement addr; SerializeElement length; SerializeElement> payload; }; /** * @brief This class helps to unpack information from an action messages * to set a parameter in gomspace devices. The action message can be * for example received from the PUS Service 8. */ class SetParamMessageUnpacker: public SerialLinkedListAdapter { public: SetParamMessageUnpacker(const uint8_t* commandData, size_t commandDataLen) { SerializeAdapter::deSerialize(&tableId, &commandData, &commandDataLen, SerializeIF::Endianness::BIG); SerializeAdapter::deSerialize(&address, &commandData, &commandDataLen, SerializeIF::Endianness::BIG); parameterBuffer = commandData; parameterCount = commandDataLen; } uint8_t getTableId() const { return tableId; } uint16_t getAddress() const { return address; } const uint8_t* getParameters() { return parameterBuffer; } uint8_t getParameterCount(){ return parameterCount; } private: SetParamMessageUnpacker(const SetParamMessageUnpacker &message); uint8_t tableId; uint16_t address; /* Parameter buffer holds the values of the parameters to set while the * address points to the location of a parameter. */ const uint8_t * parameterBuffer; uint8_t parameterCount; }; /** * @brief This class helps to unpack information from an action message * to get a parameter from gomspace devices. The action message can be * for example received from the PUS Service 8. */ class GetParamMessageUnpacker: public SerialLinkedListAdapter { public: GetParamMessageUnpacker(const uint8_t* commandData, size_t commandDataLen) { SerializeAdapter::deSerialize(&tableId, &commandData, &commandDataLen, SerializeIF::Endianness::BIG); SerializeAdapter::deSerialize(&address, &commandData, &commandDataLen, SerializeIF::Endianness::BIG); SerializeAdapter::deSerialize(&querySize, &commandData, &commandDataLen, SerializeIF::Endianness::BIG); } uint8_t getTableId() const { return tableId; } uint16_t getAddress() const { return address; } uint8_t getQuerySize(){ return querySize; } private: GetParamMessageUnpacker(const GetParamMessageUnpacker &message); uint8_t tableId; uint16_t address; //The memory address offset within the table uint8_t querySize; //defines number of bytes to query }; #endif /* MISSION_DEVICES_DEVICEDEFINITIONS_GOMSPACEPACKETS_H_ */