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-03 15:22:39 +02:00
|
|
|
HeaderReader::HeaderReader(const uint8_t *pduBuf, size_t maxSize)
|
2022-02-02 10:29:30 +01:00
|
|
|
: rawPtr(pduBuf), maxSize(maxSize) {}
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
ReturnValue_t HeaderReader::parseData() {
|
2022-02-02 10:29:30 +01:00
|
|
|
if (maxSize < 7) {
|
|
|
|
return SerializeIF::STREAM_TOO_SHORT;
|
|
|
|
}
|
|
|
|
return setData(const_cast<uint8_t *>(rawPtr), maxSize);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
ReturnValue_t HeaderReader::setData(uint8_t *dataPtr, size_t maxSize_, void *args) {
|
2022-02-02 10:29:30 +01:00
|
|
|
if (dataPtr == nullptr) {
|
|
|
|
// Allowed for now
|
|
|
|
this->fixedHeader = nullptr;
|
2021-12-03 15:37:49 +01:00
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
2022-02-02 10:29:30 +01:00
|
|
|
}
|
|
|
|
this->fixedHeader = reinterpret_cast<PduHeaderFixedStruct *>(const_cast<uint8_t *>(dataPtr));
|
|
|
|
sourceIdRaw = static_cast<uint8_t *>(&fixedHeader->variableFieldsStart);
|
|
|
|
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-03 15:22:39 +02:00
|
|
|
maxSize = maxSize_;
|
2022-02-02 10:29:30 +01:00
|
|
|
return HasReturnvaluesIF::RETURN_OK;
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
size_t HeaderReader::getHeaderSize() const {
|
2022-02-02 10:29:30 +01:00
|
|
|
if (fixedHeader != nullptr) {
|
|
|
|
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-03 16:00:48 +02:00
|
|
|
return (fixedHeader->pduDataFieldLenH << 8) | 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-02-02 10:29:30 +01:00
|
|
|
return static_cast<cfdp::PduType>((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-02-02 10:29:30 +01:00
|
|
|
return static_cast<cfdp::Direction>((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-02-02 10:29:30 +01:00
|
|
|
return static_cast<cfdp::TransmissionModes>((fixedHeader->firstByte >> 2) & 0x01);
|
2021-12-03 15:37:49 +01:00
|
|
|
}
|
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
bool HeaderReader::getCrcFlag() const { return (fixedHeader->firstByte >> 1) & 0x01; }
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-03 15:22:39 +02:00
|
|
|
bool HeaderReader::getLargeFileFlag() const { return 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-02-02 10:29:30 +01:00
|
|
|
return static_cast<cfdp::SegmentationControl>((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-02-02 10:29:30 +01:00
|
|
|
return static_cast<cfdp::WidthInBytes>((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-02-02 10:29:30 +01:00
|
|
|
return static_cast<cfdp::WidthInBytes>(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-02-02 10:29:30 +01:00
|
|
|
return static_cast<cfdp::SegmentMetadataFlag>((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);
|
|
|
|
}
|