2022-08-03 15:22:39 +02:00
|
|
|
#include "HeaderReader.h"
|
2022-02-02 10:29:30 +01:00
|
|
|
|
|
|
|
#include <fsfw/serialize/SerializeAdapter.h>
|
|
|
|
|
2021-12-03 15:37:49 +01:00
|
|
|
#include <cstring>
|
|
|
|
|
2022-08-08 18:29:32 +02:00
|
|
|
HeaderReader::HeaderReader(const uint8_t *pduBuf, size_t maxSize) { setData(pduBuf, maxSize); }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
ReturnValue_t HeaderReader::parseData() {
|
2022-08-09 11:03:22 +02:00
|
|
|
if (pointers.rawPtr == nullptr) {
|
2022-08-22 16:35:53 +02:00
|
|
|
return returnvalue::FAILED;
|
2022-08-08 18:29:32 +02:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
if (maxSize < 7) {
|
|
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
|
|
}
|
2022-08-09 11:03:22 +02:00
|
|
|
pointers.fixedHeader =
|
|
|
|
reinterpret_cast<PduHeaderFixedStruct *>(const_cast<uint8_t *>(pointers.rawPtr));
|
2022-08-08 18:29:32 +02:00
|
|
|
sourceIdRaw = static_cast<uint8_t *>(&pointers.fixedHeader->variableFieldsStart);
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::WidthInBytes widthEntityIds = getLenEntityIds();
|
|
|
|
cfdp::WidthInBytes widthSeqNum = getLenSeqNum();
|
|
|
|
seqNumRaw = static_cast<uint8_t *>(sourceIdRaw) + static_cast<uint8_t>(widthEntityIds);
|
|
|
|
destIdRaw = static_cast<uint8_t *>(seqNumRaw) + static_cast<uint8_t>(widthSeqNum);
|
2022-08-22 16:35:53 +02:00
|
|
|
return returnvalue::OK;
|
2022-08-08 18:29:32 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ReturnValue_t HeaderReader::setData(uint8_t *dataPtr, size_t maxSize_, void *args) {
|
2022-08-09 11:03:22 +02:00
|
|
|
if (dataPtr == nullptr) {
|
2022-08-22 16:35:53 +02:00
|
|
|
return returnvalue::FAILED;
|
2022-08-09 11:03:22 +02:00
|
|
|
}
|
2022-08-08 18:29:32 +02:00
|
|
|
if (maxSize_ < 7) {
|
|
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
|
|
}
|
|
|
|
pointers.rawPtr = dataPtr;
|
2022-08-03 15:22:39 +02:00
|
|
|
maxSize = maxSize_;
|
2022-08-22 16:35:53 +02:00
|
|
|
return returnvalue::OK;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
size_t HeaderReader::getHeaderSize() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
if (pointers.fixedHeader != nullptr) {
|
2022-02-02 10:29:30 +01:00
|
|
|
return getLenEntityIds() * 2 + getLenSeqNum() + 4;
|
|
|
|
}
|
|
|
|
return 0;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
size_t HeaderReader::getPduDataFieldLen() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
return (pointers.fixedHeader->pduDataFieldLenH << 8) | pointers.fixedHeader->pduDataFieldLenL;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 16:00:48 +02:00
|
|
|
size_t HeaderReader::getWholePduSize() const {
|
|
|
|
return getPduDataFieldLen() + HeaderReader::getHeaderSize();
|
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
cfdp::PduType HeaderReader::getPduType() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
return static_cast<cfdp::PduType>((pointers.fixedHeader->firstByte >> 4) & 0x01);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
cfdp::Direction HeaderReader::getDirection() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
return static_cast<cfdp::Direction>((pointers.fixedHeader->firstByte >> 3) & 0x01);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
cfdp::TransmissionModes HeaderReader::getTransmissionMode() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
return static_cast<cfdp::TransmissionModes>((pointers.fixedHeader->firstByte >> 2) & 0x01);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-08 18:29:32 +02:00
|
|
|
bool HeaderReader::getCrcFlag() const { return (pointers.fixedHeader->firstByte >> 1) & 0x01; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-08 18:29:32 +02:00
|
|
|
bool HeaderReader::getLargeFileFlag() const { return pointers.fixedHeader->firstByte & 0x01; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
cfdp::SegmentationControl HeaderReader::getSegmentationControl() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
return static_cast<cfdp::SegmentationControl>((pointers.fixedHeader->fourthByte >> 7) & 0x01);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
cfdp::WidthInBytes HeaderReader::getLenEntityIds() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
return static_cast<cfdp::WidthInBytes>((pointers.fixedHeader->fourthByte >> 4) & 0x07);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
cfdp::WidthInBytes HeaderReader::getLenSeqNum() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
return static_cast<cfdp::WidthInBytes>(pointers.fixedHeader->fourthByte & 0x07);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
cfdp::SegmentMetadataFlag HeaderReader::getSegmentMetadataFlag() const {
|
2022-08-08 18:29:32 +02:00
|
|
|
return static_cast<cfdp::SegmentMetadataFlag>((pointers.fixedHeader->fourthByte >> 3) & 0x01);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
void HeaderReader::getSourceId(cfdp::EntityId &sourceId) const {
|
2022-02-02 10:29:30 +01:00
|
|
|
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&sourceId), getLenEntityIds(),
|
|
|
|
this->sourceIdRaw);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
void HeaderReader::getDestId(cfdp::EntityId &destId) const {
|
2022-02-02 10:29:30 +01:00
|
|
|
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&destId), getLenEntityIds(), this->destIdRaw);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
void HeaderReader::getTransactionSeqNum(cfdp::TransactionSeqNum &seqNum) const {
|
2022-02-02 10:29:30 +01:00
|
|
|
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&seqNum), getLenSeqNum(), this->seqNumRaw);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
void HeaderReader::assignVarLenField(cfdp::VarLenField *field, cfdp::WidthInBytes width,
|
|
|
|
void *sourcePtr) const {
|
2022-02-02 10:29:30 +01:00
|
|
|
switch (width) {
|
|
|
|
case (cfdp::WidthInBytes::ONE_BYTE): {
|
2022-08-03 15:22:39 +02:00
|
|
|
auto *fieldTyped = static_cast<uint8_t *>(sourcePtr);
|
2022-02-02 10:29:30 +01:00
|
|
|
field->setValue(width, *fieldTyped);
|
|
|
|
break;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
case (cfdp::WidthInBytes::TWO_BYTES): {
|
|
|
|
uint16_t fieldTyped = 0;
|
|
|
|
size_t deserSize = 0;
|
|
|
|
SerializeAdapter::deSerialize(&fieldTyped, static_cast<uint8_t *>(sourcePtr), &deserSize,
|
|
|
|
SerializeIF::Endianness::NETWORK);
|
|
|
|
field->setValue(width, fieldTyped);
|
|
|
|
break;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
case (cfdp::WidthInBytes::FOUR_BYTES): {
|
|
|
|
uint32_t fieldTyped = 0;
|
|
|
|
size_t deserSize = 0;
|
|
|
|
SerializeAdapter::deSerialize(&fieldTyped, static_cast<uint8_t *>(sourcePtr), &deserSize,
|
|
|
|
SerializeIF::Endianness::NETWORK);
|
|
|
|
field->setValue(width, fieldTyped);
|
|
|
|
break;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
size_t HeaderReader::getMaxSize() const { return maxSize; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
bool HeaderReader::hasSegmentMetadataFlag() const {
|
2022-02-02 10:29:30 +01:00
|
|
|
if (this->getSegmentMetadataFlag() == cfdp::SegmentMetadataFlag::PRESENT) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
2022-08-03 15:22:39 +02:00
|
|
|
|
|
|
|
ReturnValue_t HeaderReader::setData(const uint8_t *dataPtr, size_t maxSize_) {
|
|
|
|
return setData(const_cast<uint8_t *>(dataPtr), maxSize_, nullptr);
|
|
|
|
}
|
2022-08-08 18:29:32 +02:00
|
|
|
bool HeaderReader::isNull() const {
|
|
|
|
return pointers.rawPtr == nullptr or pointers.fixedHeader == nullptr;
|
|
|
|
}
|
|
|
|
|
2022-08-09 10:59:24 +02:00
|
|
|
HeaderReader::operator bool() const { return not isNull(); }
|
2022-08-23 20:30:41 +02:00
|
|
|
|
|
|
|
void HeaderReader::fillConfig(PduConfig &cfg) const {
|
|
|
|
cfg.largeFile = getLargeFileFlag();
|
|
|
|
cfg.crcFlag = getCrcFlag();
|
|
|
|
cfg.mode = getTransmissionMode();
|
|
|
|
cfg.direction = getDirection();
|
|
|
|
getTransactionSeqNum(cfg.seqNum);
|
|
|
|
getSourceId(cfg.sourceId);
|
|
|
|
getDestId(cfg.destId);
|
|
|
|
}
|