F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
FpySequencerRunState.cpp
Go to the documentation of this file.
1 #include <new>
2 #include "Fw/Com/ComPacket.hpp"
3 #include "Fw/Time/Time.hpp"
5 namespace Svc {
6 
7 Signal FpySequencer::dispatchStatement() {
8  // check to make sure no array out of bounds, or if it is out of bounds it's only 1 out of bound
9  // as that indicates eof
10  FW_ASSERT(this->m_runtime.nextStatementIndex <= this->m_sequenceObj.get_header().get_statementCount());
11 
12  if (this->m_runtime.nextStatementIndex == this->m_sequenceObj.get_header().get_statementCount()) {
14  }
15 
16  const Fpy::Statement& nextStatement = this->m_sequenceObj.get_statements()[this->m_runtime.nextStatementIndex];
17  this->m_runtime.nextStatementIndex++;
18  this->m_runtime.currentStatementOpcode = nextStatement.get_opCode();
19  this->m_runtime.currentCmdOpcode = 0; // we haven't deserialized the directive yet, so we don't know if it's a cmd
20 
21  Fw::Success result;
22  DirectiveUnion directiveUnion;
23 
24  result = this->deserializeDirective(nextStatement, directiveUnion);
25 
26  if (!result) {
28  }
29 
30  if (this->m_runtime.currentStatementOpcode == Fpy::DirectiveId::CMD) {
31  // update the opcode of the cmd we will await
32  this->m_runtime.currentCmdOpcode = directiveUnion.cmd.get_opCode();
33  }
34 
35  this->dispatchDirective(directiveUnion,
36  Fpy::DirectiveId(static_cast<Fpy::DirectiveId::T>(nextStatement.get_opCode())));
37  this->m_runtime.currentStatementDispatchTime = getTime(); // set dispatch time right after we have successfully dispatched
38 
39  this->m_statementsDispatched++;
40 
42 }
43 
44 // deserializes a directive from bytes into the Fpy type
45 // returns success if able to deserialize, and returns the Fpy type object
46 // as a reference, in a union of all the possible directive type objects
47 Fw::Success FpySequencer::deserializeDirective(const Fpy::Statement& stmt, DirectiveUnion& deserializedDirective) {
48  Fw::SerializeStatus status;
49  // make our own esb so we can deser from stmt without breaking its constness
50  Fw::ExternalSerializeBuffer argBuf(const_cast<U8*>(stmt.get_argBuf().getBuffAddr()),
51  stmt.get_argBuf().getBuffLength());
52  argBuf.setBuffLen(stmt.get_argBuf().getBuffLength());
53 
54  switch (stmt.get_opCode()) {
56  // in order to use a type with non trivial ctor in cpp union, have to manually construct and destruct it
57  new (&deserializedDirective.waitRel) FpySequencer_WaitRelDirective();
58  status = argBuf.deserialize(deserializedDirective.waitRel);
59  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
60  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
61  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
62  return Fw::Success::FAILURE;
63  }
64  break;
65  }
67  new (&deserializedDirective.waitAbs) FpySequencer_WaitAbsDirective();
68  status = argBuf.deserialize(deserializedDirective.waitAbs);
69  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
70  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
71  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
72  return Fw::Success::FAILURE;
73  }
74  break;
75  }
77  new (&deserializedDirective.setSerReg) FpySequencer_SetSerRegDirective();
78  // set local var has some custom deserialization behavior
79  // we don't write a custom class for it though because that deserialization behavior only
80  // applies for the initial time we deserialize it out of the statement
81 
82  // the behavior in question is that it will grab the entire remaining part of the statement
83  // arg buf. that is, it uses the remaining length of the statement arg buf to determine the length
84  // of its value buf. this way we get to save on serializing the value length
85 
86  // TODO do some trades on the best way to do this. not confident on this one
87 
88  // first deserialize the index
89  U8 index;
90  status = argBuf.deserialize(index);
92  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
93  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
94  return Fw::Success::FAILURE;
95  }
96 
97  deserializedDirective.setSerReg.set_index(index);
98 
99  // okay, now deserialize the remaining bytes in the stmt arg buf into the value buf
100 
101  // how many bytes are left?
102  FwSizeType valueSize = argBuf.getBuffLeft();
103 
104  // check to make sure the value will fit in the FpySequencer_SetSerRegDirective::value buf
105  if (valueSize > Fpy::MAX_SERIALIZABLE_REGISTER_SIZE) {
106  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
108  argBuf.getBuffLeft(), argBuf.getBuffLength());
109  return Fw::Success::FAILURE;
110  }
111 
112  // okay, it will fit. put it in
113  status = argBuf.deserialize(deserializedDirective.setSerReg.get_value(), valueSize, Fw::Serialization::OMIT_LENGTH);
114 
115  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) {
116  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
117  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
118  return Fw::Success::FAILURE;
119  }
120 
121  // now there should be nothing left, otherwise coding err
122  FW_ASSERT(argBuf.getBuffLeft() == 0, static_cast<FwAssertArgType>(argBuf.getBuffLeft()));
123 
124  // and set the buf size now that we know it
125  deserializedDirective.setSerReg.set__valueSize(valueSize);
126  break;
127  }
128  case Fpy::DirectiveId::GOTO: {
129  new (&deserializedDirective.gotoDirective) FpySequencer_GotoDirective();
130  status = argBuf.deserialize(deserializedDirective.gotoDirective);
131  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
132  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
133  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
134  return Fw::Success::FAILURE;
135  }
136  break;
137  }
138  case Fpy::DirectiveId::IF: {
139  new (&deserializedDirective.ifDirective) FpySequencer_IfDirective();
140  status = argBuf.deserialize(deserializedDirective.ifDirective);
141  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
142  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
143  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
144  return Fw::Success::FAILURE;
145  }
146  break;
147  }
149  new (&deserializedDirective.noOp) FpySequencer_NoOpDirective();
150  // no op does not need deser
151  if (argBuf.getBuffLeft() != 0) {
152  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
154  argBuf.getBuffLeft(), argBuf.getBuffLength());
155  return Fw::Success::FAILURE;
156  }
157  break;
158  }
160  new (&deserializedDirective.getTlm) FpySequencer_GetTlmDirective();
161  status = argBuf.deserialize(deserializedDirective.getTlm);
162  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
163  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
164  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
165  return Fw::Success::FAILURE;
166  }
167  break;
168  }
170  new (&deserializedDirective.getPrm) FpySequencer_GetPrmDirective();
171  status = argBuf.deserialize(deserializedDirective.getPrm);
172  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
173  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
174  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
175  return Fw::Success::FAILURE;
176  }
177  break;
178  }
179  case Fpy::DirectiveId::CMD: {
180  new (&deserializedDirective.cmd) FpySequencer_CmdDirective();
181  // same deserialization behavior as SET_SER_REG
182 
183  // first deserialize the opcode
184  FwOpcodeType opcode;
185  status = argBuf.deserialize(opcode);
186  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) {
187  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
188  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
189  return Fw::Success::FAILURE;
190  }
191 
192  deserializedDirective.cmd.set_opCode(opcode);
193  // how many bytes are left?
194  FwSizeType cmdArgBufSize = argBuf.getBuffLeft();
195 
196  // check to make sure the value will fit in the FpySequencer_CmdDirective::argBuf
197  if (cmdArgBufSize > Fpy::MAX_SERIALIZABLE_REGISTER_SIZE) {
198  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
200  argBuf.getBuffLeft(), argBuf.getBuffLength());
201  return Fw::Success::FAILURE;
202  }
203 
204  // okay, it will fit. put it in
205  status = argBuf.deserialize(deserializedDirective.cmd.get_argBuf(), cmdArgBufSize, Fw::Serialization::OMIT_LENGTH);
206 
207  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) {
208  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
209  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
210  return Fw::Success::FAILURE;
211  }
212 
213  // now there should be nothing left, otherwise coding err
214  FW_ASSERT(argBuf.getBuffLeft() == 0, static_cast<FwAssertArgType>(argBuf.getBuffLeft()));
215 
216  // and set the buf size now that we know it
217  deserializedDirective.cmd.set__argBufSize(cmdArgBufSize);
218  break;
219  }
220  // fallthrough on purpose
225  new (&deserializedDirective.deserSerReg) FpySequencer_DeserSerRegDirective();
226 
227  U8 deserSize;
228 
229  if (stmt.get_opCode() == Fpy::DirectiveId::DESER_SER_REG_1) {
230  deserSize = 1;
231  } else if (stmt.get_opCode() == Fpy::DirectiveId::DESER_SER_REG_2) {
232  deserSize = 2;
233  } else if (stmt.get_opCode() == Fpy::DirectiveId::DESER_SER_REG_4) {
234  deserSize = 4;
235  } else if (stmt.get_opCode() == Fpy::DirectiveId::DESER_SER_REG_8) {
236  deserSize = 8;
237  } else {
238  FW_ASSERT(0, static_cast<FwAssertArgType>(stmt.get_opCode()));
239  return Fw::Success::FAILURE;
240  }
241 
242  deserializedDirective.deserSerReg.set__deserSize(deserSize);
243 
244  U8 srcSerRegIdx;
245  status = argBuf.deserialize(srcSerRegIdx);
246  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) {
247  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
248  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
249  return Fw::Success::FAILURE;
250  }
251  deserializedDirective.deserSerReg.set_srcSerRegIdx(srcSerRegIdx);
252 
253  FwSizeType srcOffset;
254  status = argBuf.deserialize(srcOffset);
255  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) {
256  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
257  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
258  return Fw::Success::FAILURE;
259  }
260  deserializedDirective.deserSerReg.set_srcOffset(srcOffset);
261 
262  U8 destReg;
263  status = argBuf.deserialize(destReg);
264  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
265  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
266  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
267  return Fw::Success::FAILURE;
268  }
269  deserializedDirective.deserSerReg.set_destReg(destReg);
270  break;
271  }
273  new (&deserializedDirective.setReg) FpySequencer_SetRegDirective();
274  status = argBuf.deserialize(deserializedDirective.setReg);
275  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
276  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
277  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
278  return Fw::Success::FAILURE;
279  }
280  break;
281  }
282  // fallthrough on purpose
290  case Fpy::DirectiveId::UGE:
294  case Fpy::DirectiveId::SGE:
301  {
302  new (&deserializedDirective.binaryRegOp) FpySequencer_BinaryRegOpDirective();
303 
304  U8 lhs;
305  status = argBuf.deserialize(lhs);
306  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) {
307  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
308  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
309  return Fw::Success::FAILURE;
310  }
311  deserializedDirective.binaryRegOp.set_lhs(lhs);
312  U8 rhs;
313  status = argBuf.deserialize(rhs);
314  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) {
315  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
316  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
317  return Fw::Success::FAILURE;
318  }
319  deserializedDirective.binaryRegOp.set_rhs(rhs);
320  U8 res;
321  status = argBuf.deserialize(res);
322  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
323  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
324  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
325  return Fw::Success::FAILURE;
326  }
327  deserializedDirective.binaryRegOp.set_res(res);
328 
329  deserializedDirective.binaryRegOp.set__op(stmt.get_opCode());
330  break;
331  }
332  // fallthrough on purpose
340  new (&deserializedDirective.unaryRegOp) FpySequencer_UnaryRegOpDirective();
341 
342  U8 src;
343  status = argBuf.deserialize(src);
344  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK) {
345  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
346  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
347  return Fw::Success::FAILURE;
348  }
349  deserializedDirective.unaryRegOp.set_src(src);
350  U8 res;
351  status = argBuf.deserialize(res);
352  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
353  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
354  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
355  return Fw::Success::FAILURE;
356  }
357  deserializedDirective.unaryRegOp.set_res(res);
358 
359  deserializedDirective.unaryRegOp.set__op(stmt.get_opCode());
360  break;
361  }
362  case Fpy::DirectiveId::EXIT: {
363  new (&deserializedDirective.exit) FpySequencer_ExitDirective();
364  status = argBuf.deserialize(deserializedDirective.exit);
365  if (status != Fw::SerializeStatus::FW_SERIALIZE_OK || argBuf.getBuffLeft() != 0) {
366  this->log_WARNING_HI_DirectiveDeserializeError(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
367  status, argBuf.getBuffLeft(), argBuf.getBuffLength());
368  return Fw::Success::FAILURE;
369  }
370  break;
371  }
372  default: {
373  // unsure what this opcode is. check compiler version matches sequencer
374  this->log_WARNING_HI_UnknownSequencerDirective(stmt.get_opCode(), this->m_runtime.nextStatementIndex - 1,
375  this->m_sequenceFilePath);
376  return Fw::Success::FAILURE;
377  }
378  }
379  return Fw::Success::SUCCESS;
380 }
381 
382 // dispatches a deserialized sequencer directive to the right handler.
383 void FpySequencer::dispatchDirective(const DirectiveUnion& directive, const Fpy::DirectiveId& id) {
384  switch (id) {
386  // coding err
387  FW_ASSERT(0);
388  return;
389  }
391  this->directive_waitRel_internalInterfaceInvoke(directive.waitRel);
392  return;
393  }
395  this->directive_waitAbs_internalInterfaceInvoke(directive.waitAbs);
396  return;
397  }
399  this->directive_setSerReg_internalInterfaceInvoke(directive.setSerReg);
400  return;
401  }
402  case Fpy::DirectiveId::GOTO: {
403  this->directive_goto_internalInterfaceInvoke(directive.gotoDirective);
404  return;
405  }
406  case Fpy::DirectiveId::IF: {
407  this->directive_if_internalInterfaceInvoke(directive.ifDirective);
408  return;
409  }
411  this->directive_noOp_internalInterfaceInvoke(directive.noOp);
412  return;
413  }
415  this->directive_getTlm_internalInterfaceInvoke(directive.getTlm);
416  return;
417  }
419  this->directive_getPrm_internalInterfaceInvoke(directive.getPrm);
420  return;
421  }
422  case Fpy::DirectiveId::CMD: {
423  this->directive_cmd_internalInterfaceInvoke(directive.cmd);
424  return;
425  }
426  // fallthrough on purpose
431  this->directive_deserSerReg_internalInterfaceInvoke(directive.deserSerReg);
432  return;
433  }
435  this->directive_setReg_internalInterfaceInvoke(directive.setReg);
436  return;
437  }
438  // fallthrough on purpose
446  case Fpy::DirectiveId::UGE:
456  case Fpy::DirectiveId::FGE: {
457  this->directive_binaryRegOp_internalInterfaceInvoke(directive.binaryRegOp);
458  return;
459  }
460  // fallthrough on purpose
468  this->directive_unaryRegOp_internalInterfaceInvoke(directive.unaryRegOp);
469  return;
470  }
471  case Fpy::DirectiveId::EXIT: {
472  this->directive_exit_internalInterfaceInvoke(directive.exit);
473  return;
474  }
475  }
476  // coding err
477  FW_ASSERT(0, static_cast<FwAssertArgType>(id));
478 }
479 
480 Signal FpySequencer::checkShouldWake() {
481  Fw::Time currentTime = this->getTime();
482 
483  if (currentTime.getTimeBase() != this->m_runtime.wakeupTime.getTimeBase()) {
484  // cannot compare these times.
485  this->log_WARNING_HI_MismatchedTimeBase(currentTime.getTimeBase(), this->m_runtime.wakeupTime.getTimeBase());
486 
488  }
489 
490  // Do not compare time context
491 
492  if (currentTime < this->m_runtime.wakeupTime) {
493  // not time to wake up!
495  }
496 
497  // say we've finished our sleep
499 }
500 
501 // checks whether the currently executing statement timed out
502 Signal FpySequencer::checkStatementTimeout() {
503  Fw::ParamValid valid;
504  F32 timeout = this->paramGet_STATEMENT_TIMEOUT_SECS(valid);
505  if (timeout <= 0 || timeout > static_cast<F32>(std::numeric_limits<U32>::max())) {
506  // no timeout
508  }
509 
510  Fw::Time currentTime = getTime();
511 
512  if (currentTime.getTimeBase() != this->m_runtime.currentStatementDispatchTime.getTimeBase()) {
513  // can't compare time base. must have changed
515  this->m_runtime.currentStatementDispatchTime.getTimeBase());
517  }
518 
519  // Do not compare time context
520 
521  if (this->m_runtime.currentStatementDispatchTime.getSeconds() > currentTime.getSeconds()) {
522  // somehow we've gone back in time... just ignore it and move on. should get fixed
523  // if we wait I guess
525  }
526 
527  if (this->m_runtime.currentStatementDispatchTime.getSeconds() == currentTime.getSeconds() &&
528  this->m_runtime.currentStatementDispatchTime.getUSeconds() > currentTime.getUSeconds()) {
529  // same as above
531  }
532 
533  U64 currentUSeconds = currentTime.getSeconds() * 1000000 + currentTime.getUSeconds();
534  U64 dispatchUSeconds = this->m_runtime.currentStatementDispatchTime.getSeconds() * 1000000 +
535  this->m_runtime.currentStatementDispatchTime.getUSeconds();
536 
537  U64 timeoutUSeconds = static_cast<U64>(timeout * 1000000.0f);
538 
539  if (currentUSeconds - dispatchUSeconds < timeoutUSeconds) {
540  // not over timeout
542  }
543 
544  // we timed out
545  if (this->m_runtime.currentStatementOpcode == Fpy::DirectiveId::CMD) {
546  // if we were executing a command, warn that the cmd timed out with its opcode
547  this->log_WARNING_HI_CommandTimedOut(this->m_runtime.currentCmdOpcode,
548  this->m_runtime.nextStatementIndex - 1, this->m_sequenceFilePath);
549  } else {
550  this->log_WARNING_HI_DirectiveTimedOut(this->m_runtime.currentStatementOpcode,
551  this->m_runtime.nextStatementIndex - 1, this->m_sequenceFilePath);
552  }
553 
555 }
556 
557 } // namespace Svc
Serialization/Deserialization operation was successful.
called in dispatchStatement method when a statement was unable to be sent out
void directive_setSerReg_internalInterfaceInvoke(const Svc::FpySequencer_SetSerRegDirective &directive)
Internal interface base-class function for directive_setSerReg.
void log_WARNING_HI_DirectiveTimedOut(U8 opCode, U32 stmtIdx, const Fw::StringBase &filePath) const
Log event DirectiveTimedOut.
FwIdType FwOpcodeType
The type of a command opcode.
called in dispatchStatement method when there were no more statements in the sequence ...
Representing success.
PlatformSizeType FwSizeType
void directive_deserSerReg_internalInterfaceInvoke(const Svc::FpySequencer_DeserSerRegDirective &directive)
Internal interface base-class function for directive_deserSerReg.
void directive_if_internalInterfaceInvoke(const Svc::FpySequencer_IfDirective &directive)
Internal interface base-class function for directive_if.
TimeBase getTimeBase() const
Definition: Time.cpp:94
Deserialization data had incorrect values (unexpected data types)
void directive_noOp_internalInterfaceInvoke(const Svc::FpySequencer_NoOpDirective &directive)
Internal interface base-class function for directive_noOp.
void log_WARNING_HI_DirectiveDeserializeError(U8 opcode, U32 stmtIdx, I32 errorCode, U64 buffLeft, U64 buffLength) const
Log event DirectiveDeserializeError.
SerializeStatus
forward declaration for string
float F32
32-bit floating point
Definition: BasicTypes.h:83
void directive_setReg_internalInterfaceInvoke(const Svc::FpySequencer_SetRegDirective &directive)
Internal interface base-class function for directive_setReg.
called in dispatchStatement method when a statement was successfully dispatched
F32 paramGet_STATEMENT_TIMEOUT_SECS(Fw::ParamValid &valid)
void directive_unaryRegOp_internalInterfaceInvoke(const Svc::FpySequencer_UnaryRegOpDirective &directive)
Internal interface base-class function for directive_unaryRegOp.
Data was left in the buffer, but not enough to deserialize.
External serialize buffer with no copy semantics.
U32 getSeconds() const
Definition: Time.cpp:86
Type_of_statements & get_statements()
Get member statements.
void directive_waitAbs_internalInterfaceInvoke(const Svc::FpySequencer_WaitAbsDirective &directive)
Internal interface base-class function for directive_waitAbs.
void log_WARNING_HI_CommandTimedOut(FwOpcodeType opCode, U32 stmtIdx, const Fw::StringBase &filePath) const
Log event CommandTimedOut.
void directive_getTlm_internalInterfaceInvoke(const Svc::FpySequencer_GetTlmDirective &directive)
Internal interface base-class function for directive_getTlm.
Representing failure.
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:53
Omit length from serialization.
U32 getUSeconds() const
Definition: Time.cpp:90
void log_WARNING_HI_UnknownSequencerDirective(U8 opcode, U32 stmtIdx, const Fw::StringBase &filePath) const
Log event UnknownSequencerDirective.
RateGroupDivider component implementation.
void directive_getPrm_internalInterfaceInvoke(const Svc::FpySequencer_GetPrmDirective &directive)
Internal interface base-class function for directive_getPrm.
Enum representing parameter validity.
void log_WARNING_HI_MismatchedTimeBase(I32 internalTimeBase, I32 otherTimeBase) const
Log event MismatchedTimeBase.
void directive_exit_internalInterfaceInvoke(const Svc::FpySequencer_ExitDirective &directive)
Internal interface base-class function for directive_exit.
void directive_goto_internalInterfaceInvoke(const Svc::FpySequencer_GotoDirective &directive)
Internal interface base-class function for directive_goto.
void directive_waitRel_internalInterfaceInvoke(const Svc::FpySequencer_WaitRelDirective &directive)
Internal interface base-class function for directive_waitRel.
void directive_binaryRegOp_internalInterfaceInvoke(const Svc::FpySequencer_BinaryRegOpDirective &directive)
Internal interface base-class function for directive_binaryRegOp.
FpySequencer_SequencerStateMachineStateMachineBase::Signal Signal
#define FW_ASSERT(...)
Definition: Assert.hpp:14
Success/Failure.
PlatformAssertArgType FwAssertArgType
The type of arguments to assert functions.
void directive_cmd_internalInterfaceInvoke(const Svc::FpySequencer_CmdDirective &directive)
Internal interface base-class function for directive_cmd.
SerializeStatus setBuffLen(Serializable::SizeType length)
sets buffer length manually after filling with data
#define U64(C)
Definition: sha.h:180