F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
CfdpManager.hpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title CfdpManager.hpp
3 // \author Brian Campuzano
4 // \brief hpp file for CfdpManager component implementation class
5 // ======================================================================
6 
7 #ifndef CCSDS_CFDPMANAGER_HPP
8 #define CCSDS_CFDPMANAGER_HPP
9 
11 #include <Fw/Types/String.hpp>
12 #include <Os/Queue.hpp>
15 
16 namespace Svc {
17 namespace Ccsds {
18 namespace Cfdp {
19 
20 // Forward declarations
21 class Engine;
22 class Channel;
23 class Transaction;
24 
25 class CfdpManager final : public CfdpManagerComponentBase {
26  friend class CfdpManagerTester;
27  // Give access to protected functions for EVRs and Telemetry
28  friend class Engine;
29  friend class Channel;
30  friend class Transaction;
31 
32  public:
33  // ----------------------------------------------------------------------
34  // Component construction and destruction
35  // ----------------------------------------------------------------------
36 
38  CfdpManager(const char* const compName
39  );
40 
42  ~CfdpManager();
43 
53  void configure(Fw::MemAllocator& allocator, FwSizeType fileQueueDepth, FwEnumStoreType memId = 0);
54 
56  void cleanup();
57 
59  void deinit() override;
60 
61  public:
62  // ----------------------------------------------------------------------
63  // Constants
64  // ----------------------------------------------------------------------
65 
68 
69  // ----------------------------------------------------------------------
70  // Port calls that are invoked by the CFDP engine
71  // These functions are analogous to the functions in cf_cfdp_sbintf.*
72  // However these functions are not direct ports due to the architectural
73  // differences between F' and cFE
74  // ----------------------------------------------------------------------
75 
86  Status::T getPduBuffer(Fw::Buffer& buffer, Channel& channel, FwSizeType size);
87 
94  void returnPduBuffer(Channel& channel, Fw::Buffer& pduBuffer);
95 
102  void sendPduBuffer(Channel& channel, Fw::Buffer& pduBuffer);
103 
110 
111  // ----------------------------------------------------------------
112  // Telemetry helper methods (public for Engine/Transaction access)
113  // ----------------------------------------------------------------
114 
116  void incrementRecvErrors(U8 chanId) {
117  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
118  m_channelTelemetry[chanId].set_recvErrors(m_channelTelemetry[chanId].get_recvErrors() + 1);
119  }
120 
122  void incrementRecvDropped(U8 chanId) {
123  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
124  m_channelTelemetry[chanId].set_recvDropped(m_channelTelemetry[chanId].get_recvDropped() + 1);
125  }
126 
128  void incrementRecvSpurious(U8 chanId) {
129  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
130  m_channelTelemetry[chanId].set_recvSpurious(m_channelTelemetry[chanId].get_recvSpurious() + 1);
131  }
132 
134  void addRecvFileDataBytes(U8 chanId, U32 bytes) {
135  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
136  m_channelTelemetry[chanId].set_recvFileDataBytes(m_channelTelemetry[chanId].get_recvFileDataBytes() + bytes);
137  }
138 
140  void addRecvNakSegmentRequests(U8 chanId, U32 count) {
141  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
142  m_channelTelemetry[chanId].set_recvNakSegmentRequests(m_channelTelemetry[chanId].get_recvNakSegmentRequests() +
143  count);
144  }
145 
147  void incrementRecvPdu(U8 chanId) {
148  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
149  m_channelTelemetry[chanId].set_recvPdu(m_channelTelemetry[chanId].get_recvPdu() + 1);
150  }
151 
154  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
155  m_channelTelemetry[chanId].set_recvEofCanceled(m_channelTelemetry[chanId].get_recvEofCanceled() + 1);
156  }
157 
159  void addSentNakSegmentRequests(U8 chanId, U32 count) {
160  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
161  m_channelTelemetry[chanId].set_sentNakSegmentRequests(m_channelTelemetry[chanId].get_sentNakSegmentRequests() +
162  count);
163  }
164 
166  void addSentFileDataBytes(U8 chanId, U32 bytes) {
167  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
168  m_channelTelemetry[chanId].set_sentFileDataBytes(m_channelTelemetry[chanId].get_sentFileDataBytes() + bytes);
169  }
170 
172  void incrementSentPdu(U8 chanId) {
173  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
174  m_channelTelemetry[chanId].set_sentPdu(m_channelTelemetry[chanId].get_sentPdu() + 1);
175  }
176 
179  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
180  m_channelTelemetry[chanId].set_sentEofCanceled(m_channelTelemetry[chanId].get_sentEofCanceled() + 1);
181  }
182 
184  void incrementFaultAckLimit(U8 chanId) {
185  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
186  m_channelTelemetry[chanId].set_faultAckLimit(m_channelTelemetry[chanId].get_faultAckLimit() + 1);
187  }
188 
190  void incrementFaultNakLimit(U8 chanId) {
191  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
192  m_channelTelemetry[chanId].set_faultNakLimit(m_channelTelemetry[chanId].get_faultNakLimit() + 1);
193  }
194 
197  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
198  m_channelTelemetry[chanId].set_faultInactivityTimer(m_channelTelemetry[chanId].get_faultInactivityTimer() + 1);
199  }
200 
203  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
204  m_channelTelemetry[chanId].set_faultCrcMismatch(m_channelTelemetry[chanId].get_faultCrcMismatch() + 1);
205  }
206 
209  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
210  m_channelTelemetry[chanId].set_faultFileSizeMismatch(m_channelTelemetry[chanId].get_faultFileSizeMismatch() +
211  1);
212  }
213 
215  void incrementFaultFileOpen(U8 chanId) {
216  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
217  m_channelTelemetry[chanId].set_faultFileOpen(m_channelTelemetry[chanId].get_faultFileOpen() + 1);
218  }
219 
221  void incrementFaultFileRead(U8 chanId) {
222  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
223  m_channelTelemetry[chanId].set_faultFileRead(m_channelTelemetry[chanId].get_faultFileRead() + 1);
224  }
225 
228  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
229  m_channelTelemetry[chanId].set_faultFileWrite(m_channelTelemetry[chanId].get_faultFileWrite() + 1);
230  }
231 
233  void incrementFaultFileSeek(U8 chanId) {
234  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
235  m_channelTelemetry[chanId].set_faultFileSeek(m_channelTelemetry[chanId].get_faultFileSeek() + 1);
236  }
237 
240  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
241  m_channelTelemetry[chanId].set_faultFileRename(m_channelTelemetry[chanId].get_faultFileRename() + 1);
242  }
243 
246  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
247  m_channelTelemetry[chanId].set_faultDirectoryRead(m_channelTelemetry[chanId].get_faultDirectoryRead() + 1);
248  }
249 
252  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
253  m_channelTelemetry[chanId].set_faultRxEofError(m_channelTelemetry[chanId].get_faultRxEofError() + 1);
254  }
255 
258  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
259  m_channelTelemetry[chanId].set_faultTxEofError(m_channelTelemetry[chanId].get_faultTxEofError() + 1);
260  }
261 
264  FW_ASSERT(chanId < Cfdp::NumChannels, chanId);
265  return m_channelTelemetry[chanId];
266  }
267 
268  private:
269  // ----------------------------------------------------------------------
270  // Handler implementations for typed input ports
271  // ----------------------------------------------------------------------
272 
276  void run1Hz_handler(FwIndexType portNum,
277  U32 context
278  ) override;
279 
281  void dataReturnIn_handler(FwIndexType portNum,
282  Fw::Buffer& fwBuffer) override;
283 
285  void dataIn_handler(FwIndexType portNum,
286  Fw::Buffer& fwBuffer
287  ) override;
288 
290  Svc::SendFileResponse fileIn_handler(FwIndexType portNum,
291  const Fw::StringBase& sourceFileName,
292  const Fw::StringBase& destFileName,
293  U32 offset,
294  U32 length
295  ) override;
296 
298  void pingIn_handler(FwIndexType portNum,
299  U32 key
300  ) override;
301 
302  private:
303  // ----------------------------------------------------------------------
304  // Handler implementations for commands
305  // ----------------------------------------------------------------------
306 
310  void SendFile_cmdHandler(FwOpcodeType opCode,
311  U32 cmdSeq,
312  U8 channelId,
313  EntityId destId,
314  const Class& cfdpClass,
315  const Keep& keep,
316  U8 priority,
317  const Fw::CmdStringArg& sourceFileName,
318  const Fw::CmdStringArg& destFileName
319  ) override;
320 
324  void PlaybackDirectory_cmdHandler(
325  FwOpcodeType opCode,
326  U32 cmdSeq,
327  U8 channelId,
328  EntityId destId,
329  const Class& cfdpClass,
330  const Keep& keep,
331  U8 priority,
332  const Fw::CmdStringArg& sourceDirectory,
333  const Fw::CmdStringArg& destDirectory
334  ) override;
335 
339  void PollDirectory_cmdHandler(
340  FwOpcodeType opCode,
341  U32 cmdSeq,
342  U8 channelId,
343  U8 pollId,
344  EntityId destId,
345  const Class& cfdpClass,
346  U8 priority,
347  U32 interval,
348  const Fw::CmdStringArg& sourceDirectory,
349  const Fw::CmdStringArg& destDirectory
350  ) override;
351 
355  void StopPollDirectory_cmdHandler(FwOpcodeType opCode,
356  U32 cmdSeq,
357  U8 channelId,
358  U8 pollId
359  ) override;
360 
364  void SetChannelFlow_cmdHandler(FwOpcodeType opCode,
365  U32 cmdSeq,
366  U8 channelId,
367  const Flow& freeze
368  ) override;
369 
373  void SuspendResumeTransaction_cmdHandler(FwOpcodeType opCode,
374  U32 cmdSeq,
375  U8 channelId,
376  TransactionSeq transactionSeq,
377  EntityId entityId,
378  const SuspendResume& action
379  ) override;
380 
384  void CancelTransaction_cmdHandler(FwOpcodeType opCode,
385  U32 cmdSeq,
386  U8 channelId,
387  TransactionSeq transactionSeq,
388  EntityId entityId
389  ) override;
390 
394  void AbandonTransaction_cmdHandler(FwOpcodeType opCode,
395  U32 cmdSeq,
396  U8 channelId,
397  TransactionSeq transactionSeq,
398  EntityId entityId
399  ) override;
400 
404  void ResetCounters_cmdHandler(FwOpcodeType opCode,
405  U32 cmdSeq,
406  U8 channelId
407  ) override;
408 
409  private:
410  // ----------------------------------------------------------------------
411  // Private command helper functions
412  // ----------------------------------------------------------------------
413 
418  void drainFileInQueue();
419 
421  Fw::CmdResponse::T checkCommandChannelIndex(U8 channelIndex
422  );
423 
425  Fw::CmdResponse::T checkCommandChannelPollIndex(U8 pollIndex
426  );
427 
428  public:
429  // ----------------------------------------------------------------------
430  // Parameter helpers used by the CFDP engine
431  // ----------------------------------------------------------------------
432 
437 
442 
447 
452 
457  Fw::String getTmpDirParam(U8 channelIndex);
458 
463  Fw::String getFailDirParam(U8 channelIndex);
464 
469  U8 getAckLimitParam(U8 channelIndex);
470 
475  U8 getNackLimitParam(U8 channelIndex);
476 
481  U32 getAckTimerParam(U8 channelIndex);
482 
487  U32 getInactivityTimerParam(U8 channelIndex);
488 
493  Fw::Enabled getDequeueEnabledParam(U8 channelIndex);
494 
499  Fw::String getMoveDirParam(U8 channelIndex);
500 
505  U32 getMaxOutgoingPdusPerCycleParam(U8 channelIndex);
506 
507  private:
508  // ----------------------------------------------------------------------
509  // Types
510  // ----------------------------------------------------------------------
511 
515  struct FileInRequest {
516  Fw::String sourceFileName;
517  Fw::String destFileName;
518  U32 context;
519  };
520 
521  // ----------------------------------------------------------------------
522  // Member variables
523  // ----------------------------------------------------------------------
524  // CFDP Engine - owns all protocol state and operations
525  Engine* m_engine;
526 
528  Os::Queue m_fileInQueue;
529 
532  FwSizeType m_fileInQueueDepth = 0;
533 
535  Cfdp::ChannelTelemetryArray m_channelTelemetry;
536 
538  FwEnumStoreType m_allocatorId = 0;
539  Fw::MemAllocator* m_allocator = nullptr;
540 };
541 
542 } // namespace Cfdp
543 } // namespace Ccsds
544 } // namespace Svc
545 
546 #endif // CCSDS_CFDPMANAGER_HPP
void configure(Fw::MemAllocator &allocator, FwSizeType fileQueueDepth, FwEnumStoreType memId=0)
Definition: CfdpManager.cpp:34
void incrementSentPdu(U8 chanId)
Increment sent PDU counter.
void incrementFaultFileWrite(U8 chanId)
Increment fault file write counter.
CFDP Protocol Engine.
Definition: Engine.hpp:89
void sendFileComplete(Svc::SendFileStatus::T status)
void incrementRecvErrors(U8 chanId)
Increment receive error counter.
U16 FwPacketDescriptorType
The width of packet descriptors when they are serialized by the framework.
CFDP Channel class.
Definition: Channel.hpp:56
Enum used to determine if a file should be kept or deleted after a CFDP transaction.
Definition: KeepEnumAc.hpp:22
FwIdType FwOpcodeType
The type of a command opcode.
CFDP Transaction state machine class.
void addRecvNakSegmentRequests(U8 chanId, U32 count)
Add to received NAK segment requests.
PlatformSizeType FwSizeType
I32 FwEnumStoreType
void incrementRecvEofCanceled(U8 chanId)
Increment receive EOF canceled counter.
U32 EntityId
Entity id size.
Auto-generated base for CfdpManager component.
U8 getNackLimitParam(U8 channelIndex)
void incrementFaultCrcMismatch(U8 chanId)
Increment fault CRC mismatch counter.
void incrementFaultFileRename(U8 chanId)
Increment fault file rename counter.
Fw::String getFailDirParam(U8 channelIndex)
void incrementFaultDirectoryRead(U8 chanId)
Increment fault directory read counter.
T
The raw enum type.
~CfdpManager()
Destroy CfdpManager object.
Definition: CfdpManager.cpp:24
void addSentNakSegmentRequests(U8 chanId, U32 count)
Add to sent NAK segment requests.
void incrementRecvDropped(U8 chanId)
Increment receive dropped counter.
void sendPduBuffer(Channel &channel, Fw::Buffer &pduBuffer)
void deinit() override
Tear down the fileIn request queue.
Definition: CfdpManager.cpp:59
CfdpManager(const char *const compName)
Construct CfdpManager object.
Definition: CfdpManager.cpp:22
void incrementRecvSpurious(U8 chanId)
Increment receive spurious counter.
U32 TransactionSeq
transaction sequence number size
void returnPduBuffer(Channel &channel, Fw::Buffer &pduBuffer)
Fw::Enabled getDequeueEnabledParam(U8 channelIndex)
void incrementFaultFileSeek(U8 chanId)
Increment fault file seek counter.
U8 getAckLimitParam(U8 channelIndex)
Status::T getPduBuffer(Fw::Buffer &buffer, Channel &channel, FwSizeType size)
void incrementFaultFileOpen(U8 chanId)
Increment fault file open counter.
void incrementRecvPdu(U8 chanId)
Increment received PDU counter.
T
The raw enum type.
void incrementSentEofCanceled(U8 chanId)
Increment sent EOF canceled counter.
void incrementFaultInactivityTimer(U8 chanId)
Increment fault inactivity timer counter.
void addSentFileDataBytes(U8 chanId, U32 bytes)
Add sent file data bytes.
Enabled and disabled states.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:54
U32 getAckTimerParam(U8 channelIndex)
void incrementFaultNakLimit(U8 chanId)
Increment fault NAK limit counter.
U32 getInactivityTimerParam(U8 channelIndex)
static constexpr FwSizeType PACKET_DESCRIPTOR_SIZE
Size of packet descriptor prepended to PDUs for ComQueue.
Definition: CfdpManager.hpp:67
void incrementFaultFileRead(U8 chanId)
Increment fault file read counter.
Memory Allocation base class.
PlatformIndexType FwIndexType
Send file response struct.
void incrementFaultTxEofError(U8 chanId)
Increment sent EOF error counter (any condition code that is not no-error or cancel) ...
void incrementFaultRxEofError(U8 chanId)
Increment receive EOF error counter (any condition code that is not no-error or cancel) ...
Structure for the telemetry array of CFDP channels.
RateGroupDivider component implementation.
U32 getMaxOutgoingPdusPerCycleParam(U8 channelIndex)
Fw::String getTmpDirParam(U8 channelIndex)
Defines a base class for a memory allocator for classes.
void cleanup()
Cleanup CFDP engine and deallocate resources.
Definition: CfdpManager.cpp:64
Fw::String getMoveDirParam(U8 channelIndex)
Cfdp::ChannelTelemetry & getChannelTelemetryRef(U8 chanId)
Get reference to channel telemetry for queue depth updates.
void incrementFaultFileSizeMismatch(U8 chanId)
Increment fault file size mismatch counter.
#define FW_ASSERT(...)
Definition: Assert.hpp:14
void incrementFaultAckLimit(U8 chanId)
Increment fault ACK limit counter.
void addRecvFileDataBytes(U8 chanId, U32 bytes)
Add to received file data bytes.