fsfw/src/fsfw/cfdp/pdu/PduHeaderReader.h

115 lines
3.7 KiB
C
Raw Normal View History

#ifndef FSFW_SRC_FSFW_CFDP_PDU_HEADERDESERIALIZER_H_
#define FSFW_SRC_FSFW_CFDP_PDU_HEADERDESERIALIZER_H_
2022-02-02 10:29:30 +01:00
#include <cstddef>
#include <cstdint>
#include "PduConfig.h"
#include "PduHeaderIF.h"
#include "fsfw/serialize/SerializeIF.h"
#include "fsfw/tmtcpacket/RedirectableDataPointerIF.h"
struct PduHeaderFixedStruct {
2022-02-02 10:29:30 +01:00
uint8_t firstByte;
uint8_t pduDataFieldLenH;
uint8_t pduDataFieldLenL;
uint8_t fourthByte;
uint8_t variableFieldsStart;
};
/**
* @brief This class is used to deserialize a PDU header from raw memory.
* @details
* This is a zero-copy implementation and #parseData needs to be called to ensure the data is
* valid.
*/
2022-09-08 11:08:40 +02:00
class PduHeaderReader : public RedirectableDataPointerIF, public PduHeaderIF {
2022-02-02 10:29:30 +01:00
public:
2022-09-08 11:08:40 +02:00
PduHeaderReader() = default;
2022-02-02 10:29:30 +01:00
/**
* Initialize a PDU header from raw data. This is a zero-copy implementation and #parseData
* needs to be called to ensure the data is valid
* @param pduBuf
* @param maxSize
*/
2022-09-08 11:08:40 +02:00
PduHeaderReader(const uint8_t* pduBuf, size_t maxSize);
2022-02-02 10:29:30 +01:00
/**
* This needs to be called before accessing the PDU fields to avoid segmentation faults.
* @return
2022-08-16 12:12:21 +02:00
* - returnvalue::OK on parse success
2022-08-15 20:28:16 +02:00
* - returnvalue::FAILED Invalid raw data
2022-02-02 10:29:30 +01:00
* - SerializeIF::BUFFER_TOO_SHORT if buffer is shorter than expected
*/
virtual ReturnValue_t parseData();
2022-08-08 18:29:32 +02:00
explicit operator bool() const;
[[nodiscard]] bool isNull() const;
2022-08-23 20:30:41 +02:00
/**
* Fill the provided PDU configuration from the fields detected by this reader.
* @param cfg
*/
void fillConfig(PduConfig& cfg) const;
2022-08-03 16:00:48 +02:00
[[nodiscard]] virtual size_t getHeaderSize() const;
2022-08-03 15:22:39 +02:00
[[nodiscard]] size_t getPduDataFieldLen() const override;
[[nodiscard]] size_t getWholePduSize() const override;
2022-09-15 18:41:15 +02:00
[[nodiscard]] cfdp::PduType getPduType() const override;
2022-08-03 15:22:39 +02:00
[[nodiscard]] cfdp::Direction getDirection() const override;
2022-09-15 18:41:15 +02:00
[[nodiscard]] cfdp::TransmissionMode getTransmissionMode() const override;
2022-08-03 15:22:39 +02:00
[[nodiscard]] bool getCrcFlag() const override;
[[nodiscard]] bool getLargeFileFlag() const override;
[[nodiscard]] cfdp::SegmentationControl getSegmentationControl() const override;
[[nodiscard]] cfdp::WidthInBytes getLenEntityIds() const override;
[[nodiscard]] cfdp::WidthInBytes getLenSeqNum() const override;
[[nodiscard]] cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const override;
[[nodiscard]] bool hasSegmentMetadataFlag() const override;
2022-02-02 10:29:30 +01:00
void getSourceId(cfdp::EntityId& sourceId) const override;
void getDestId(cfdp::EntityId& destId) const override;
void getTransactionSeqNum(cfdp::TransactionSeqNum& seqNum) const override;
2022-08-15 20:28:16 +02:00
ReturnValue_t deserResult = returnvalue::OK;
2022-08-03 15:22:39 +02:00
[[nodiscard]] size_t getMaxSize() const;
2022-09-08 11:08:40 +02:00
[[nodiscard]] const uint8_t* getPduDataField() const;
2022-08-03 15:22:39 +02:00
2022-02-02 10:29:30 +01:00
/**
* Can also be used to reset the pointer to a nullptr, but the getter functions will not
* perform nullptr checks!
* @param dataPtr
* @param maxSize
* @param args
* @return
*/
2022-09-08 11:08:40 +02:00
ReturnValue_t setReadOnlyData(const uint8_t* dataPtr, size_t maxSize);
2022-02-02 10:29:30 +01:00
protected:
2022-08-08 18:29:32 +02:00
struct Pointers {
PduHeaderFixedStruct* fixedHeader = nullptr;
2022-09-08 11:08:40 +02:00
const uint8_t* dataFieldStart = nullptr;
2022-08-08 18:29:32 +02:00
const uint8_t* rawPtr = nullptr;
};
Pointers pointers;
2022-02-02 10:29:30 +01:00
size_t maxSize = 0;
2022-02-02 10:29:30 +01:00
private:
2022-08-03 15:22:39 +02:00
/**
2022-09-08 11:08:40 +02:00
* This is a reader class and setting mutable data is forbidden. Use @setReadOnlyData instead.
2022-08-03 15:22:39 +02:00
* @param dataPtr
* @param maxSize
* @param args
* @return
*/
ReturnValue_t setData(uint8_t* dataPtr, size_t maxSize, void* args) override;
2022-02-02 10:29:30 +01:00
void assignVarLenField(cfdp::VarLenField* field, cfdp::WidthInBytes width, void* sourcePtr) const;
void* sourceIdRaw = nullptr;
void* seqNumRaw = nullptr;
void* destIdRaw = nullptr;
};
#endif /* FSFW_SRC_FSFW_CFDP_PDU_HEADERDESERIALIZER_H_ */