F´ Flight Software - C/C++ Documentation
A framework for building embedded system applications to NASA flight quality standards.
WasmSequencerController.cpp
Go to the documentation of this file.
1 // ======================================================================
2 // \title WasmSequencerController.cpp
3 // \author tumbar
4 // \brief cpp file for WasmSequencer controller state machine
5 // ======================================================================
6 
8 #include "Fw/Types/Assert.hpp"
9 #include "Os/File.hpp"
16 #include "spacewasm.h"
17 
18 namespace Svc {
19 
20 // ----------------------------------------------------------------------
21 // Implementations for internal state machine actions
22 // ----------------------------------------------------------------------
23 
24 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_processInvoke(
25  SmId smId,
27  const Svc::WasmSequencer_InvokeRequest& value) {
28  // Resolve the module name to its index within the engine.
29  FW_ASSERT(this->m_wasm != nullptr);
30  U32 moduleIdx = 0;
31  const spacewasm_status_t findStatus =
32  spacewasm_find_module(this->m_wasm, value.get_moduleName().toChar(), &moduleIdx);
33 
34  if (findStatus != SPACEWASM_OK) {
37  } else {
38  // Store the arguments for the ARGS host function round trip and carry the
39  // resolved module index forward in the request context.
40  this->m_args = value.get_args();
42  context.set_moduleIdx(static_cast<WasmSequencer_ModuleIdx>(moduleIdx));
43  this->controller_sendSignal_invoked(context);
44  }
45 }
46 
47 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respond_noblock_OK(
48  SmId smId,
50  const Svc::WasmSequencer_RequestContext& value) {
51  // Respond only to NO_BLOCK requests
52  if (value.get_block() == Svc::BlockState::NO_BLOCK) {
53  // Respond to this request!
54  this->respondToRequest(value, Fw::CmdResponse::OK);
55  }
56 
57  // Clear any pending waits that locked during load
59  this->respondToWaiting(Fw::CmdResponse::OK);
60  }
61 }
62 
63 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respond_ERROR(
64  SmId smId,
66  const Svc::WasmSequencer_RequestContext& value) {
67  this->respondToRequest(value, Fw::CmdResponse::EXECUTION_ERROR);
68 
69  // Respond to all wait requests
70  this->respondToWaiting(Fw::CmdResponse::EXECUTION_ERROR);
71 }
72 
73 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_incrementSequenceFailure(
74  SmId smId,
76  this->m_tlm.sequencesFailed++;
77 }
78 
79 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_setCancelRequested(
80  SmId smId,
82  this->m_cancelRequested = true;
83 }
84 
85 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_clearCancelRequested(
86  SmId smId,
88  this->m_cancelRequested = false;
89 }
90 
91 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_cancelPendingRequest(
92  SmId smId,
94  const Svc::WasmSequencer_RequestContext& value) {
95  this->m_tlm.sequencesCancelled++;
96  this->respondToRequest(value, Fw::CmdResponse::EXECUTION_ERROR);
97  this->respondToWaiting(Fw::CmdResponse::EXECUTION_ERROR);
98 }
99 
100 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respondInvoke_BUSY(
101  SmId smId,
103  const Svc::WasmSequencer_InvokeRequest& value) {
105  this->respondToRequest(value.get_context(), Fw::CmdResponse::BUSY);
106 }
107 
108 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respondInvoke_ERROR(
109  SmId smId,
111  const Svc::WasmSequencer_InvokeRequest& value) {
113  this->respondToRequest(value.get_context(), Fw::CmdResponse::EXECUTION_ERROR);
114 }
115 
116 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respondLoad_BUSY(
117  SmId smId,
119  const Svc::WasmSequencer_LoadRequest& value) {
121  this->respondToRequest(value.get_context(), Fw::CmdResponse::BUSY);
122 }
123 
124 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respond_block_OK(
125  SmId smId,
127  const Svc::WasmSequencer_RequestContext& value) {
128  // Respond only to BLOCK requests
129  if (value.get_block() == Svc::BlockState::BLOCK) {
130  // Respond to this request!
131  this->respondToRequest(value, Fw::CmdResponse::OK);
132  }
133 
134  // Respond to all wait requests
135  this->respondToWaiting(Fw::CmdResponse::OK);
136 
137  // If this concluded an active RUN, report the done to internal callers.
138  this->reportSeqDone(value, Fw::CmdResponse::OK);
139 }
140 
141 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respond_block_ERROR(
142  SmId smId,
144  const Svc::WasmSequencer_RequestContext& value) {
145  // Respond only to BLOCK requests
146  if (value.get_block() == Svc::BlockState::BLOCK) {
147  // Respond to this request!
148  this->respondToRequest(value, Fw::CmdResponse::EXECUTION_ERROR);
149  }
150 
151  // Respond to all wait requests
152  this->respondToWaiting(Fw::CmdResponse::EXECUTION_ERROR);
153 
154  // If this concluded an active RUN, report the done to internal callers.
155  this->reportSeqDone(value, Fw::CmdResponse::EXECUTION_ERROR);
156 }
157 
158 bool WasmSequencer ::resolveSequencePath(const Fw::StringBase& fileName, Fw::String& filePath) {
159  // Resolve the requested path against the SEQ_BASE_DIR parameter
160  Fw::ParamValid baseDirValid;
161  const Fw::ParamString baseDir = this->paramGet_SEQ_BASE_DIR(baseDirValid);
162 
163  if (baseDir.length() == 0) {
164  filePath = fileName;
165  return true;
166  }
167 
168  // With a base dir configured, SEQ_BASE_DIR acts as a containment boundary.
169  // A ground-supplied file name containing a ".." component could escape it
170  // (e.g. "../../etc/passwd"), so reject such names rather than opening a path
171  // outside the configured base directory.
172  if (WasmSequencer::pathHasParentTraversal(fileName)) {
173  this->log_WARNING_HI_SequenceFilePathNotContained(baseDir, fileName);
174  return false;
175  }
176 
177  // Join the base dir and file name with exactly one '/' separator. Without an
178  // explicit separator a base dir that lacks a trailing slash both mis-resolves
179  // ordinary names ("seqs" + "a.wasm" -> "seqsa.wasm") and can escape the
180  // containment boundary ("seqs" + "_priv/x.wasm" -> "seqs_priv/x.wasm", a sibling
181  // directory). The ".." rejection above plus a guaranteed base-dir prefix keeps
182  // the resolved path inside the configured directory.
183  const FwSizeType baseLen = static_cast<FwSizeType>(baseDir.length());
184  const char* const separator = (baseLen > 0 && baseDir.toChar()[baseLen - 1] == '/') ? "" : "/";
185 
186  const Fw::FormatStatus fmtStatus = filePath.format("%s%s%s", baseDir.toChar(), separator, fileName.toChar());
187  if (fmtStatus != Fw::FormatStatus::SUCCESS) {
188  FW_ASSERT(fmtStatus == Fw::FormatStatus::OVERFLOWED, static_cast<FwAssertArgType>(fmtStatus));
189  this->log_WARNING_HI_SequenceFilePathTooLong(baseDir, fileName);
190  return false;
191  }
192 
193  return true;
194 }
195 
196 namespace {
197 struct WasmFileReader {
198  explicit WasmFileReader(Os::File& loadFile) : m_loadFile(loadFile) {}
199 
200  spacewasm_read_result_t readChunk(const U8** outBuf, std::size_t* outLen) {
201  FwSizeType size = sizeof(this->m_readBuf);
202  const Os::File::Status status = this->m_loadFile.read(this->m_readBuf, size);
203 
204  spacewasm_read_result_t readStatus;
205  if (status != Os::File::Status::OP_OK) {
206  *outLen = 0;
207  readStatus = SPACEWASM_READ_ERROR;
208  } else {
209  // `size` is updated in-place with the number of bytes actually read.
210  *outBuf = this->m_readBuf;
211  *outLen = static_cast<std::size_t>(size);
212 
213  if (size == 0) {
214  readStatus = SPACEWASM_READ_EOF;
215  } else {
216  readStatus = SPACEWASM_READ_OK;
217  }
218  }
219 
220  return readStatus;
221  }
222 
223  static spacewasm_read_result_t readChunkCallback(void* userdata, const U8** outBuf, size_t* outLen) {
224  FW_ASSERT(userdata != nullptr);
225  return static_cast<WasmFileReader*>(userdata)->readChunk(outBuf, outLen);
226  }
227 
229  Os::File& m_loadFile;
230 
233 };
234 } // namespace
235 
236 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_load(
237  SmId smId,
239  const Svc::WasmSequencer_LoadRequest& value) {
240  FW_ASSERT(this->m_wasm != nullptr);
241  FW_ASSERT(this->m_guest_allocator != nullptr);
242 
243  this->m_args = value.get_args();
244 
245  // Resolve the sequence file path against SEQ_BASE_DIR
246  Fw::String filePath;
247  if (!this->resolveSequencePath(value.get_fileName(), filePath)) {
249  return;
250  }
251 
252  // Record the sequence name for telemetry (module name, or filename stem).
253  this->setSequenceName(filePath, value.get_moduleName());
254 
255  Os::File file;
256  const Os::File::Status openStatus = file.open(filePath.toChar(), Os::File::OPEN_READ);
257  if (openStatus != Os::File::Status::OP_OK) {
258  this->log_WARNING_HI_FileOpenError(filePath, openStatus);
260  return;
261  }
262 
263  this->m_lastLoadFileName = value.get_fileName();
264 
265  this->takeAllocatorLock();
266 
267  U32 moduleIndex = 0;
269 
270  WasmFileReader reader(file);
271 
272  auto status =
273  spacewasm_load_module(this->m_wasm, value.get_moduleName().toChar(), &WasmFileReader::readChunkCallback,
274  &reader, this->m_guest_allocator, &moduleIndex);
275 
276  next.set_moduleIdx(static_cast<WasmSequencer_ModuleIdx>(moduleIndex));
277 
278  this->releaseAllocatorLock();
279 
280  file.close();
281 
282  if (status == SPACEWASM_OK) {
284  } else {
285  this->log_WARNING_HI_ModuleLoadFailed(WasmSequencer_Status(status));
287  }
288 }
289 
290 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_invokeStart(
291  SmId smId,
293  const Svc::WasmSequencer_RequestContext& value) {
294  U32 start_module_idx;
295  U32 start_function_idx;
296 
297  // Get the module's start function WasmRef
298  auto status = spacewasm_module_start(this->m_wasm, value.get_moduleIdx(), &start_module_idx, &start_function_idx);
299  FW_ASSERT(status == SPACEWASM_OK, status);
300 
301  this->m_invokeStatus = spacewasm_invoke(this->m_wasm, start_module_idx, start_function_idx, nullptr, 0);
302 }
303 
304 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_invokeMain(
305  SmId smId,
307  const Svc::WasmSequencer_RequestContext& value) {
308  // Resolve the main function of given module index
309  U32 funcIndex = 0;
310  auto status = spacewasm_find_export_func(this->m_wasm, static_cast<U32>(value.get_moduleIdx()), "main", &funcIndex);
311 
312  // This should always succeed because our state machine is checking whether this module has a main/is-valid
313  FW_ASSERT(status == SPACEWASM_OK, status);
314 
315  this->m_invokeStatus =
316  spacewasm_invoke(this->m_wasm, static_cast<U32>(value.get_moduleIdx()), funcIndex, nullptr, 0);
317 }
318 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleInvalidMain(
319  SmId smId,
321  const Svc::WasmSequencer_RequestContext& value) {
322  // Get the failure status of why the main module is invalid
323  auto problemStatus = this->validateModuleMain(value.get_moduleIdx());
324  this->log_WARNING_HI_InvalidModuleEntrypoint(value.get_moduleIdx(), WasmSequencer_Status(problemStatus));
325 }
326 
327 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleMainInvokeFailed(
328  SmId smId,
330  const Svc::WasmSequencer_RequestContext& value) {
331  this->log_WARNING_HI_ModuleMainInvokeFailed(WasmSequencer_Status(this->m_invokeStatus));
332 }
333 
334 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleStartInvokeFailed(
335  SmId smId,
337  const Svc::WasmSequencer_RequestContext& value) {
338  this->log_WARNING_HI_ModuleStartInvokeFailed(WasmSequencer_Status(this->m_invokeStatus));
339 }
340 
341 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleStarted(
342  SmId smId,
344  const Svc::WasmSequencer_RequestContext& value) {
348  if (this->isConnected_seqStartOut_OutputPort(0)) {
349  this->seqStartOut_out(0, this->m_lastLoadFileName, this->m_args);
350  }
351  }
352 }
353 
354 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_resetStore(
355  SmId smId,
357  if (this->m_wasm == nullptr) {
358  // The store has not been created yet.
359  // This should be the initial transition
360  FW_ASSERT(signal == Svc_WasmSequencer_ControllerStateMachine::Signal::__FPRIME_INITIAL_TRANSITION,
361  static_cast<FwAssertArgType>(signal));
362 
363  // `configure()` will initialize the first store
364  } else {
365  this->destroyStore();
366  this->createStore();
367  }
368 }
369 
370 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_runEngine(
371  SmId smId,
373  const Svc::WasmSequencer_RequestContext& value) {
374  this->interpreter_sendSignal_run(value);
375 }
376 
377 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleSucceeded(
378  SmId smId,
380  const Svc::WasmSequencer_RequestContext& value) {
381  this->m_tlm.sequencesSucceeded++;
383 }
384 
385 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleStartFailed(
386  SmId smId,
388  const Svc::WasmSequencer_RequestContext& value) {
389  // A failure while running a module's start function (LOAD-with-start, or the
390  // start phase of a RUN-with-start).
391  this->reportSequenceRuntimeFailure(value.get_moduleIdx(), WasmSequencer_SequencePhase::START);
392 }
393 
394 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleMainFailed(
395  SmId smId,
397  const Svc::WasmSequencer_RequestContext& value) {
398  // A failure while running a module's main function.
399  this->reportSequenceRuntimeFailure(value.get_moduleIdx(), WasmSequencer_SequencePhase::MAIN);
400 }
401 
402 void WasmSequencer ::reportSequenceRuntimeFailure(WasmSequencer_ModuleIdx moduleIdx,
403  WasmSequencer_SequencePhase phase) {
404  switch (this->m_exit.reason) {
406  this->m_tlm.sequencesCancelled++;
407  this->log_ACTIVITY_HI_SequenceCancelled(moduleIdx, phase);
408  break;
410  this->m_tlm.sequencesFailed++;
411  this->log_WARNING_HI_SequencePanic(moduleIdx, phase, this->m_exit.code);
412  break;
414  this->m_tlm.sequencesFailed++;
415  this->log_WARNING_HI_SequenceTrapped(moduleIdx, phase, this->m_exit.lastTrapReason);
416  break;
417  case WasmSequencer_ExitReason::INTERPRETER_FINISHED: // fallthrough is intended
419  // Only reached on the failure path: a non-zero main return value or a
420  // non-zero fprime.exit code.
421  this->m_tlm.sequencesFailed++;
422  this->log_WARNING_HI_SequenceExited(moduleIdx, phase, this->m_exit.code);
423  break;
429  default:
430  this->m_tlm.sequencesFailed++;
431  this->log_WARNING_HI_SequenceHostFailure(moduleIdx, phase, this->m_exit.reason,
432  this->m_exit.lastHostFunction);
433  break;
434  }
435 }
436 
437 // ----------------------------------------------------------------------
438 // Implementations for internal state machine guards
439 // ----------------------------------------------------------------------
440 
441 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_moduleHasStart(
442  SmId smId,
444  const Svc::WasmSequencer_RequestContext& value) const {
445  U32 start_module_idx;
446  U32 start_function_idx;
447  auto status = spacewasm_module_start(this->m_wasm, static_cast<U32>(value.get_moduleIdx()), &start_module_idx,
448  &start_function_idx);
449 
450  switch (status) {
451  case SPACEWASM_OK:
452  return true;
454  return false;
455  default:
456  // All other status means we passed the c api invalid options
457  FW_ASSERT(false, status);
458  return false;
459  }
460 }
461 
462 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_moduleHasValidMain(
463  SmId smId,
465  const Svc::WasmSequencer_RequestContext& value) const {
466  return this->validateModuleMain(value.get_moduleIdx()) == SPACEWASM_OK;
467 }
468 
469 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_invokeSucceeded(
470  SmId smId,
472  const Svc::WasmSequencer_RequestContext& value) const {
473  return this->m_invokeStatus == SPACEWASM_OK;
474 }
475 
476 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_interpreterSucceeded(
477  SmId smId,
479  // The engine sets m_exit.reason and m_exit.code before signalling
480  // engineFinished. A run succeeds only when it finished with a zero code:
481  // main returned 0 (a void return reports code 0) or the guest called
482  // fprime.exit(0)
483  switch (this->m_exit.reason) {
486  return this->m_exit.code == 0;
487  default:
488  return false;
489  }
490 }
491 
492 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_cancelRequested(
493  SmId smId,
495  return this->m_cancelRequested;
496 }
497 
498 } // namespace Svc
constexpr FwSizeType LOAD_READ_CHUNK_SIZE
void controller_sendSignal_loadFailed(const Svc::WasmSequencer_RequestContext &value)
Send signal loadFailed to state machine controller.
void log_WARNING_HI_ModuleStartInvokeFailed(const Svc::WasmSequencer_Status &status) const
Fw::ExternalString & get_fileName()
Get member fileName.
Operation succeeded.
Definition: Os.hpp:27
The interpreter exited via HOST_TRAP and we indicated HOST_PANIC in the host function.
void log_WARNING_HI_SequenceTrapped(Svc::WasmSequencer_ModuleIdx index, const Svc::WasmSequencer_SequencePhase &phase, const Svc::WasmSequencer_TrapReason &reason) const
PlatformSizeType FwSizeType
We got an unexpected async reply which caused us to abort.
Fw::ExternalString & get_moduleName()
Get member moduleName.
spacewasm_status_t spacewasm_module_start(struct spacewasm_t *engine, uint32_t module_idx, uint32_t *out_module_idx, uint32_t *out_func_index)
void log_WARNING_HI_SequenceFilePathNotContained(const Fw::StringBase &baseDir, const Fw::StringBase &fileName) const
spacewasm_status_t spacewasm_load_module(struct spacewasm_t *engine, const char *name, spacewasm_read_fn_t read, void *read_userdata, struct spacewasm_allocator_t *allocator, uint32_t *out_module_idx)
virtual const CHAR * toChar() const =0
Convert to a C-style char*.
Format overflowed.
void log_WARNING_HI_FileOpenError(const Fw::StringBase &fileName, I32 status) const
void log_WARNING_LO_ControllerBusy(const Svc::WasmSequencer_SignalSource &signalSource, const Svc::WasmSequencer_ControllerStateMachine_State &state) const
A cancel signal was sent and we exited the interpreter.
An async host function replied with an error.
An async reply timeout overran while waiting for a host function reply.
spacewasm_status_t spacewasm_find_export_func(struct spacewasm_t *engine, uint32_t module_idx, const char *name, uint32_t *out_index)
Svc::WasmSequencer_SignalSource::T get_source() const
Get member source.
void log_WARNING_HI_SequencePanic(Svc::WasmSequencer_ModuleIdx index, const Svc::WasmSequencer_SequencePhase &phase, I32 code) const
Svc::BlockState::T get_block() const
Get member block.
Os::FileInterface::Status open(const char *path, Mode mode)
open file with supplied path and mode
Definition: File.cpp:50
Svc_WasmSequencer_ControllerStateMachine::State controller_getState() const
Get the state of state machine instance controller.
void controller_sendSignal_loadSucceeded(const Svc::WasmSequencer_RequestContext &value)
Send signal loadSucceeded to state machine controller.
const char * toChar() const
void log_WARNING_HI_SequenceExited(Svc::WasmSequencer_ModuleIdx index, const Svc::WasmSequencer_SequencePhase &phase, I32 code) const
void log_WARNING_HI_ModuleLoadFailed(const Svc::WasmSequencer_Status &status) const
Fw::ExternalString & get_moduleName()
Get member moduleName.
const char * toChar() const
Convert to a C-style char*.
The interpreter exited via HOST_TRAP but a host function indicated it was a standard exit() ...
FormatStatus format(const CHAR *formatString,...)
write formatted string to buffer
Definition: StringBase.cpp:58
Command successfully executed.
bool isConnected_seqStartOut_OutputPort(FwIndexType portNum) const
void log_ACTIVITY_HI_SequenceStarting(Svc::WasmSequencer_ModuleIdx index) const
uint8_t U8
8-bit unsigned integer
Definition: BasicTypes.h:54
The module&#39;s optional start function.
Command had execution error.
A sleep or host-function timer became incomparable (time base changed) and could not be evaluated...
spacewasm_status_t
Definition: spacewasm.h:37
Fw::ParamString paramGet_SEQ_BASE_DIR(Fw::ParamValid &valid)
void interpreter_sendSignal_run(const Svc::WasmSequencer_RequestContext &value)
Send signal run to state machine interpreter.
void log_ACTIVITY_HI_SequenceSucceeded(Svc::WasmSequencer_ModuleIdx index) const
void log_WARNING_HI_SequenceHostFailure(Svc::WasmSequencer_ModuleIdx index, const Svc::WasmSequencer_SequencePhase &phase, const Svc::WasmSequencer_ExitReason &reason, const Svc::WasmSequencer_HostFunction &hostFunction) const
void log_WARNING_LO_ModuleNotFound(const Fw::StringBase &module_name) const
Svc::WasmSequencer_RequestContext & get_context()
Get member context.
Svc::WasmSequencer_RequestContext & get_context()
Get member context.
void log_WARNING_HI_InvalidModuleEntrypoint(Svc::WasmSequencer_ModuleIdx moduleIdx, const Svc::WasmSequencer_Status &status) const
Log event InvalidModuleEntrypoint.
The interpreter exited normally and set m_exitCode.
spacewasm_status_t spacewasm_invoke(struct spacewasm_t *engine, uint32_t module_idx, uint32_t func_index, const struct spacewasm_value_t *params, size_t n)
Open file for reading.
Definition: File.hpp:33
void log_WARNING_HI_ModuleMainInvokeFailed(const Svc::WasmSequencer_Status &status) const
void seqStartOut_out(FwIndexType portNum, const Fw::StringBase &filename, const Svc::SeqArgs &args) const
Invoke output port seqStartOut.
Svc::WasmSequencer_ModuleIdx get_moduleIdx() const
Get member moduleIdx.
RateGroupDivider component implementation.
virtual SizeType length() const
Get the length of the string.
Enum representing parameter validity.
void log_ACTIVITY_HI_SequenceCancelled(Svc::WasmSequencer_ModuleIdx index, const Svc::WasmSequencer_SequencePhase &phase) const
void controller_sendSignal_invoked(const Svc::WasmSequencer_RequestContext &value)
Send signal invoked to state machine controller.
spacewasm_status_t spacewasm_find_module(struct spacewasm_t *engine, const char *name, uint32_t *out_index)
void set_moduleIdx(Svc::WasmSequencer_ModuleIdx moduleIdx)
Set member moduleIdx.
void log_WARNING_HI_SequenceFilePathTooLong(const Fw::StringBase &baseDir, const Fw::StringBase &fileName) const
void controller_sendSignal_invokeFailed(const Svc::WasmSequencer_RequestContext &value)
Send signal invokeFailed to state machine controller.
FpySequencer_SequencerStateMachineStateMachineBase::Signal Signal
spacewasm_read_result_t
Definition: spacewasm.h:214
#define FW_ASSERT(...)
Definition: Assert.hpp:14
We did not explicitely set the exit reason, bug?
FormatStatus
status of string format calls
Definition: format.hpp:18