fsfw/src/fsfw/tmtcpacket/ccsds/SpacePacketCreator.cpp

95 lines
3.5 KiB
C++
Raw Normal View History

2022-07-18 10:42:56 +02:00
#include "SpacePacketCreator.h"
2022-07-20 11:43:16 +02:00
#include <utility>
2022-07-18 10:42:56 +02:00
#include "fsfw/serialize/SerializeAdapter.h"
2022-07-20 11:43:16 +02:00
SpacePacketCreator::SpacePacketCreator(SpacePacketParams params_) : params(std::move(params_)) {
2022-07-18 16:07:26 +02:00
checkFieldValidity();
}
2022-07-20 11:43:16 +02:00
SpacePacketCreator::SpacePacketCreator(ccsds::PacketType packetType, bool secHeaderFlag,
uint16_t apid, ccsds::SequenceFlags seqFlags,
uint16_t seqCount, uint16_t dataLen, uint8_t version)
: params(SpacePacketParams(PacketId(packetType, secHeaderFlag, apid),
PacketSeqCtrl(seqFlags, seqCount), dataLen)) {
params.version = version;
2022-10-17 17:24:46 +02:00
checkFieldValidity();
2022-07-20 11:43:16 +02:00
}
uint16_t SpacePacketCreator::getPacketIdRaw() const { return params.packetId.raw(); }
uint16_t SpacePacketCreator::getPacketSeqCtrlRaw() const { return params.packetSeqCtrl.raw(); }
2022-07-19 18:13:25 +02:00
uint16_t SpacePacketCreator::getPacketDataLen() const { return params.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()) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-07-18 16:07:26 +02:00
}
2022-07-19 18:13:25 +02:00
uint16_t packetIdAndVersion =
(static_cast<uint16_t>(params.version) << 13) | params.packetId.raw();
2022-07-18 10:42:56 +02:00
ReturnValue_t result =
SerializeAdapter::serialize(&packetIdAndVersion, buffer, size, maxSize, streamEndianness);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-07-18 10:42:56 +02:00
return result;
}
2022-07-19 18:13:25 +02:00
uint16_t pscRaw = params.packetSeqCtrl.raw();
2022-07-18 16:07:26 +02:00
result = SerializeAdapter::serialize(&pscRaw, buffer, size, maxSize, streamEndianness);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-07-18 10:42:56 +02:00
return result;
}
2022-07-19 18:13:25 +02:00
return SerializeAdapter::serialize(&params.dataLen, buffer, size, maxSize, streamEndianness);
2022-07-18 10:42:56 +02:00
}
void SpacePacketCreator::setCcsdsLenFromTotalDataFieldLen(size_t actualLength) {
if (actualLength == 0) {
return;
}
setDataLenField(actualLength - 1);
}
size_t SpacePacketCreator::getSerializedSize() const { return ccsds::HEADER_LEN; }
2022-07-18 16:07:26 +02:00
2022-07-18 10:42:56 +02:00
ReturnValue_t SpacePacketCreator::deSerialize(const uint8_t **buffer, size_t *size,
SerializeIF::Endianness streamEndianness) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-07-18 10:42:56 +02:00
}
2022-07-18 14:05:43 +02:00
bool SpacePacketCreator::isValid() const { return valid; }
2022-07-18 16:07:26 +02:00
void SpacePacketCreator::setApid(uint16_t apid) {
if (apid < ccsds::LIMIT_APID) {
2022-07-19 18:13:25 +02:00
params.packetId.apid = apid;
2022-07-18 16:07:26 +02:00
}
checkFieldValidity();
}
void SpacePacketCreator::setSeqCount(uint16_t seqCount) {
if (seqCount < ccsds::LIMIT_SEQUENCE_COUNT) {
2022-07-19 18:13:25 +02:00
params.packetSeqCtrl.seqCount = seqCount;
2022-07-18 16:07:26 +02:00
}
checkFieldValidity();
}
2022-07-19 18:13:25 +02:00
void SpacePacketCreator::setSeqFlags(ccsds::SequenceFlags flags) {
params.packetSeqCtrl.seqFlags = flags;
}
void SpacePacketCreator::setDataLenField(uint16_t dataLen_) { params.dataLen = dataLen_; }
2022-07-18 16:07:26 +02:00
void SpacePacketCreator::checkFieldValidity() {
valid = true;
2022-07-19 18:13:25 +02:00
if (params.packetId.apid > ccsds::LIMIT_APID or
params.packetSeqCtrl.seqCount > ccsds::LIMIT_SEQUENCE_COUNT) {
2022-07-18 16:07:26 +02:00
valid = false;
}
}
2022-07-20 22:21:15 +02:00
void SpacePacketCreator::setParams(SpacePacketParams params_) { params = std::move(params_); }
SpacePacketParams &SpacePacketCreator::getParams() { return params; }
2022-07-21 17:48:11 +02:00
void SpacePacketCreator::setPacketType(ccsds::PacketType type) {
params.packetId.packetType = type;
}
2022-07-23 10:24:56 +02:00
bool SpacePacketCreator::operator==(const SpacePacketCreator &other) const { return false; }
2022-07-23 11:43:48 +02:00
SpacePacketCreator::operator bool() const { return isValid(); }
void SpacePacketCreator::setSecHeaderFlag() { params.packetId.secHeaderFlag = true; }