fsfw/src/fsfw/tmtcpacket/pus/tc/TcPacketSerializer.cpp

43 lines
1.5 KiB
C++

#include "TcPacketSerializer.h"
#include <cstring>
TcPacketSerializer::TcPacketSerializer(uint8_t* store, size_t maxSize, PusConfig& cfg)
: TcPacketPus(nullptr), store(store), maxSize(maxSize), cfg(cfg) {}
ReturnValue_t TcPacketSerializer::serialize(uint8_t** buffer, size_t* size, size_t maxSize,
Endianness streamEndianness) const {
if (*size + getSerializedSize() > maxSize) {
return BUFFER_TOO_SHORT;
}
std::memcpy(*buffer, store, getSerializedSize());
*buffer += getSerializedSize();
*size += getSerializedSize();
return RETURN_OK;
}
size_t TcPacketSerializer::getSerializedSize() const { return TC_PACKET_MIN_SIZE + cfg.appDataLen; }
ReturnValue_t TcPacketSerializer::initialize() {
if (getSerializedSize() > maxSize) {
return SerializeIF::BUFFER_TOO_SHORT;
}
ReturnValue_t result = setData(store, maxSize);
if (result != RETURN_OK) {
return result;
}
initializeTcPacket(cfg.apid, cfg.sequenceCount, cfg.ack, cfg.service, cfg.subservice,
PusConfig::PUS_VERSION, cfg.sourceId);
if (cfg.appData != nullptr and cfg.appDataLen > 0) {
std::memcpy(&tcData->appData, cfg.appData, cfg.appDataLen);
}
setPacketDataLength(calculateFullPacketLength(cfg.appDataLen) - sizeof(CCSDSPrimaryHeader) - 1);
setErrorControl();
return RETURN_OK;
}
ReturnValue_t TcPacketSerializer::deSerialize(const uint8_t** buffer, size_t* size,
Endianness streamEndianness) {
return RETURN_FAILED;
}