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 status = argBuf.
setBuffLen(stmt.get_argBuf().getSize());
64 switch (stmt.get_opCode()) {
67 new (&deserializedDirective.waitRel) FpySequencer_WaitRelDirective();
69 if (argBuf.getDeserializeSizeLeft() != 0) {
72 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
78 new (&deserializedDirective.waitAbs) FpySequencer_WaitAbsDirective();
80 if (argBuf.getDeserializeSizeLeft() != 0) {
83 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
89 new (&deserializedDirective.gotoDirective) FpySequencer_GotoDirective();
90 status = argBuf.deserializeTo(deserializedDirective.gotoDirective);
93 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
99 new (&deserializedDirective.ifDirective) FpySequencer_IfDirective();
100 status = argBuf.deserializeTo(deserializedDirective.ifDirective);
103 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
109 new (&deserializedDirective.noOp) FpySequencer_NoOpDirective();
111 if (argBuf.getDeserializeSizeLeft() != 0) {
114 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
120 new (&deserializedDirective.pushTlmVal) FpySequencer_PushTlmValDirective();
121 status = argBuf.deserializeTo(deserializedDirective.pushTlmVal);
124 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
130 new (&deserializedDirective.pushTlmValAndTime) FpySequencer_PushTlmValAndTimeDirective();
131 status = argBuf.deserializeTo(deserializedDirective.pushTlmValAndTime);
134 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
140 new (&deserializedDirective.pushPrm) FpySequencer_PushPrmDirective();
141 status = argBuf.deserializeTo(deserializedDirective.pushPrm);
144 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
150 new (&deserializedDirective.constCmd) FpySequencer_ConstCmdDirective();
154 status = argBuf.deserializeTo(opcode);
157 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
161 deserializedDirective.constCmd.set_opCode(opcode);
163 FwSizeType cmdArgBufSize = argBuf.getDeserializeSizeLeft();
169 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
174 status = argBuf.deserializeTo(deserializedDirective.constCmd.get_argBuf(), cmdArgBufSize,
179 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
184 FW_ASSERT(argBuf.getDeserializeSizeLeft() == 0,
188 deserializedDirective.constCmd.set__argBufSize(cmdArgBufSize);
240 new (&deserializedDirective.stackOp) FpySequencer_StackOpDirective();
241 if (argBuf.getDeserializeSizeLeft() != 0) {
244 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
247 deserializedDirective.stackOp.set__op(stmt.get_opCode());
251 new (&deserializedDirective.exit) FpySequencer_ExitDirective();
252 if (argBuf.getDeserializeSizeLeft() != 0) {
255 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
261 new (&deserializedDirective.allocate) FpySequencer_AllocateDirective();
262 status = argBuf.deserializeTo(deserializedDirective.allocate);
265 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
271 new (&deserializedDirective.storeRelConstOffset) FpySequencer_StoreRelConstOffsetDirective();
272 status = argBuf.deserializeTo(deserializedDirective.storeRelConstOffset);
275 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
281 new (&deserializedDirective.loadRel) FpySequencer_LoadRelDirective();
282 status = argBuf.deserializeTo(deserializedDirective.loadRel);
285 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
291 new (&deserializedDirective.pushVal) FpySequencer_PushValDirective();
294 FwSizeType bufSize = argBuf.getDeserializeSizeLeft();
300 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
310 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
315 FW_ASSERT(argBuf.getDeserializeSizeLeft() == 0,
319 deserializedDirective.pushVal.set__valSize(bufSize);
323 new (&deserializedDirective.discard) FpySequencer_DiscardDirective();
324 status = argBuf.deserializeTo(deserializedDirective.discard);
327 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
333 new (&deserializedDirective.memCmp) FpySequencer_MemCmpDirective();
334 status = argBuf.deserializeTo(deserializedDirective.memCmp);
337 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
343 new (&deserializedDirective.stackCmd) FpySequencer_StackCmdDirective();
344 status = argBuf.deserializeTo(deserializedDirective.stackCmd);
347 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
353 new (&deserializedDirective.pushTime) FpySequencer_PushTimeDirective();
354 if (argBuf.getDeserializeSizeLeft() != 0) {
357 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
363 new (&deserializedDirective.setSeed) FpySequencer_SetSeedDirective();
364 if (argBuf.getDeserializeSizeLeft() != 0) {
367 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
373 new (&deserializedDirective.pushRand) FpySequencer_PushRandDirective();
374 if (argBuf.getDeserializeSizeLeft() != 0) {
377 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
383 new (&deserializedDirective.getField) FpySequencer_GetFieldDirective();
384 status = argBuf.deserializeTo(deserializedDirective.getField);
387 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
393 new (&deserializedDirective.peek) FpySequencer_PeekDirective();
394 if (argBuf.getDeserializeSizeLeft() != 0) {
397 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
403 new (&deserializedDirective.storeRel) FpySequencer_StoreRelDirective();
404 status = argBuf.deserializeTo(deserializedDirective.storeRel);
407 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
413 new (&deserializedDirective.call) FpySequencer_CallDirective();
414 if (argBuf.getDeserializeSizeLeft() != 0) {
417 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
423 new (&deserializedDirective.returnDirective) FpySequencer_ReturnDirective();
424 status = argBuf.deserializeTo(deserializedDirective.returnDirective);
427 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
433 new (&deserializedDirective.loadAbs) FpySequencer_LoadAbsDirective();
434 status = argBuf.deserializeTo(deserializedDirective.loadAbs);
437 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
443 new (&deserializedDirective.storeAbs) FpySequencer_StoreAbsDirective();
444 status = argBuf.deserializeTo(deserializedDirective.storeAbs);
447 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
453 new (&deserializedDirective.storeAbsConstOffset) FpySequencer_StoreAbsConstOffsetDirective();
454 status = argBuf.deserializeTo(deserializedDirective.storeAbsConstOffset);
457 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
463 new (&deserializedDirective.popEvent) FpySequencer_PopEventDirective();
465 if (argBuf.getDeserializeSizeLeft() != 0) {
468 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
474 new (&deserializedDirective.popSerializable) FpySequencer_PopSerializableDirective();
475 status = argBuf.deserializeTo(deserializedDirective.popSerializable);
478 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
490 this->m_sequenceFilePath);
495 void FpySequencer::dispatchDirective(
const DirectiveUnion& directive,
const Fpy::DirectiveId&
id) {
676 FW_ASSERT(
false, static_cast<FwAssertArgType>(
id));
679 Signal FpySequencer::checkShouldWake() {
682 if (currentTime.
getTimeBase() != this->m_runtime.wakeupTime.getTimeBase()) {
691 if (currentTime < this->m_runtime.wakeupTime) {
701 Signal FpySequencer::checkStatementTimeout() {
704 if (timeout <= 0 || timeout > static_cast<F32>(std::numeric_limits<U32>::max())) {
711 if (currentTime.
getTimeBase() != this->m_runtime.currentStatementDispatchTime.getTimeBase()) {
714 this->m_runtime.currentStatementDispatchTime.getTimeBase());
720 if (this->m_runtime.currentStatementDispatchTime.getSeconds() > currentTime.
getSeconds()) {
726 if (this->m_runtime.currentStatementDispatchTime.getSeconds() == currentTime.
getSeconds() &&
727 this->m_runtime.currentStatementDispatchTime.getUSeconds() > currentTime.
getUSeconds()) {
733 U64 dispatchUSeconds =
static_cast<U64>(this->m_runtime.currentStatementDispatchTime.getSeconds()) * 1000000 +
734 this->m_runtime.currentStatementDispatchTime.getUSeconds();
736 U64 timeoutUSeconds =
static_cast<U64>(timeout * 1000000.0f);
738 if (currentUSeconds - dispatchUSeconds < timeoutUSeconds) {
748 this->m_sequenceFilePath);
751 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_popEvent_internalInterfaceInvoke(const Svc::FpySequencer_PopEventDirective &directive)
Internal interface base-class function for directive_popEvent.
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_popSerializable_internalInterfaceInvoke(const Svc::FpySequencer_PopSerializableDirective &directive)
Internal interface base-class function for directive_popSerializable.
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.
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_pushRand_internalInterfaceInvoke(const Svc::FpySequencer_PushRandDirective &directive)
Internal interface base-class function for directive_pushRand.
void directive_setSeed_internalInterfaceInvoke(const Svc::FpySequencer_SetSeedDirective &directive)
Internal interface base-class function for directive_setSeed.
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 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.