From 3147f67fbdde039fa3d98e9646fcb419b5842f25 Mon Sep 17 00:00:00 2001 From: Robin Mueller Date: Fri, 2 Sep 2022 18:03:52 +0200 Subject: [PATCH] basic dest handler framework almost complete --- src/fsfw/cfdp/handler/DestHandler.cpp | 30 ++++++++++++++++++++++++++- src/fsfw/cfdp/handler/DestHandler.h | 2 ++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/fsfw/cfdp/handler/DestHandler.cpp b/src/fsfw/cfdp/handler/DestHandler.cpp index e152cbd5..33947dcd 100644 --- a/src/fsfw/cfdp/handler/DestHandler.cpp +++ b/src/fsfw/cfdp/handler/DestHandler.cpp @@ -72,10 +72,14 @@ ReturnValue_t cfdp::DestHandler::performStateMachine() { } } if (step == TransactionStep::TRANSFER_COMPLETION) { + result = handleTransferCompletion(); + if (result != OK) { + status = result; + } } if (step == TransactionStep::SENDING_FINISHED_PDU) { } - return OK; + return status; } if (cfdpState == CfdpStates::BUSY_CLASS_2_ACKED) { // TODO: Will be implemented at a later stage @@ -200,6 +204,13 @@ ReturnValue_t cfdp::DestHandler::handleEofPdu(const cfdp::PacketInfo& info) { } tp.fileSize.setFileSize(fileSizeFromEof, std::nullopt); } + if (step == TransactionStep::RECEIVING_FILE_DATA_PDUS) { + if (cfdpState == CfdpStates::BUSY_CLASS_1_NACKED) { + step = TransactionStep::TRANSFER_COMPLETION; + } else if (cfdpState == CfdpStates::BUSY_CLASS_2_ACKED) { + step = TransactionStep::SENDING_ACK_PDU; + } + } return returnvalue::OK; } @@ -287,3 +298,20 @@ ReturnValue_t cfdp::DestHandler::startTransaction(MetadataPduReader& reader, Met } cfdp::CfdpStates cfdp::DestHandler::getCfdpState() const { return cfdpState; } + +ReturnValue_t cfdp::DestHandler::handleTransferCompletion() { + // TODO: Checksum verification and notice of completion + if (cfdpState == CfdpStates::BUSY_CLASS_1_NACKED) { + if (tp.closureRequested) { + step = TransactionStep::SENDING_FINISHED_PDU; + } else { + finish(); + } + } else if (cfdpState == CfdpStates::BUSY_CLASS_2_ACKED) { + step = TransactionStep::SENDING_FINISHED_PDU; + } +} + +void cfdp::DestHandler::finish() { + // TODO: Clear PDU list, reset state to be ready for next transfer +} diff --git a/src/fsfw/cfdp/handler/DestHandler.h b/src/fsfw/cfdp/handler/DestHandler.h index b24a35bc..9b607d65 100644 --- a/src/fsfw/cfdp/handler/DestHandler.h +++ b/src/fsfw/cfdp/handler/DestHandler.h @@ -123,6 +123,8 @@ class DestHandler { ReturnValue_t handleFileDataPdu(const PacketInfo& info); ReturnValue_t handleEofPdu(const PacketInfo& info); ReturnValue_t handleMetadataParseError(const uint8_t* rawData, size_t maxSize); + ReturnValue_t handleTransferCompletion(); + void finish(); }; } // namespace cfdp