fsfw/src/fsfw/tmtcpacket/SpacePacketCreator.cpp

77 lines
3.0 KiB
C++
Raw Normal View History

2022-07-18 10:42:56 +02:00
#include "SpacePacketCreator.h"
#include "fsfw/serialize/SerializeAdapter.h"
2022-07-18 16:07:26 +02:00
SpacePacketCreator::SpacePacketCreator(PacketId packetId_, PacketSeqCtrl psc_, uint16_t dataLen_,
uint8_t version_)
: packetId(packetId_), packetSeqCtrl(psc_) {
dataLen = dataLen_;
2022-07-18 10:42:56 +02:00
version = version_;
2022-07-18 16:07:26 +02:00
checkFieldValidity();
}
SpacePacketCreator::SpacePacketCreator(ccsds::PacketType packetType, bool secHeaderFlag,
uint16_t apid, ccsds::SequenceFlags seqFlags,
2022-07-18 16:07:26 +02:00
uint16_t seqCount, uint16_t dataLen_, uint8_t version_)
: SpacePacketCreator(PacketId(packetType, secHeaderFlag, apid),
PacketSeqCtrl(seqFlags, seqCount), dataLen_, version_) {
version = version_;
dataLen = dataLen_;
2022-07-18 10:42:56 +02:00
}
2022-07-18 16:07:26 +02:00
uint16_t SpacePacketCreator::getPacketId() const { return packetId.raw(); }
uint16_t SpacePacketCreator::getPacketSeqCtrl() const { return packetSeqCtrl.raw(); }
2022-07-18 13:51:02 +02:00
uint16_t SpacePacketCreator::getPacketDataLen() const { return dataLen; }
2022-07-18 10:42:56 +02:00
ReturnValue_t SpacePacketCreator::serialize(uint8_t **buffer, size_t *size, size_t maxSize,
SerializeIF::Endianness streamEndianness) const {
2022-07-18 16:07:26 +02:00
if (not isValid()) {
return HasReturnvaluesIF::RETURN_FAILED;
}
uint16_t packetIdAndVersion = (static_cast<uint16_t>(version) << 13) | packetId.raw();
2022-07-18 10:42:56 +02:00
ReturnValue_t result =
SerializeAdapter::serialize(&packetIdAndVersion, buffer, size, maxSize, streamEndianness);
if (result != HasReturnvaluesIF::RETURN_OK) {
return result;
}
2022-07-18 16:07:26 +02:00
uint16_t pscRaw = packetSeqCtrl.raw();
result = SerializeAdapter::serialize(&pscRaw, buffer, size, maxSize, streamEndianness);
2022-07-18 10:42:56 +02:00
if (result != HasReturnvaluesIF::RETURN_OK) {
return result;
}
return SerializeAdapter::serialize(&dataLen, buffer, size, maxSize, streamEndianness);
2022-07-18 10:42:56 +02:00
}
2022-07-18 16:07:26 +02:00
size_t SpacePacketCreator::getSerializedSize() const { return 6; }
2022-07-18 10:42:56 +02:00
ReturnValue_t SpacePacketCreator::deSerialize(const uint8_t **buffer, size_t *size,
SerializeIF::Endianness streamEndianness) {
return HasReturnvaluesIF::RETURN_FAILED;
}
2022-07-18 14:05:43 +02:00
bool SpacePacketCreator::isValid() const { return valid; }
2022-07-18 16:07:26 +02:00
ReturnValue_t SpacePacketCreator::serialize(uint8_t **buffer, size_t *size, size_t maxSize) const {
return serialize(buffer, size, maxSize, SerializeIF::Endianness::NETWORK);
}
void SpacePacketCreator::setApid(uint16_t apid) {
if (apid < ccsds::LIMIT_APID) {
packetId.apid = apid;
}
checkFieldValidity();
}
void SpacePacketCreator::setSeqCount(uint16_t seqCount) {
if (seqCount < ccsds::LIMIT_SEQUENCE_COUNT) {
packetSeqCtrl.seqCount = seqCount;
}
checkFieldValidity();
}
void SpacePacketCreator::setSeqFlags(ccsds::SequenceFlags flags) { packetSeqCtrl.seqFlags = flags; }
void SpacePacketCreator::setDataLen(uint16_t dataLen_) { dataLen = dataLen_; }
void SpacePacketCreator::checkFieldValidity() {
valid = true;
if (packetId.apid > ccsds::LIMIT_APID or packetSeqCtrl.seqCount > ccsds::LIMIT_SEQUENCE_COUNT) {
valid = false;
}
}