#ifndef FSFW_CFDP_CFDPSOURCEHANDLER_H #define FSFW_CFDP_CFDPSOURCEHANDLER_H #include #include #include "UserBase.h" #include "defs.h" #include "fsfw/cfdp/Fss.h" #include "fsfw/cfdp/handler/mib.h" #include "fsfw/events/EventReportingProxyIF.h" #include "fsfw/storagemanager/StorageManagerIF.h" #include "fsfw/tmtcservices/AcceptsTelemetryIF.h" #include "fsfw/util/ProvidesSeqCountIF.h" namespace cfdp { struct SourceHandlerParams { SourceHandlerParams(LocalEntityCfg cfg, UserBase& user, ProvidesSeqCountIF& seqCountProvider) : cfg(std::move(cfg)), user(user), seqCountProvider(seqCountProvider) {} LocalEntityCfg cfg; UserBase& user; ProvidesSeqCountIF& seqCountProvider; }; 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::Fss fileSize; size_t progress = 0; bool closureRequested = false; RemoteEntityCfg remoteCfg; PduConfig pduConf; cfdp::TransactionId id{}; cfdp::WidthInBytes seqCountWidth; uint32_t seqNum = 0; } transactionParams; cfdp::CfdpState state = cfdp::CfdpState::IDLE; TransactionStep step = TransactionStep::IDLE; std::array fileBuf{}; SourceHandlerParams sourceParams; cfdp::FsfwParams fsfwParams; FsmResult fsmResult; FsmResult& fsmNacked(); ReturnValue_t checksumGeneration(); ReturnValue_t prepareAndSendMetadataPdu(); ReturnValue_t prepareAndSendNextFileDataPdu(); ReturnValue_t prepareAndSendEofPdu(); ReturnValue_t sendGenericPdu(const SerializeIF& pdu) const; }; } // namespace cfdp #endif // FSFW_CFDP_CFDPSOURCEHANDLER_H