fsfw/src/fsfw/tmtcpacket/pus/tm/PusTmCreator.cpp

152 lines
5.3 KiB
C++
Raw Normal View History

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"
2022-09-05 14:44:35 +02:00
#include "fsfw/timemanager/TimeWriterIF.h"
2022-07-20 22:21:15 +02:00
2022-07-22 16:06:31 +02:00
PusTmCreator::PusTmCreator(SpacePacketParams initSpParams, PusTmParams initPusParams)
: pusParams(initPusParams), spCreator(std::move(initSpParams)) {
setup();
2022-07-21 11:34:11 +02:00
}
2022-07-20 22:21:15 +02:00
2022-07-22 16:06:31 +02:00
PusTmCreator::PusTmCreator() { setup(); }
2022-07-19 18:13:25 +02:00
2022-07-27 17:00:43 +02:00
void PusTmCreator::disableCrcCalculation() { calculateCrcOnSerialization = false; }
2022-07-27 17:00:43 +02:00
void PusTmCreator::enableCrcCalculation() { calculateCrcOnSerialization = true; }
2022-07-21 11:34:11 +02:00
uint16_t PusTmCreator::getPacketIdRaw() const { return spCreator.getPacketIdRaw(); }
2022-07-22 16:41:32 +02:00
2022-07-21 11:34:11 +02:00
uint16_t PusTmCreator::getPacketSeqCtrlRaw() const { return spCreator.getPacketSeqCtrlRaw(); }
2022-07-22 16:41:32 +02:00
2022-07-21 11:34:11 +02:00
uint16_t PusTmCreator::getPacketDataLen() const { return spCreator.getPacketDataLen(); }
2022-07-22 16:41:32 +02:00
2022-07-21 11:34:11 +02:00
uint8_t PusTmCreator::getPusVersion() const { return pusParams.secHeader.pusVersion; }
2022-07-22 16:41:32 +02:00
2022-07-21 11:34:11 +02:00
uint8_t PusTmCreator::getService() const { return pusParams.secHeader.service; }
2022-07-22 16:41:32 +02:00
2022-07-21 11:34:11 +02:00
uint8_t PusTmCreator::getSubService() const { return pusParams.secHeader.subservice; }
2022-07-22 16:41:32 +02:00
2022-07-20 22:21:15 +02:00
PusTmParams& PusTmCreator::getParams() { return pusParams; }
2022-07-22 16:41:32 +02:00
2022-09-05 14:44:35 +02:00
void PusTmCreator::setTimeStamper(TimeWriterIF& timeStamper_) {
pusParams.secHeader.timeStamper = &timeStamper_;
2022-07-22 17:09:44 +02:00
updateSpLengthField();
2022-07-20 22:21:15 +02:00
}
2022-07-22 16:41:32 +02:00
2022-07-22 16:09:18 +02:00
uint8_t PusTmCreator::getScTimeRefStatus() { return pusParams.secHeader.scTimeRefStatus; }
2022-07-22 16:41:32 +02:00
2022-07-22 16:09:18 +02:00
uint16_t PusTmCreator::getMessageTypeCounter() { return pusParams.secHeader.messageTypeCounter; }
2022-07-22 16:41:32 +02:00
2022-07-22 16:09:18 +02:00
uint16_t PusTmCreator::getDestId() { return pusParams.secHeader.destId; }
2022-07-20 22:21:15 +02:00
ReturnValue_t PusTmCreator::serialize(uint8_t** buffer, size_t* size, size_t maxSize,
SerializeIF::Endianness streamEndianness) const {
2022-07-22 16:06:31 +02:00
const uint8_t* start = *buffer;
2022-07-20 22:21:15 +02:00
if (*size + getSerializedSize() > maxSize) {
return SerializeIF::BUFFER_TOO_SHORT;
}
2022-07-23 10:24:56 +02:00
ReturnValue_t result = spCreator.serialize(buffer, size, maxSize, streamEndianness);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-07-20 22:21:15 +02:00
return result;
}
**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);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-07-20 22:21:15 +02:00
return result;
}
result = SerializeAdapter::serialize(&pusParams.secHeader.destId, buffer, size, maxSize,
streamEndianness);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-07-20 22:21:15 +02:00
return result;
}
2022-07-27 17:00:43 +02:00
if (getTimestamper() != nullptr) {
result = pusParams.secHeader.timeStamper->serialize(buffer, size, maxSize, streamEndianness);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-07-27 17:00:43 +02:00
return result;
}
2022-07-20 22:21:15 +02:00
}
2022-07-27 17:00:43 +02:00
2022-09-05 16:02:32 +02:00
if (pusParams.sourceData != nullptr) {
result = pusParams.sourceData->serialize(buffer, size, maxSize, streamEndianness);
2022-08-16 01:08:26 +02:00
if (result != returnvalue::OK) {
2022-07-20 22:21:15 +02:00
return result;
}
}
2022-07-27 11:26:47 +02:00
if (calculateCrcOnSerialization) {
uint16_t crc16 = CRC::crc16ccitt(start, getFullPacketLen() - sizeof(ecss::PusChecksumT));
return SerializeAdapter::serialize(&crc16, buffer, size, maxSize, streamEndianness);
}
// Even if no CRC is calculated, account for the space taken by it
*size += 2;
*buffer += 2;
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-07-20 22:21:15 +02:00
}
size_t PusTmCreator::getSerializedSize() const { return getFullPacketLen(); }
ReturnValue_t PusTmCreator::deSerialize(const uint8_t** buffer, size_t* size,
SerializeIF::Endianness streamEndianness) {
2022-08-16 01:08:26 +02:00
return returnvalue::FAILED;
2022-07-20 22:21:15 +02:00
}
2022-09-05 14:44:35 +02:00
TimeWriterIF* PusTmCreator::getTimestamper() const { return pusParams.secHeader.timeStamper; }
2022-07-22 16:41:32 +02:00
2022-07-20 22:21:15 +02:00
SpacePacketParams& PusTmCreator::getSpParams() { return spCreator.getParams(); }
void PusTmCreator::updateSpLengthField() {
size_t headerLen = PusTmIF::MIN_SEC_HEADER_LEN + sizeof(ecss::PusChecksumT);
2022-09-05 16:02:32 +02:00
if (pusParams.sourceData != nullptr) {
headerLen += pusParams.sourceData->getSerializedSize();
}
2022-07-20 22:21:15 +02:00
if (pusParams.secHeader.timeStamper != nullptr) {
headerLen += pusParams.secHeader.timeStamper->getSerializedSize();
}
spCreator.setCcsdsLenFromTotalDataFieldLen(headerLen);
2022-07-20 22:21:15 +02:00
}
2022-07-21 11:34:11 +02:00
void PusTmCreator::setApid(uint16_t apid) { spCreator.setApid(apid); }
2022-07-22 16:06:31 +02:00
void PusTmCreator::setup() {
updateSpLengthField();
spCreator.setPacketType(ccsds::PacketType::TM);
spCreator.setSecHeaderFlag();
2022-07-22 16:06:31 +02:00
}
2022-07-22 16:41:32 +02:00
void PusTmCreator::setMessageTypeCounter(uint16_t messageTypeCounter) {
pusParams.secHeader.messageTypeCounter = messageTypeCounter;
};
void PusTmCreator::setDestId(uint16_t destId) { pusParams.secHeader.destId = destId; }
2022-07-22 17:09:44 +02:00
ReturnValue_t PusTmCreator::setRawUserData(const uint8_t* data, size_t len) {
2022-09-05 16:02:32 +02:00
if (data == nullptr or len == 0) {
pusParams.sourceData = nullptr;
} else {
2022-09-05 16:25:02 +02:00
pusParams.adapter.setBuffer(data, len);
2022-09-05 16:02:32 +02:00
pusParams.sourceData = &pusParams.adapter;
}
2022-07-22 16:41:32 +02:00
updateSpLengthField();
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-07-22 16:41:32 +02:00
}
2022-09-05 15:30:53 +02:00
ReturnValue_t PusTmCreator::setSerializableUserData(const SerializeIF& serializable) {
2022-09-05 16:02:32 +02:00
pusParams.sourceData = &serializable;
2022-07-22 16:41:32 +02:00
updateSpLengthField();
2022-08-16 01:08:26 +02:00
return returnvalue::OK;
2022-07-22 16:41:32 +02:00
}
void PusTmCreator::setService(uint8_t service) { pusParams.secHeader.service = service; }
void PusTmCreator::setSubservice(uint8_t subservice) {
pusParams.secHeader.subservice = subservice;
}
bool PusTmCreator::crcCalculationEnabled() const { return calculateCrcOnSerialization; }