fsfw/src/fsfw/cfdp/pdu/HeaderReader.cpp

161 lines
5.5 KiB
C++
Raw Normal View History

2022-02-02 10:29:30 +01:00
#include <fsfw/serialize/SerializeAdapter.h>
#include <cstring>
2022-09-08 11:08:40 +02:00
#include "PduHeaderReader.h"
PduHeaderReader::PduHeaderReader(const uint8_t *pduBuf, size_t maxSize) {
setReadOnlyData(pduBuf, maxSize);
}
2022-09-08 11:08:40 +02:00
ReturnValue_t PduHeaderReader::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-09-08 11:08:40 +02:00
if (getWholePduSize() > PduHeaderReader::getHeaderSize()) {
pointers.dataFieldStart = reinterpret_cast<const uint8_t *>(destIdRaw) + widthEntityIds;
} else {
pointers.dataFieldStart = nullptr;
}
2022-08-22 16:35:53 +02:00
return returnvalue::OK;
2022-08-08 18:29:32 +02:00
}
2022-09-08 11:08:40 +02:00
ReturnValue_t PduHeaderReader::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;
}
2022-09-08 11:08:40 +02:00
size_t PduHeaderReader::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;
}
2022-09-08 11:08:40 +02:00
size_t PduHeaderReader::getPduDataFieldLen() const {
2022-08-08 18:29:32 +02:00
return (pointers.fixedHeader->pduDataFieldLenH << 8) | pointers.fixedHeader->pduDataFieldLenL;
}
2022-09-08 11:08:40 +02:00
size_t PduHeaderReader::getWholePduSize() const {
return getPduDataFieldLen() + PduHeaderReader::getHeaderSize();
2022-08-03 16:00:48 +02:00
}
2022-09-15 18:41:15 +02:00
cfdp::PduType PduHeaderReader::getPduType() const {
return static_cast<cfdp::PduType>((pointers.fixedHeader->firstByte >> 4) & 0x01);
}
2022-09-08 11:08:40 +02:00
cfdp::Direction PduHeaderReader::getDirection() const {
2022-08-08 18:29:32 +02:00
return static_cast<cfdp::Direction>((pointers.fixedHeader->firstByte >> 3) & 0x01);
}
2022-09-15 18:41:15 +02:00
cfdp::TransmissionMode PduHeaderReader::getTransmissionMode() const {
return static_cast<cfdp::TransmissionMode>((pointers.fixedHeader->firstByte >> 2) & 0x01);
}
2022-09-08 11:08:40 +02:00
bool PduHeaderReader::getCrcFlag() const { return (pointers.fixedHeader->firstByte >> 1) & 0x01; }
2022-09-08 11:08:40 +02:00
bool PduHeaderReader::getLargeFileFlag() const { return pointers.fixedHeader->firstByte & 0x01; }
2022-09-08 11:08:40 +02:00
cfdp::SegmentationControl PduHeaderReader::getSegmentationControl() const {
2022-08-08 18:29:32 +02:00
return static_cast<cfdp::SegmentationControl>((pointers.fixedHeader->fourthByte >> 7) & 0x01);
}
2022-09-08 11:08:40 +02:00
cfdp::WidthInBytes PduHeaderReader::getLenEntityIds() const {
2022-08-08 18:29:32 +02:00
return static_cast<cfdp::WidthInBytes>((pointers.fixedHeader->fourthByte >> 4) & 0x07);
}
2022-09-08 11:08:40 +02:00
cfdp::WidthInBytes PduHeaderReader::getLenSeqNum() const {
2022-08-08 18:29:32 +02:00
return static_cast<cfdp::WidthInBytes>(pointers.fixedHeader->fourthByte & 0x07);
}
2022-09-08 11:08:40 +02:00
cfdp::SegmentMetadataFlag PduHeaderReader::getSegmentMetadataFlag() const {
2022-08-08 18:29:32 +02:00
return static_cast<cfdp::SegmentMetadataFlag>((pointers.fixedHeader->fourthByte >> 3) & 0x01);
}
2022-09-08 11:08:40 +02:00
void PduHeaderReader::getSourceId(cfdp::EntityId &sourceId) const {
2022-02-02 10:29:30 +01:00
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&sourceId), getLenEntityIds(),
this->sourceIdRaw);
}
2022-09-08 11:08:40 +02:00
void PduHeaderReader::getDestId(cfdp::EntityId &destId) const {
2022-02-02 10:29:30 +01:00
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&destId), getLenEntityIds(), this->destIdRaw);
}
2022-09-08 11:08:40 +02:00
void PduHeaderReader::getTransactionSeqNum(cfdp::TransactionSeqNum &seqNum) const {
2022-02-02 10:29:30 +01:00
assignVarLenField(dynamic_cast<cfdp::VarLenField *>(&seqNum), getLenSeqNum(), this->seqNumRaw);
}
2022-09-08 11:08:40 +02:00
void PduHeaderReader::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;
}
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;
}
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;
}
2022-02-02 10:29:30 +01:00
}
}
2022-09-08 11:08:40 +02:00
size_t PduHeaderReader::getMaxSize() const { return maxSize; }
2022-09-08 11:08:40 +02:00
bool PduHeaderReader::hasSegmentMetadataFlag() const {
2022-02-02 10:29:30 +01:00
if (this->getSegmentMetadataFlag() == cfdp::SegmentMetadataFlag::PRESENT) {
return true;
}
return false;
}
2022-08-03 15:22:39 +02:00
2022-09-08 11:08:40 +02:00
ReturnValue_t PduHeaderReader::setReadOnlyData(const uint8_t *dataPtr, size_t maxSize_) {
2022-08-03 15:22:39 +02:00
return setData(const_cast<uint8_t *>(dataPtr), maxSize_, nullptr);
}
2022-09-08 11:08:40 +02:00
bool PduHeaderReader::isNull() const {
2022-08-08 18:29:32 +02:00
return pointers.rawPtr == nullptr or pointers.fixedHeader == nullptr;
}
2022-09-08 11:08:40 +02:00
PduHeaderReader::operator bool() const { return not isNull(); }
2022-08-23 20:30:41 +02:00
2022-09-08 11:08:40 +02:00
void PduHeaderReader::fillConfig(PduConfig &cfg) const {
2022-08-23 20:30:41 +02:00
cfg.largeFile = getLargeFileFlag();
cfg.crcFlag = getCrcFlag();
cfg.mode = getTransmissionMode();
cfg.direction = getDirection();
getTransactionSeqNum(cfg.seqNum);
getSourceId(cfg.sourceId);
getDestId(cfg.destId);
}
2022-09-08 11:08:40 +02:00
const uint8_t *PduHeaderReader::getPduDataField() const { return pointers.dataFieldStart; }