fsfw/src/fsfw/cfdp/handler/DestHandler.h

123 lines
3.6 KiB
C
Raw Normal View History

2022-08-09 15:46:42 +02:00
#ifndef FSFW_CFDP_CFDPDESTHANDLER_H
#define FSFW_CFDP_CFDPDESTHANDLER_H
2022-08-17 18:49:51 +02:00
#include <etl/list.h>
#include <utility>
2022-08-09 18:51:44 +02:00
#include "RemoteConfigTableIF.h"
2022-08-09 16:36:35 +02:00
#include "UserBase.h"
2022-08-23 20:30:41 +02:00
#include "defs.h"
2022-08-09 15:46:42 +02:00
#include "fsfw/cfdp/handler/mib.h"
2022-08-23 20:30:41 +02:00
#include "fsfw/cfdp/pdu/MetadataPduReader.h"
2022-08-09 15:46:42 +02:00
#include "fsfw/cfdp/pdu/PduConfig.h"
2022-08-17 18:49:51 +02:00
#include "fsfw/container/DynamicFIFO.h"
#include "fsfw/storagemanager/StorageManagerIF.h"
#include "fsfw/storagemanager/storeAddress.h"
#include "fsfw/tmtcservices/AcceptsTelemetryIF.h"
2022-08-09 15:46:42 +02:00
namespace cfdp {
2022-08-17 18:49:51 +02:00
struct PacketInfo {
PacketInfo(PduType type, FileDirectives directive, store_address_t storeId)
: pduType(type), directiveType(directive), storeId(storeId) {}
PduType pduType = PduType::FILE_DATA;
FileDirectives directiveType = FileDirectives::INVALID_DIRECTIVE;
store_address_t storeId = store_address_t::invalid();
PacketInfo() = default;
};
struct DestHandlerParams {
DestHandlerParams(LocalEntityCfg cfg, UserBase& user, RemoteConfigTableIF& remoteCfgTable,
2022-08-23 20:30:41 +02:00
etl::ilist<PacketInfo>& packetList)
2022-08-17 18:49:51 +02:00
: cfg(std::move(cfg)),
user(user),
remoteCfgTable(remoteCfgTable),
packetListRef(packetList) {}
2022-08-09 15:46:42 +02:00
LocalEntityCfg cfg;
2022-08-09 16:36:35 +02:00
UserBase& user;
2022-08-09 18:51:44 +02:00
RemoteConfigTableIF& remoteCfgTable;
2022-08-23 19:37:30 +02:00
etl::ilist<PacketInfo>& packetListRef;
2022-08-23 20:30:41 +02:00
uint8_t maxTlvsInOnePdu = 10;
size_t maxFilenameLen = 255;
2022-08-23 19:37:30 +02:00
};
struct FsfwParams {
FsfwParams(AcceptsTelemetryIF& packetDest, MessageQueueIF& msgQueue,
EventReportingProxyIF& eventReporter)
: packetDest(packetDest), msgQueue(msgQueue), eventReporter(eventReporter) {}
2022-08-17 18:49:51 +02:00
AcceptsTelemetryIF& packetDest;
MessageQueueIF& msgQueue;
2022-08-23 19:37:30 +02:00
EventReportingProxyIF& eventReporter;
2022-08-17 18:49:51 +02:00
StorageManagerIF* tcStore = nullptr;
StorageManagerIF* tmStore = nullptr;
};
class DestHandler {
public:
2022-08-24 17:31:26 +02:00
/**
* Will be returned if it is advisable to call the state machine operation call again
*/
ReturnValue_t CALL_FSM_AGAIN = returnvalue::makeCode(1, 0);
2022-08-23 19:37:30 +02:00
explicit DestHandler(DestHandlerParams handlerParams, FsfwParams fsfwParams);
2022-08-17 18:49:51 +02:00
2022-08-24 17:31:26 +02:00
/**
*
* @return
* - @c returnvalue::OK State machine OK for this execution cycle
* - @c CALL_FSM_AGAIN State machine should be called again.
*/
2022-08-17 18:49:51 +02:00
ReturnValue_t performStateMachine();
ReturnValue_t passPacket(PacketInfo packet);
ReturnValue_t initialize();
2022-08-24 17:31:26 +02:00
[[nodiscard]] CfdpStates getCfdpState() const;
2022-08-17 18:49:51 +02:00
private:
enum class TransactionStep {
IDLE = 0,
TRANSACTION_START = 1,
RECEIVING_FILE_DATA_PDUS = 2,
SENDING_ACK_PDU = 3,
TRANSFER_COMPLETION = 4,
SENDING_FINISHED_PDU = 5
};
2022-08-23 20:30:41 +02:00
struct TransactionParams {
explicit TransactionParams(size_t maxFileNameLen)
: sourceName(maxFileNameLen), destName(maxFileNameLen) {}
ChecksumType checksumType = ChecksumType::NULL_CHECKSUM;
2022-09-02 14:39:53 +02:00
bool closureRequested = false;
2022-08-23 20:30:41 +02:00
std::vector<char> sourceName;
std::vector<char> destName;
cfdp::FileSize fileSize;
TransactionId transactionId;
PduConfig pduConf;
2022-09-02 14:39:53 +02:00
uint32_t crc = 0;
RemoteEntityCfg* remoteCfg = nullptr;
2022-08-23 20:30:41 +02:00
};
2022-08-17 18:49:51 +02:00
TransactionStep step = TransactionStep::IDLE;
2022-08-23 20:30:41 +02:00
CfdpStates cfdpState = CfdpStates::IDLE;
2022-08-23 19:37:30 +02:00
std::vector<cfdp::Tlv> tlvVec;
2022-08-23 20:30:41 +02:00
std::vector<cfdp::Tlv> userTlvVec;
DestHandlerParams dp;
FsfwParams fp;
TransactionParams tp;
ReturnValue_t startTransaction(MetadataPduReader& reader, MetadataInfo& info);
2022-09-02 14:39:53 +02:00
ReturnValue_t handleMetadataPdu(const PacketInfo& info);
ReturnValue_t handleFileDataPdu(const PacketInfo& info);
ReturnValue_t handleEofPdu(const PacketInfo& info);
ReturnValue_t handleMetadataParseError(const uint8_t* rawData, size_t maxSize);
2022-08-09 15:46:42 +02:00
};
} // namespace cfdp
#endif // FSFW_CFDP_CFDPDESTHANDLER_H