2022-07-19 18:13:25 +02:00
|
|
|
#include "PusTmCreator.h"
|
|
|
|
|
2022-07-20 22:21:15 +02:00
|
|
|
#include <utility>
|
|
|
|
|
|
|
|
#include "fsfw/globalfunctions/CRC.h"
|
|
|
|
#include "fsfw/timemanager/TimeStamperIF.h"
|
|
|
|
|
|
|
|
PusTmCreator::PusTmCreator(SpacePacketParams initSpParams, PusTmParams initPusParams,
|
|
|
|
TimeStamperIF* timeStamper)
|
2022-07-21 11:34:11 +02:00
|
|
|
: pusParams(initPusParams), spCreator(std::move(initSpParams)) {}
|
2022-07-20 22:21:15 +02:00
|
|
|
|
|
|
|
PusTmCreator::PusTmCreator(TimeStamperIF* timeStamper_) {
|
|
|
|
pusParams.secHeader.timeStamper = timeStamper_;
|
2022-07-21 11:34:11 +02:00
|
|
|
}
|
2022-07-20 22:21:15 +02:00
|
|
|
|
|
|
|
PusTmCreator::PusTmCreator() = default;
|
2022-07-19 18:13:25 +02:00
|
|
|
|
2022-07-21 11:34:11 +02:00
|
|
|
uint16_t PusTmCreator::getPacketIdRaw() const { return spCreator.getPacketIdRaw(); }
|
|
|
|
uint16_t PusTmCreator::getPacketSeqCtrlRaw() const { return spCreator.getPacketSeqCtrlRaw(); }
|
|
|
|
uint16_t PusTmCreator::getPacketDataLen() const { return spCreator.getPacketDataLen(); }
|
|
|
|
uint8_t PusTmCreator::getPusVersion() const { return pusParams.secHeader.pusVersion; }
|
|
|
|
uint8_t PusTmCreator::getService() const { return pusParams.secHeader.service; }
|
|
|
|
uint8_t PusTmCreator::getSubService() const { return pusParams.secHeader.subservice; }
|
2022-07-20 22:21:15 +02:00
|
|
|
PusTmParams& PusTmCreator::getParams() { return pusParams; }
|
|
|
|
void PusTmCreator::setTimeStamper(TimeStamperIF* timeStamper_) {
|
|
|
|
pusParams.secHeader.timeStamper = timeStamper_;
|
|
|
|
}
|
|
|
|
uint8_t PusTmCreator::getScTimeRefStatus() { return 0; }
|
|
|
|
uint16_t PusTmCreator::getMessageTypeCounter() { return 0; }
|
|
|
|
uint16_t PusTmCreator::getDestId() { return 0; }
|
|
|
|
|
|
|
|
ReturnValue_t PusTmCreator::serialize(uint8_t** buffer, size_t* size, size_t maxSize,
|
|
|
|
SerializeIF::Endianness streamEndianness) const {
|
|
|
|
if (*size + getSerializedSize() > maxSize) {
|
|
|
|
return SerializeIF::BUFFER_TOO_SHORT;
|
|
|
|
}
|
|
|
|
ReturnValue_t result = spCreator.serialize(buffer, size, maxSize);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
size_t userDataLen = pusParams.dataWrapper.getLength();
|
|
|
|
**buffer =
|
|
|
|
((pusParams.secHeader.pusVersion << 4) & 0xF0) | (pusParams.secHeader.scTimeRefStatus & 0x0F);
|
|
|
|
*buffer += 1;
|
|
|
|
**buffer = pusParams.secHeader.service;
|
|
|
|
*buffer += 1;
|
|
|
|
**buffer = pusParams.secHeader.subservice;
|
|
|
|
*buffer += 1;
|
|
|
|
*size += 3;
|
|
|
|
result = SerializeAdapter::serialize(&pusParams.secHeader.messageTypeCounter, buffer, size,
|
|
|
|
maxSize, streamEndianness);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = SerializeAdapter::serialize(&pusParams.secHeader.destId, buffer, size, maxSize,
|
|
|
|
streamEndianness);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
result = pusParams.secHeader.timeStamper->serialize(buffer, size, maxSize, streamEndianness);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
if (pusParams.dataWrapper.type == ecss::DataTypes::RAW and
|
|
|
|
pusParams.dataWrapper.dataUnion.raw.data != nullptr) {
|
|
|
|
std::memcpy(*buffer, pusParams.dataWrapper.dataUnion.raw.data, userDataLen);
|
|
|
|
*buffer += userDataLen;
|
|
|
|
*size += userDataLen;
|
|
|
|
} else if (pusParams.dataWrapper.type == ecss::DataTypes::SERIALIZABLE and
|
|
|
|
pusParams.dataWrapper.dataUnion.serializable != nullptr) {
|
|
|
|
result = pusParams.dataWrapper.dataUnion.serializable->serialize(buffer, size, maxSize,
|
|
|
|
streamEndianness);
|
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
2022-07-21 19:10:15 +02:00
|
|
|
uint16_t crc16 = CRC::crc16ccitt(*buffer, getFullPacketLen() - sizeof(ecss::PusChecksumT));
|
2022-07-20 22:21:15 +02:00
|
|
|
return SerializeAdapter::serialize(&crc16, buffer, size, maxSize, streamEndianness);
|
|
|
|
}
|
|
|
|
|
|
|
|
size_t PusTmCreator::getSerializedSize() const { return getFullPacketLen(); }
|
|
|
|
ReturnValue_t PusTmCreator::deSerialize(const uint8_t** buffer, size_t* size,
|
|
|
|
SerializeIF::Endianness streamEndianness) {
|
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
}
|
|
|
|
|
|
|
|
ecss::DataWrapper& PusTmCreator::getDataWrapper() { return pusParams.dataWrapper; }
|
|
|
|
TimeStamperIF* PusTmCreator::getTimestamper() { return pusParams.secHeader.timeStamper; }
|
|
|
|
SpacePacketParams& PusTmCreator::getSpParams() { return spCreator.getParams(); }
|
|
|
|
|
|
|
|
void PusTmCreator::updateSpLengthField() {
|
2022-07-21 11:34:11 +02:00
|
|
|
size_t headerLen = PusTmIF::MIN_SIZE;
|
2022-07-20 22:21:15 +02:00
|
|
|
if (pusParams.secHeader.timeStamper != nullptr) {
|
|
|
|
headerLen += pusParams.secHeader.timeStamper->getSerializedSize();
|
|
|
|
}
|
|
|
|
spCreator.setDataLen(headerLen + pusParams.dataWrapper.getLength() + 1);
|
|
|
|
}
|
|
|
|
|
2022-07-21 11:34:11 +02:00
|
|
|
void PusTmCreator::setApid(uint16_t apid) { spCreator.setApid(apid); }
|