start file data pdu processing
This commit is contained in:
parent
dc79b7ba00
commit
eae75b29e7
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#include "fsfw/cfdp/pdu/FileDataReader.h"
|
||||||
#include "fsfw/cfdp/pdu/HeaderReader.h"
|
#include "fsfw/cfdp/pdu/HeaderReader.h"
|
||||||
#include "fsfw/objectmanager.h"
|
#include "fsfw/objectmanager.h"
|
||||||
#include "fsfw/serviceinterface.h"
|
#include "fsfw/serviceinterface.h"
|
||||||
@ -18,28 +19,41 @@ cfdp::DestHandler::DestHandler(DestHandlerParams params, FsfwParams fsfwParams)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t cfdp::DestHandler::performStateMachine() {
|
ReturnValue_t cfdp::DestHandler::performStateMachine() {
|
||||||
if (step == TransactionStep::IDLE) {
|
|
||||||
ReturnValue_t status = returnvalue::OK;
|
|
||||||
ReturnValue_t result;
|
ReturnValue_t result;
|
||||||
for(auto infoIter = dp.packetListRef.begin(); infoIter != dp.packetListRef.end();) {
|
ReturnValue_t status = returnvalue::OK;
|
||||||
|
if (step == TransactionStep::IDLE) {
|
||||||
|
for (auto infoIter = dp.packetListRef.begin(); infoIter != dp.packetListRef.end();) {
|
||||||
if (infoIter->pduType == PduType::FILE_DIRECTIVE and
|
if (infoIter->pduType == PduType::FILE_DIRECTIVE and
|
||||||
infoIter->directiveType == FileDirectives::METADATA) {
|
infoIter->directiveType == FileDirectives::METADATA) {
|
||||||
result = handleMetadataPdu(*infoIter);
|
result = handleMetadataPdu(*infoIter);
|
||||||
if (result != OK) {
|
if (result != OK) {
|
||||||
status = result;
|
status = result;
|
||||||
}
|
}
|
||||||
fp.tcStore->deleteData(infoIter->storeId);
|
// metadata packet was deleted in metadata handler because a store guard is used
|
||||||
dp.packetListRef.erase(infoIter++);
|
dp.packetListRef.erase(infoIter++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (step == TransactionStep::IDLE) {
|
||||||
|
// To decrease the already high complexity of the software, all packets arriving before
|
||||||
|
// a metadata PDU are deleted.
|
||||||
|
for (auto infoIter = dp.packetListRef.begin(); infoIter != dp.packetListRef.end();) {
|
||||||
|
fp.tcStore->deleteData(infoIter->storeId);
|
||||||
|
}
|
||||||
|
dp.packetListRef.clear();
|
||||||
|
}
|
||||||
|
|
||||||
if (step != TransactionStep::IDLE) {
|
if (step != TransactionStep::IDLE) {
|
||||||
return CALL_FSM_AGAIN;
|
return CALL_FSM_AGAIN;
|
||||||
}
|
}
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
if (cfdpState == CfdpStates::BUSY_CLASS_1_NACKED) {
|
if (cfdpState == CfdpStates::BUSY_CLASS_1_NACKED) {
|
||||||
for (const auto& info : dp.packetListRef) {
|
for (auto infoIter = dp.packetListRef.begin(); infoIter != dp.packetListRef.end();) {
|
||||||
if (info.pduType == PduType::FILE_DATA) {
|
if (infoIter->pduType == PduType::FILE_DATA) {
|
||||||
|
result = handleFileDataPdu(*infoIter);
|
||||||
|
if (result != OK) {
|
||||||
|
status = result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
@ -77,6 +91,7 @@ ReturnValue_t cfdp::DestHandler::initialize() {
|
|||||||
}
|
}
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReturnValue_t cfdp::DestHandler::handleMetadataPdu(const PacketInfo& info) {
|
ReturnValue_t cfdp::DestHandler::handleMetadataPdu(const PacketInfo& info) {
|
||||||
// Process metadata PDU
|
// Process metadata PDU
|
||||||
auto constAccessorPair = fp.tcStore->getData(info.storeId);
|
auto constAccessorPair = fp.tcStore->getData(info.storeId);
|
||||||
@ -102,6 +117,19 @@ ReturnValue_t cfdp::DestHandler::handleMetadataPdu(const PacketInfo& info) {
|
|||||||
return startTransaction(reader, metadataInfo);
|
return startTransaction(reader, metadataInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReturnValue_t cfdp::DestHandler::handleFileDataPdu(const cfdp::PacketInfo& info) {
|
||||||
|
// Process file data PDU
|
||||||
|
auto constAccessorPair = fp.tcStore->getData(info.storeId);
|
||||||
|
if (constAccessorPair.first != OK) {
|
||||||
|
// TODO: This is not a CFDP error. Event and/or warning?
|
||||||
|
cfdp::FileSize offset;
|
||||||
|
FileDataInfo fdInfo(offset);
|
||||||
|
FileDataReader reader(constAccessorPair.second.data(), constAccessorPair.second.size(), fdInfo);
|
||||||
|
return constAccessorPair.first;
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t cfdp::DestHandler::handleMetadataParseError(const uint8_t* rawData, size_t maxSize) {
|
ReturnValue_t cfdp::DestHandler::handleMetadataParseError(const uint8_t* rawData, size_t maxSize) {
|
||||||
// TODO: try to extract destination ID for error
|
// TODO: try to extract destination ID for error
|
||||||
// TODO: Invalid metadata PDU.
|
// TODO: Invalid metadata PDU.
|
||||||
|
@ -77,6 +77,7 @@ class DestHandler {
|
|||||||
ReturnValue_t initialize();
|
ReturnValue_t initialize();
|
||||||
|
|
||||||
ReturnValue_t handleMetadataPdu(const PacketInfo& info);
|
ReturnValue_t handleMetadataPdu(const PacketInfo& info);
|
||||||
|
ReturnValue_t handleFileDataPdu(const PacketInfo& info);
|
||||||
ReturnValue_t handleMetadataParseError(const uint8_t* rawData, size_t maxSize);
|
ReturnValue_t handleMetadataParseError(const uint8_t* rawData, size_t maxSize);
|
||||||
|
|
||||||
[[nodiscard]] CfdpStates getCfdpState() const;
|
[[nodiscard]] CfdpStates getCfdpState() const;
|
||||||
|
@ -6,25 +6,25 @@
|
|||||||
|
|
||||||
class FileDataInfo {
|
class FileDataInfo {
|
||||||
public:
|
public:
|
||||||
FileDataInfo(cfdp::FileSize& offset);
|
explicit FileDataInfo(cfdp::FileSize& offset);
|
||||||
FileDataInfo(cfdp::FileSize& offset, const uint8_t* fileData, size_t fileSize);
|
FileDataInfo(cfdp::FileSize& offset, const uint8_t* fileData, size_t fileSize);
|
||||||
|
|
||||||
size_t getSerializedSize(bool largeFile = false) const;
|
[[nodiscard]] size_t getSerializedSize(bool largeFile = false) const;
|
||||||
|
|
||||||
cfdp::FileSize& getOffset();
|
cfdp::FileSize& getOffset();
|
||||||
const uint8_t* getFileData(size_t* fileSize = nullptr) const;
|
const uint8_t* getFileData(size_t* fileSize = nullptr) const;
|
||||||
void setFileData(const uint8_t* fileData, size_t fileSize);
|
void setFileData(const uint8_t* fileData, size_t fileSize);
|
||||||
|
|
||||||
cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const;
|
[[nodiscard]] cfdp::SegmentMetadataFlag getSegmentMetadataFlag() const;
|
||||||
cfdp::SegmentationControl getSegmentationControl() const;
|
[[nodiscard]] cfdp::SegmentationControl getSegmentationControl() const;
|
||||||
cfdp::RecordContinuationState getRecordContinuationState() const;
|
[[nodiscard]] cfdp::RecordContinuationState getRecordContinuationState() const;
|
||||||
void setRecordContinuationState(cfdp::RecordContinuationState recContState);
|
void setRecordContinuationState(cfdp::RecordContinuationState recContState);
|
||||||
void setSegmentationControl(cfdp::SegmentationControl segCtrl);
|
void setSegmentationControl(cfdp::SegmentationControl segCtrl);
|
||||||
|
|
||||||
size_t getSegmentMetadataLen() const;
|
[[nodiscard]] size_t getSegmentMetadataLen() const;
|
||||||
void setSegmentMetadataLen(size_t len);
|
void setSegmentMetadataLen(size_t len);
|
||||||
void setSegmentMetadata(const uint8_t* ptr);
|
void setSegmentMetadata(const uint8_t* ptr);
|
||||||
bool hasSegmentMetadata() const;
|
[[nodiscard]] bool hasSegmentMetadata() const;
|
||||||
void setSegmentMetadataFlag(bool enable);
|
void setSegmentMetadataFlag(bool enable);
|
||||||
ReturnValue_t addSegmentMetadataInfo(cfdp::RecordContinuationState recContState,
|
ReturnValue_t addSegmentMetadataInfo(cfdp::RecordContinuationState recContState,
|
||||||
const uint8_t* segmentMetadata, size_t segmentMetadataLen);
|
const uint8_t* segmentMetadata, size_t segmentMetadataLen);
|
||||||
|
Loading…
Reference in New Issue
Block a user