F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
CmdSequencerImpl.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title CmdSequencerImpl.cpp
3 // \author Bocchino/Canham
4 // \brief cpp file for CmdDispatcherComponentBase component implementation class
5 //
6 // Copyright (C) 2009-2018 California Institute of Technology.
7 // ALL RIGHTS RESERVED. United States Government Sponsorship
8 // acknowledged.
9 
10 #include <Fw/Com/ComPacket.hpp>
11 #include <Fw/Types/Assert.hpp>
15 #include <Utils/Hash/Hash.hpp>
16 #include <config/CommandDispatcherImplCfg.hpp>
17 
18 namespace Svc {
19 
20 // ----------------------------------------------------------------------
21 // Construction, initialization, and destruction
22 // ----------------------------------------------------------------------
23 
26  m_FPrimeSequence(*this),
27  m_sequence(&this->m_FPrimeSequence),
28  m_loadCmdCount(0),
29  m_cancelCmdCount(0),
30  m_errorCount(0),
31  m_runMode(STOPPED),
32  m_stepMode(AUTO),
33  m_executedCount(0),
34  m_totalExecutedCount(0),
35  m_sequencesCompletedCount(0),
36  m_timeout(0),
37  m_blockState(Svc::BlockState::NO_BLOCK),
38  m_opCode(0),
39  m_cmdSeq(0),
40  m_join_waiting(false) {}
41 
42 void CmdSequencerComponentImpl::setTimeout(const U32 timeout) {
43  this->m_timeout = timeout;
44 }
45 
47  this->m_sequence = &sequence;
48 }
49 
51  Fw::MemAllocator& allocator,
52  const FwSizeType bytes) {
53  this->m_sequence->allocateBuffer(identifier, allocator, bytes);
54 }
55 
57  FW_ASSERT(this->m_runMode == STOPPED, this->m_runMode);
58  if (not this->loadFile(fileName)) {
59  this->m_sequence->clear();
60  }
61 }
62 
64  this->m_sequence->deallocateBuffer(allocator);
65 }
66 
68 
69 // ----------------------------------------------------------------------
70 // Handler implementations
71 // ----------------------------------------------------------------------
72 
73 void CmdSequencerComponentImpl::CS_RUN_cmdHandler(FwOpcodeType opCode,
74  U32 cmdSeq,
75  const Fw::CmdStringArg& fileName,
76  const Svc::BlockState& block) {
77  if (not this->requireRunMode(STOPPED)) {
78  if (m_join_waiting) {
79  // Inform user previous seq file is not complete
81  }
83  return;
84  }
85 
86  if ((Svc::BlockState::BLOCK == block.e) && (MANUAL == this->m_stepMode)) {
87  // In MANUAL mode nothing executes until CS_STEP, so a BLOCK response could never be sent
90  return;
91  }
92 
93  this->m_blockState = block.e;
94  this->m_cmdSeq = cmdSeq;
95  this->m_opCode = opCode;
96 
97  // load commands
98  if (not this->loadFile(fileName)) {
100  return;
101  }
102 
103  this->m_executedCount = 0;
104 
105  // Check the step mode. If it is auto, start the sequence
106  if (AUTO == this->m_stepMode) {
107  this->m_runMode = RUNNING;
108  this->tlmWrite_CS_CurrentSequence(this->m_sequence->getStringFileName());
109  if (this->isConnected_seqStartOut_OutputPort(0)) {
110  // Create empty SeqArgs as placeholder
111  // Use parameterized constructor to ensure m_size is initialized to 0
112  Svc::SeqArgs emptyArgs{0, 0};
113  this->seqStartOut_out(0, this->m_sequence->getStringFileName(), emptyArgs);
114  }
115  this->performCmd_Step();
116  }
117 
118  if (Svc::BlockState::NO_BLOCK == this->m_blockState) {
119  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
120  }
121 }
122 
123 void CmdSequencerComponentImpl::CS_VALIDATE_cmdHandler(FwOpcodeType opCode,
124  U32 cmdSeq,
125  const Fw::CmdStringArg& fileName) {
126  FW_ASSERT(this->m_sequence != nullptr);
127  if (!this->requireRunMode(STOPPED)) {
128  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
129  return;
130  }
131 
132  // load commands
133  if (not this->loadFile(fileName)) {
134  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
135  return;
136  }
137 
138  // clear the buffer
139  this->m_sequence->clear();
140 
141  this->log_ACTIVITY_HI_CS_SequenceValid(this->m_sequence->getLogFileName());
142 
143  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
144 }
145 
147 void CmdSequencerComponentImpl::doSequenceRun(const Fw::StringBase& filename) {
148  if (MANUAL == this->m_stepMode) {
149  // In MANUAL mode nothing executes until CS_STEP, so a port-driven run would wedge
152  return;
153  }
154  if (!this->requireRunMode(STOPPED)) {
156  return;
157  }
158 
159  // If file name is non-empty, load a file.
160  // Empty file name means don't load.
161  if (filename != "") {
162  Fw::CmdStringArg cmdStr(filename);
163  const bool status = this->loadFile(cmdStr);
164  if (!status) {
166  return;
167  }
168  } else if (not this->m_sequence->hasMoreRecords()) {
169  // No sequence loaded
171  this->error();
173  return;
174  }
175 
176  this->m_executedCount = 0;
177 
178  // Check the step mode. If it is auto, start the sequence
179  if (AUTO == this->m_stepMode) {
180  this->m_runMode = RUNNING;
181  this->tlmWrite_CS_CurrentSequence(this->m_sequence->getStringFileName());
182  if (this->isConnected_seqStartOut_OutputPort(0)) {
183  // Create empty SeqArgs as placeholder
184  // Use parameterized constructor to ensure m_size is initialized to 0
185  Svc::SeqArgs emptyArgs{0, 0};
186  this->seqStartOut_out(0, this->m_sequence->getStringFileName(), emptyArgs);
187  }
188  this->performCmd_Step();
189  }
190 
191  this->log_ACTIVITY_HI_CS_PortSequenceStarted(this->m_sequence->getLogFileName());
192 }
193 
194 void CmdSequencerComponentImpl::seqRunIn_handler(FwIndexType portNum,
195  const Fw::StringBase& filename,
196  const Svc::SeqArgs& args) {
197  (void)args; // Suppress unused parameter warning
198  this->doSequenceRun(filename);
199 }
200 
201 void CmdSequencerComponentImpl::seqDispatchIn_handler(FwIndexType portNum, Fw::StringBase& file_name) {
202  this->doSequenceRun(file_name);
203 }
204 
205 void CmdSequencerComponentImpl ::seqCancelIn_handler(const FwIndexType portNum) {
206  if (RUNNING == this->m_runMode) {
207  this->performCmd_Cancel();
208  this->log_ACTIVITY_HI_CS_SequenceCanceled(this->m_sequence->getLogFileName());
209  ++this->m_cancelCmdCount;
210  this->tlmWrite_CS_CancelCommands(this->m_cancelCmdCount);
211  } else {
213  }
214 }
215 
216 void CmdSequencerComponentImpl::CS_CANCEL_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) {
217  if (RUNNING == this->m_runMode) {
218  this->performCmd_Cancel();
219  this->log_ACTIVITY_HI_CS_SequenceCanceled(this->m_sequence->getLogFileName());
220  ++this->m_cancelCmdCount;
221  this->tlmWrite_CS_CancelCommands(this->m_cancelCmdCount);
222  } else {
224  }
225  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
226 }
227 
228 void CmdSequencerComponentImpl::CS_JOIN_WAIT_cmdHandler(const FwOpcodeType opCode, const U32 cmdSeq) {
229  // If there is no running sequence do not wait
230  if (m_runMode != RUNNING) {
232  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK);
233  return;
234  } else if ((Svc::BlockState::BLOCK == this->m_blockState) || this->m_join_waiting) {
235  // A command response is already owed to a BLOCK-mode CS_RUN caller or a
236  // previous CS_JOIN_WAIT caller. Reject rather than overwrite that state,
237  // which would leave the original caller without a completion response.
239  this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
240  } else {
241  m_join_waiting = true;
242  Fw::LogStringArg& logFileName = this->m_sequence->getLogFileName();
243  this->log_ACTIVITY_HI_CS_JoinWaiting(logFileName, m_cmdSeq, CmdDispatcherCfg::getEventOpcode(m_opCode));
244  m_cmdSeq = cmdSeq;
245  m_opCode = opCode;
246  }
247 }
248 
249 // ----------------------------------------------------------------------
250 // Private helper methods
251 // ----------------------------------------------------------------------
252 
253 bool CmdSequencerComponentImpl ::loadFile(const Fw::ConstStringBase& fileName) {
254  const bool status = this->m_sequence->loadFile(fileName);
255  if (status) {
256  Fw::LogStringArg& logFileName = this->m_sequence->getLogFileName();
257  this->log_ACTIVITY_LO_CS_SequenceLoaded(logFileName);
258  ++this->m_loadCmdCount;
259  this->tlmWrite_CS_LoadCommands(this->m_loadCmdCount);
260  } else {
261  // A partial load may have populated m_buffer before an intermediate
262  // validation step (e.g. CRC, time, record structure) failed. Without
263  // an explicit reset, FPrimeSequence::hasMoreRecords() still returns
264  // true because getDeserializeSizeLeft() > 0, so a subsequent CS_START
265  // bypasses the "no sequence active" guard and reaches
266  // FPrimeSequence::nextRecord, which asserts on the failed deserialize
267  // and aborts the FSW. Clearing the sequence on every load failure
268  // closes that window.
269  this->m_sequence->clear();
270  }
271  return status;
272 }
273 
274 void CmdSequencerComponentImpl::error() {
275  ++this->m_errorCount;
276  this->tlmWrite_CS_Errors(m_errorCount);
277 }
278 
279 void CmdSequencerComponentImpl::performCmd_Cancel() {
280  FW_ASSERT(this->m_sequence != nullptr);
281  this->m_sequence->reset();
282  this->m_runMode = STOPPED;
283  this->m_cmdTimer.clear();
284  this->m_cmdTimeoutTimer.clear();
285  this->m_executedCount = 0;
286  // write sequence done port with error, if connected
287  if (this->isConnected_seqDone_OutputPort(0)) {
289  }
290 
291  if (Svc::BlockState::BLOCK == this->m_blockState || m_join_waiting) {
292  // Do not wait if sequence was canceled or a cmd failed
293  this->m_join_waiting = false;
294  this->cmdResponse_out(this->m_opCode, this->m_cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
295  }
296 
297  this->m_blockState = Svc::BlockState::NO_BLOCK;
298 }
299 
300 void CmdSequencerComponentImpl ::cmdResponseIn_handler(FwIndexType portNum,
301  FwOpcodeType opcode,
302  U32 cmdSeq,
303  const Fw::CmdResponse& response) {
304  if (this->m_runMode == STOPPED) {
305  // Sequencer is not running
307  } else {
308  // clear command timeout
309  this->m_cmdTimeoutTimer.clear();
310  if (response != Fw::CmdResponse::OK) {
311  this->commandError(this->m_executedCount, opcode, response.e);
312  this->performCmd_Cancel();
313  } else if (this->m_runMode == RUNNING && this->m_stepMode == AUTO) {
314  // Auto mode
315  this->commandComplete(opcode);
316  if (not this->m_sequence->hasMoreRecords()) {
317  // No data left
318  this->m_runMode = STOPPED;
319  this->sequenceComplete();
320  } else {
321  this->performCmd_Step();
322  }
323  } else {
324  // Manual step mode
325  this->commandComplete(opcode);
326  if (not this->m_sequence->hasMoreRecords()) {
327  this->m_runMode = STOPPED;
328  this->sequenceComplete();
329  }
330  }
331  }
332 }
333 
334 void CmdSequencerComponentImpl ::schedIn_handler(FwIndexType portNum, U32 order) {
335  Fw::Time currTime = this->getTime();
336  // check to see if a command time is pending
337  if (this->m_cmdTimer.isExpiredAt(currTime)) {
338  this->comCmdOut_out(0, m_record.m_command, 0);
339  this->m_cmdTimer.clear();
340  // start command timeout timer
341  this->setCmdTimeout(currTime);
342  } else if (this->m_cmdTimeoutTimer.isExpiredAt(this->getTime())) { // check for command timeout
343  this->log_WARNING_HI_CS_SequenceTimeout(m_sequence->getLogFileName(), this->m_executedCount);
344  // If there is a command timeout, cancel the sequence
345  this->performCmd_Cancel();
346  }
347 }
348 
349 void CmdSequencerComponentImpl ::CS_START_cmdHandler(FwOpcodeType opcode, U32 cmdSeq) {
350  if (not this->m_sequence->hasMoreRecords()) {
351  // No sequence loaded
353  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
354  return;
355  }
356  if (!this->requireRunMode(STOPPED)) {
357  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
358  return;
359  }
360 
361  this->m_blockState = Svc::BlockState::NO_BLOCK;
362  this->m_runMode = RUNNING;
363  this->tlmWrite_CS_CurrentSequence(this->m_sequence->getStringFileName());
364  this->log_ACTIVITY_HI_CS_CmdStarted(this->m_sequence->getLogFileName());
365  this->performCmd_Step();
366  if (this->isConnected_seqStartOut_OutputPort(0)) {
367  // Create empty SeqArgs as placeholder
368  Svc::SeqArgs emptyArgs{0, 0};
369  this->seqStartOut_out(0, this->m_sequence->getStringFileName(), emptyArgs);
370  }
371  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::OK);
372 }
373 
374 void CmdSequencerComponentImpl ::CS_STEP_cmdHandler(FwOpcodeType opcode, U32 cmdSeq) {
375  FW_ASSERT(this->m_sequence != nullptr);
376  if (this->requireRunMode(RUNNING)) {
377  if (not this->m_sequence->hasMoreRecords()) {
378  // A sequence with no end-of-sequence record leaves nothing to step; stepping anyway
379  // asserts in the sequence reader
381  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
382  return;
383  }
384  this->performCmd_Step();
385  // check for special case where end of sequence entry was encountered
386  if (this->m_runMode != STOPPED) {
387  this->log_ACTIVITY_HI_CS_CmdStepped(this->m_sequence->getLogFileName(), this->m_executedCount);
388  }
389  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::OK);
390  } else {
391  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
392  }
393 }
394 
395 void CmdSequencerComponentImpl ::CS_AUTO_cmdHandler(FwOpcodeType opcode, U32 cmdSeq) {
396  if (this->requireRunMode(STOPPED)) {
397  this->m_stepMode = AUTO;
399  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::OK);
400  } else {
401  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
402  }
403 }
404 
405 void CmdSequencerComponentImpl ::CS_MANUAL_cmdHandler(FwOpcodeType opcode, U32 cmdSeq) {
406  if (this->requireRunMode(STOPPED)) {
407  this->m_stepMode = MANUAL;
409  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::OK);
410  } else {
411  this->cmdResponse_out(opcode, cmdSeq, Fw::CmdResponse::EXECUTION_ERROR);
412  }
413 }
414 
415 // ----------------------------------------------------------------------
416 // Helper methods
417 // ----------------------------------------------------------------------
418 
419 bool CmdSequencerComponentImpl::requireRunMode(RunMode mode) {
420  if (this->m_runMode == mode) {
421  return true;
422  } else {
424  return false;
425  }
426 }
427 
428 void CmdSequencerComponentImpl ::commandError(const U32 number, const FwOpcodeType opCode, const U32 error) {
429  this->log_WARNING_HI_CS_CommandError(this->m_sequence->getLogFileName(), number,
430  CmdDispatcherCfg::getEventOpcode(opCode), error);
431  this->error();
432 }
433 
434 void CmdSequencerComponentImpl::performCmd_Step() {
435  this->m_sequence->nextRecord(m_record);
436  // set clock time base and context from value set when sequence was loaded
437  const Sequence::Header& header = this->m_sequence->getHeader();
438  this->m_record.m_timeTag.setTimeBase(header.m_timeBase);
439  this->m_record.m_timeTag.setTimeContext(header.m_timeContext);
440 
441  Fw::Time currentTime = this->getTime();
442  switch (this->m_record.m_descriptor) {
444  this->m_runMode = STOPPED;
445  this->sequenceComplete();
446  break;
448  this->performCmd_Step_RELATIVE(currentTime);
449  break;
451  this->performCmd_Step_ABSOLUTE(currentTime);
452  break;
453  default:
454  FW_ASSERT(false, m_record.m_descriptor);
455  }
456 }
457 
458 void CmdSequencerComponentImpl::sequenceComplete() {
459  FW_ASSERT(this->m_sequence != nullptr);
460  ++this->m_sequencesCompletedCount;
461  // reset buffer
462  this->m_sequence->clear();
463  this->log_ACTIVITY_HI_CS_SequenceComplete(this->m_sequence->getLogFileName());
464  this->tlmWrite_CS_SequencesCompleted(this->m_sequencesCompletedCount);
465  this->m_executedCount = 0;
466  // write sequence done port, if connected
467  if (this->isConnected_seqDone_OutputPort(0)) {
468  this->seqDone_out(0, 0, 0, Fw::CmdResponse::OK);
469  }
470 
471  if (Svc::BlockState::BLOCK == this->m_blockState || m_join_waiting) {
472  this->cmdResponse_out(this->m_opCode, this->m_cmdSeq, Fw::CmdResponse::OK);
473  }
474 
475  m_join_waiting = false;
476  this->m_blockState = Svc::BlockState::NO_BLOCK;
477  this->tlmWrite_CS_CurrentSequence(NO_SEQ);
478 }
479 
480 void CmdSequencerComponentImpl::commandComplete(const FwOpcodeType opcode) {
481  this->log_ACTIVITY_LO_CS_CommandComplete(this->m_sequence->getLogFileName(), this->m_executedCount,
483  ++this->m_executedCount;
484  ++this->m_totalExecutedCount;
485  this->tlmWrite_CS_CommandsExecuted(this->m_totalExecutedCount);
486 }
487 
488 void CmdSequencerComponentImpl ::performCmd_Step_RELATIVE(Fw::Time& currentTime) {
489  this->m_record.m_timeTag.add(currentTime.getSeconds(), currentTime.getUSeconds());
490  this->performCmd_Step_ABSOLUTE(currentTime);
491 }
492 
493 void CmdSequencerComponentImpl ::performCmd_Step_ABSOLUTE(Fw::Time& currentTime) {
494  if (currentTime >= this->m_record.m_timeTag) {
495  this->comCmdOut_out(0, m_record.m_command, 0);
496  this->setCmdTimeout(currentTime);
497  } else {
498  this->m_cmdTimer.set(this->m_record.m_timeTag);
499  }
500 }
501 
502 void CmdSequencerComponentImpl ::pingIn_handler(FwIndexType portNum,
503  U32 key
504 ) {
505  // send ping response
506  this->pingOut_out(0, key);
507 }
508 
509 void CmdSequencerComponentImpl ::setCmdTimeout(const Fw::Time& currentTime) {
510  // start timeout timer if enabled and not in step mode
511  if ((this->m_timeout > 0) and (AUTO == this->m_stepMode)) {
512  Fw::Time expTime = currentTime;
513  expTime.add(this->m_timeout, 0);
514  this->m_cmdTimeoutTimer.set(expTime);
515  }
516 }
517 
518 } // namespace Svc
constexpr FwOpcodeType getEventOpcode(const FwOpcodeType opcode)
void loadSequence(const Fw::ConstStringBase &fileName)
void tlmWrite_CS_LoadCommands(U32 arg, Fw::Time _tlmTime=Fw::Time()) const
void setSequenceFormat(Sequence &sequence)
FwIdType FwOpcodeType
The type of a command opcode.
PlatformSizeType FwSizeType
I32 FwEnumStoreType
CmdSequencerComponentImpl(const char *compName)
Construct a CmdSequencer.
void tlmWrite_CS_Errors(U32 arg, Fw::Time _tlmTime=Fw::Time()) const
void log_ACTIVITY_HI_CS_JoinWaiting(const Fw::StringBase &filename, U32 recordNumber, FwOpcodeType opCode) const
void log_WARNING_HI_CS_UnexpectedCompletion(FwOpcodeType opcode) const
void log_ACTIVITY_LO_CS_SequenceLoaded(const Fw::StringBase &fileName) const
enum T e
The raw enum value.
Fw::Time m_timeTag
The time tag. NOTE: timeBase and context not filled in.
void tlmWrite_CS_CurrentSequence(const Fw::StringBase &arg, Fw::Time _tlmTime=Fw::Time())
void log_ACTIVITY_HI_CS_CmdStarted(const Fw::StringBase &filename) const
Enum representing a command response.
bool isConnected_seqDone_OutputPort(FwIndexType portNum) const
void log_WARNING_HI_CS_SequenceTimeout(const Fw::StringBase &filename, U32 command) const
bool isConnected_seqStartOut_OutputPort(FwIndexType portNum) const
void allocateBuffer(FwEnumStoreType identifier, Fw::MemAllocator &allocator, FwSizeType bytes)
Give the sequence representation a memory buffer.
Definition: Sequence.cpp:45
virtual bool hasMoreRecords() const =0
void tlmWrite_CS_CancelCommands(U32 arg, Fw::Time _tlmTime=Fw::Time()) const
void tlmWrite_CS_CommandsExecuted(U32 arg, Fw::Time _tlmTime=Fw::Time()) const
~CmdSequencerComponentImpl()
Destroy a CmdDispatcherComponentBase.
void log_ACTIVITY_HI_CS_PortSequenceStarted(const Fw::StringBase &filename) const
void seqStartOut_out(FwIndexType portNum, const Fw::StringBase &filename, const Svc::SeqArgs &args) const
Invoke output port seqStartOut.
void log_ACTIVITY_HI_CS_SequenceCanceled(const Fw::StringBase &fileName) const
void setTimeContext(FwTimeContextStoreType context)
Definition: Time.cpp:262
void allocateBuffer(const FwEnumStoreType identifier, Fw::MemAllocator &allocator, const FwSizeType bytes)
A sequence with unspecified binary format.
void deallocateBuffer(Fw::MemAllocator &allocator)
Deallocate the buffer.
Definition: Sequence.cpp:55
U32 getSeconds() const
Definition: Time.cpp:128
Sequencer blocking state.
void setTimeBase(TimeBase timeBase)
Definition: Time.cpp:258
void log_ACTIVITY_HI_CS_ModeSwitched(const Svc::CmdSequencer_SeqMode &mode) const
void setTimeout(const U32 seconds)
Command successfully executed.
virtual bool loadFile(const Fw::ConstStringBase &fileName)=0
Command had execution error.
static Time add(const Time &a, const Time &b)
Definition: Time.cpp:174
void deallocateBuffer(Fw::MemAllocator &allocator)
Return allocated buffer. Call during shutdown.
Memory Allocation base class.
U32 getUSeconds() const
Definition: Time.cpp:132
A read-only abstract superclass for StringBase.
PlatformIndexType FwIndexType
Auto-generated base for CmdSequencer component.
void comCmdOut_out(FwIndexType portNum, Fw::ComBuffer &data, U32 context) const
Invoke output port comCmdOut.
RateGroupDivider component implementation.
virtual void nextRecord(Record &record)=0
void log_ACTIVITY_HI_CS_SequenceComplete(const Fw::StringBase &fileName) const
void seqDone_out(FwIndexType portNum, FwOpcodeType opCode, U32 cmdSeq, const Fw::CmdResponse &response) const
Invoke output port seqDone.
void log_ACTIVITY_LO_CS_CommandComplete(const Fw::StringBase &fileName, U32 recordNumber, FwOpcodeType opCode) const
void log_WARNING_HI_CS_CommandError(const Fw::StringBase &fileName, U32 recordNumber, FwOpcodeType opCode, U32 errorStatus) const
#define FW_ASSERT(...)
Definition: Assert.hpp:14
void pingOut_out(FwIndexType portNum, U32 key) const
Invoke output port pingOut.
const Header & getHeader() const
Get the sequence header.
Definition: Sequence.cpp:60
void log_ACTIVITY_HI_CS_SequenceValid(const Fw::StringBase &filename) const
enum T e
The raw enum value.
void cmdResponse_out(FwOpcodeType opCode, U32 cmdSeq, Fw::CmdResponse response)
Emit command response.
void tlmWrite_CS_SequencesCompleted(U32 arg, Fw::Time _tlmTime=Fw::Time()) const
void log_ACTIVITY_HI_CS_CmdStepped(const Fw::StringBase &filename, U32 command) const