eive-obsw/mission/devices/devicedefinitions/PlocMPSoCDefinitions.h

181 lines
7.1 KiB
C
Raw Normal View History

#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_
#define MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_
2021-04-11 12:04:13 +02:00
#include <fsfw/tmtcpacket/SpacePacket.h>
#include <fsfw/globalfunctions/CRC.h>
2021-04-15 13:17:15 +02:00
#include <fsfw/serialize/SerializeAdapter.h>
2021-04-11 12:04:13 +02:00
namespace PLOC_MPSOC {
2021-04-11 12:04:13 +02:00
2022-01-03 08:01:55 +01:00
static const DeviceCommandId_t NONE = 0x0;
static const DeviceCommandId_t TC_MEM_WRITE = 0x1;
static const DeviceCommandId_t TC_MEM_READ = 0x2;
static const DeviceCommandId_t ACK_REPORT = 0x3;
static const DeviceCommandId_t EXE_REPORT = 0x5;
static const DeviceCommandId_t TM_MEMORY_READ_REPORT = 0x6;
static const uint16_t SIZE_ACK_REPORT = 14;
static const uint16_t SIZE_EXE_REPORT = 14;
static const uint16_t SIZE_TM_MEM_READ_REPORT = 18;
/**
* SpacePacket apids of PLOC telecommands and telemetry.
*/
static const uint16_t APID_TC_MEM_WRITE = 0x714;
static const uint16_t APID_TC_MEM_READ = 0x715;
static const uint16_t APID_TM_MEMORY_READ_REPORT = 0x404;
static const uint16_t APID_ACK_SUCCESS = 0x400;
static const uint16_t APID_ACK_FAILURE = 0x401;
static const uint16_t APID_EXE_SUCCESS = 0x402;
static const uint16_t APID_EXE_FAILURE = 0x403;
/** Offset from first byte in Space packet to first byte of data field */
static const uint8_t DATA_FIELD_OFFSET = 6;
/**
* The size of payload data which will be forwarded to the requesting object. e.g. PUS Service
* 8.
*/
static const uint8_t SIZE_MEM_READ_REPORT_DATA = 10;
/**
* PLOC space packet length for fixed size packets. This is the size of the whole packet data
* field. For the length field in the space packet this size will be substracted by one.
*/
static const uint16_t LENGTH_TC_MEM_WRITE = 12;
static const uint16_t LENGTH_TC_MEM_READ = 8;
static const size_t MAX_REPLY_SIZE = SIZE_TM_MEM_READ_REPORT;
static const size_t MAX_COMMAND_SIZE = 18;
/**
* @brief This class helps to build the memory read command for the PLOC.
*
* @details The last two bytes of the packet data field contain a CRC calculated over the whole
* space packet. This is the CRC-16-CCITT as specified in
* ECSS-E-ST-70-41C Telemetry and telecommand packet utilization.
*/
class TcMemRead: public SpacePacket {
public:
2021-04-11 12:04:13 +02:00
/**
2022-01-03 08:01:55 +01:00
* @brief Constructor
*
* @param memAddr The memory address to read from.
2021-04-11 12:04:13 +02:00
*/
2022-01-03 08:01:55 +01:00
TcMemRead(const uint32_t memAddr, uint16_t sequenceCount) :
SpacePacket(LENGTH_TC_MEM_READ - 1, true, APID_TC_MEM_READ, sequenceCount) {
fillPacketDataField(&memAddr);
}
2021-04-11 12:04:13 +02:00
2022-01-03 08:01:55 +01:00
private:
2022-01-03 08:01:55 +01:00
static const uint8_t OFFSET_ADDRESS = 0;
static const uint8_t OFFSET_MEM_LEN_FIELD = 4;
static const uint8_t CRC_OFFSET = 6;
const uint16_t MEM_LEN = 1;
2021-04-11 12:04:13 +02:00
/**
2022-01-03 08:01:55 +01:00
* @brief This function builds the packet data field for the mem read command.
*
* @param memAddr Pointer to the memory address to read from.
2021-04-11 12:04:13 +02:00
*/
2022-01-03 08:01:55 +01:00
void fillPacketDataField(const uint32_t* memAddr) {
ReturnValue_t result = HasReturnvaluesIF::RETURN_OK;
size_t serializedSize = 0;
result = SerializeAdapter::serialize<uint32_t>(memAddr,
this->localData.fields.buffer + OFFSET_ADDRESS, &serializedSize, sizeof(*memAddr),
SerializeIF::Endianness::BIG);
if (result != HasReturnvaluesIF::RETURN_OK) {
sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize address field"
<< std::endl;
}
result = SerializeAdapter::serialize<uint16_t>(&MEM_LEN,
this->localData.fields.buffer + OFFSET_MEM_LEN_FIELD, &serializedSize,
sizeof(MEM_LEN), SerializeIF::Endianness::BIG);
if (result != HasReturnvaluesIF::RETURN_OK) {
sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize mem len field"
<< std::endl;
}
// Calculate crc
uint16_t crc = CRC::crc16ccitt(this->localData.byteStream,
sizeof(CCSDSPrimaryHeader) + LENGTH_TC_MEM_READ - CRC_SIZE);
// Add crc to packet data field of space packet */
result = SerializeAdapter::serialize<uint16_t>(&crc,
this->localData.fields.buffer + CRC_OFFSET, &serializedSize, sizeof(crc),
SerializeIF::Endianness::BIG);
if (result != HasReturnvaluesIF::RETURN_OK) {
sif::debug << "TcMemRead::fillPacketDataField: Failed to serialize crc field"
<< std::endl;
}
}
};
/**
* @brief This class helps to generate the space packet to write to a memory address within
* the PLOC.
* @details The last two bytes of the packet data field contain a CRC calculated over the whole
* space packet. This is the CRC-16-CCITT as specified in
* ECSS-E-ST-70-41C Telemetry and telecommand packet utilization.
*/
class TcMemWrite: public SpacePacket {
public:
2021-04-11 12:04:13 +02:00
/**
2022-01-03 08:01:55 +01:00
* @brief Constructor
2021-04-11 12:04:13 +02:00
*
2022-01-03 08:01:55 +01:00
* @param memAddr The PLOC memory address where to write to.
* @param memoryData The data to write to the specified memory address.
* @param sequenceCount The subsequence count. Must be incremented with each new packet.
2021-04-11 12:04:13 +02:00
*/
2022-01-03 08:01:55 +01:00
TcMemWrite(const uint32_t memAddr, const uint32_t memoryData, uint16_t sequenceCount) :
SpacePacket(LENGTH_TC_MEM_WRITE - 1, true, APID_TC_MEM_WRITE, sequenceCount) {
fillPacketDataField(&memAddr, &memoryData);
2021-04-26 11:28:19 +02:00
}
2021-04-11 12:04:13 +02:00
2022-01-03 08:01:55 +01:00
private:
2021-04-11 12:04:13 +02:00
/**
2022-01-03 08:01:55 +01:00
* @brief This function builds the packet data field for the mem write command.
*
* @param memAddrPtr Pointer to the PLOC memory address where to write to.
* @param memoryDataPtr Pointer to the memoryData to write
2021-04-11 12:04:13 +02:00
*/
2022-01-03 08:01:55 +01:00
void fillPacketDataField(const uint32_t* memAddrPtr, const uint32_t* memoryDataPtr) {
/* Add memAddr to packet data field */
size_t serializedSize = 0;
uint8_t* memoryAddressPos = this->localData.fields.buffer;
SerializeAdapter::serialize<uint32_t>(memAddrPtr, &memoryAddressPos, &serializedSize,
sizeof(*memAddrPtr), SerializeIF::Endianness::BIG);
/* Add memLen to packet data field */
this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD] = 1;
this->localData.fields.buffer[OFFSET_MEM_LEN_FIELD + 1] = 0;
/* Add memData to packet data field */
serializedSize = 0;
uint8_t* memoryDataPos = this->localData.fields.buffer + OFFSET_MEM_DATA_FIELD;
SerializeAdapter::serialize<uint32_t>(memoryDataPtr, &memoryDataPos, &serializedSize,
2021-04-15 13:17:15 +02:00
sizeof(*memoryDataPtr), SerializeIF::Endianness::BIG);
2022-01-03 08:01:55 +01:00
/* Calculate crc */
uint16_t crc = CRC::crc16ccitt(this->localData.byteStream,
sizeof(CCSDSPrimaryHeader) + LENGTH_TC_MEM_WRITE - CRC_SIZE);
2021-04-15 13:17:15 +02:00
2022-01-03 08:01:55 +01:00
serializedSize = 0;
uint8_t* crcPos = this->localData.fields.buffer + CRC_OFFSET;
/* Add crc to packet data field of space packet */
SerializeAdapter::serialize<uint16_t>(&crc, &crcPos, &serializedSize, sizeof(crc),
SerializeIF::Endianness::BIG);
}
2021-04-11 12:04:13 +02:00
2022-01-03 08:01:55 +01:00
/** Offsets from base address of packet data field */
static const uint8_t OFFSET_MEM_LEN_FIELD = 4;
static const uint8_t OFFSET_MEM_DATA_FIELD = 6;
static const uint8_t CRC_OFFSET = 10;
};
2021-04-11 12:04:13 +02:00
}
#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_PLOCMPSOCDEFINITIONS_H_ */