2021-12-03 15:37:49 +01:00
|
|
|
#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>
|
|
|
|
|
2021-12-03 15:37:49 +01:00
|
|
|
#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;
|
2021-12-03 15:37:49 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @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-02-02 10:29:30 +01:00
|
|
|
class HeaderDeserializer : public RedirectableDataPointerIF, public PduHeaderIF {
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
HeaderDeserializer(const uint8_t* pduBuf, size_t maxSize);
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
/**
|
|
|
|
* This needs to be called before accessing the PDU fields to avoid segmentation faults.
|
|
|
|
* @return
|
|
|
|
* - RETURN_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();
|
|
|
|
size_t getHeaderSize() const;
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
size_t getPduDataFieldLen() const override;
|
|
|
|
size_t getWholePduSize() const override;
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
cfdp::PduType getPduType() const override;
|
|
|
|
cfdp::Direction getDirection() const override;
|
|
|
|
cfdp::TransmissionModes getTransmissionMode() const override;
|
|
|
|
bool getCrcFlag() const override;
|
|
|
|
bool getLargeFileFlag() const override;
|
|
|
|
cfdp::SegmentationControl getSegmentationControl() const override;
|
|
|
|
cfdp::WidthInBytes getLenEntityIds() const override;
|
|
|
|
cfdp::WidthInBytes getLenSeqNum() const override;
|
|
|
|
cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const override;
|
|
|
|
bool hasSegmentMetadataFlag() const override;
|
2021-12-03 15:37:49 +01:00
|
|
|
|
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;
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-08-15 20:28:16 +02:00
|
|
|
ReturnValue_t deserResult = returnvalue::OK;
|
2021-12-03 15:37:49 +01: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
|
|
|
|
*/
|
|
|
|
ReturnValue_t setData(uint8_t* dataPtr, size_t maxSize, void* args = nullptr) override;
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
size_t getMaxSize() const;
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
protected:
|
|
|
|
PduHeaderFixedStruct* fixedHeader = nullptr;
|
|
|
|
const uint8_t* rawPtr = nullptr;
|
|
|
|
size_t maxSize = 0;
|
2021-12-03 15:37:49 +01:00
|
|
|
|
2022-02-02 10:29:30 +01:00
|
|
|
private:
|
|
|
|
void assignVarLenField(cfdp::VarLenField* field, cfdp::WidthInBytes width, void* sourcePtr) const;
|
|
|
|
void* sourceIdRaw = nullptr;
|
|
|
|
void* seqNumRaw = nullptr;
|
|
|
|
void* destIdRaw = nullptr;
|
2021-12-03 15:37:49 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* FSFW_SRC_FSFW_CFDP_PDU_HEADERDESERIALIZER_H_ */
|