F´ Flight Software - C/C++ Documentation  devel
A framework for building embedded system applications to NASA flight quality standards.
DpWriterComponentAc.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title DpWriterComponentAc.cpp
3 // \author Generated by fpp-to-cpp
4 // \brief cpp file for DpWriter component base class
5 // ======================================================================
6 
8 #include "Fw/Types/Assert.hpp"
10 #if FW_ENABLE_TEXT_LOGGING
11 #include "Fw/Types/String.hpp"
12 #endif
13 
14 namespace Svc {
15 
16  namespace {
17  enum MsgTypeEnum {
18  DPWRITER_COMPONENT_EXIT = Fw::ActiveComponentBase::ACTIVE_COMPONENT_EXIT,
19  BUFFERSENDIN_BUFFERSEND,
20  SCHEDIN_SCHED,
21  CMD_CLEAR_EVENT_THROTTLE,
22  };
23 
24  // Get the max size by constructing a union of the async input, command, and
25  // internal port serialization sizes
26  union BuffUnion {
27  BYTE bufferSendInPortSize[Fw::InputBufferSendPort::SERIALIZED_SIZE];
30  };
31 
32  // Define a message buffer class large enough to handle all the
33  // asynchronous inputs to the component
34  class ComponentIpcSerializableBuffer :
36  {
37 
38  public:
39 
40  enum {
41  // Max. message size = size of data + message id + port
42  SERIALIZATION_SIZE =
43  sizeof(BuffUnion) +
44  sizeof(FwEnumStoreType) +
45  sizeof(FwIndexType)
46  };
47 
48  Fw::Serializable::SizeType getBuffCapacity() const {
49  return sizeof(m_buff);
50  }
51 
52  U8* getBuffAddr() {
53  return m_buff;
54  }
55 
56  const U8* getBuffAddr() const {
57  return m_buff;
58  }
59 
60  private:
61  // Should be the max of all the input ports serialized sizes...
62  U8 m_buff[SERIALIZATION_SIZE];
63 
64  };
65  }
66 
67  // ----------------------------------------------------------------------
68  // Component initialization
69  // ----------------------------------------------------------------------
70 
72  init(
73  FwQueueSizeType queueDepth,
74  FwEnumStoreType instance
75  )
76  {
77  // Initialize base class
79 
80  // Connect input port cmdIn
81  for (
82  FwIndexType port = 0;
83  port < static_cast<FwIndexType>(this->getNum_cmdIn_InputPorts());
84  port++
85  ) {
86  this->m_cmdIn_InputPort[port].init();
87  this->m_cmdIn_InputPort[port].addCallComp(
88  this,
89  m_p_cmdIn_in
90  );
91  this->m_cmdIn_InputPort[port].setPortNum(port);
92 
93 #if FW_OBJECT_NAMES == 1
94  Fw::ObjectName portName;
95  portName.format(
96  "%s_cmdIn_InputPort[%" PRI_PlatformIntType "]",
97  this->m_objName.toChar(),
98  port
99  );
100  this->m_cmdIn_InputPort[port].setObjName(portName.toChar());
101 #endif
102  }
103 
104  // Connect input port bufferSendIn
105  for (
106  FwIndexType port = 0;
107  port < static_cast<FwIndexType>(this->getNum_bufferSendIn_InputPorts());
108  port++
109  ) {
110  this->m_bufferSendIn_InputPort[port].init();
111  this->m_bufferSendIn_InputPort[port].addCallComp(
112  this,
113  m_p_bufferSendIn_in
114  );
115  this->m_bufferSendIn_InputPort[port].setPortNum(port);
116 
117 #if FW_OBJECT_NAMES == 1
118  Fw::ObjectName portName;
119  portName.format(
120  "%s_bufferSendIn_InputPort[%" PRI_PlatformIntType "]",
121  this->m_objName.toChar(),
122  port
123  );
124  this->m_bufferSendIn_InputPort[port].setObjName(portName.toChar());
125 #endif
126  }
127 
128  // Connect input port schedIn
129  for (
130  FwIndexType port = 0;
131  port < static_cast<FwIndexType>(this->getNum_schedIn_InputPorts());
132  port++
133  ) {
134  this->m_schedIn_InputPort[port].init();
135  this->m_schedIn_InputPort[port].addCallComp(
136  this,
137  m_p_schedIn_in
138  );
139  this->m_schedIn_InputPort[port].setPortNum(port);
140 
141 #if FW_OBJECT_NAMES == 1
142  Fw::ObjectName portName;
143  portName.format(
144  "%s_schedIn_InputPort[%" PRI_PlatformIntType "]",
145  this->m_objName.toChar(),
146  port
147  );
148  this->m_schedIn_InputPort[port].setObjName(portName.toChar());
149 #endif
150  }
151 
152  // Connect output port cmdRegIn
153  for (
154  FwIndexType port = 0;
155  port < static_cast<FwIndexType>(this->getNum_cmdRegIn_OutputPorts());
156  port++
157  ) {
158  this->m_cmdRegIn_OutputPort[port].init();
159 
160 #if FW_OBJECT_NAMES == 1
161  Fw::ObjectName portName;
162  portName.format(
163  "%s_cmdRegIn_OutputPort[%" PRI_PlatformIntType "]",
164  this->m_objName.toChar(),
165  port
166  );
167  this->m_cmdRegIn_OutputPort[port].setObjName(portName.toChar());
168 #endif
169  }
170 
171  // Connect output port cmdResponseOut
172  for (
173  FwIndexType port = 0;
174  port < static_cast<FwIndexType>(this->getNum_cmdResponseOut_OutputPorts());
175  port++
176  ) {
177  this->m_cmdResponseOut_OutputPort[port].init();
178 
179 #if FW_OBJECT_NAMES == 1
180  Fw::ObjectName portName;
181  portName.format(
182  "%s_cmdResponseOut_OutputPort[%" PRI_PlatformIntType "]",
183  this->m_objName.toChar(),
184  port
185  );
186  this->m_cmdResponseOut_OutputPort[port].setObjName(portName.toChar());
187 #endif
188  }
189 
190  // Connect output port eventOut
191  for (
192  FwIndexType port = 0;
193  port < static_cast<FwIndexType>(this->getNum_eventOut_OutputPorts());
194  port++
195  ) {
196  this->m_eventOut_OutputPort[port].init();
197 
198 #if FW_OBJECT_NAMES == 1
199  Fw::ObjectName portName;
200  portName.format(
201  "%s_eventOut_OutputPort[%" PRI_PlatformIntType "]",
202  this->m_objName.toChar(),
203  port
204  );
205  this->m_eventOut_OutputPort[port].setObjName(portName.toChar());
206 #endif
207  }
208 
209 #if FW_ENABLE_TEXT_LOGGING == 1
210  // Connect output port textEventOut
211  for (
212  FwIndexType port = 0;
213  port < static_cast<FwIndexType>(this->getNum_textEventOut_OutputPorts());
214  port++
215  ) {
216  this->m_textEventOut_OutputPort[port].init();
217 
218 #if FW_OBJECT_NAMES == 1
219  Fw::ObjectName portName;
220  portName.format(
221  "%s_textEventOut_OutputPort[%" PRI_PlatformIntType "]",
222  this->m_objName.toChar(),
223  port
224  );
225  this->m_textEventOut_OutputPort[port].setObjName(portName.toChar());
226 #endif
227  }
228 #endif
229 
230  // Connect output port timeGetOut
231  for (
232  FwIndexType port = 0;
233  port < static_cast<FwIndexType>(this->getNum_timeGetOut_OutputPorts());
234  port++
235  ) {
236  this->m_timeGetOut_OutputPort[port].init();
237 
238 #if FW_OBJECT_NAMES == 1
239  Fw::ObjectName portName;
240  portName.format(
241  "%s_timeGetOut_OutputPort[%" PRI_PlatformIntType "]",
242  this->m_objName.toChar(),
243  port
244  );
245  this->m_timeGetOut_OutputPort[port].setObjName(portName.toChar());
246 #endif
247  }
248 
249  // Connect output port tlmOut
250  for (
251  FwIndexType port = 0;
252  port < static_cast<FwIndexType>(this->getNum_tlmOut_OutputPorts());
253  port++
254  ) {
255  this->m_tlmOut_OutputPort[port].init();
256 
257 #if FW_OBJECT_NAMES == 1
258  Fw::ObjectName portName;
259  portName.format(
260  "%s_tlmOut_OutputPort[%" PRI_PlatformIntType "]",
261  this->m_objName.toChar(),
262  port
263  );
264  this->m_tlmOut_OutputPort[port].setObjName(portName.toChar());
265 #endif
266  }
267 
268  // Connect output port deallocBufferSendOut
269  for (
270  FwIndexType port = 0;
271  port < static_cast<FwIndexType>(this->getNum_deallocBufferSendOut_OutputPorts());
272  port++
273  ) {
274  this->m_deallocBufferSendOut_OutputPort[port].init();
275 
276 #if FW_OBJECT_NAMES == 1
277  Fw::ObjectName portName;
278  portName.format(
279  "%s_deallocBufferSendOut_OutputPort[%" PRI_PlatformIntType "]",
280  this->m_objName.toChar(),
281  port
282  );
283  this->m_deallocBufferSendOut_OutputPort[port].setObjName(portName.toChar());
284 #endif
285  }
286 
287  // Connect output port dpWrittenOut
288  for (
289  FwIndexType port = 0;
290  port < static_cast<FwIndexType>(this->getNum_dpWrittenOut_OutputPorts());
291  port++
292  ) {
293  this->m_dpWrittenOut_OutputPort[port].init();
294 
295 #if FW_OBJECT_NAMES == 1
296  Fw::ObjectName portName;
297  portName.format(
298  "%s_dpWrittenOut_OutputPort[%" PRI_PlatformIntType "]",
299  this->m_objName.toChar(),
300  port
301  );
302  this->m_dpWrittenOut_OutputPort[port].setObjName(portName.toChar());
303 #endif
304  }
305 
306  // Connect output port procBufferSendOut
307  for (
308  FwIndexType port = 0;
309  port < static_cast<FwIndexType>(this->getNum_procBufferSendOut_OutputPorts());
310  port++
311  ) {
312  this->m_procBufferSendOut_OutputPort[port].init();
313 
314 #if FW_OBJECT_NAMES == 1
315  Fw::ObjectName portName;
316  portName.format(
317  "%s_procBufferSendOut_OutputPort[%" PRI_PlatformIntType "]",
318  this->m_objName.toChar(),
319  port
320  );
321  this->m_procBufferSendOut_OutputPort[port].setObjName(portName.toChar());
322 #endif
323  }
324 
325  Os::Queue::QueueStatus qStat = this->createQueue(
326  queueDepth,
327  ComponentIpcSerializableBuffer::SERIALIZATION_SIZE
328  );
329  FW_ASSERT(
330  Os::Queue::QUEUE_OK == qStat,
331  static_cast<FwAssertArgType>(qStat)
332  );
333  }
334 
335  // ----------------------------------------------------------------------
336  // Getters for special input ports
337  // ----------------------------------------------------------------------
338 
341  {
342  FW_ASSERT(
343  portNum < this->getNum_cmdIn_InputPorts(),
344  static_cast<FwAssertArgType>(portNum)
345  );
346 
347  return &this->m_cmdIn_InputPort[portNum];
348  }
349 
350  // ----------------------------------------------------------------------
351  // Getters for typed input ports
352  // ----------------------------------------------------------------------
353 
356  {
357  FW_ASSERT(
358  portNum < this->getNum_bufferSendIn_InputPorts(),
359  static_cast<FwAssertArgType>(portNum)
360  );
361 
362  return &this->m_bufferSendIn_InputPort[portNum];
363  }
364 
367  {
368  FW_ASSERT(
369  portNum < this->getNum_schedIn_InputPorts(),
370  static_cast<FwAssertArgType>(portNum)
371  );
372 
373  return &this->m_schedIn_InputPort[portNum];
374  }
375 
376  // ----------------------------------------------------------------------
377  // Connect input ports to special output ports
378  // ----------------------------------------------------------------------
379 
382  FwIndexType portNum,
383  Fw::InputCmdRegPort* port
384  )
385  {
386  FW_ASSERT(
387  portNum < this->getNum_cmdRegIn_OutputPorts(),
388  static_cast<FwAssertArgType>(portNum)
389  );
390 
391  this->m_cmdRegIn_OutputPort[portNum].addCallPort(port);
392  }
393 
396  FwIndexType portNum,
398  )
399  {
400  FW_ASSERT(
401  portNum < this->getNum_cmdResponseOut_OutputPorts(),
402  static_cast<FwAssertArgType>(portNum)
403  );
404 
405  this->m_cmdResponseOut_OutputPort[portNum].addCallPort(port);
406  }
407 
410  FwIndexType portNum,
411  Fw::InputLogPort* port
412  )
413  {
414  FW_ASSERT(
415  portNum < this->getNum_eventOut_OutputPorts(),
416  static_cast<FwAssertArgType>(portNum)
417  );
418 
419  this->m_eventOut_OutputPort[portNum].addCallPort(port);
420  }
421 
422 #if FW_ENABLE_TEXT_LOGGING == 1
423 
424  void DpWriterComponentBase ::
425  set_textEventOut_OutputPort(
426  FwIndexType portNum,
428  )
429  {
430  FW_ASSERT(
431  portNum < this->getNum_textEventOut_OutputPorts(),
432  static_cast<FwAssertArgType>(portNum)
433  );
434 
435  this->m_textEventOut_OutputPort[portNum].addCallPort(port);
436  }
437 
438 #endif
439 
442  FwIndexType portNum,
443  Fw::InputTimePort* port
444  )
445  {
446  FW_ASSERT(
447  portNum < this->getNum_timeGetOut_OutputPorts(),
448  static_cast<FwAssertArgType>(portNum)
449  );
450 
451  this->m_timeGetOut_OutputPort[portNum].addCallPort(port);
452  }
453 
456  FwIndexType portNum,
457  Fw::InputTlmPort* port
458  )
459  {
460  FW_ASSERT(
461  portNum < this->getNum_tlmOut_OutputPorts(),
462  static_cast<FwAssertArgType>(portNum)
463  );
464 
465  this->m_tlmOut_OutputPort[portNum].addCallPort(port);
466  }
467 
468  // ----------------------------------------------------------------------
469  // Connect typed input ports to typed output ports
470  // ----------------------------------------------------------------------
471 
474  FwIndexType portNum,
476  )
477  {
478  FW_ASSERT(
479  portNum < this->getNum_deallocBufferSendOut_OutputPorts(),
480  static_cast<FwAssertArgType>(portNum)
481  );
482 
483  this->m_deallocBufferSendOut_OutputPort[portNum].addCallPort(port);
484  }
485 
488  FwIndexType portNum,
490  )
491  {
492  FW_ASSERT(
493  portNum < this->getNum_dpWrittenOut_OutputPorts(),
494  static_cast<FwAssertArgType>(portNum)
495  );
496 
497  this->m_dpWrittenOut_OutputPort[portNum].addCallPort(port);
498  }
499 
502  FwIndexType portNum,
504  )
505  {
506  FW_ASSERT(
507  portNum < this->getNum_procBufferSendOut_OutputPorts(),
508  static_cast<FwAssertArgType>(portNum)
509  );
510 
511  this->m_procBufferSendOut_OutputPort[portNum].addCallPort(port);
512  }
513 
514 #if FW_PORT_SERIALIZATION
515 
516  // ----------------------------------------------------------------------
517  // Connect serial input ports to special output ports
518  // ----------------------------------------------------------------------
519 
522  FwIndexType portNum,
523  Fw::InputSerializePort* port
524  )
525  {
526  FW_ASSERT(
527  portNum < this->getNum_cmdRegIn_OutputPorts(),
528  static_cast<FwAssertArgType>(portNum)
529  );
530 
531  this->m_cmdRegIn_OutputPort[portNum].registerSerialPort(port);
532  }
533 
536  FwIndexType portNum,
537  Fw::InputSerializePort* port
538  )
539  {
540  FW_ASSERT(
541  portNum < this->getNum_cmdResponseOut_OutputPorts(),
542  static_cast<FwAssertArgType>(portNum)
543  );
544 
545  this->m_cmdResponseOut_OutputPort[portNum].registerSerialPort(port);
546  }
547 
550  FwIndexType portNum,
551  Fw::InputSerializePort* port
552  )
553  {
554  FW_ASSERT(
555  portNum < this->getNum_eventOut_OutputPorts(),
556  static_cast<FwAssertArgType>(portNum)
557  );
558 
559  this->m_eventOut_OutputPort[portNum].registerSerialPort(port);
560  }
561 
562 #if FW_ENABLE_TEXT_LOGGING == 1
563 
564  void DpWriterComponentBase ::
565  set_textEventOut_OutputPort(
566  FwIndexType portNum,
567  Fw::InputSerializePort* port
568  )
569  {
570  FW_ASSERT(
571  portNum < this->getNum_textEventOut_OutputPorts(),
572  static_cast<FwAssertArgType>(portNum)
573  );
574 
575  this->m_textEventOut_OutputPort[portNum].registerSerialPort(port);
576  }
577 
578 #endif
579 
582  FwIndexType portNum,
583  Fw::InputSerializePort* port
584  )
585  {
586  FW_ASSERT(
587  portNum < this->getNum_timeGetOut_OutputPorts(),
588  static_cast<FwAssertArgType>(portNum)
589  );
590 
591  this->m_timeGetOut_OutputPort[portNum].registerSerialPort(port);
592  }
593 
596  FwIndexType portNum,
597  Fw::InputSerializePort* port
598  )
599  {
600  FW_ASSERT(
601  portNum < this->getNum_tlmOut_OutputPorts(),
602  static_cast<FwAssertArgType>(portNum)
603  );
604 
605  this->m_tlmOut_OutputPort[portNum].registerSerialPort(port);
606  }
607 
608 #endif
609 
610 #if FW_PORT_SERIALIZATION
611 
612  // ----------------------------------------------------------------------
613  // Connect serial input ports to typed output ports
614  // ----------------------------------------------------------------------
615 
618  FwIndexType portNum,
619  Fw::InputSerializePort* port
620  )
621  {
622  FW_ASSERT(
623  portNum < this->getNum_deallocBufferSendOut_OutputPorts(),
624  static_cast<FwAssertArgType>(portNum)
625  );
626 
627  this->m_deallocBufferSendOut_OutputPort[portNum].registerSerialPort(port);
628  }
629 
632  FwIndexType portNum,
633  Fw::InputSerializePort* port
634  )
635  {
636  FW_ASSERT(
637  portNum < this->getNum_dpWrittenOut_OutputPorts(),
638  static_cast<FwAssertArgType>(portNum)
639  );
640 
641  this->m_dpWrittenOut_OutputPort[portNum].registerSerialPort(port);
642  }
643 
646  FwIndexType portNum,
647  Fw::InputSerializePort* port
648  )
649  {
650  FW_ASSERT(
651  portNum < this->getNum_procBufferSendOut_OutputPorts(),
652  static_cast<FwAssertArgType>(portNum)
653  );
654 
655  this->m_procBufferSendOut_OutputPort[portNum].registerSerialPort(port);
656  }
657 
658 #endif
659 
660  // ----------------------------------------------------------------------
661  // Command registration
662  // ----------------------------------------------------------------------
663 
665  regCommands()
666  {
667  FW_ASSERT(this->m_cmdRegIn_OutputPort[0].isConnected());
668 
669  this->m_cmdRegIn_OutputPort[0].invoke(
671  );
672  }
673 
674  // ----------------------------------------------------------------------
675  // Component construction and destruction
676  // ----------------------------------------------------------------------
677 
679  DpWriterComponentBase(const char* compName) :
680  Fw::ActiveComponentBase(compName)
681  {
682  // Write telemetry channel NumBuffersReceived
683  this->m_first_update_NumBuffersReceived = true;
684  this->m_last_NumBuffersReceived = 0;
685 
686  // Write telemetry channel NumBytesWritten
687  this->m_first_update_NumBytesWritten = true;
688  this->m_last_NumBytesWritten = 0;
689 
690  // Write telemetry channel NumSuccessfulWrites
691  this->m_first_update_NumSuccessfulWrites = true;
692  this->m_last_NumSuccessfulWrites = 0;
693 
694  // Write telemetry channel NumFailedWrites
695  this->m_first_update_NumFailedWrites = true;
696  this->m_last_NumFailedWrites = 0;
697 
698  // Write telemetry channel NumErrors
699  this->m_first_update_NumErrors = true;
700  this->m_last_NumErrors = 0;
701 
702  this->m_InvalidBufferThrottle = 0;
703  this->m_BufferTooSmallForPacketThrottle = 0;
704  this->m_InvalidHeaderHashThrottle = 0;
705  this->m_InvalidHeaderThrottle = 0;
706  this->m_BufferTooSmallForDataThrottle = 0;
707  this->m_FileOpenErrorThrottle = 0;
708  this->m_FileWriteErrorThrottle = 0;
709  }
710 
713  {
714 
715  }
716 
717  // ----------------------------------------------------------------------
718  // Getters for numbers of special input ports
719  // ----------------------------------------------------------------------
720 
723  {
724  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_cmdIn_InputPort));
725  }
726 
727  // ----------------------------------------------------------------------
728  // Getters for numbers of typed input ports
729  // ----------------------------------------------------------------------
730 
733  {
734  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_bufferSendIn_InputPort));
735  }
736 
739  {
740  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_schedIn_InputPort));
741  }
742 
743  // ----------------------------------------------------------------------
744  // Getters for numbers of special output ports
745  // ----------------------------------------------------------------------
746 
749  {
750  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_cmdRegIn_OutputPort));
751  }
752 
755  {
756  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_cmdResponseOut_OutputPort));
757  }
758 
761  {
762  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_eventOut_OutputPort));
763  }
764 
765 #if FW_ENABLE_TEXT_LOGGING == 1
766 
767  FwIndexType DpWriterComponentBase ::
768  getNum_textEventOut_OutputPorts() const
769  {
770  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_textEventOut_OutputPort));
771  }
772 
773 #endif
774 
777  {
778  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_timeGetOut_OutputPort));
779  }
780 
783  {
784  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_tlmOut_OutputPort));
785  }
786 
787  // ----------------------------------------------------------------------
788  // Getters for numbers of typed output ports
789  // ----------------------------------------------------------------------
790 
793  {
794  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_deallocBufferSendOut_OutputPort));
795  }
796 
799  {
800  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_dpWrittenOut_OutputPort));
801  }
802 
805  {
806  return static_cast<FwIndexType>(FW_NUM_ARRAY_ELEMENTS(this->m_procBufferSendOut_OutputPort));
807  }
808 
809  // ----------------------------------------------------------------------
810  // Connection status queries for special output ports
811  // ----------------------------------------------------------------------
812 
815  {
816  FW_ASSERT(
817  portNum < this->getNum_cmdRegIn_OutputPorts(),
818  static_cast<FwAssertArgType>(portNum)
819  );
820 
821  return this->m_cmdRegIn_OutputPort[portNum].isConnected();
822  }
823 
826  {
827  FW_ASSERT(
828  portNum < this->getNum_cmdResponseOut_OutputPorts(),
829  static_cast<FwAssertArgType>(portNum)
830  );
831 
832  return this->m_cmdResponseOut_OutputPort[portNum].isConnected();
833  }
834 
837  {
838  FW_ASSERT(
839  portNum < this->getNum_eventOut_OutputPorts(),
840  static_cast<FwAssertArgType>(portNum)
841  );
842 
843  return this->m_eventOut_OutputPort[portNum].isConnected();
844  }
845 
846 #if FW_ENABLE_TEXT_LOGGING == 1
847 
848  bool DpWriterComponentBase ::
849  isConnected_textEventOut_OutputPort(FwIndexType portNum)
850  {
851  FW_ASSERT(
852  portNum < this->getNum_textEventOut_OutputPorts(),
853  static_cast<FwAssertArgType>(portNum)
854  );
855 
856  return this->m_textEventOut_OutputPort[portNum].isConnected();
857  }
858 
859 #endif
860 
863  {
864  FW_ASSERT(
865  portNum < this->getNum_timeGetOut_OutputPorts(),
866  static_cast<FwAssertArgType>(portNum)
867  );
868 
869  return this->m_timeGetOut_OutputPort[portNum].isConnected();
870  }
871 
874  {
875  FW_ASSERT(
876  portNum < this->getNum_tlmOut_OutputPorts(),
877  static_cast<FwAssertArgType>(portNum)
878  );
879 
880  return this->m_tlmOut_OutputPort[portNum].isConnected();
881  }
882 
883  // ----------------------------------------------------------------------
884  // Connection status queries for typed output ports
885  // ----------------------------------------------------------------------
886 
889  {
890  FW_ASSERT(
891  portNum < this->getNum_deallocBufferSendOut_OutputPorts(),
892  static_cast<FwAssertArgType>(portNum)
893  );
894 
895  return this->m_deallocBufferSendOut_OutputPort[portNum].isConnected();
896  }
897 
900  {
901  FW_ASSERT(
902  portNum < this->getNum_dpWrittenOut_OutputPorts(),
903  static_cast<FwAssertArgType>(portNum)
904  );
905 
906  return this->m_dpWrittenOut_OutputPort[portNum].isConnected();
907  }
908 
911  {
912  FW_ASSERT(
913  portNum < this->getNum_procBufferSendOut_OutputPorts(),
914  static_cast<FwAssertArgType>(portNum)
915  );
916 
917  return this->m_procBufferSendOut_OutputPort[portNum].isConnected();
918  }
919 
920  // ----------------------------------------------------------------------
921  // Port handler base-class functions for typed input ports
922  //
923  // Call these functions directly to bypass the corresponding ports
924  // ----------------------------------------------------------------------
925 
928  FwIndexType portNum,
929  Fw::Buffer& fwBuffer
930  )
931  {
932  // Make sure port number is valid
933  FW_ASSERT(
934  portNum < this->getNum_bufferSendIn_InputPorts(),
935  static_cast<FwAssertArgType>(portNum)
936  );
937 
938  // Call pre-message hook
940  portNum,
941  fwBuffer
942  );
943  ComponentIpcSerializableBuffer msg;
945 
946  // Serialize message ID
947  _status = msg.serialize(
948  static_cast<FwEnumStoreType>(BUFFERSENDIN_BUFFERSEND)
949  );
950  FW_ASSERT(
951  _status == Fw::FW_SERIALIZE_OK,
952  static_cast<FwAssertArgType>(_status)
953  );
954 
955  // Serialize port number
956  _status = msg.serialize(portNum);
957  FW_ASSERT(
958  _status == Fw::FW_SERIALIZE_OK,
959  static_cast<FwAssertArgType>(_status)
960  );
961 
962  // Serialize argument fwBuffer
963  _status = msg.serialize(fwBuffer);
964  FW_ASSERT(
965  _status == Fw::FW_SERIALIZE_OK,
966  static_cast<FwAssertArgType>(_status)
967  );
968 
969  // Send message
971  Os::Queue::QueueStatus qStatus = this->m_queue.send(msg, 0, _block);
972 
973  FW_ASSERT(
974  qStatus == Os::Queue::QUEUE_OK,
975  static_cast<FwAssertArgType>(qStatus)
976  );
977  }
978 
981  FwIndexType portNum,
982  U32 context
983  )
984  {
985  // Make sure port number is valid
986  FW_ASSERT(
987  portNum < this->getNum_schedIn_InputPorts(),
988  static_cast<FwAssertArgType>(portNum)
989  );
990 
991  // Call pre-message hook
993  portNum,
994  context
995  );
996  ComponentIpcSerializableBuffer msg;
998 
999  // Serialize message ID
1000  _status = msg.serialize(
1001  static_cast<FwEnumStoreType>(SCHEDIN_SCHED)
1002  );
1003  FW_ASSERT(
1004  _status == Fw::FW_SERIALIZE_OK,
1005  static_cast<FwAssertArgType>(_status)
1006  );
1007 
1008  // Serialize port number
1009  _status = msg.serialize(portNum);
1010  FW_ASSERT(
1011  _status == Fw::FW_SERIALIZE_OK,
1012  static_cast<FwAssertArgType>(_status)
1013  );
1014 
1015  // Serialize argument context
1016  _status = msg.serialize(context);
1017  FW_ASSERT(
1018  _status == Fw::FW_SERIALIZE_OK,
1019  static_cast<FwAssertArgType>(_status)
1020  );
1021 
1022  // Send message
1024  Os::Queue::QueueStatus qStatus = this->m_queue.send(msg, 0, _block);
1025 
1026  FW_ASSERT(
1027  qStatus == Os::Queue::QUEUE_OK,
1028  static_cast<FwAssertArgType>(qStatus)
1029  );
1030  }
1031 
1032  // ----------------------------------------------------------------------
1033  // Pre-message hooks for typed async input ports
1034  //
1035  // Each of these functions is invoked just before processing a message
1036  // on the corresponding port. By default, they do nothing. You can
1037  // override them to provide specific pre-message behavior.
1038  // ----------------------------------------------------------------------
1039 
1042  FwIndexType portNum,
1043  Fw::Buffer& fwBuffer
1044  )
1045  {
1046  // Default: no-op
1047  }
1048 
1051  FwIndexType portNum,
1052  U32 context
1053  )
1054  {
1055  // Default: no-op
1056  }
1057 
1058  // ----------------------------------------------------------------------
1059  // Invocation functions for typed output ports
1060  // ----------------------------------------------------------------------
1061 
1064  FwIndexType portNum,
1065  Fw::Buffer& fwBuffer
1066  )
1067  {
1068  FW_ASSERT(
1069  portNum < this->getNum_deallocBufferSendOut_OutputPorts(),
1070  static_cast<FwAssertArgType>(portNum)
1071  );
1072  this->m_deallocBufferSendOut_OutputPort[portNum].invoke(
1073  fwBuffer
1074  );
1075  }
1076 
1079  FwIndexType portNum,
1080  const Fw::StringBase& fileName,
1081  FwDpPriorityType priority,
1082  FwSizeType size
1083  )
1084  {
1085  FW_ASSERT(
1086  portNum < this->getNum_dpWrittenOut_OutputPorts(),
1087  static_cast<FwAssertArgType>(portNum)
1088  );
1089  this->m_dpWrittenOut_OutputPort[portNum].invoke(
1090  fileName,
1091  priority,
1092  size
1093  );
1094  }
1095 
1098  FwIndexType portNum,
1099  Fw::Buffer& fwBuffer
1100  )
1101  {
1102  FW_ASSERT(
1103  portNum < this->getNum_procBufferSendOut_OutputPorts(),
1104  static_cast<FwAssertArgType>(portNum)
1105  );
1106  this->m_procBufferSendOut_OutputPort[portNum].invoke(
1107  fwBuffer
1108  );
1109  }
1110 
1111  // ----------------------------------------------------------------------
1112  // Command response
1113  // ----------------------------------------------------------------------
1114 
1117  FwOpcodeType opCode,
1118  U32 cmdSeq,
1119  Fw::CmdResponse response
1120  )
1121  {
1122  FW_ASSERT(this->m_cmdResponseOut_OutputPort[0].isConnected());
1123  this->m_cmdResponseOut_OutputPort[0].invoke(opCode, cmdSeq, response);
1124  }
1125 
1126  // ----------------------------------------------------------------------
1127  // Command handler base-class functions
1128  //
1129  // Call these functions directly to bypass the command input port
1130  // ----------------------------------------------------------------------
1131 
1134  FwOpcodeType opCode,
1135  U32 cmdSeq,
1136  Fw::CmdArgBuffer& args
1137  )
1138  {
1139  // Call pre-message hook
1140  this->CLEAR_EVENT_THROTTLE_preMsgHook(opCode,cmdSeq);
1141 
1142  // Defer deserializing arguments to the message dispatcher
1143  // to avoid deserializing and reserializing just for IPC
1144  ComponentIpcSerializableBuffer msg;
1146 
1147  // Serialize for IPC
1148  _status = msg.serialize(static_cast<FwEnumStoreType>(CMD_CLEAR_EVENT_THROTTLE));
1149  FW_ASSERT (
1150  _status == Fw::FW_SERIALIZE_OK,
1151  static_cast<FwAssertArgType>(_status)
1152  );
1153 
1154  // Fake port number to make message dequeue work
1155  FwIndexType port = 0;
1156 
1157  _status = msg.serialize(port);
1158  FW_ASSERT (
1159  _status == Fw::FW_SERIALIZE_OK,
1160  static_cast<FwAssertArgType>(_status)
1161  );
1162 
1163  _status = msg.serialize(opCode);
1164  FW_ASSERT (
1165  _status == Fw::FW_SERIALIZE_OK,
1166  static_cast<FwAssertArgType>(_status)
1167  );
1168 
1169  _status = msg.serialize(cmdSeq);
1170  FW_ASSERT (
1171  _status == Fw::FW_SERIALIZE_OK,
1172  static_cast<FwAssertArgType>(_status)
1173  );
1174 
1175  _status = msg.serialize(args);
1176  FW_ASSERT (
1177  _status == Fw::FW_SERIALIZE_OK,
1178  static_cast<FwAssertArgType>(_status)
1179  );
1180 
1181  // Send message
1183  Os::Queue::QueueStatus qStatus = this->m_queue.send(msg, 0, _block);
1184 
1185  FW_ASSERT(
1186  qStatus == Os::Queue::QUEUE_OK,
1187  static_cast<FwAssertArgType>(qStatus)
1188  );
1189  }
1190 
1191  // ----------------------------------------------------------------------
1192  // Pre-message hooks for async commands
1193  //
1194  // Each of these functions is invoked just before processing the
1195  // corresponding command. By default they do nothing. You can
1196  // override them to provide specific pre-command behavior.
1197  // ----------------------------------------------------------------------
1198 
1201  FwOpcodeType opCode,
1202  U32 cmdSeq
1203  )
1204  {
1205  // Defaults to no-op; can be overridden
1206  (void) opCode;
1207  (void) cmdSeq;
1208  }
1209 
1210  // ----------------------------------------------------------------------
1211  // Event logging functions
1212  // ----------------------------------------------------------------------
1213 
1216  {
1217  // Check throttle value
1218  if (this->m_InvalidBufferThrottle >= EVENTID_INVALIDBUFFER_THROTTLE) {
1219  return;
1220  }
1221  else {
1222  this->m_InvalidBufferThrottle++;
1223  }
1224 
1225  // Get the time
1226  Fw::Time _logTime;
1227  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
1228  this->m_timeGetOut_OutputPort[0].invoke(_logTime);
1229  }
1230 
1231  FwEventIdType _id = static_cast<FwEventIdType>(0);
1232 
1233  _id = this->getIdBase() + EVENTID_INVALIDBUFFER;
1234 
1235  // Emit the event on the log port
1236  if (this->m_eventOut_OutputPort[0].isConnected()) {
1237  Fw::LogBuffer _logBuff;
1238 
1239 #if FW_AMPCS_COMPATIBLE
1241  // Serialize the number of arguments
1242  _status = _logBuff.serialize(static_cast<U8>(0));
1243  FW_ASSERT(
1244  _status == Fw::FW_SERIALIZE_OK,
1245  static_cast<FwAssertArgType>(_status)
1246  );
1247 #endif
1248 
1249  this->m_eventOut_OutputPort[0].invoke(
1250  _id,
1251  _logTime,
1253  _logBuff
1254  );
1255  }
1256 
1257  // Emit the event on the text log port
1258 #if FW_ENABLE_TEXT_LOGGING
1259  if (this->m_textEventOut_OutputPort[0].isConnected()) {
1260 #if FW_OBJECT_NAMES == 1
1261  const char* _formatString =
1262  "(%s) %s: Received buffer is invalid";
1263 #else
1264  const char* _formatString =
1265  "%s: Received buffer is invalid";
1266 #endif
1267 
1268  Fw::TextLogString _logString;
1269  _logString.format(
1270  _formatString,
1271 #if FW_OBJECT_NAMES == 1
1272  this->m_objName.toChar(),
1273 #endif
1274  "InvalidBuffer "
1275  );
1276 
1277  this->m_textEventOut_OutputPort[0].invoke(
1278  _id,
1279  _logTime,
1281  _logString
1282  );
1283  }
1284 #endif
1285  }
1286 
1289  U32 bufferSize,
1290  U32 minSize
1291  )
1292  {
1293  // Check throttle value
1294  if (this->m_BufferTooSmallForPacketThrottle >= EVENTID_BUFFERTOOSMALLFORPACKET_THROTTLE) {
1295  return;
1296  }
1297  else {
1298  this->m_BufferTooSmallForPacketThrottle++;
1299  }
1300 
1301  // Get the time
1302  Fw::Time _logTime;
1303  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
1304  this->m_timeGetOut_OutputPort[0].invoke(_logTime);
1305  }
1306 
1307  FwEventIdType _id = static_cast<FwEventIdType>(0);
1308 
1310 
1311  // Emit the event on the log port
1312  if (this->m_eventOut_OutputPort[0].isConnected()) {
1313  Fw::LogBuffer _logBuff;
1315 
1316 #if FW_AMPCS_COMPATIBLE
1317  // Serialize the number of arguments
1318  _status = _logBuff.serialize(static_cast<U8>(2));
1319  FW_ASSERT(
1320  _status == Fw::FW_SERIALIZE_OK,
1321  static_cast<FwAssertArgType>(_status)
1322  );
1323 #endif
1324 
1325 #if FW_AMPCS_COMPATIBLE
1326  // Serialize the argument size
1327  _status = _logBuff.serialize(
1328  static_cast<U8>(sizeof(U32))
1329  );
1330  FW_ASSERT(
1331  _status == Fw::FW_SERIALIZE_OK,
1332  static_cast<FwAssertArgType>(_status)
1333  );
1334 #endif
1335  _status = _logBuff.serialize(bufferSize);
1336  FW_ASSERT(
1337  _status == Fw::FW_SERIALIZE_OK,
1338  static_cast<FwAssertArgType>(_status)
1339  );
1340 
1341 #if FW_AMPCS_COMPATIBLE
1342  // Serialize the argument size
1343  _status = _logBuff.serialize(
1344  static_cast<U8>(sizeof(U32))
1345  );
1346  FW_ASSERT(
1347  _status == Fw::FW_SERIALIZE_OK,
1348  static_cast<FwAssertArgType>(_status)
1349  );
1350 #endif
1351  _status = _logBuff.serialize(minSize);
1352  FW_ASSERT(
1353  _status == Fw::FW_SERIALIZE_OK,
1354  static_cast<FwAssertArgType>(_status)
1355  );
1356 
1357  this->m_eventOut_OutputPort[0].invoke(
1358  _id,
1359  _logTime,
1361  _logBuff
1362  );
1363  }
1364 
1365  // Emit the event on the text log port
1366 #if FW_ENABLE_TEXT_LOGGING
1367  if (this->m_textEventOut_OutputPort[0].isConnected()) {
1368 #if FW_OBJECT_NAMES == 1
1369  const char* _formatString =
1370  "(%s) %s: Received buffer has size %" PRIu32 "; minimum required size is %" PRIu32 "";
1371 #else
1372  const char* _formatString =
1373  "%s: Received buffer has size %" PRIu32 "; minimum required size is %" PRIu32 "";
1374 #endif
1375 
1376  Fw::TextLogString _logString;
1377  _logString.format(
1378  _formatString,
1379 #if FW_OBJECT_NAMES == 1
1380  this->m_objName.toChar(),
1381 #endif
1382  "BufferTooSmallForPacket ",
1383  bufferSize,
1384  minSize
1385  );
1386 
1387  this->m_textEventOut_OutputPort[0].invoke(
1388  _id,
1389  _logTime,
1391  _logString
1392  );
1393  }
1394 #endif
1395  }
1396 
1399  U32 bufferSize,
1400  U32 storedHash,
1401  U32 computedHash
1402  )
1403  {
1404  // Check throttle value
1405  if (this->m_InvalidHeaderHashThrottle >= EVENTID_INVALIDHEADERHASH_THROTTLE) {
1406  return;
1407  }
1408  else {
1409  this->m_InvalidHeaderHashThrottle++;
1410  }
1411 
1412  // Get the time
1413  Fw::Time _logTime;
1414  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
1415  this->m_timeGetOut_OutputPort[0].invoke(_logTime);
1416  }
1417 
1418  FwEventIdType _id = static_cast<FwEventIdType>(0);
1419 
1420  _id = this->getIdBase() + EVENTID_INVALIDHEADERHASH;
1421 
1422  // Emit the event on the log port
1423  if (this->m_eventOut_OutputPort[0].isConnected()) {
1424  Fw::LogBuffer _logBuff;
1426 
1427 #if FW_AMPCS_COMPATIBLE
1428  // Serialize the number of arguments
1429  _status = _logBuff.serialize(static_cast<U8>(3));
1430  FW_ASSERT(
1431  _status == Fw::FW_SERIALIZE_OK,
1432  static_cast<FwAssertArgType>(_status)
1433  );
1434 #endif
1435 
1436 #if FW_AMPCS_COMPATIBLE
1437  // Serialize the argument size
1438  _status = _logBuff.serialize(
1439  static_cast<U8>(sizeof(U32))
1440  );
1441  FW_ASSERT(
1442  _status == Fw::FW_SERIALIZE_OK,
1443  static_cast<FwAssertArgType>(_status)
1444  );
1445 #endif
1446  _status = _logBuff.serialize(bufferSize);
1447  FW_ASSERT(
1448  _status == Fw::FW_SERIALIZE_OK,
1449  static_cast<FwAssertArgType>(_status)
1450  );
1451 
1452 #if FW_AMPCS_COMPATIBLE
1453  // Serialize the argument size
1454  _status = _logBuff.serialize(
1455  static_cast<U8>(sizeof(U32))
1456  );
1457  FW_ASSERT(
1458  _status == Fw::FW_SERIALIZE_OK,
1459  static_cast<FwAssertArgType>(_status)
1460  );
1461 #endif
1462  _status = _logBuff.serialize(storedHash);
1463  FW_ASSERT(
1464  _status == Fw::FW_SERIALIZE_OK,
1465  static_cast<FwAssertArgType>(_status)
1466  );
1467 
1468 #if FW_AMPCS_COMPATIBLE
1469  // Serialize the argument size
1470  _status = _logBuff.serialize(
1471  static_cast<U8>(sizeof(U32))
1472  );
1473  FW_ASSERT(
1474  _status == Fw::FW_SERIALIZE_OK,
1475  static_cast<FwAssertArgType>(_status)
1476  );
1477 #endif
1478  _status = _logBuff.serialize(computedHash);
1479  FW_ASSERT(
1480  _status == Fw::FW_SERIALIZE_OK,
1481  static_cast<FwAssertArgType>(_status)
1482  );
1483 
1484  this->m_eventOut_OutputPort[0].invoke(
1485  _id,
1486  _logTime,
1488  _logBuff
1489  );
1490  }
1491 
1492  // Emit the event on the text log port
1493 #if FW_ENABLE_TEXT_LOGGING
1494  if (this->m_textEventOut_OutputPort[0].isConnected()) {
1495 #if FW_OBJECT_NAMES == 1
1496  const char* _formatString =
1497  "(%s) %s: Received a buffer of size %" PRIu32 " with an invalid header hash (stored %" PRIx32 ", computed %" PRIx32 ")";
1498 #else
1499  const char* _formatString =
1500  "%s: Received a buffer of size %" PRIu32 " with an invalid header hash (stored %" PRIx32 ", computed %" PRIx32 ")";
1501 #endif
1502 
1503  Fw::TextLogString _logString;
1504  _logString.format(
1505  _formatString,
1506 #if FW_OBJECT_NAMES == 1
1507  this->m_objName.toChar(),
1508 #endif
1509  "InvalidHeaderHash ",
1510  bufferSize,
1511  storedHash,
1512  computedHash
1513  );
1514 
1515  this->m_textEventOut_OutputPort[0].invoke(
1516  _id,
1517  _logTime,
1519  _logString
1520  );
1521  }
1522 #endif
1523  }
1524 
1527  U32 bufferSize,
1528  U32 errorCode
1529  )
1530  {
1531  // Check throttle value
1532  if (this->m_InvalidHeaderThrottle >= EVENTID_INVALIDHEADER_THROTTLE) {
1533  return;
1534  }
1535  else {
1536  this->m_InvalidHeaderThrottle++;
1537  }
1538 
1539  // Get the time
1540  Fw::Time _logTime;
1541  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
1542  this->m_timeGetOut_OutputPort[0].invoke(_logTime);
1543  }
1544 
1545  FwEventIdType _id = static_cast<FwEventIdType>(0);
1546 
1547  _id = this->getIdBase() + EVENTID_INVALIDHEADER;
1548 
1549  // Emit the event on the log port
1550  if (this->m_eventOut_OutputPort[0].isConnected()) {
1551  Fw::LogBuffer _logBuff;
1553 
1554 #if FW_AMPCS_COMPATIBLE
1555  // Serialize the number of arguments
1556  _status = _logBuff.serialize(static_cast<U8>(2));
1557  FW_ASSERT(
1558  _status == Fw::FW_SERIALIZE_OK,
1559  static_cast<FwAssertArgType>(_status)
1560  );
1561 #endif
1562 
1563 #if FW_AMPCS_COMPATIBLE
1564  // Serialize the argument size
1565  _status = _logBuff.serialize(
1566  static_cast<U8>(sizeof(U32))
1567  );
1568  FW_ASSERT(
1569  _status == Fw::FW_SERIALIZE_OK,
1570  static_cast<FwAssertArgType>(_status)
1571  );
1572 #endif
1573  _status = _logBuff.serialize(bufferSize);
1574  FW_ASSERT(
1575  _status == Fw::FW_SERIALIZE_OK,
1576  static_cast<FwAssertArgType>(_status)
1577  );
1578 
1579 #if FW_AMPCS_COMPATIBLE
1580  // Serialize the argument size
1581  _status = _logBuff.serialize(
1582  static_cast<U8>(sizeof(U32))
1583  );
1584  FW_ASSERT(
1585  _status == Fw::FW_SERIALIZE_OK,
1586  static_cast<FwAssertArgType>(_status)
1587  );
1588 #endif
1589  _status = _logBuff.serialize(errorCode);
1590  FW_ASSERT(
1591  _status == Fw::FW_SERIALIZE_OK,
1592  static_cast<FwAssertArgType>(_status)
1593  );
1594 
1595  this->m_eventOut_OutputPort[0].invoke(
1596  _id,
1597  _logTime,
1599  _logBuff
1600  );
1601  }
1602 
1603  // Emit the event on the text log port
1604 #if FW_ENABLE_TEXT_LOGGING
1605  if (this->m_textEventOut_OutputPort[0].isConnected()) {
1606 #if FW_OBJECT_NAMES == 1
1607  const char* _formatString =
1608  "(%s) %s: Received buffer of size %" PRIu32 "; deserialization of packet header failed with error code %" PRIu32 "";
1609 #else
1610  const char* _formatString =
1611  "%s: Received buffer of size %" PRIu32 "; deserialization of packet header failed with error code %" PRIu32 "";
1612 #endif
1613 
1614  Fw::TextLogString _logString;
1615  _logString.format(
1616  _formatString,
1617 #if FW_OBJECT_NAMES == 1
1618  this->m_objName.toChar(),
1619 #endif
1620  "InvalidHeader ",
1621  bufferSize,
1622  errorCode
1623  );
1624 
1625  this->m_textEventOut_OutputPort[0].invoke(
1626  _id,
1627  _logTime,
1629  _logString
1630  );
1631  }
1632 #endif
1633  }
1634 
1637  U32 bufferSize,
1638  U32 minSize
1639  )
1640  {
1641  // Check throttle value
1642  if (this->m_BufferTooSmallForDataThrottle >= EVENTID_BUFFERTOOSMALLFORDATA_THROTTLE) {
1643  return;
1644  }
1645  else {
1646  this->m_BufferTooSmallForDataThrottle++;
1647  }
1648 
1649  // Get the time
1650  Fw::Time _logTime;
1651  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
1652  this->m_timeGetOut_OutputPort[0].invoke(_logTime);
1653  }
1654 
1655  FwEventIdType _id = static_cast<FwEventIdType>(0);
1656 
1657  _id = this->getIdBase() + EVENTID_BUFFERTOOSMALLFORDATA;
1658 
1659  // Emit the event on the log port
1660  if (this->m_eventOut_OutputPort[0].isConnected()) {
1661  Fw::LogBuffer _logBuff;
1663 
1664 #if FW_AMPCS_COMPATIBLE
1665  // Serialize the number of arguments
1666  _status = _logBuff.serialize(static_cast<U8>(2));
1667  FW_ASSERT(
1668  _status == Fw::FW_SERIALIZE_OK,
1669  static_cast<FwAssertArgType>(_status)
1670  );
1671 #endif
1672 
1673 #if FW_AMPCS_COMPATIBLE
1674  // Serialize the argument size
1675  _status = _logBuff.serialize(
1676  static_cast<U8>(sizeof(U32))
1677  );
1678  FW_ASSERT(
1679  _status == Fw::FW_SERIALIZE_OK,
1680  static_cast<FwAssertArgType>(_status)
1681  );
1682 #endif
1683  _status = _logBuff.serialize(bufferSize);
1684  FW_ASSERT(
1685  _status == Fw::FW_SERIALIZE_OK,
1686  static_cast<FwAssertArgType>(_status)
1687  );
1688 
1689 #if FW_AMPCS_COMPATIBLE
1690  // Serialize the argument size
1691  _status = _logBuff.serialize(
1692  static_cast<U8>(sizeof(U32))
1693  );
1694  FW_ASSERT(
1695  _status == Fw::FW_SERIALIZE_OK,
1696  static_cast<FwAssertArgType>(_status)
1697  );
1698 #endif
1699  _status = _logBuff.serialize(minSize);
1700  FW_ASSERT(
1701  _status == Fw::FW_SERIALIZE_OK,
1702  static_cast<FwAssertArgType>(_status)
1703  );
1704 
1705  this->m_eventOut_OutputPort[0].invoke(
1706  _id,
1707  _logTime,
1709  _logBuff
1710  );
1711  }
1712 
1713  // Emit the event on the text log port
1714 #if FW_ENABLE_TEXT_LOGGING
1715  if (this->m_textEventOut_OutputPort[0].isConnected()) {
1716 #if FW_OBJECT_NAMES == 1
1717  const char* _formatString =
1718  "(%s) %s: Received buffer has size %" PRIu32 "; minimum required size is %" PRIu32 "";
1719 #else
1720  const char* _formatString =
1721  "%s: Received buffer has size %" PRIu32 "; minimum required size is %" PRIu32 "";
1722 #endif
1723 
1724  Fw::TextLogString _logString;
1725  _logString.format(
1726  _formatString,
1727 #if FW_OBJECT_NAMES == 1
1728  this->m_objName.toChar(),
1729 #endif
1730  "BufferTooSmallForData ",
1731  bufferSize,
1732  minSize
1733  );
1734 
1735  this->m_textEventOut_OutputPort[0].invoke(
1736  _id,
1737  _logTime,
1739  _logString
1740  );
1741  }
1742 #endif
1743  }
1744 
1747  U32 status,
1748  const Fw::StringBase& file
1749  )
1750  {
1751  // Check throttle value
1752  if (this->m_FileOpenErrorThrottle >= EVENTID_FILEOPENERROR_THROTTLE) {
1753  return;
1754  }
1755  else {
1756  this->m_FileOpenErrorThrottle++;
1757  }
1758 
1759  // Get the time
1760  Fw::Time _logTime;
1761  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
1762  this->m_timeGetOut_OutputPort[0].invoke(_logTime);
1763  }
1764 
1765  FwEventIdType _id = static_cast<FwEventIdType>(0);
1766 
1767  _id = this->getIdBase() + EVENTID_FILEOPENERROR;
1768 
1769  // Emit the event on the log port
1770  if (this->m_eventOut_OutputPort[0].isConnected()) {
1771  Fw::LogBuffer _logBuff;
1773 
1774 #if FW_AMPCS_COMPATIBLE
1775  // Serialize the number of arguments
1776  _status = _logBuff.serialize(static_cast<U8>(2));
1777  FW_ASSERT(
1778  _status == Fw::FW_SERIALIZE_OK,
1779  static_cast<FwAssertArgType>(_status)
1780  );
1781 #endif
1782 
1783 #if FW_AMPCS_COMPATIBLE
1784  // Serialize the argument size
1785  _status = _logBuff.serialize(
1786  static_cast<U8>(sizeof(U32))
1787  );
1788  FW_ASSERT(
1789  _status == Fw::FW_SERIALIZE_OK,
1790  static_cast<FwAssertArgType>(_status)
1791  );
1792 #endif
1793  _status = _logBuff.serialize(status);
1794  FW_ASSERT(
1795  _status == Fw::FW_SERIALIZE_OK,
1796  static_cast<FwAssertArgType>(_status)
1797  );
1798 
1799  _status = file.serialize(_logBuff, FW_MIN(FW_LOG_STRING_MAX_SIZE, 200));
1800  FW_ASSERT(
1801  _status == Fw::FW_SERIALIZE_OK,
1802  static_cast<FwAssertArgType>(_status)
1803  );
1804 
1805  this->m_eventOut_OutputPort[0].invoke(
1806  _id,
1807  _logTime,
1809  _logBuff
1810  );
1811  }
1812 
1813  // Emit the event on the text log port
1814 #if FW_ENABLE_TEXT_LOGGING
1815  if (this->m_textEventOut_OutputPort[0].isConnected()) {
1816 #if FW_OBJECT_NAMES == 1
1817  const char* _formatString =
1818  "(%s) %s: Error %" PRIu32 " opening file %s";
1819 #else
1820  const char* _formatString =
1821  "%s: Error %" PRIu32 " opening file %s";
1822 #endif
1823 
1824  Fw::TextLogString _logString;
1825  _logString.format(
1826  _formatString,
1827 #if FW_OBJECT_NAMES == 1
1828  this->m_objName.toChar(),
1829 #endif
1830  "FileOpenError ",
1831  status,
1832  file.toChar()
1833  );
1834 
1835  this->m_textEventOut_OutputPort[0].invoke(
1836  _id,
1837  _logTime,
1839  _logString
1840  );
1841  }
1842 #endif
1843  }
1844 
1847  U32 status,
1848  U32 bytesWritten,
1849  U32 bytesToWrite,
1850  const Fw::StringBase& file
1851  )
1852  {
1853  // Check throttle value
1854  if (this->m_FileWriteErrorThrottle >= EVENTID_FILEWRITEERROR_THROTTLE) {
1855  return;
1856  }
1857  else {
1858  this->m_FileWriteErrorThrottle++;
1859  }
1860 
1861  // Get the time
1862  Fw::Time _logTime;
1863  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
1864  this->m_timeGetOut_OutputPort[0].invoke(_logTime);
1865  }
1866 
1867  FwEventIdType _id = static_cast<FwEventIdType>(0);
1868 
1869  _id = this->getIdBase() + EVENTID_FILEWRITEERROR;
1870 
1871  // Emit the event on the log port
1872  if (this->m_eventOut_OutputPort[0].isConnected()) {
1873  Fw::LogBuffer _logBuff;
1875 
1876 #if FW_AMPCS_COMPATIBLE
1877  // Serialize the number of arguments
1878  _status = _logBuff.serialize(static_cast<U8>(4));
1879  FW_ASSERT(
1880  _status == Fw::FW_SERIALIZE_OK,
1881  static_cast<FwAssertArgType>(_status)
1882  );
1883 #endif
1884 
1885 #if FW_AMPCS_COMPATIBLE
1886  // Serialize the argument size
1887  _status = _logBuff.serialize(
1888  static_cast<U8>(sizeof(U32))
1889  );
1890  FW_ASSERT(
1891  _status == Fw::FW_SERIALIZE_OK,
1892  static_cast<FwAssertArgType>(_status)
1893  );
1894 #endif
1895  _status = _logBuff.serialize(status);
1896  FW_ASSERT(
1897  _status == Fw::FW_SERIALIZE_OK,
1898  static_cast<FwAssertArgType>(_status)
1899  );
1900 
1901 #if FW_AMPCS_COMPATIBLE
1902  // Serialize the argument size
1903  _status = _logBuff.serialize(
1904  static_cast<U8>(sizeof(U32))
1905  );
1906  FW_ASSERT(
1907  _status == Fw::FW_SERIALIZE_OK,
1908  static_cast<FwAssertArgType>(_status)
1909  );
1910 #endif
1911  _status = _logBuff.serialize(bytesWritten);
1912  FW_ASSERT(
1913  _status == Fw::FW_SERIALIZE_OK,
1914  static_cast<FwAssertArgType>(_status)
1915  );
1916 
1917 #if FW_AMPCS_COMPATIBLE
1918  // Serialize the argument size
1919  _status = _logBuff.serialize(
1920  static_cast<U8>(sizeof(U32))
1921  );
1922  FW_ASSERT(
1923  _status == Fw::FW_SERIALIZE_OK,
1924  static_cast<FwAssertArgType>(_status)
1925  );
1926 #endif
1927  _status = _logBuff.serialize(bytesToWrite);
1928  FW_ASSERT(
1929  _status == Fw::FW_SERIALIZE_OK,
1930  static_cast<FwAssertArgType>(_status)
1931  );
1932 
1933  _status = file.serialize(_logBuff, FW_MIN(FW_LOG_STRING_MAX_SIZE, 200));
1934  FW_ASSERT(
1935  _status == Fw::FW_SERIALIZE_OK,
1936  static_cast<FwAssertArgType>(_status)
1937  );
1938 
1939  this->m_eventOut_OutputPort[0].invoke(
1940  _id,
1941  _logTime,
1943  _logBuff
1944  );
1945  }
1946 
1947  // Emit the event on the text log port
1948 #if FW_ENABLE_TEXT_LOGGING
1949  if (this->m_textEventOut_OutputPort[0].isConnected()) {
1950 #if FW_OBJECT_NAMES == 1
1951  const char* _formatString =
1952  "(%s) %s: Error %" PRIu32 " while writing %" PRIu32 " of %" PRIu32 " bytes to %s";
1953 #else
1954  const char* _formatString =
1955  "%s: Error %" PRIu32 " while writing %" PRIu32 " of %" PRIu32 " bytes to %s";
1956 #endif
1957 
1958  Fw::TextLogString _logString;
1959  _logString.format(
1960  _formatString,
1961 #if FW_OBJECT_NAMES == 1
1962  this->m_objName.toChar(),
1963 #endif
1964  "FileWriteError ",
1965  status,
1966  bytesWritten,
1967  bytesToWrite,
1968  file.toChar()
1969  );
1970 
1971  this->m_textEventOut_OutputPort[0].invoke(
1972  _id,
1973  _logTime,
1975  _logString
1976  );
1977  }
1978 #endif
1979  }
1980 
1983  U32 bytes,
1984  const Fw::StringBase& file
1985  )
1986  {
1987  // Get the time
1988  Fw::Time _logTime;
1989  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
1990  this->m_timeGetOut_OutputPort[0].invoke(_logTime);
1991  }
1992 
1993  FwEventIdType _id = static_cast<FwEventIdType>(0);
1994 
1995  _id = this->getIdBase() + EVENTID_FILEWRITTEN;
1996 
1997  // Emit the event on the log port
1998  if (this->m_eventOut_OutputPort[0].isConnected()) {
1999  Fw::LogBuffer _logBuff;
2001 
2002 #if FW_AMPCS_COMPATIBLE
2003  // Serialize the number of arguments
2004  _status = _logBuff.serialize(static_cast<U8>(2));
2005  FW_ASSERT(
2006  _status == Fw::FW_SERIALIZE_OK,
2007  static_cast<FwAssertArgType>(_status)
2008  );
2009 #endif
2010 
2011 #if FW_AMPCS_COMPATIBLE
2012  // Serialize the argument size
2013  _status = _logBuff.serialize(
2014  static_cast<U8>(sizeof(U32))
2015  );
2016  FW_ASSERT(
2017  _status == Fw::FW_SERIALIZE_OK,
2018  static_cast<FwAssertArgType>(_status)
2019  );
2020 #endif
2021  _status = _logBuff.serialize(bytes);
2022  FW_ASSERT(
2023  _status == Fw::FW_SERIALIZE_OK,
2024  static_cast<FwAssertArgType>(_status)
2025  );
2026 
2027  _status = file.serialize(_logBuff, FW_MIN(FW_LOG_STRING_MAX_SIZE, 200));
2028  FW_ASSERT(
2029  _status == Fw::FW_SERIALIZE_OK,
2030  static_cast<FwAssertArgType>(_status)
2031  );
2032 
2033  this->m_eventOut_OutputPort[0].invoke(
2034  _id,
2035  _logTime,
2037  _logBuff
2038  );
2039  }
2040 
2041  // Emit the event on the text log port
2042 #if FW_ENABLE_TEXT_LOGGING
2043  if (this->m_textEventOut_OutputPort[0].isConnected()) {
2044 #if FW_OBJECT_NAMES == 1
2045  const char* _formatString =
2046  "(%s) %s: Wrote %" PRIu32 " bytes to file %s";
2047 #else
2048  const char* _formatString =
2049  "%s: Wrote %" PRIu32 " bytes to file %s";
2050 #endif
2051 
2052  Fw::TextLogString _logString;
2053  _logString.format(
2054  _formatString,
2055 #if FW_OBJECT_NAMES == 1
2056  this->m_objName.toChar(),
2057 #endif
2058  "FileWritten ",
2059  bytes,
2060  file.toChar()
2061  );
2062 
2063  this->m_textEventOut_OutputPort[0].invoke(
2064  _id,
2065  _logTime,
2067  _logString
2068  );
2069  }
2070 #endif
2071  }
2072 
2073  // ----------------------------------------------------------------------
2074  // Event throttle reset functions
2075  // ----------------------------------------------------------------------
2076 
2079  {
2080  // Reset throttle counter
2081  this->m_InvalidBufferThrottle = 0;
2082  }
2083 
2086  {
2087  // Reset throttle counter
2088  this->m_BufferTooSmallForPacketThrottle = 0;
2089  }
2090 
2093  {
2094  // Reset throttle counter
2095  this->m_InvalidHeaderHashThrottle = 0;
2096  }
2097 
2100  {
2101  // Reset throttle counter
2102  this->m_InvalidHeaderThrottle = 0;
2103  }
2104 
2107  {
2108  // Reset throttle counter
2109  this->m_BufferTooSmallForDataThrottle = 0;
2110  }
2111 
2114  {
2115  // Reset throttle counter
2116  this->m_FileOpenErrorThrottle = 0;
2117  }
2118 
2121  {
2122  // Reset throttle counter
2123  this->m_FileWriteErrorThrottle = 0;
2124  }
2125 
2126  // ----------------------------------------------------------------------
2127  // Telemetry write functions
2128  // ----------------------------------------------------------------------
2129 
2132  U32 arg,
2133  Fw::Time _tlmTime
2134  )
2135  {
2136  // Check to see if it is the first time
2137  if (not this->m_first_update_NumBuffersReceived) {
2138  // Check to see if value has changed. If not, don't write it.
2139  if (arg == this->m_last_NumBuffersReceived) {
2140  return;
2141  }
2142  else {
2143  this->m_last_NumBuffersReceived = arg;
2144  }
2145  }
2146  else {
2147  this->m_first_update_NumBuffersReceived = false;
2148  this->m_last_NumBuffersReceived = arg;
2149  }
2150 
2151  if (this->m_tlmOut_OutputPort[0].isConnected()) {
2152  if (
2153  this->m_timeGetOut_OutputPort[0].isConnected() &&
2154  (_tlmTime == Fw::ZERO_TIME)
2155  ) {
2156  this->m_timeGetOut_OutputPort[0].invoke(_tlmTime);
2157  }
2158 
2159  Fw::TlmBuffer _tlmBuff;
2160  Fw::SerializeStatus _stat = _tlmBuff.serialize(arg);
2161  FW_ASSERT(
2162  _stat == Fw::FW_SERIALIZE_OK,
2163  static_cast<FwAssertArgType>(_stat)
2164  );
2165 
2166  FwChanIdType _id;
2167 
2168  _id = this->getIdBase() + CHANNELID_NUMBUFFERSRECEIVED;
2169 
2170  this->m_tlmOut_OutputPort[0].invoke(
2171  _id,
2172  _tlmTime,
2173  _tlmBuff
2174  );
2175  }
2176  }
2177 
2180  U64 arg,
2181  Fw::Time _tlmTime
2182  )
2183  {
2184  // Check to see if it is the first time
2185  if (not this->m_first_update_NumBytesWritten) {
2186  // Check to see if value has changed. If not, don't write it.
2187  if (arg == this->m_last_NumBytesWritten) {
2188  return;
2189  }
2190  else {
2191  this->m_last_NumBytesWritten = arg;
2192  }
2193  }
2194  else {
2195  this->m_first_update_NumBytesWritten = false;
2196  this->m_last_NumBytesWritten = arg;
2197  }
2198 
2199  if (this->m_tlmOut_OutputPort[0].isConnected()) {
2200  if (
2201  this->m_timeGetOut_OutputPort[0].isConnected() &&
2202  (_tlmTime == Fw::ZERO_TIME)
2203  ) {
2204  this->m_timeGetOut_OutputPort[0].invoke(_tlmTime);
2205  }
2206 
2207  Fw::TlmBuffer _tlmBuff;
2208  Fw::SerializeStatus _stat = _tlmBuff.serialize(arg);
2209  FW_ASSERT(
2210  _stat == Fw::FW_SERIALIZE_OK,
2211  static_cast<FwAssertArgType>(_stat)
2212  );
2213 
2214  FwChanIdType _id;
2215 
2216  _id = this->getIdBase() + CHANNELID_NUMBYTESWRITTEN;
2217 
2218  this->m_tlmOut_OutputPort[0].invoke(
2219  _id,
2220  _tlmTime,
2221  _tlmBuff
2222  );
2223  }
2224  }
2225 
2228  U32 arg,
2229  Fw::Time _tlmTime
2230  )
2231  {
2232  // Check to see if it is the first time
2233  if (not this->m_first_update_NumSuccessfulWrites) {
2234  // Check to see if value has changed. If not, don't write it.
2235  if (arg == this->m_last_NumSuccessfulWrites) {
2236  return;
2237  }
2238  else {
2239  this->m_last_NumSuccessfulWrites = arg;
2240  }
2241  }
2242  else {
2243  this->m_first_update_NumSuccessfulWrites = false;
2244  this->m_last_NumSuccessfulWrites = arg;
2245  }
2246 
2247  if (this->m_tlmOut_OutputPort[0].isConnected()) {
2248  if (
2249  this->m_timeGetOut_OutputPort[0].isConnected() &&
2250  (_tlmTime == Fw::ZERO_TIME)
2251  ) {
2252  this->m_timeGetOut_OutputPort[0].invoke(_tlmTime);
2253  }
2254 
2255  Fw::TlmBuffer _tlmBuff;
2256  Fw::SerializeStatus _stat = _tlmBuff.serialize(arg);
2257  FW_ASSERT(
2258  _stat == Fw::FW_SERIALIZE_OK,
2259  static_cast<FwAssertArgType>(_stat)
2260  );
2261 
2262  FwChanIdType _id;
2263 
2264  _id = this->getIdBase() + CHANNELID_NUMSUCCESSFULWRITES;
2265 
2266  this->m_tlmOut_OutputPort[0].invoke(
2267  _id,
2268  _tlmTime,
2269  _tlmBuff
2270  );
2271  }
2272  }
2273 
2276  U32 arg,
2277  Fw::Time _tlmTime
2278  )
2279  {
2280  // Check to see if it is the first time
2281  if (not this->m_first_update_NumFailedWrites) {
2282  // Check to see if value has changed. If not, don't write it.
2283  if (arg == this->m_last_NumFailedWrites) {
2284  return;
2285  }
2286  else {
2287  this->m_last_NumFailedWrites = arg;
2288  }
2289  }
2290  else {
2291  this->m_first_update_NumFailedWrites = false;
2292  this->m_last_NumFailedWrites = arg;
2293  }
2294 
2295  if (this->m_tlmOut_OutputPort[0].isConnected()) {
2296  if (
2297  this->m_timeGetOut_OutputPort[0].isConnected() &&
2298  (_tlmTime == Fw::ZERO_TIME)
2299  ) {
2300  this->m_timeGetOut_OutputPort[0].invoke(_tlmTime);
2301  }
2302 
2303  Fw::TlmBuffer _tlmBuff;
2304  Fw::SerializeStatus _stat = _tlmBuff.serialize(arg);
2305  FW_ASSERT(
2306  _stat == Fw::FW_SERIALIZE_OK,
2307  static_cast<FwAssertArgType>(_stat)
2308  );
2309 
2310  FwChanIdType _id;
2311 
2312  _id = this->getIdBase() + CHANNELID_NUMFAILEDWRITES;
2313 
2314  this->m_tlmOut_OutputPort[0].invoke(
2315  _id,
2316  _tlmTime,
2317  _tlmBuff
2318  );
2319  }
2320  }
2321 
2324  U32 arg,
2325  Fw::Time _tlmTime
2326  )
2327  {
2328  // Check to see if it is the first time
2329  if (not this->m_first_update_NumErrors) {
2330  // Check to see if value has changed. If not, don't write it.
2331  if (arg == this->m_last_NumErrors) {
2332  return;
2333  }
2334  else {
2335  this->m_last_NumErrors = arg;
2336  }
2337  }
2338  else {
2339  this->m_first_update_NumErrors = false;
2340  this->m_last_NumErrors = arg;
2341  }
2342 
2343  if (this->m_tlmOut_OutputPort[0].isConnected()) {
2344  if (
2345  this->m_timeGetOut_OutputPort[0].isConnected() &&
2346  (_tlmTime == Fw::ZERO_TIME)
2347  ) {
2348  this->m_timeGetOut_OutputPort[0].invoke(_tlmTime);
2349  }
2350 
2351  Fw::TlmBuffer _tlmBuff;
2352  Fw::SerializeStatus _stat = _tlmBuff.serialize(arg);
2353  FW_ASSERT(
2354  _stat == Fw::FW_SERIALIZE_OK,
2355  static_cast<FwAssertArgType>(_stat)
2356  );
2357 
2358  FwChanIdType _id;
2359 
2360  _id = this->getIdBase() + CHANNELID_NUMERRORS;
2361 
2362  this->m_tlmOut_OutputPort[0].invoke(
2363  _id,
2364  _tlmTime,
2365  _tlmBuff
2366  );
2367  }
2368  }
2369 
2370  // ----------------------------------------------------------------------
2371  // Time
2372  // ----------------------------------------------------------------------
2373 
2375  getTime()
2376  {
2377  if (this->m_timeGetOut_OutputPort[0].isConnected()) {
2378  Fw::Time _time;
2379  this->m_timeGetOut_OutputPort[0].invoke(_time);
2380  return _time;
2381  }
2382  else {
2383  return Fw::Time(TB_NONE, 0, 0);
2384  }
2385  }
2386 
2387  // ----------------------------------------------------------------------
2388  // Message dispatch functions
2389  // ----------------------------------------------------------------------
2390 
2391  Fw::QueuedComponentBase::MsgDispatchStatus DpWriterComponentBase ::
2392  doDispatch()
2393  {
2394  ComponentIpcSerializableBuffer msg;
2395  FwQueuePriorityType priority = 0;
2396 
2397  Os::Queue::QueueStatus msgStatus = this->m_queue.receive(
2398  msg,
2399  priority,
2401  );
2402  FW_ASSERT(
2403  msgStatus == Os::Queue::QUEUE_OK,
2404  static_cast<FwAssertArgType>(msgStatus)
2405  );
2406 
2407  // Reset to beginning of buffer
2408  msg.resetDeser();
2409 
2410  FwEnumStoreType desMsg = 0;
2411  Fw::SerializeStatus deserStatus = msg.deserialize(desMsg);
2412  FW_ASSERT(
2413  deserStatus == Fw::FW_SERIALIZE_OK,
2414  static_cast<FwAssertArgType>(deserStatus)
2415  );
2416 
2417  MsgTypeEnum msgType = static_cast<MsgTypeEnum>(desMsg);
2418 
2419  if (msgType == DPWRITER_COMPONENT_EXIT) {
2420  return MSG_DISPATCH_EXIT;
2421  }
2422 
2423  FwIndexType portNum = 0;
2424  deserStatus = msg.deserialize(portNum);
2425  FW_ASSERT(
2426  deserStatus == Fw::FW_SERIALIZE_OK,
2427  static_cast<FwAssertArgType>(deserStatus)
2428  );
2429 
2430  switch (msgType) {
2431  // Handle async input port bufferSendIn
2432  case BUFFERSENDIN_BUFFERSEND: {
2433  // Deserialize argument fwBuffer
2434  Fw::Buffer fwBuffer;
2435  deserStatus = msg.deserialize(fwBuffer);
2436  FW_ASSERT(
2437  deserStatus == Fw::FW_SERIALIZE_OK,
2438  static_cast<FwAssertArgType>(deserStatus)
2439  );
2440  // Call handler function
2441  this->bufferSendIn_handler(
2442  portNum,
2443  fwBuffer
2444  );
2445 
2446  break;
2447  }
2448 
2449  // Handle async input port schedIn
2450  case SCHEDIN_SCHED: {
2451  // Deserialize argument context
2452  U32 context;
2453  deserStatus = msg.deserialize(context);
2454  FW_ASSERT(
2455  deserStatus == Fw::FW_SERIALIZE_OK,
2456  static_cast<FwAssertArgType>(deserStatus)
2457  );
2458  // Call handler function
2459  this->schedIn_handler(
2460  portNum,
2461  context
2462  );
2463 
2464  break;
2465  }
2466 
2467  // Handle command CLEAR_EVENT_THROTTLE
2468  case CMD_CLEAR_EVENT_THROTTLE: {
2469  // Deserialize opcode
2470  FwOpcodeType opCode = 0;
2471  deserStatus = msg.deserialize(opCode);
2472  FW_ASSERT (
2473  deserStatus == Fw::FW_SERIALIZE_OK,
2474  static_cast<FwAssertArgType>(deserStatus)
2475  );
2476 
2477  // Deserialize command sequence
2478  U32 cmdSeq = 0;
2479  deserStatus = msg.deserialize(cmdSeq);
2480  FW_ASSERT (
2481  deserStatus == Fw::FW_SERIALIZE_OK,
2482  static_cast<FwAssertArgType>(deserStatus)
2483  );
2484 
2485  // Deserialize command argument buffer
2486  Fw::CmdArgBuffer args;
2487  deserStatus = msg.deserialize(args);
2488  FW_ASSERT (
2489  deserStatus == Fw::FW_SERIALIZE_OK,
2490  static_cast<FwAssertArgType>(deserStatus)
2491  );
2492 
2493  // Reset buffer
2494  args.resetDeser();
2495 
2496  // Make sure there was no data left over.
2497  // That means the argument buffer size was incorrect.
2498 #if FW_CMD_CHECK_RESIDUAL
2499  if (args.getBuffLeft() != 0) {
2500  if (this->m_cmdResponseOut_OutputPort[0].isConnected()) {
2501  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::FORMAT_ERROR);
2502  }
2503  // Don't crash the task if bad arguments were passed from the ground
2504  break;
2505  }
2506 #endif
2507 
2508  // Call handler function
2509  this->CLEAR_EVENT_THROTTLE_cmdHandler(opCode, cmdSeq);
2510 
2511  break;
2512  }
2513 
2514  default:
2515  return MSG_DISPATCH_ERROR;
2516  }
2517 
2518  return MSG_DISPATCH_OK;
2519  }
2520 
2521  // ----------------------------------------------------------------------
2522  // Calls for messages received on special input ports
2523  // ----------------------------------------------------------------------
2524 
2525  void DpWriterComponentBase ::
2526  m_p_cmdIn_in(
2527  Fw::PassiveComponentBase* callComp,
2528  FwIndexType portNum,
2529  FwOpcodeType opCode,
2530  U32 cmdSeq,
2531  Fw::CmdArgBuffer& args
2532  )
2533  {
2534  FW_ASSERT(callComp);
2535  DpWriterComponentBase* compPtr = static_cast<DpWriterComponentBase*>(callComp);
2536 
2537  const U32 idBase = callComp->getIdBase();
2538  FW_ASSERT(opCode >= idBase, static_cast<FwAssertArgType>(opCode), static_cast<FwAssertArgType>(idBase));
2539 
2540  // Select base class function based on opcode
2541  switch (opCode - idBase) {
2543  compPtr->CLEAR_EVENT_THROTTLE_cmdHandlerBase(
2544  opCode,
2545  cmdSeq,
2546  args
2547  );
2548  break;
2549  }
2550  }
2551  }
2552 
2553  // ----------------------------------------------------------------------
2554  // Calls for messages received on typed input ports
2555  // ----------------------------------------------------------------------
2556 
2557  void DpWriterComponentBase ::
2558  m_p_bufferSendIn_in(
2559  Fw::PassiveComponentBase* callComp,
2560  FwIndexType portNum,
2561  Fw::Buffer& fwBuffer
2562  )
2563  {
2564  FW_ASSERT(callComp);
2565  DpWriterComponentBase* compPtr = static_cast<DpWriterComponentBase*>(callComp);
2566  compPtr->bufferSendIn_handlerBase(
2567  portNum,
2568  fwBuffer
2569  );
2570  }
2571 
2572  void DpWriterComponentBase ::
2573  m_p_schedIn_in(
2574  Fw::PassiveComponentBase* callComp,
2575  FwIndexType portNum,
2576  U32 context
2577  )
2578  {
2579  FW_ASSERT(callComp);
2580  DpWriterComponentBase* compPtr = static_cast<DpWriterComponentBase*>(callComp);
2581  compPtr->schedIn_handlerBase(
2582  portNum,
2583  context
2584  );
2585  }
2586 
2587 }
#define FW_ASSERT(...)
Definition: Assert.hpp:14
U8 BYTE
byte type
Definition: BasicTypes.h:27
#define FW_MIN(a, b)
MIN macro.
Definition: BasicTypes.h:68
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:26
#define FW_NUM_ARRAY_ELEMENTS(a)
number of elements in an array
Definition: BasicTypes.h:66
#define PRI_PlatformIntType
@ TB_NONE
No time base has been established.
Definition: FpConfig.h:57
I32 FwEnumStoreType
Definition: FpConfig.h:51
PlatformAssertArgType FwAssertArgType
Definition: FpConfig.h:34
U32 FwDpPriorityType
Definition: FpConfig.h:106
U32 FwChanIdType
Definition: FpConfig.h:82
U32 FwEventIdType
Definition: FpConfig.h:86
FwIndexType FwQueueSizeType
Definition: FpConfig.h:117
U32 FwOpcodeType
Definition: FpConfig.h:78
PlatformSizeType FwSizeType
Definition: FpConfig.h:30
#define FW_LOG_STRING_MAX_SIZE
Max size of log string parameter type.
Definition: FpConfig.h:300
I32 FwQueuePriorityType
Definition: FpConfig.h:98
PlatformIndexType FwIndexType
Definition: FpConfig.h:20
#define FW_OBJECT_NAMES
Indicates whether or not object names are stored (more memory, can be used for tracking objects)
Definition: FpConfig.h:135
@ ACTIVE_COMPONENT_EXIT
message to exit active component task
Fw::SerializeStatus deserialize(Fw::SerializeBufferBase &buffer)
Definition: Buffer.cpp:134
Enum representing a command response.
@ FORMAT_ERROR
Command failed to deserialize.
void addCallComp(Fw::PassiveComponentBase *callComp, CompFuncPtr funcPtr)
Register a component.
@ SERIALIZED_SIZE
The size of the serial representations of the port arguments.
void init()
Initialization function.
void addCallComp(Fw::PassiveComponentBase *callComp, CompFuncPtr funcPtr)
Register a component.
Definition: CmdPortAc.cpp:62
@ SERIALIZED_SIZE
The size of the serial representations of the port arguments.
Definition: CmdPortAc.hpp:37
void init()
Initialization function.
Definition: CmdPortAc.cpp:56
void setPortNum(NATIVE_INT_TYPE portNum)
@ WARNING_HI
A serious but recoverable event.
@ ACTIVITY_LO
Less important informational events.
void init()
Object initializer.
Definition: ObjBase.cpp:27
const char * toChar() const
Definition: ObjectName.hpp:50
void addCallPort(InputBufferSendPort *callPort)
Register an input port.
void invoke(Fw::Buffer &fwBuffer)
Invoke a port interface.
void init()
Initialization function.
void addCallPort(InputCmdRegPort *callPort)
Register an input port.
void invoke(FwOpcodeType opCode)
Invoke a port interface.
void init()
Initialization function.
void init()
Initialization function.
void addCallPort(InputCmdResponsePort *callPort)
Register an input port.
void invoke(FwOpcodeType opCode, U32 cmdSeq, const Fw::CmdResponse &response)
Invoke a port interface.
void init()
Initialization function.
Definition: LogPortAc.cpp:151
void invoke(FwEventIdType id, Fw::Time &timeTag, const Fw::LogSeverity &severity, Fw::LogBuffer &args)
Invoke a port interface.
Definition: LogPortAc.cpp:170
void addCallPort(InputLogPort *callPort)
Register an input port.
Definition: LogPortAc.cpp:157
void addCallPort(InputTimePort *callPort)
Register an input port.
Definition: TimePortAc.cpp:134
void invoke(Fw::Time &time)
Invoke a port interface.
Definition: TimePortAc.cpp:147
void init()
Initialization function.
Definition: TimePortAc.cpp:128
void addCallPort(InputTlmPort *callPort)
Register an input port.
Definition: TlmPortAc.cpp:150
void init()
Initialization function.
Definition: TlmPortAc.cpp:144
void invoke(FwChanIdType id, Fw::Time &timeTag, Fw::TlmBuffer &val)
Invoke a port interface.
Definition: TlmPortAc.cpp:163
bool isConnected()
Definition: PortBase.cpp:41
Os::Queue::QueueStatus createQueue(NATIVE_INT_TYPE depth, NATIVE_INT_TYPE msgSize)
Os::Queue m_queue
queue object for active component
@ MSG_DISPATCH_OK
Dispatch was normal.
@ MSG_DISPATCH_EXIT
A message was sent requesting an exit of the loop.
@ MSG_DISPATCH_ERROR
Errors dispatching messages.
NATIVE_UINT_TYPE SizeType
void resetDeser()
reset deserialization to beginning
Serializable::SizeType getBuffLeft() const
returns how much deserialization buffer is left
SerializeStatus deserialize(U8 &val)
deserialize 8-bit unsigned int
SerializeStatus serialize(U8 val)
serialize 8-bit unsigned int
virtual const CHAR * toChar() const =0
void format(const CHAR *formatString,...)
write formatted string to buffer
Definition: StringBase.cpp:56
virtual SerializeStatus serialize(SerializeBufferBase &buffer) const
serialization function
Definition: StringBase.cpp:137
Definition: Time.hpp:9
QueueStatus
Definition: Queue.hpp:27
@ QUEUE_OK
message sent/received okay
Definition: Queue.hpp:28
QueueStatus send(const Fw::SerializeBufferBase &buffer, NATIVE_INT_TYPE priority, QueueBlocking block)
send a message
Definition: QueueCommon.cpp:13
QueueStatus receive(Fw::SerializeBufferBase &buffer, NATIVE_INT_TYPE &priority, QueueBlocking block)
receive a message
Definition: QueueCommon.cpp:22
QueueBlocking
Definition: Queue.hpp:40
@ QUEUE_BLOCKING
Queue receive blocks until a message arrives.
Definition: Queue.hpp:41
@ QUEUE_NONBLOCKING
Queue receive always returns even if there is no message.
Definition: Queue.hpp:42
bool isConnected_cmdRegIn_OutputPort(FwIndexType portNum)
void deallocBufferSendOut_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port deallocBufferSendOut.
void log_WARNING_HI_BufferTooSmallForData(U32 bufferSize, U32 minSize)
void CLEAR_EVENT_THROTTLE_cmdHandlerBase(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdArgBuffer &args)
FwIndexType getNum_bufferSendIn_InputPorts() const
virtual void bufferSendIn_handler(FwIndexType portNum, Fw::Buffer &fwBuffer)=0
Handler for input port bufferSendIn.
void dpWrittenOut_out(FwIndexType portNum, const Fw::StringBase &fileName, FwDpPriorityType priority, FwSizeType size)
Invoke output port dpWrittenOut.
Fw::InputBufferSendPort * get_bufferSendIn_InputPort(FwIndexType portNum)
virtual void bufferSendIn_preMsgHook(FwIndexType portNum, Fw::Buffer &fwBuffer)
Pre-message hook for async input port bufferSendIn.
void log_WARNING_HI_InvalidHeader_ThrottleClear()
Reset throttle value for InvalidHeader.
bool isConnected_cmdResponseOut_OutputPort(FwIndexType portNum)
DpWriterComponentBase(const char *compName="")
Construct DpWriterComponentBase object.
@ EVENTID_INVALIDHEADER
Error occurred when deserializing the packet header.
@ EVENTID_INVALIDBUFFER
Received buffer is invalid.
@ EVENTID_BUFFERTOOSMALLFORDATA
Received buffer is too small to hold the data specified in the header.
@ EVENTID_BUFFERTOOSMALLFORPACKET
Received buffer is too small to hold a data product packet.
@ EVENTID_INVALIDHEADERHASH
The received buffer has an invalid header hash.
@ EVENTID_FILEWRITEERROR
An error occurred when writing to a file.
@ EVENTID_FILEOPENERROR
An error occurred when opening a file.
void log_WARNING_HI_FileOpenError(U32 status, const Fw::StringBase &file)
@ OPCODE_CLEAR_EVENT_THROTTLE
Clear event throttling.
void log_WARNING_HI_FileWriteError(U32 status, U32 bytesWritten, U32 bytesToWrite, const Fw::StringBase &file)
void log_WARNING_HI_InvalidBuffer_ThrottleClear()
Reset throttle value for InvalidBuffer.
void bufferSendIn_handlerBase(FwIndexType portNum, Fw::Buffer &fwBuffer)
Handler base-class function for input port bufferSendIn.
bool isConnected_deallocBufferSendOut_OutputPort(FwIndexType portNum)
FwIndexType getNum_deallocBufferSendOut_OutputPorts() const
void set_eventOut_OutputPort(FwIndexType portNum, Fw::InputLogPort *port)
Connect port to eventOut[portNum].
void set_tlmOut_OutputPort(FwIndexType portNum, Fw::InputTlmPort *port)
Connect port to tlmOut[portNum].
bool isConnected_tlmOut_OutputPort(FwIndexType portNum)
FwIndexType getNum_cmdResponseOut_OutputPorts() const
void tlmWrite_NumSuccessfulWrites(U32 arg, Fw::Time _tlmTime=Fw::Time())
Fw::InputCmdPort * get_cmdIn_InputPort(FwIndexType portNum)
bool isConnected_eventOut_OutputPort(FwIndexType portNum)
@ EVENTID_INVALIDHEADER_THROTTLE
Throttle reset count for InvalidHeader.
@ EVENTID_INVALIDHEADERHASH_THROTTLE
Throttle reset count for InvalidHeaderHash.
@ EVENTID_FILEWRITEERROR_THROTTLE
Throttle reset count for FileWriteError.
@ EVENTID_BUFFERTOOSMALLFORDATA_THROTTLE
Throttle reset count for BufferTooSmallForData.
@ EVENTID_FILEOPENERROR_THROTTLE
Throttle reset count for FileOpenError.
@ EVENTID_INVALIDBUFFER_THROTTLE
Throttle reset count for InvalidBuffer.
@ EVENTID_BUFFERTOOSMALLFORPACKET_THROTTLE
Throttle reset count for BufferTooSmallForPacket.
bool isConnected_procBufferSendOut_OutputPort(FwIndexType portNum)
void log_WARNING_HI_BufferTooSmallForPacket_ThrottleClear()
Reset throttle value for BufferTooSmallForPacket.
FwIndexType getNum_cmdRegIn_OutputPorts() const
virtual void CLEAR_EVENT_THROTTLE_cmdHandler(FwOpcodeType opCode, U32 cmdSeq)=0
void log_WARNING_HI_InvalidHeaderHash_ThrottleClear()
Reset throttle value for InvalidHeaderHash.
void log_WARNING_HI_FileWriteError_ThrottleClear()
Reset throttle value for FileWriteError.
FwIndexType getNum_tlmOut_OutputPorts() const
FwIndexType getNum_procBufferSendOut_OutputPorts() const
void set_timeGetOut_OutputPort(FwIndexType portNum, Fw::InputTimePort *port)
Connect port to timeGetOut[portNum].
void tlmWrite_NumBuffersReceived(U32 arg, Fw::Time _tlmTime=Fw::Time())
void log_ACTIVITY_LO_FileWritten(U32 bytes, const Fw::StringBase &file)
virtual void schedIn_handler(FwIndexType portNum, U32 context)=0
Handler for input port schedIn.
void procBufferSendOut_out(FwIndexType portNum, Fw::Buffer &fwBuffer)
Invoke output port procBufferSendOut.
void regCommands()
Register commands with the Command Dispatcher.
void set_cmdResponseOut_OutputPort(FwIndexType portNum, Fw::InputCmdResponsePort *port)
Connect port to cmdResponseOut[portNum].
void set_deallocBufferSendOut_OutputPort(FwIndexType portNum, Fw::InputBufferSendPort *port)
Connect port to deallocBufferSendOut[portNum].
void tlmWrite_NumBytesWritten(U64 arg, Fw::Time _tlmTime=Fw::Time())
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
void set_dpWrittenOut_OutputPort(FwIndexType portNum, Svc::InputDpWrittenPort *port)
Connect port to dpWrittenOut[portNum].
void set_procBufferSendOut_OutputPort(FwIndexType portNum, Fw::InputBufferSendPort *port)
Connect port to procBufferSendOut[portNum].
void schedIn_handlerBase(FwIndexType portNum, U32 context)
Handler base-class function for input port schedIn.
void log_WARNING_HI_BufferTooSmallForPacket(U32 bufferSize, U32 minSize)
@ CHANNELID_NUMBUFFERSRECEIVED
Channel ID for NumBuffersReceived.
@ CHANNELID_NUMBYTESWRITTEN
Channel ID for NumBytesWritten.
@ CHANNELID_NUMSUCCESSFULWRITES
Channel ID for NumSuccessfulWrites.
@ CHANNELID_NUMERRORS
Channel ID for NumErrors.
@ CHANNELID_NUMFAILEDWRITES
Channel ID for NumFailedWrites.
void log_WARNING_HI_InvalidHeader(U32 bufferSize, U32 errorCode)
Svc::InputSchedPort * get_schedIn_InputPort(FwIndexType portNum)
FwIndexType getNum_schedIn_InputPorts() const
void set_cmdRegIn_OutputPort(FwIndexType portNum, Fw::InputCmdRegPort *port)
Connect port to cmdRegIn[portNum].
FwIndexType getNum_timeGetOut_OutputPorts() const
bool isConnected_dpWrittenOut_OutputPort(FwIndexType portNum)
FwIndexType getNum_dpWrittenOut_OutputPorts() const
bool isConnected_timeGetOut_OutputPort(FwIndexType portNum)
void log_WARNING_HI_FileOpenError_ThrottleClear()
Reset throttle value for FileOpenError.
FwIndexType getNum_cmdIn_InputPorts() const
void tlmWrite_NumErrors(U32 arg, Fw::Time _tlmTime=Fw::Time())
virtual void CLEAR_EVENT_THROTTLE_preMsgHook(FwOpcodeType opCode, U32 cmdSeq)
Pre-message hook for command CLEAR_EVENT_THROTTLE.
virtual void schedIn_preMsgHook(FwIndexType portNum, U32 context)
Pre-message hook for async input port schedIn.
virtual ~DpWriterComponentBase()
Destroy DpWriterComponentBase object.
void tlmWrite_NumFailedWrites(U32 arg, Fw::Time _tlmTime=Fw::Time())
FwIndexType getNum_eventOut_OutputPorts() const
void log_WARNING_HI_BufferTooSmallForData_ThrottleClear()
Reset throttle value for BufferTooSmallForData.
void log_WARNING_HI_InvalidHeaderHash(U32 bufferSize, U32 storedHash, U32 computedHash)
@ SERIALIZED_SIZE
The size of the serial representations of the port arguments.
Definition: SchedPortAc.hpp:36
void addCallComp(Fw::PassiveComponentBase *callComp, CompFuncPtr funcPtr)
Register a component.
Definition: SchedPortAc.cpp:62
void init()
Initialization function.
Definition: SchedPortAc.cpp:56
void invoke(const Fw::StringBase &fileName, FwDpPriorityType priority, FwSizeType size)
Invoke a port interface.
void addCallPort(InputDpWrittenPort *callPort)
Register an input port.
void init()
Initialization function.
SerializeStatus
forward declaration for string
@ FW_SERIALIZE_OK
Serialization/Deserialization operation was successful.
const Time ZERO_TIME
Definition: Time.cpp:5
#define U64(C)
Definition: sha.h:176