1 #include <config/CommandDispatcherImplCfg.hpp> 10 U32 FpySequencer::currentStatementIdx() {
11 if (this->m_runtime.nextStatementIndex == 0) {
15 return this->m_runtime.nextStatementIndex - 1;
18 Signal FpySequencer::dispatchStatement() {
21 FW_ASSERT(this->m_runtime.nextStatementIndex <= this->m_sequenceObj.get_header().get_statementCount());
23 if (this->m_runtime.nextStatementIndex == this->m_sequenceObj.get_header().get_statementCount()) {
27 const Fpy::Statement& nextStatement = this->m_sequenceObj.
get_statements()[this->m_runtime.nextStatementIndex];
28 this->m_runtime.nextStatementIndex++;
29 this->m_runtime.currentStatementOpcode = nextStatement.get_opCode();
30 this->m_runtime.currentCmdOpcode = 0;
33 DirectiveUnion directiveUnion;
35 result = this->deserializeDirective(nextStatement, directiveUnion);
43 this->m_runtime.currentCmdOpcode = directiveUnion.constCmd.get_opCode();
46 this->dispatchDirective(directiveUnion,
47 Fpy::DirectiveId(static_cast<Fpy::DirectiveId::T>(nextStatement.get_opCode())));
48 this->m_runtime.currentStatementDispatchTime =
51 this->m_statementsDispatched++;
59 Fw::Success FpySequencer::deserializeDirective(
const Fpy::Statement& stmt, DirectiveUnion& deserializedDirective) {
63 status = argBuf.
setBuffLen(stmt.get_argBuf().getSize());
66 switch (stmt.get_opCode()) {
69 new (&deserializedDirective.waitRel) FpySequencer_WaitRelDirective();
71 if (argBuf.getDeserializeSizeLeft() != 0) {
74 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
80 new (&deserializedDirective.waitAbs) FpySequencer_WaitAbsDirective();
82 if (argBuf.getDeserializeSizeLeft() != 0) {
85 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
91 new (&deserializedDirective.gotoDirective) FpySequencer_GotoDirective();
92 status = argBuf.deserializeTo(deserializedDirective.gotoDirective);
95 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
101 new (&deserializedDirective.ifDirective) FpySequencer_IfDirective();
102 status = argBuf.deserializeTo(deserializedDirective.ifDirective);
105 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
111 new (&deserializedDirective.noOp) FpySequencer_NoOpDirective();
113 if (argBuf.getDeserializeSizeLeft() != 0) {
116 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
122 new (&deserializedDirective.pushTlmVal) FpySequencer_PushTlmValDirective();
123 status = argBuf.deserializeTo(deserializedDirective.pushTlmVal);
126 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
132 new (&deserializedDirective.pushTlmValAndTime) FpySequencer_PushTlmValAndTimeDirective();
133 status = argBuf.deserializeTo(deserializedDirective.pushTlmValAndTime);
136 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
142 new (&deserializedDirective.pushPrm) FpySequencer_PushPrmDirective();
143 status = argBuf.deserializeTo(deserializedDirective.pushPrm);
146 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
152 new (&deserializedDirective.constCmd) FpySequencer_ConstCmdDirective();
156 status = argBuf.deserializeTo(opcode);
159 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
163 deserializedDirective.constCmd.set_opCode(opcode);
165 FwSizeType cmdArgBufSize = argBuf.getDeserializeSizeLeft();
171 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
176 status = argBuf.deserializeTo(deserializedDirective.constCmd.get_argBuf(), cmdArgBufSize,
181 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
186 FW_ASSERT(argBuf.getDeserializeSizeLeft() == 0,
190 deserializedDirective.constCmd.set__argBufSize(cmdArgBufSize);
245 new (&deserializedDirective.stackOp) FpySequencer_StackOpDirective();
246 if (argBuf.getDeserializeSizeLeft() != 0) {
249 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
252 deserializedDirective.stackOp.set__op(stmt.get_opCode());
256 new (&deserializedDirective.exit) FpySequencer_ExitDirective();
257 if (argBuf.getDeserializeSizeLeft() != 0) {
260 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
266 new (&deserializedDirective.allocate) FpySequencer_AllocateDirective();
267 status = argBuf.deserializeTo(deserializedDirective.allocate);
270 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
276 new (&deserializedDirective.storeRelConstOffset) FpySequencer_StoreRelConstOffsetDirective();
277 status = argBuf.deserializeTo(deserializedDirective.storeRelConstOffset);
280 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
286 new (&deserializedDirective.loadRel) FpySequencer_LoadRelDirective();
287 status = argBuf.deserializeTo(deserializedDirective.loadRel);
290 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
296 new (&deserializedDirective.pushVal) FpySequencer_PushValDirective();
299 FwSizeType bufSize = argBuf.getDeserializeSizeLeft();
305 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
315 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
320 FW_ASSERT(argBuf.getDeserializeSizeLeft() == 0,
324 deserializedDirective.pushVal.set__valSize(bufSize);
328 new (&deserializedDirective.discard) FpySequencer_DiscardDirective();
329 status = argBuf.deserializeTo(deserializedDirective.discard);
332 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
338 new (&deserializedDirective.memCmp) FpySequencer_MemCmpDirective();
339 status = argBuf.deserializeTo(deserializedDirective.memCmp);
342 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
348 new (&deserializedDirective.stackCmd) FpySequencer_StackCmdDirective();
349 status = argBuf.deserializeTo(deserializedDirective.stackCmd);
352 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
358 new (&deserializedDirective.pushTime) FpySequencer_PushTimeDirective();
359 if (argBuf.getDeserializeSizeLeft() != 0) {
362 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
368 new (&deserializedDirective.setSeed) FpySequencer_SetSeedDirective();
369 if (argBuf.getDeserializeSizeLeft() != 0) {
372 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
378 new (&deserializedDirective.pushRand) FpySequencer_PushRandDirective();
379 if (argBuf.getDeserializeSizeLeft() != 0) {
382 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
388 new (&deserializedDirective.getField) FpySequencer_GetFieldDirective();
389 status = argBuf.deserializeTo(deserializedDirective.getField);
392 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
398 new (&deserializedDirective.peek) FpySequencer_PeekDirective();
399 if (argBuf.getDeserializeSizeLeft() != 0) {
402 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
408 new (&deserializedDirective.storeRel) FpySequencer_StoreRelDirective();
409 status = argBuf.deserializeTo(deserializedDirective.storeRel);
412 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
418 new (&deserializedDirective.call) FpySequencer_CallDirective();
419 if (argBuf.getDeserializeSizeLeft() != 0) {
422 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
428 new (&deserializedDirective.returnDirective) FpySequencer_ReturnDirective();
429 status = argBuf.deserializeTo(deserializedDirective.returnDirective);
432 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
438 new (&deserializedDirective.loadAbs) FpySequencer_LoadAbsDirective();
439 status = argBuf.deserializeTo(deserializedDirective.loadAbs);
442 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
448 new (&deserializedDirective.storeAbs) FpySequencer_StoreAbsDirective();
449 status = argBuf.deserializeTo(deserializedDirective.storeAbs);
452 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
458 new (&deserializedDirective.storeAbsConstOffset) FpySequencer_StoreAbsConstOffsetDirective();
459 status = argBuf.deserializeTo(deserializedDirective.storeAbsConstOffset);
462 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
468 new (&deserializedDirective.popEvent) FpySequencer_PopEventDirective();
470 if (argBuf.getDeserializeSizeLeft() != 0) {
473 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
479 new (&deserializedDirective.popSerializable) FpySequencer_PopSerializableDirective();
480 status = argBuf.deserializeTo(deserializedDirective.popSerializable);
483 argBuf.getDeserializeSizeLeft(), argBuf.getSize());
495 this->m_sequenceFilePath);
500 void FpySequencer::dispatchDirective(
const DirectiveUnion& directive,
const Fpy::DirectiveId&
id) {
684 FW_ASSERT(
false, static_cast<FwAssertArgType>(
id));
687 Signal FpySequencer::checkShouldWake() {
690 if (currentTime.
getTimeBase() != this->m_runtime.wakeupTime.getTimeBase()) {
699 if (currentTime < this->m_runtime.wakeupTime) {
709 Signal FpySequencer::checkStatementTimeout() {
712 if (timeout <= 0 || timeout > static_cast<F32>(std::numeric_limits<U32>::max())) {
719 if (currentTime.
getTimeBase() != this->m_runtime.currentStatementDispatchTime.getTimeBase()) {
722 this->m_runtime.currentStatementDispatchTime.getTimeBase());
728 if (this->m_runtime.currentStatementDispatchTime.getSeconds() > currentTime.
getSeconds()) {
734 if (this->m_runtime.currentStatementDispatchTime.getSeconds() == currentTime.
getSeconds() &&
735 this->m_runtime.currentStatementDispatchTime.getUSeconds() > currentTime.
getUSeconds()) {
740 U64 currentUSeconds =
static_cast<U64
>(currentTime.
getSeconds()) * 1000000 + currentTime.
getUSeconds();
741 U64 dispatchUSeconds =
static_cast<U64
>(this->m_runtime.currentStatementDispatchTime.getSeconds()) * 1000000 +
742 this->m_runtime.currentStatementDispatchTime.getUSeconds();
744 U64 timeoutUSeconds =
static_cast<U64
>(timeout * 1000000.0f);
746 if (currentUSeconds - dispatchUSeconds < timeoutUSeconds) {
756 this->currentStatementIdx(), this->m_sequenceFilePath);
759 this->m_sequenceFilePath);
constexpr FwOpcodeType getEventOpcode(const FwOpcodeType opcode)
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.
SerializeStatus setBuffLen(Serializable::SizeType length) override
Set buffer length manually.
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.
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.