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 
429  Fw::CmdResponse::T checkCommandPollInterval(U32 interval
430  );
431 
432  public:
433  // ----------------------------------------------------------------------
434  // Parameter helpers used by the CFDP engine
435  // ----------------------------------------------------------------------
436 
441 
446 
451 
456 
461  Fw::String getTmpDirParam(U8 channelIndex);
462 
467  Fw::String getFailDirParam(U8 channelIndex);
468 
473  U8 getAckLimitParam(U8 channelIndex);
474 
479  U8 getNackLimitParam(U8 channelIndex);
480 
485  U32 getAckTimerParam(U8 channelIndex);
486 
491  U32 getInactivityTimerParam(U8 channelIndex);
492 
497  Fw::Enabled getDequeueEnabledParam(U8 channelIndex);
498 
503  Fw::String getMoveDirParam(U8 channelIndex);
504 
509  U32 getMaxOutgoingPdusPerCycleParam(U8 channelIndex);
510 
511  private:
512  // ----------------------------------------------------------------------
513  // Types
514  // ----------------------------------------------------------------------
515 
519  struct FileInRequest {
520  Fw::String sourceFileName;
521  Fw::String destFileName;
522  U32 context;
523  };
524 
525  // ----------------------------------------------------------------------
526  // Member variables
527  // ----------------------------------------------------------------------
528  // CFDP Engine - owns all protocol state and operations
529  Engine* m_engine;
530 
532  Os::Queue m_fileInQueue;
533 
536  FwSizeType m_fileInQueueDepth = 0;
537 
539  Cfdp::ChannelTelemetryArray m_channelTelemetry;
540 
542  FwEnumStoreType m_allocatorId = 0;
543  Fw::MemAllocator* m_allocator = nullptr;
544 };
545 
546 } // namespace Cfdp
547 } // namespace Ccsds
548 } // namespace Svc
549 
550 #endif // CCSDS_CFDPMANAGER_HPP
void configure(Fw::MemAllocator &allocator, FwSizeType fileQueueDepth, FwEnumStoreType memId=0)
Definition: CfdpManager.cpp:35
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:25
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:60
CfdpManager(const char *const compName)
Construct CfdpManager object.
Definition: CfdpManager.cpp:23
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:65
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.