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.storeConstOffset) FpySequencer_StoreConstOffsetDirective();
271 status = argBuf.deserializeTo(deserializedDirective.storeConstOffset);
274 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
280 new (&deserializedDirective.load) FpySequencer_LoadDirective();
281 status = argBuf.deserializeTo(deserializedDirective.load);
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.store) FpySequencer_StoreDirective();
403 status = argBuf.deserializeTo(deserializedDirective.store);
406 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
414 this->m_sequenceFilePath);
422 void FpySequencer::dispatchDirective(
const DirectiveUnion& directive,
const Fpy::DirectiveId&
id) {
575 FW_ASSERT(0, static_cast<FwAssertArgType>(
id));
578 Signal FpySequencer::checkShouldWake() {
581 if (currentTime.
getTimeBase() != this->m_runtime.wakeupTime.getTimeBase()) {
590 if (currentTime < this->m_runtime.wakeupTime) {
600 Signal FpySequencer::checkStatementTimeout() {
603 if (timeout <= 0 || timeout > static_cast<F32>(std::numeric_limits<U32>::max())) {
610 if (currentTime.
getTimeBase() != this->m_runtime.currentStatementDispatchTime.getTimeBase()) {
613 this->m_runtime.currentStatementDispatchTime.getTimeBase());
619 if (this->m_runtime.currentStatementDispatchTime.getSeconds() > currentTime.
getSeconds()) {
625 if (this->m_runtime.currentStatementDispatchTime.getSeconds() == currentTime.
getSeconds() &&
626 this->m_runtime.currentStatementDispatchTime.getUSeconds() > currentTime.
getUSeconds()) {
632 U64 dispatchUSeconds = this->m_runtime.currentStatementDispatchTime.getSeconds() * 1000000 +
633 this->m_runtime.currentStatementDispatchTime.getUSeconds();
635 U64 timeoutUSeconds =
static_cast<U64>(timeout * 1000000.0f);
637 if (currentUSeconds - dispatchUSeconds < timeoutUSeconds) {
647 this->m_sequenceFilePath);
650 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.
void directive_load_internalInterfaceInvoke(const Svc::FpySequencer_LoadDirective &directive)
Internal interface base-class function for directive_load.
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_store_internalInterfaceInvoke(const Svc::FpySequencer_StoreDirective &directive)
Internal interface base-class function for directive_store.
void directive_allocate_internalInterfaceInvoke(const Svc::FpySequencer_AllocateDirective &directive)
Internal interface base-class function for directive_allocate.
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
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.
void directive_storeConstOffset_internalInterfaceInvoke(const Svc::FpySequencer_StoreConstOffsetDirective &directive)
Internal interface base-class function for directive_storeConstOffset.
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_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 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.
raised when the statement times out, according to the timeout parameter
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.
FpySequencer_SequencerStateMachineStateMachineBase::Signal Signal
PlatformAssertArgType FwAssertArgType
The type of arguments to assert functions.