#ifndef FSFW_CFDP_CFDPSOURCEHANDLER_H #define FSFW_CFDP_CFDPSOURCEHANDLER_H #include #include #include "UserBase.h" #include "defs.h" #include "fsfw/cfdp/FileSize.h" #include "fsfw/cfdp/handler/mib.h" #include "fsfw/events/EventReportingProxyIF.h" #include "fsfw/storagemanager/StorageManagerIF.h" #include "fsfw/tmtcservices/AcceptsTelemetryIF.h" namespace cfdp { struct SourceHandlerParams { SourceHandlerParams(LocalEntityCfg cfg, UserBase& user) : cfg(std::move(cfg)), user(user) {} LocalEntityCfg cfg; UserBase& user; size_t maxFilePathSize = 256; }; class SourceHandler { public: struct FsmResult { public: ReturnValue_t result = returnvalue::OK; CallStatus callStatus = CallStatus::CALL_AFTER_DELAY; CfdpState state = CfdpState::IDLE; uint32_t packetsSent = 0; uint8_t errors = 0; std::array errorCodes = {}; }; SourceHandler(SourceHandlerParams params, FsfwParams fsfwParams); /** * Pass a put request to the source handler, which might initiate a CFDP transaction and start * the state machine * @return */ ReturnValue_t putRequest(PutRequestFull& putRequest, RemoteEntityCfg& cfg); FsmResult& stateMachine(); ReturnValue_t initialize(); private: enum class TransactionStep : uint8_t { IDLE = 0, TRANSACTION_START = 1, CRC_PROCEDURE = 2, SENDING_METADATA = 3, SENDING_FILE_DATA = 4, SENDING_EOF = 5, WAIT_FOR_ACK = 6, WAIT_FOR_FINISH = 7, NOTICE_OF_COMPLETION = 8 }; struct TransactionParams { uint32_t crc{}; std::array sourceName{}; size_t sourceNameSize = 0; std::array destName{}; size_t destNameSize = 0; cfdp::FileSize fileSize; size_t currentFilePos = 0; bool closureRequested = false; PduConfig pduConf; } transactionParams; cfdp::CfdpState state = cfdp::CfdpState::IDLE; TransactionStep step = TransactionStep::IDLE; SourceHandlerParams sourceParams; cfdp::FsfwParams fsfwParams; RemoteEntityCfg currentRemoteCfg; FsmResult fsmResult; FsmResult& fsmNacked(); ReturnValue_t checksumGeneration(); ReturnValue_t prepareAndSendMetadataPdu(); ReturnValue_t prepareAndSendNextFileDataPdu(); ReturnValue_t prepareAndSendEofPdu(); }; } // namespace cfdp #endif // FSFW_CFDP_CFDPSOURCEHANDLER_H