start refactoring of PLOC SUPV packet defs
EIVE/eive-obsw/pipeline/head There was a failure building this commit Details

This commit is contained in:
Robin Müller 2022-08-15 12:23:54 +02:00
parent 4a28f79e3a
commit 859ced185d
No known key found for this signature in database
GPG Key ID: 71B58F8A3CDFA9AC
1 changed files with 83 additions and 25 deletions

View File

@ -6,7 +6,7 @@
#include <fsfw/globalfunctions/CRC.h>
#include <fsfw/serialize/SerializeAdapter.h>
#include <fsfw/timemanager/Clock.h>
#include <fsfw/tmtcpacket/SpacePacket.h>
#include <fsfw/tmtcpacket/ccsds/SpacePacketCreator.h>
#include "linux/devices/devicedefinitions/SupvReturnValuesIF.h"
@ -274,10 +274,47 @@ static const uint32_t ERASE_MEMORY = 60000;
static const uint32_t UPDATE_STATUS_REPORT = 70000;
} // namespace recv_timeout
class SpacePacketBase {
public:
SpacePacketBase(SpacePacketCreator& creator, uint8_t* buf, size_t payloadLen, size_t maxSize)
: creator(creator), buf(buf), payloadLen(payloadLen), maxSize(maxSize) {
creator.setDataLen(payloadLen - 1);
creator.setPacketType(ccsds::PacketType::TC);
payloadStart = buf + ccsds::HEADER_LEN;
}
ReturnValue_t checkPayloadLen() {
if(ccsds::HEADER_LEN + payloadLen > maxSize) {
return SerializeIF::BUFFER_TOO_SHORT;
}
return result::OK;
}
ReturnValue_t serialize() {
size_t serLen = 0;
return creator.serializeBe(buf, serLen, maxSize);
}
ReturnValue_t checkSizeAndSerialize() {
ReturnValue_t result = checkPayloadLen();
if(result != result::OK) {
return result;
}
return serialize();
}
protected:
SpacePacketCreator& creator;
uint8_t* buf;
size_t payloadLen;
uint8_t* payloadStart;
size_t maxSize;
};
/**
* @brief This class creates a space packet containing only the header data and the CRC.
*/
class ApidOnlyPacket : public SpacePacket {
class ApidOnlyPacket: public SpacePacketBase {
public:
/**
* @brief Constructor
@ -286,20 +323,33 @@ class ApidOnlyPacket : public SpacePacket {
*
* @note Sequence count of empty packet is always 1.
*/
ApidOnlyPacket(uint16_t apid) : SpacePacket(LENGTH_EMPTY_TC - 1, true, apid, 1) { calcCrc(); }
ApidOnlyPacket(uint16_t apid, SpacePacketCreator& creator, uint8_t* buf, size_t maxSize)
: SpacePacketBase(creator, buf, LENGTH_EMPTY_TC, maxSize) {
creator.setApid(apid);
}
ReturnValue_t buildPacket() {
ReturnValue_t result = checkSizeAndSerialize();
if(result != result::OK) {
return result;
}
calcCrc();
return result::OK;
}
private:
/**
* @brief CRC calculation which involves only the header in an empty packet
*/
void calcCrc() {
/* Calculate crc */
uint16_t crc = CRC::crc16ccitt(this->localData.byteStream, sizeof(CCSDSPrimaryHeader));
uint16_t crc = CRC::crc16ccitt(buf, ccsds::HEADER_LEN);
/* Add crc to packet data field of space packet */
size_t serializedSize = 0;
uint8_t* crcPos = this->localData.fields.buffer;
SerializeAdapter::serialize<uint16_t>(&crc, &crcPos, &serializedSize, sizeof(crc),
SerializeAdapter::serialize<uint16_t>(&crc, &payloadStart, &serializedSize, sizeof(crc),
SerializeIF::Endianness::BIG);
}
};
@ -308,7 +358,7 @@ class ApidOnlyPacket : public SpacePacket {
* @brief This class can be used to generate the space packet selecting the boot image of
* of the MPSoC.
*/
class MPSoCBootSelect : public SpacePacket {
class MPSoCBootSelect : public SpacePacketBase {
public:
static const uint8_t NVM0 = 0;
static const uint8_t NVM1 = 1;
@ -323,13 +373,23 @@ class MPSoCBootSelect : public SpacePacket {
*
* @note Selection of partitions is currently not supported.
*/
MPSoCBootSelect(uint8_t mem = 0, uint8_t bp0 = 0, uint8_t bp1 = 0, uint8_t bp2 = 0)
: SpacePacket(DATA_FIELD_LENGTH - 1, true, APID_SEL_MPSOC_BOOT_IMAGE, DEFAULT_SEQUENCE_COUNT),
mem(mem),
bp0(bp0),
bp1(bp1),
bp2(bp2) {
MPSoCBootSelect(SpacePacketCreator& creator, uint8_t* buf, size_t maxSize)
: SpacePacketBase(creator, buf, DATA_FIELD_LENGTH - 1, maxSize) {
creator.setApid(APID_SEL_MPSOC_BOOT_IMAGE);
creator.setSeqCount(DEFAULT_SEQUENCE_COUNT);
}
ReturnValue_t buildPacket(uint8_t mem_ = 0, uint8_t bp0_ = 0, uint8_t bp1_ = 0, uint8_t bp2_ = 0) {
mem = mem_;
bp0 = bp0_;
bp1 = bp1_;
bp2 = bp2_;
auto res = checkSizeAndSerialize();
if(res != result::OK) {
return res;
}
initPacket();
return res;
}
private:
@ -348,18 +408,16 @@ class MPSoCBootSelect : public SpacePacket {
uint8_t bp2 = 0;
void initPacket() {
uint8_t* data_field_start = this->localData.fields.buffer;
std::memcpy(data_field_start + MEM_OFFSET, &mem, sizeof(mem));
std::memcpy(data_field_start + BP0_OFFSET, &bp0, sizeof(bp0));
std::memcpy(data_field_start + BP1_OFFSET, &bp1, sizeof(bp1));
std::memcpy(data_field_start + BP2_OFFSET, &bp2, sizeof(bp2));
std::memcpy(payloadStart + MEM_OFFSET, &mem, sizeof(mem));
std::memcpy(payloadStart + BP0_OFFSET, &bp0, sizeof(bp0));
std::memcpy(payloadStart + BP1_OFFSET, &bp1, sizeof(bp1));
std::memcpy(payloadStart + BP2_OFFSET, &bp2, sizeof(bp2));
/* Calculate crc */
uint16_t crc = CRC::crc16ccitt(this->localData.byteStream,
sizeof(CCSDSPrimaryHeader) + DATA_FIELD_LENGTH - 2);
uint16_t crc = CRC::crc16ccitt(buf, ccsds::HEADER_LEN + DATA_FIELD_LENGTH - 2);
/* Add crc to packet data field of space packet */
size_t serializedSize = 0;
uint8_t* crcPos = this->localData.fields.buffer + CRC_OFFSET;
uint8_t* crcPos = payloadStart + CRC_OFFSET;
SerializeAdapter::serialize<uint16_t>(&crc, &crcPos, &serializedSize, sizeof(crc),
SerializeIF::Endianness::BIG);
}
@ -369,7 +427,7 @@ class MPSoCBootSelect : public SpacePacket {
* @brief This class creates the command to enable or disable the NVMs connected to the
* supervisor.
*/
class EnableNvms : public SpacePacket {
class EnableNvms : public SpacePacketCreator {
public:
/**
* @brief Constructor
@ -412,7 +470,7 @@ class EnableNvms : public SpacePacket {
/**
* @brief This class generates the space packet to update the time of the PLOC supervisor.
*/
class SetTimeRef : public SpacePacket {
class SetTimeRef : public SpacePacketCreator {
public:
SetTimeRef(Clock::TimeOfDay_t* time)
: SpacePacket(DATA_FIELD_LENGTH - 1, true, APID_SET_TIME_REF, DEFAULT_SEQUENCE_COUNT) {
@ -467,7 +525,7 @@ class SetTimeRef : public SpacePacket {
/**
* @brief This class can be used to generate the set boot timout command.
*/
class SetBootTimeout : public SpacePacket {
class SetBootTimeout : public SpacePacketCreator {
public:
/**
* @brief Constructor
@ -503,7 +561,7 @@ class SetBootTimeout : public SpacePacket {
/**
* @brief This class can be used to generate the space packet to set the maximum boot tries.
*/
class SetRestartTries : public SpacePacket {
class SetRestartTries : public SpacePacketCreator {
public:
/**
* @brief Constructor