7 Signal FpySequencer::dispatchStatement() {
10 FW_ASSERT(this->m_runtime.nextStatementIndex <= this->m_sequenceObj.get_header().get_statementCount());
12 if (this->m_runtime.nextStatementIndex == this->m_sequenceObj.get_header().get_statementCount()) {
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;
22 DirectiveUnion directiveUnion;
24 result = this->deserializeDirective(nextStatement, directiveUnion);
32 this->m_runtime.currentCmdOpcode = directiveUnion.cmd.get_opCode();
35 this->dispatchDirective(directiveUnion,
36 Fpy::DirectiveId(static_cast<Fpy::DirectiveId::T>(nextStatement.get_opCode())));
37 this->m_runtime.currentStatementDispatchTime =
getTime();
39 this->m_statementsDispatched++;
47 Fw::Success FpySequencer::deserializeDirective(
const Fpy::Statement& stmt, DirectiveUnion& deserializedDirective) {
51 stmt.get_argBuf().getBuffLength());
52 argBuf.
setBuffLen(stmt.get_argBuf().getBuffLength());
54 switch (stmt.get_opCode()) {
57 new (&deserializedDirective.waitRel) FpySequencer_WaitRelDirective();
58 status = argBuf.deserialize(deserializedDirective.waitRel);
61 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
67 new (&deserializedDirective.waitAbs) FpySequencer_WaitAbsDirective();
68 status = argBuf.deserialize(deserializedDirective.waitAbs);
71 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
77 new (&deserializedDirective.setSerReg) FpySequencer_SetSerRegDirective();
90 status = argBuf.deserialize(index);
93 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
97 deserializedDirective.setSerReg.set_index(index);
108 argBuf.getBuffLeft(), argBuf.getBuffLength());
117 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
125 deserializedDirective.setSerReg.set__valueSize(valueSize);
129 new (&deserializedDirective.gotoDirective) FpySequencer_GotoDirective();
130 status = argBuf.deserialize(deserializedDirective.gotoDirective);
133 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
139 new (&deserializedDirective.ifDirective) FpySequencer_IfDirective();
140 status = argBuf.deserialize(deserializedDirective.ifDirective);
143 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
149 new (&deserializedDirective.noOp) FpySequencer_NoOpDirective();
151 if (argBuf.getBuffLeft() != 0) {
154 argBuf.getBuffLeft(), argBuf.getBuffLength());
160 new (&deserializedDirective.getTlm) FpySequencer_GetTlmDirective();
161 status = argBuf.deserialize(deserializedDirective.getTlm);
164 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
170 new (&deserializedDirective.getPrm) FpySequencer_GetPrmDirective();
171 status = argBuf.deserialize(deserializedDirective.getPrm);
174 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
180 new (&deserializedDirective.cmd) FpySequencer_CmdDirective();
185 status = argBuf.deserialize(opcode);
188 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
192 deserializedDirective.cmd.set_opCode(opcode);
194 FwSizeType cmdArgBufSize = argBuf.getBuffLeft();
200 argBuf.getBuffLeft(), argBuf.getBuffLength());
209 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
217 deserializedDirective.cmd.set__argBufSize(cmdArgBufSize);
225 new (&deserializedDirective.deserSerReg) FpySequencer_DeserSerRegDirective();
238 FW_ASSERT(0, static_cast<FwAssertArgType>(stmt.get_opCode()));
242 deserializedDirective.deserSerReg.set__deserSize(deserSize);
245 status = argBuf.deserialize(srcSerRegIdx);
248 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
251 deserializedDirective.deserSerReg.set_srcSerRegIdx(srcSerRegIdx);
254 status = argBuf.deserialize(srcOffset);
257 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
260 deserializedDirective.deserSerReg.set_srcOffset(srcOffset);
263 status = argBuf.deserialize(destReg);
266 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
269 deserializedDirective.deserSerReg.set_destReg(destReg);
273 new (&deserializedDirective.setReg) FpySequencer_SetRegDirective();
274 status = argBuf.deserialize(deserializedDirective.setReg);
277 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
302 new (&deserializedDirective.binaryRegOp) FpySequencer_BinaryRegOpDirective();
305 status = argBuf.deserialize(lhs);
308 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
311 deserializedDirective.binaryRegOp.set_lhs(lhs);
313 status = argBuf.deserialize(rhs);
316 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
319 deserializedDirective.binaryRegOp.set_rhs(rhs);
321 status = argBuf.deserialize(res);
324 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
327 deserializedDirective.binaryRegOp.set_res(res);
329 deserializedDirective.binaryRegOp.set__op(stmt.get_opCode());
340 new (&deserializedDirective.unaryRegOp) FpySequencer_UnaryRegOpDirective();
343 status = argBuf.deserialize(src);
346 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
349 deserializedDirective.unaryRegOp.set_src(src);
351 status = argBuf.deserialize(res);
354 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
357 deserializedDirective.unaryRegOp.set_res(res);
359 deserializedDirective.unaryRegOp.set__op(stmt.get_opCode());
363 new (&deserializedDirective.exit) FpySequencer_ExitDirective();
364 status = argBuf.deserialize(deserializedDirective.exit);
367 status, argBuf.getBuffLeft(), argBuf.getBuffLength());
375 this->m_sequenceFilePath);
383 void FpySequencer::dispatchDirective(
const DirectiveUnion& directive,
const Fpy::DirectiveId&
id) {
477 FW_ASSERT(0, static_cast<FwAssertArgType>(
id));
480 Signal FpySequencer::checkShouldWake() {
483 if (currentTime.
getTimeBase() != this->m_runtime.wakeupTime.getTimeBase()) {
492 if (currentTime < this->m_runtime.wakeupTime) {
502 Signal FpySequencer::checkStatementTimeout() {
505 if (timeout <= 0 || timeout > static_cast<F32>(std::numeric_limits<U32>::max())) {
512 if (currentTime.
getTimeBase() != this->m_runtime.currentStatementDispatchTime.getTimeBase()) {
515 this->m_runtime.currentStatementDispatchTime.getTimeBase());
521 if (this->m_runtime.currentStatementDispatchTime.getSeconds() > currentTime.
getSeconds()) {
527 if (this->m_runtime.currentStatementDispatchTime.getSeconds() == currentTime.
getSeconds() &&
528 this->m_runtime.currentStatementDispatchTime.getUSeconds() > currentTime.
getUSeconds()) {
534 U64 dispatchUSeconds = this->m_runtime.currentStatementDispatchTime.getSeconds() * 1000000 +
535 this->m_runtime.currentStatementDispatchTime.getUSeconds();
537 U64 timeoutUSeconds =
static_cast<U64>(timeout * 1000000.0f);
539 if (currentUSeconds - dispatchUSeconds < timeoutUSeconds) {
548 this->m_runtime.nextStatementIndex - 1, this->m_sequenceFilePath);
551 this->m_runtime.nextStatementIndex - 1, this->m_sequenceFilePath);
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 ...
PlatformSizeType FwSizeType
void directive_deserSerReg_internalInterfaceInvoke(const Svc::FpySequencer_DeserSerRegDirective &directive)
Internal interface base-class function for directive_deserSerReg.
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 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_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.
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.
uint8_t U8
8-bit unsigned integer
Omit length from serialization.
raised when the statement has not timed out yet
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.
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
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
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