2022-09-14 19:29:43 +02:00
|
|
|
#ifndef FSFW_CFDP_CFDPSOURCEHANDLER_H
|
|
|
|
#define FSFW_CFDP_CFDPSOURCEHANDLER_H
|
|
|
|
|
2023-06-30 11:59:22 +02:00
|
|
|
#include <cstdint>
|
2023-07-17 09:53:23 +02:00
|
|
|
#include <vector>
|
2023-06-30 11:59:22 +02:00
|
|
|
|
2023-07-17 09:53:23 +02:00
|
|
|
#include "UserBase.h"
|
2023-07-14 15:56:38 +02:00
|
|
|
#include "defs.h"
|
2023-07-17 09:53:23 +02:00
|
|
|
#include "fsfw/cfdp/FileSize.h"
|
|
|
|
#include "fsfw/cfdp/handler/mib.h"
|
2023-06-30 11:59:22 +02:00
|
|
|
#include "fsfw/events/EventReportingProxyIF.h"
|
|
|
|
#include "fsfw/storagemanager/StorageManagerIF.h"
|
2023-07-17 10:15:06 +02:00
|
|
|
#include "fsfw/tmtcservices/AcceptsTelemetryIF.h"
|
2023-06-30 11:59:22 +02:00
|
|
|
|
2023-07-17 09:53:23 +02:00
|
|
|
namespace cfdp {
|
|
|
|
|
|
|
|
struct SourceHandlerParams {
|
|
|
|
SourceHandlerParams(LocalEntityCfg cfg, UserBase& user) : cfg(std::move(cfg)), user(user) {}
|
|
|
|
|
|
|
|
LocalEntityCfg cfg;
|
|
|
|
UserBase& user;
|
|
|
|
size_t maxFilePathSize = 256;
|
|
|
|
};
|
2023-06-30 11:36:19 +02:00
|
|
|
|
|
|
|
class SourceHandler {
|
2023-06-30 11:48:25 +02:00
|
|
|
public:
|
2023-07-17 15:21:22 +02:00
|
|
|
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<ReturnValue_t, 3> errorCodes = {};
|
|
|
|
};
|
|
|
|
|
2023-07-17 10:25:09 +02:00
|
|
|
SourceHandler(SourceHandlerParams params, FsfwParams fsfwParams);
|
2023-06-30 11:48:25 +02:00
|
|
|
|
2023-07-17 10:15:06 +02:00
|
|
|
/**
|
|
|
|
* Pass a put request to the source handler, which might initiate a CFDP transaction and start
|
|
|
|
* the state machine
|
|
|
|
* @return
|
|
|
|
*/
|
2023-07-17 13:43:48 +02:00
|
|
|
ReturnValue_t putRequest(PutRequestFull& putRequest, RemoteEntityCfg& cfg);
|
2023-07-17 15:21:22 +02:00
|
|
|
FsmResult& stateMachine();
|
2023-07-14 15:56:38 +02:00
|
|
|
|
2023-06-30 11:48:25 +02:00
|
|
|
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
|
|
|
|
};
|
2023-07-17 09:53:23 +02:00
|
|
|
struct TransactionParams {
|
|
|
|
// Initialize char vectors with length + 1 for 0 termination
|
|
|
|
explicit TransactionParams(size_t maxFileNameLen)
|
|
|
|
: sourceName(maxFileNameLen + 1), destName(maxFileNameLen + 1) {}
|
|
|
|
|
|
|
|
uint32_t crc{};
|
|
|
|
std::vector<char> sourceName;
|
|
|
|
std::vector<char> destName;
|
|
|
|
cfdp::FileSize fileSize;
|
2023-07-17 14:48:37 +02:00
|
|
|
EntityId destId;
|
|
|
|
TransmissionMode transmissionMode;
|
|
|
|
bool closureRequested;
|
2023-07-17 18:56:10 +02:00
|
|
|
PduConfig pduConf;
|
2023-07-17 09:53:23 +02:00
|
|
|
} transactionParams;
|
|
|
|
cfdp::CfdpState state = cfdp::CfdpState::IDLE;
|
|
|
|
TransactionStep step = TransactionStep::IDLE;
|
|
|
|
SourceHandlerParams sourceParams;
|
2023-07-17 10:25:09 +02:00
|
|
|
cfdp::FsfwParams fsfwParams;
|
2023-07-17 14:54:45 +02:00
|
|
|
RemoteEntityCfg currentRemoteCfg;
|
2023-07-17 15:21:22 +02:00
|
|
|
FsmResult fsmResult;
|
2023-07-14 15:56:38 +02:00
|
|
|
|
2023-07-17 15:21:22 +02:00
|
|
|
FsmResult& fsmNacked();
|
2023-07-17 09:53:23 +02:00
|
|
|
ReturnValue_t checksumGeneration();
|
2023-07-17 15:11:51 +02:00
|
|
|
ReturnValue_t prepareAndSendMetadataPdu();
|
2023-07-17 15:21:22 +02:00
|
|
|
ReturnValue_t prepareAndSendNextFileDataPdu();
|
|
|
|
ReturnValue_t prepareAndSendEofPdu();
|
2023-06-30 11:36:19 +02:00
|
|
|
};
|
2022-09-14 19:29:43 +02:00
|
|
|
|
2023-07-17 09:53:23 +02:00
|
|
|
} // namespace cfdp
|
|
|
|
|
2022-09-14 19:29:43 +02:00
|
|
|
#endif // FSFW_CFDP_CFDPSOURCEHANDLER_H
|