8 U32 FpySequencer::currentStatementIdx() {
9 if (this->m_runtime.nextStatementIndex == 0) {
13 return this->m_runtime.nextStatementIndex - 1;
16 Signal FpySequencer::dispatchStatement() {
19 FW_ASSERT(this->m_runtime.nextStatementIndex <= this->m_sequenceObj.get_header().get_statementCount());
21 if (this->m_runtime.nextStatementIndex == this->m_sequenceObj.get_header().get_statementCount()) {
25 const Fpy::Statement& nextStatement = this->m_sequenceObj.
get_statements()[this->m_runtime.nextStatementIndex];
26 this->m_runtime.nextStatementIndex++;
27 this->m_runtime.currentStatementOpcode = nextStatement.get_opCode();
28 this->m_runtime.currentCmdOpcode = 0;
31 DirectiveUnion directiveUnion;
33 result = this->deserializeDirective(nextStatement, directiveUnion);
41 this->m_runtime.currentCmdOpcode = directiveUnion.constCmd.get_opCode();
44 this->dispatchDirective(directiveUnion,
45 Fpy::DirectiveId(static_cast<Fpy::DirectiveId::T>(nextStatement.get_opCode())));
46 this->m_runtime.currentStatementDispatchTime =
49 this->m_statementsDispatched++;
57 Fw::Success FpySequencer::deserializeDirective(
const Fpy::Statement& stmt, DirectiveUnion& deserializedDirective) {
61 argBuf.
setBuffLen(stmt.get_argBuf().getSize());
63 switch (stmt.get_opCode()) {
66 new (&deserializedDirective.waitRel) FpySequencer_WaitRelDirective();
68 if (argBuf.getDeserializeSizeLeft() != 0) {
71 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
77 new (&deserializedDirective.waitAbs) FpySequencer_WaitAbsDirective();
79 if (argBuf.getDeserializeSizeLeft() != 0) {
82 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
88 new (&deserializedDirective.gotoDirective) FpySequencer_GotoDirective();
89 status = argBuf.deserializeTo(deserializedDirective.gotoDirective);
92 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
98 new (&deserializedDirective.ifDirective) FpySequencer_IfDirective();
99 status = argBuf.deserializeTo(deserializedDirective.ifDirective);
102 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
108 new (&deserializedDirective.noOp) FpySequencer_NoOpDirective();
110 if (argBuf.getDeserializeSizeLeft() != 0) {
113 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
119 new (&deserializedDirective.pushTlmVal) FpySequencer_PushTlmValDirective();
120 status = argBuf.deserializeTo(deserializedDirective.pushTlmVal);
123 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
129 new (&deserializedDirective.pushTlmValAndTime) FpySequencer_PushTlmValAndTimeDirective();
130 status = argBuf.deserializeTo(deserializedDirective.pushTlmValAndTime);
133 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
139 new (&deserializedDirective.pushPrm) FpySequencer_PushPrmDirective();
140 status = argBuf.deserializeTo(deserializedDirective.pushPrm);
143 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
149 new (&deserializedDirective.constCmd) FpySequencer_ConstCmdDirective();
153 status = argBuf.deserializeTo(opcode);
156 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
160 deserializedDirective.constCmd.set_opCode(opcode);
162 FwSizeType cmdArgBufSize = argBuf.getDeserializeSizeLeft();
168 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
173 status = argBuf.deserializeTo(deserializedDirective.constCmd.get_argBuf(), cmdArgBufSize,
178 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
183 FW_ASSERT(argBuf.getDeserializeSizeLeft() == 0,
187 deserializedDirective.constCmd.set__argBufSize(cmdArgBufSize);
239 new (&deserializedDirective.stackOp) FpySequencer_StackOpDirective();
240 if (argBuf.getDeserializeSizeLeft() != 0) {
243 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
246 deserializedDirective.stackOp.set__op(stmt.get_opCode());
250 new (&deserializedDirective.exit) FpySequencer_ExitDirective();
251 if (argBuf.getDeserializeSizeLeft() != 0) {
254 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
260 new (&deserializedDirective.allocate) FpySequencer_AllocateDirective();
261 status = argBuf.deserializeTo(deserializedDirective.allocate);
264 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
270 new (&deserializedDirective.storeRelConstOffset) FpySequencer_StoreRelConstOffsetDirective();
271 status = argBuf.deserializeTo(deserializedDirective.storeRelConstOffset);
274 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
280 new (&deserializedDirective.loadRel) FpySequencer_LoadRelDirective();
281 status = argBuf.deserializeTo(deserializedDirective.loadRel);
284 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
290 new (&deserializedDirective.pushVal) FpySequencer_PushValDirective();
293 FwSizeType bufSize = argBuf.getDeserializeSizeLeft();
299 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
309 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
314 FW_ASSERT(argBuf.getDeserializeSizeLeft() == 0,
318 deserializedDirective.pushVal.set__valSize(bufSize);
322 new (&deserializedDirective.discard) FpySequencer_DiscardDirective();
323 status = argBuf.deserializeTo(deserializedDirective.discard);
326 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
332 new (&deserializedDirective.memCmp) FpySequencer_MemCmpDirective();
333 status = argBuf.deserializeTo(deserializedDirective.memCmp);
336 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
342 new (&deserializedDirective.stackCmd) FpySequencer_StackCmdDirective();
343 status = argBuf.deserializeTo(deserializedDirective.stackCmd);
346 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
352 new (&deserializedDirective.pushTime) FpySequencer_PushTimeDirective();
353 if (argBuf.getDeserializeSizeLeft() != 0) {
356 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
362 new (&deserializedDirective.setFlag) FpySequencer_SetFlagDirective();
363 status = argBuf.deserializeTo(deserializedDirective.setFlag);
366 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
372 new (&deserializedDirective.getFlag) FpySequencer_GetFlagDirective();
373 status = argBuf.deserializeTo(deserializedDirective.getFlag);
376 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
382 new (&deserializedDirective.getField) FpySequencer_GetFieldDirective();
383 status = argBuf.deserializeTo(deserializedDirective.getField);
386 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
392 new (&deserializedDirective.peek) FpySequencer_PeekDirective();
393 if (argBuf.getDeserializeSizeLeft() != 0) {
396 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
402 new (&deserializedDirective.storeRel) FpySequencer_StoreRelDirective();
403 status = argBuf.deserializeTo(deserializedDirective.storeRel);
406 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
412 new (&deserializedDirective.call) FpySequencer_CallDirective();
413 if (argBuf.getDeserializeSizeLeft() != 0) {
416 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
422 new (&deserializedDirective.returnDirective) FpySequencer_ReturnDirective();
423 status = argBuf.deserializeTo(deserializedDirective.returnDirective);
426 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
432 new (&deserializedDirective.loadAbs) FpySequencer_LoadAbsDirective();
433 status = argBuf.deserializeTo(deserializedDirective.loadAbs);
436 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
442 new (&deserializedDirective.storeAbs) FpySequencer_StoreAbsDirective();
443 status = argBuf.deserializeTo(deserializedDirective.storeAbs);
446 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
452 new (&deserializedDirective.storeAbsConstOffset) FpySequencer_StoreAbsConstOffsetDirective();
453 status = argBuf.deserializeTo(deserializedDirective.storeAbsConstOffset);
456 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
464 this->m_sequenceFilePath);
472 void FpySequencer::dispatchDirective(
const DirectiveUnion& directive,
const Fpy::DirectiveId&
id) {
645 FW_ASSERT(0, static_cast<FwAssertArgType>(
id));
648 Signal FpySequencer::checkShouldWake() {
651 if (currentTime.
getTimeBase() != this->m_runtime.wakeupTime.getTimeBase()) {
660 if (currentTime < this->m_runtime.wakeupTime) {
670 Signal FpySequencer::checkStatementTimeout() {
673 if (timeout <= 0 || timeout > static_cast<F32>(std::numeric_limits<U32>::max())) {
680 if (currentTime.
getTimeBase() != this->m_runtime.currentStatementDispatchTime.getTimeBase()) {
683 this->m_runtime.currentStatementDispatchTime.getTimeBase());
689 if (this->m_runtime.currentStatementDispatchTime.getSeconds() > currentTime.
getSeconds()) {
695 if (this->m_runtime.currentStatementDispatchTime.getSeconds() == currentTime.
getSeconds() &&
696 this->m_runtime.currentStatementDispatchTime.getUSeconds() > currentTime.
getUSeconds()) {
702 U64 dispatchUSeconds = this->m_runtime.currentStatementDispatchTime.getSeconds() * 1000000 +
703 this->m_runtime.currentStatementDispatchTime.getUSeconds();
705 U64 timeoutUSeconds =
static_cast<U64>(timeout * 1000000.0f);
707 if (currentUSeconds - dispatchUSeconds < timeoutUSeconds) {
717 this->m_sequenceFilePath);
720 this->m_sequenceFilePath);
Serialization/Deserialization operation was successful.
called in dispatchStatement method when a statement was unable to be sent out
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 ...
void directive_pushVal_internalInterfaceInvoke(const Svc::FpySequencer_PushValDirective &directive)
Internal interface base-class function for directive_pushVal.
PlatformSizeType FwSizeType
void directive_stackOp_internalInterfaceInvoke(const Svc::FpySequencer_StackOpDirective &directive)
Internal interface base-class function for directive_stackOp.
void directive_pushTlmVal_internalInterfaceInvoke(const Svc::FpySequencer_PushTlmValDirective &directive)
Internal interface base-class function for directive_pushTlmVal.
raised when we should keep sleeping
void directive_if_internalInterfaceInvoke(const Svc::FpySequencer_IfDirective &directive)
Internal interface base-class function for directive_if.
TimeBase getTimeBase() const
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 directive_allocate_internalInterfaceInvoke(const Svc::FpySequencer_AllocateDirective &directive)
Internal interface base-class function for directive_allocate.
void directive_storeRelConstOffset_internalInterfaceInvoke(const Svc::FpySequencer_StoreRelConstOffsetDirective &directive)
Internal interface base-class function for directive_storeRelConstOffset.
void directive_pushTlmValAndTime_internalInterfaceInvoke(const Svc::FpySequencer_PushTlmValAndTimeDirective &directive)
Internal interface base-class function for directive_pushTlmValAndTime.
void directive_stackCmd_internalInterfaceInvoke(const Svc::FpySequencer_StackCmdDirective &directive)
Internal interface base-class function for directive_stackCmd.
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
void directive_loadAbs_internalInterfaceInvoke(const Svc::FpySequencer_LoadAbsDirective &directive)
Internal interface base-class function for directive_loadAbs.
called in dispatchStatement method when a statement was successfully dispatched
F32 paramGet_STATEMENT_TIMEOUT_SECS(Fw::ParamValid &valid)
void directive_memCmp_internalInterfaceInvoke(const Svc::FpySequencer_MemCmpDirective &directive)
Internal interface base-class function for directive_memCmp.
void directive_pushTime_internalInterfaceInvoke(const Svc::FpySequencer_PushTimeDirective &directive)
Internal interface base-class function for directive_pushTime.
Omit length from serialization.
Data was left in the buffer, but not enough to deserialize.
External serialize buffer with no copy semantics.
void directive_setFlag_internalInterfaceInvoke(const Svc::FpySequencer_SetFlagDirective &directive)
Internal interface base-class function for directive_setFlag.
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 directive_peek_internalInterfaceInvoke(const Svc::FpySequencer_PeekDirective &directive)
Internal interface base-class function for directive_peek.
void log_WARNING_HI_CommandTimedOut(FwOpcodeType opCode, U32 stmtIdx, const Fw::StringBase &filePath) const
Log event CommandTimedOut.
void directive_getField_internalInterfaceInvoke(const Svc::FpySequencer_GetFieldDirective &directive)
Internal interface base-class function for directive_getField.
void directive_discard_internalInterfaceInvoke(const Svc::FpySequencer_DiscardDirective &directive)
Internal interface base-class function for directive_discard.
void directive_pushPrm_internalInterfaceInvoke(const Svc::FpySequencer_PushPrmDirective &directive)
Internal interface base-class function for directive_pushPrm.
void directive_constCmd_internalInterfaceInvoke(const Svc::FpySequencer_ConstCmdDirective &directive)
Internal interface base-class function for directive_constCmd.
raised when the statement has not timed out yet
void directive_return_internalInterfaceInvoke(const Svc::FpySequencer_ReturnDirective &directive)
Internal interface base-class function for directive_return.
void directive_getFlag_internalInterfaceInvoke(const Svc::FpySequencer_GetFlagDirective &directive)
Internal interface base-class function for directive_getFlag.
void log_WARNING_HI_UnknownSequencerDirective(U8 opcode, U32 stmtIdx, const Fw::StringBase &filePath) const
Log event UnknownSequencerDirective.
RateGroupDivider component implementation.
raised when we are done sleeping
Enum representing parameter validity.
void directive_storeAbs_internalInterfaceInvoke(const Svc::FpySequencer_StoreAbsDirective &directive)
Internal interface base-class function for directive_storeAbs.
void log_WARNING_HI_MismatchedTimeBase(I32 internalTimeBase, I32 otherTimeBase) const
Log event MismatchedTimeBase.
void directive_call_internalInterfaceInvoke(const Svc::FpySequencer_CallDirective &directive)
Internal interface base-class function for directive_call.
void directive_exit_internalInterfaceInvoke(const Svc::FpySequencer_ExitDirective &directive)
Internal interface base-class function for directive_exit.
raised when the statement times out, according to the timeout parameter
void directive_storeAbsConstOffset_internalInterfaceInvoke(const Svc::FpySequencer_StoreAbsConstOffsetDirective &directive)
Internal interface base-class function for directive_storeAbsConstOffset.
SerializeStatus setBuffLen(Serializable::SizeType length) override
Set buffer length manually.
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_storeRel_internalInterfaceInvoke(const Svc::FpySequencer_StoreRelDirective &directive)
Internal interface base-class function for directive_storeRel.
void directive_loadRel_internalInterfaceInvoke(const Svc::FpySequencer_LoadRelDirective &directive)
Internal interface base-class function for directive_loadRel.
FpySequencer_SequencerStateMachineStateMachineBase::Signal Signal
PlatformAssertArgType FwAssertArgType
The type of arguments to assert functions.