2022-07-18 18:36:41 +02:00
|
|
|
#include "PusTcReader.h"
|
|
|
|
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
#include "fsfw/globalfunctions/CRC.h"
|
|
|
|
#include "fsfw/globalfunctions/arrayprinter.h"
|
|
|
|
#include "fsfw/serialize.h"
|
|
|
|
#include "fsfw/serviceinterface/ServiceInterface.h"
|
|
|
|
|
2022-07-20 22:21:15 +02:00
|
|
|
PusTcReader::PusTcReader(const uint8_t* data, size_t size) { setReadOnlyData(data, size); }
|
2022-07-18 18:36:41 +02:00
|
|
|
|
|
|
|
PusTcReader::~PusTcReader() = default;
|
|
|
|
|
2022-07-21 13:48:58 +02:00
|
|
|
ReturnValue_t PusTcReader::parseDataWithCrcCheck() { return parseData(true); }
|
|
|
|
|
|
|
|
ReturnValue_t PusTcReader::parseDataWithoutCrcCheck() { return parseData(false); }
|
|
|
|
|
|
|
|
ReturnValue_t PusTcReader::parseData(bool withCrc) {
|
2022-07-21 11:34:11 +02:00
|
|
|
if (pointers.spHeaderStart == nullptr or spReader.isNull()) {
|
|
|
|
return HasReturnvaluesIF::RETURN_FAILED;
|
|
|
|
}
|
|
|
|
ReturnValue_t result = spReader.checkSize();
|
2022-07-19 18:13:25 +02:00
|
|
|
if (result != HasReturnvaluesIF::RETURN_OK) {
|
|
|
|
return result;
|
|
|
|
}
|
2022-07-21 11:34:11 +02:00
|
|
|
if (spReader.getBufSize() < PusTcIF::MIN_SIZE) {
|
2022-07-19 18:13:25 +02:00
|
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
2022-07-18 18:36:41 +02:00
|
|
|
}
|
2022-07-21 11:34:11 +02:00
|
|
|
|
|
|
|
size_t currentOffset = SpacePacketReader::getHeaderLen();
|
|
|
|
pointers.secHeaderStart = pointers.spHeaderStart + currentOffset;
|
2022-07-19 18:13:25 +02:00
|
|
|
// Might become variable sized field in the future
|
2022-07-18 18:36:41 +02:00
|
|
|
// TODO: No support for spare bytes yet
|
2022-07-21 11:34:11 +02:00
|
|
|
currentOffset += ecss::PusTcDataFieldHeader::MIN_SIZE;
|
|
|
|
pointers.userDataStart = pointers.spHeaderStart + currentOffset;
|
|
|
|
appDataSize = spReader.getFullPacketLen() - currentOffset - sizeof(ecss::PusChecksumT);
|
2022-07-19 18:13:25 +02:00
|
|
|
pointers.crcStart = pointers.userDataStart + appDataSize;
|
2022-07-21 13:48:58 +02:00
|
|
|
if (withCrc) {
|
|
|
|
uint16_t crc16 = CRC::crc16ccitt(spReader.getFullData(), getFullPacketLen());
|
|
|
|
if (crc16 != 0) {
|
|
|
|
// Checksum failure
|
|
|
|
return PusIF::INVALID_CRC_16;
|
|
|
|
}
|
2022-07-21 11:34:11 +02:00
|
|
|
}
|
2022-07-19 18:13:25 +02:00
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t PusTcReader::getAcknowledgeFlags() const {
|
|
|
|
return (pointers.secHeaderStart[0] >> 4) & 0b1111;
|
2022-07-18 18:36:41 +02:00
|
|
|
}
|
|
|
|
|
2022-07-19 18:13:25 +02:00
|
|
|
uint8_t PusTcReader::getService() const { return pointers.secHeaderStart[1]; }
|
|
|
|
|
|
|
|
uint8_t PusTcReader::getSubService() const { return pointers.secHeaderStart[2]; }
|
|
|
|
uint16_t PusTcReader::getSourceId() const {
|
|
|
|
return (pointers.secHeaderStart[3] << 8) | pointers.secHeaderStart[4];
|
|
|
|
}
|
|
|
|
|
|
|
|
uint16_t PusTcReader::getErrorControl() const {
|
|
|
|
return pointers.crcStart[0] << 8 | pointers.crcStart[1];
|
|
|
|
}
|
2022-07-18 18:36:41 +02:00
|
|
|
|
2022-07-20 11:43:16 +02:00
|
|
|
uint16_t PusTcReader::getPacketIdRaw() const { return spReader.getPacketIdRaw(); }
|
|
|
|
uint16_t PusTcReader::getPacketSeqCtrlRaw() const { return spReader.getPacketSeqCtrlRaw(); }
|
2022-07-18 18:36:41 +02:00
|
|
|
uint16_t PusTcReader::getPacketDataLen() const { return spReader.getPacketDataLen(); }
|
|
|
|
uint8_t PusTcReader::getPusVersion() const { return spReader.getVersion(); }
|
2022-07-19 18:13:25 +02:00
|
|
|
const uint8_t* PusTcReader::getFullData() { return pointers.spHeaderStart; }
|
|
|
|
|
|
|
|
ReturnValue_t PusTcReader::setData(uint8_t* pData, size_t size_, void* args) {
|
|
|
|
pointers.spHeaderStart = pData;
|
2022-07-21 11:34:11 +02:00
|
|
|
return spReader.setReadOnlyData(pData, size_);
|
2022-07-19 18:13:25 +02:00
|
|
|
}
|
2022-07-20 22:21:15 +02:00
|
|
|
|
|
|
|
ReturnValue_t PusTcReader::setReadOnlyData(const uint8_t* data, size_t size_) {
|
2022-07-21 11:34:11 +02:00
|
|
|
return setData(const_cast<uint8_t*>(data), size_, nullptr);
|
2022-07-19 18:13:25 +02:00
|
|
|
}
|
2022-07-18 18:36:41 +02:00
|
|
|
|
2022-07-21 11:34:11 +02:00
|
|
|
const uint8_t* PusTcReader::getUserData() const { return pointers.userDataStart; }
|
|
|
|
size_t PusTcReader::getUserDataLen() const { return appDataSize; }
|
2022-07-20 22:21:15 +02:00
|
|
|
|
2022-07-18 18:36:41 +02:00
|
|
|
/*
|
|
|
|
void PusTcReader::print() {
|
|
|
|
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
|
|
|
sif::info << "TcPacketBase::print:" << std::endl;
|
|
|
|
#else
|
|
|
|
sif::printInfo("TcPacketBase::print:\n");
|
|
|
|
#endif
|
|
|
|
arrayprinter::print(getWholeData(), getFullSize());
|
|
|
|
}
|
|
|
|
*/
|