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 {
39  context.set_moduleIdx(static_cast<WasmSequencer_ModuleIdx>(moduleIdx));
40  this->controller_sendSignal_invoked(context);
41  }
42 }
43 
44 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respond_noblock_OK(
45  SmId smId,
47  const Svc::WasmSequencer_RequestContext& value) {
48  // Respond only to NO_BLOCK requests
49  if (value.get_block() == Svc::BlockState::NO_BLOCK) {
50  // Respond to this request!
51  this->respondToRequest(value, Fw::CmdResponse::OK);
52  }
53 }
54 
55 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respond_ERROR(
56  SmId smId,
58  const Svc::WasmSequencer_RequestContext& value) {
59  this->respondToRequest(value, Fw::CmdResponse::EXECUTION_ERROR);
60 
61  // Respond to all wait requests
62  this->respondToWaiting(Fw::CmdResponse::EXECUTION_ERROR);
63 
64  // Respond to port requests
65  this->reportSeqAborted(value, Fw::CmdResponse::EXECUTION_ERROR);
66 }
67 
68 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_incrementSequenceFailure(
69  SmId smId,
71  this->m_tlm.sequencesFailed++;
72 }
73 
74 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_setCancelRequested(
75  SmId smId,
77  this->m_cancelRequested = true;
78 }
79 
80 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_clearCancelRequested(
81  SmId smId,
83  this->m_cancelRequested = false;
84 }
85 
86 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_cancelPendingRequest(
87  SmId smId,
89  const Svc::WasmSequencer_RequestContext& value) {
90  this->m_tlm.sequencesCancelled++;
91  this->respondToRequest(value, Fw::CmdResponse::EXECUTION_ERROR);
92  this->respondToWaiting(Fw::CmdResponse::EXECUTION_ERROR);
93 
94  // Respond to port requests
95  this->reportSeqAborted(value, Fw::CmdResponse::EXECUTION_ERROR);
96 }
97 
98 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respondInvoke_BUSY(
99  SmId smId,
101  const Svc::WasmSequencer_InvokeRequest& value) {
103  this->respondToRequest(value.get_context(), Fw::CmdResponse::BUSY);
104 }
105 
106 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respondInvoke_ERROR(
107  SmId smId,
109  const Svc::WasmSequencer_InvokeRequest& value) {
111  this->respondToRequest(value.get_context(), Fw::CmdResponse::EXECUTION_ERROR);
112 }
113 
114 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respondLoad_BUSY(
115  SmId smId,
117  const Svc::WasmSequencer_LoadRequest& value) {
119  this->respondToRequest(value.get_context(), Fw::CmdResponse::BUSY);
120 
121  // Respond to port requests
122  this->reportSeqAborted(value.get_context(), Fw::CmdResponse::BUSY);
123 }
124 
125 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respond_block_OK(
126  SmId smId,
128  const Svc::WasmSequencer_RequestContext& value) {
129  // Respond only to BLOCK requests
130  if (value.get_block() == Svc::BlockState::BLOCK) {
131  // Respond to this request!
132  this->respondToRequest(value, Fw::CmdResponse::OK);
133  }
134 
135  // Respond to all wait requests
136  this->respondToWaiting(Fw::CmdResponse::OK);
137 
138  // If this concluded an active RUN, report the done to internal callers.
139  this->reportSeqDone(value, Fw::CmdResponse::OK);
140 }
141 
142 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_respond_block_ERROR(
143  SmId smId,
145  const Svc::WasmSequencer_RequestContext& value) {
146  // Respond only to BLOCK requests
147  if (value.get_block() == Svc::BlockState::BLOCK) {
148  // Respond to this request!
149  this->respondToRequest(value, Fw::CmdResponse::EXECUTION_ERROR);
150  }
151 
152  // Respond to all wait requests
153  this->respondToWaiting(Fw::CmdResponse::EXECUTION_ERROR);
154 
155  // If this concluded an active RUN, report the done to internal callers.
156  this->reportSeqDone(value, Fw::CmdResponse::EXECUTION_ERROR);
157 }
158 
159 bool WasmSequencer ::resolveSequencePath(const Fw::StringBase& fileName, Fw::String& filePath) {
160  // Resolve the requested path against the SEQ_BASE_DIR parameter
161  Fw::ParamValid baseDirValid;
162  const Fw::ParamString baseDir = this->paramGet_SEQ_BASE_DIR(baseDirValid);
163 
164  if (baseDir.length() == 0) {
165  filePath = fileName;
166  return true;
167  }
168 
169  // With a base dir configured, SEQ_BASE_DIR acts as a containment boundary.
170  // A ground-supplied file name containing a ".." component could escape it
171  // (e.g. "../../etc/passwd"), so reject such names rather than opening a path
172  // outside the configured base directory.
173  if (WasmSequencer::pathHasParentTraversal(fileName)) {
174  this->log_WARNING_HI_SequenceFilePathNotContained(baseDir, fileName);
175  return false;
176  }
177 
178  // Join the base dir and file name with exactly one '/' separator. Without an
179  // explicit separator a base dir that lacks a trailing slash both mis-resolves
180  // ordinary names ("seqs" + "a.wasm" -> "seqsa.wasm") and can escape the
181  // containment boundary ("seqs" + "_priv/x.wasm" -> "seqs_priv/x.wasm", a sibling
182  // directory). The ".." rejection above plus a guaranteed base-dir prefix keeps
183  // the resolved path inside the configured directory.
184  const FwSizeType baseLen = static_cast<FwSizeType>(baseDir.length());
185  const char* const separator = (baseLen > 0 && baseDir.toChar()[baseLen - 1] == '/') ? "" : "/";
186 
187  const Fw::FormatStatus fmtStatus = filePath.format("%s%s%s", baseDir.toChar(), separator, fileName.toChar());
188  if (fmtStatus != Fw::FormatStatus::SUCCESS) {
189  FW_ASSERT(fmtStatus == Fw::FormatStatus::OVERFLOWED, static_cast<FwAssertArgType>(fmtStatus));
190  this->log_WARNING_HI_SequenceFilePathTooLong(baseDir, fileName);
191  return false;
192  }
193 
194  return true;
195 }
196 
197 namespace {
198 struct WasmFileReader {
199  explicit WasmFileReader(Os::File& loadFile) : m_loadFile(loadFile) {}
200 
201  spacewasm_read_result_t readChunk(const U8** outBuf, std::size_t* outLen) {
202  FwSizeType size = sizeof(this->m_readBuf);
203  const Os::File::Status status = this->m_loadFile.read(this->m_readBuf, size);
204 
205  spacewasm_read_result_t readStatus;
206  if (status != Os::File::Status::OP_OK) {
207  *outLen = 0;
208  readStatus = SPACEWASM_READ_ERROR;
209  } else {
210  // `size` is updated in-place with the number of bytes actually read.
211  *outBuf = this->m_readBuf;
212  *outLen = static_cast<std::size_t>(size);
213 
214  if (size == 0) {
215  readStatus = SPACEWASM_READ_EOF;
216  } else {
217  readStatus = SPACEWASM_READ_OK;
218  }
219  }
220 
221  return readStatus;
222  }
223 
224  static spacewasm_read_result_t readChunkCallback(void* userdata, const U8** outBuf, size_t* outLen) {
225  FW_ASSERT(userdata != nullptr);
226  return static_cast<WasmFileReader*>(userdata)->readChunk(outBuf, outLen);
227  }
228 
230  Os::File& m_loadFile;
231 
234 };
235 } // namespace
236 
237 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_load(
238  SmId smId,
240  const Svc::WasmSequencer_LoadRequest& value) {
241  FW_ASSERT(this->m_wasm != nullptr);
242  FW_ASSERT(this->m_guest_allocator != nullptr);
243 
244  // Resolve the sequence file path against SEQ_BASE_DIR
245  Fw::String filePath;
246  if (!this->resolveSequencePath(value.get_fileName(), filePath)) {
248  return;
249  }
250 
251  // Record the sequence name for telemetry (module name, or filename stem).
252  this->setSequenceName(filePath, value.get_moduleName());
253 
254  Os::File file;
255  const Os::File::Status openStatus = file.open(filePath.toChar(), Os::File::OPEN_READ);
256  if (openStatus != Os::File::Status::OP_OK) {
257  this->log_WARNING_HI_FileOpenError(filePath, openStatus);
259  return;
260  }
261 
262  this->m_lastLoadFileName = value.get_fileName();
263 
264  this->takeAllocatorLock();
265 
266  U32 moduleIndex = 0;
268 
269  WasmFileReader reader(file);
270 
271  auto status =
272  spacewasm_load_module(this->m_wasm, value.get_moduleName().toChar(), &WasmFileReader::readChunkCallback,
273  &reader, this->m_guest_allocator, &moduleIndex);
274 
275  next.set_moduleIdx(static_cast<WasmSequencer_ModuleIdx>(moduleIndex));
276 
277  this->releaseAllocatorLock();
278 
279  file.close();
280 
281  if (status == SPACEWASM_OK) {
283  } else {
284  this->log_WARNING_HI_ModuleLoadFailed(WasmSequencer_Status(status));
286  }
287 }
288 
289 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_invokeStart(
290  SmId smId,
292  const Svc::WasmSequencer_RequestContext& value) {
293  U32 start_module_idx;
294  U32 start_function_idx;
295 
296  // Get the module's start function WasmRef
297  auto status = spacewasm_module_start(this->m_wasm, value.get_moduleIdx(), &start_module_idx, &start_function_idx);
298  FW_ASSERT(status == SPACEWASM_OK, status);
299 
300  this->m_invokeStatus = spacewasm_invoke(this->m_wasm, start_module_idx, start_function_idx, nullptr, 0);
301 }
302 
303 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_invokeMain(
304  SmId smId,
306  const Svc::WasmSequencer_RequestContext& value) {
307  // Resolve the main function of given module index
308  U32 funcIndex = 0;
309  auto status = spacewasm_find_export_func(this->m_wasm, static_cast<U32>(value.get_moduleIdx()), "main", &funcIndex);
310 
311  // This should always succeed because our state machine is checking whether this module has a main/is-valid
312  FW_ASSERT(status == SPACEWASM_OK, status);
313 
314  this->m_invokeStatus =
315  spacewasm_invoke(this->m_wasm, static_cast<U32>(value.get_moduleIdx()), funcIndex, nullptr, 0);
316 }
317 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleInvalidMain(
318  SmId smId,
320  const Svc::WasmSequencer_RequestContext& value) {
321  // Get the failure status of why the main module is invalid
322  auto problemStatus = this->validateModuleMain(value.get_moduleIdx());
323  this->log_WARNING_HI_InvalidModuleEntrypoint(value.get_moduleIdx(), WasmSequencer_Status(problemStatus));
324 }
325 
326 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleMainInvokeFailed(
327  SmId smId,
329  const Svc::WasmSequencer_RequestContext& value) {
330  this->log_WARNING_HI_ModuleMainInvokeFailed(WasmSequencer_Status(this->m_invokeStatus));
331 }
332 
333 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleStartInvokeFailed(
334  SmId smId,
336  const Svc::WasmSequencer_RequestContext& value) {
337  this->log_WARNING_HI_ModuleStartInvokeFailed(WasmSequencer_Status(this->m_invokeStatus));
338 }
339 
340 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleStarted(
341  SmId smId,
343  const Svc::WasmSequencer_RequestContext& value) {
347  if (this->isConnected_seqStartOut_OutputPort(0)) {
348  this->seqStartOut_out(0, this->m_lastLoadFileName, Svc::SeqArgs{});
349  }
350  }
351 }
352 
353 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_resetStore(
354  SmId smId,
356  if (this->m_wasm == nullptr) {
357  // The store has not been created yet.
358  // This should be the initial transition
359  FW_ASSERT(signal == Svc_WasmSequencer_ControllerStateMachine::Signal::__FPRIME_INITIAL_TRANSITION,
360  static_cast<FwAssertArgType>(signal));
361 
362  // `configure()` will initialize the first store
363  } else {
364  this->destroyStore();
365  this->createStore();
366  }
367 }
368 
369 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_runEngine(
370  SmId smId,
372  const Svc::WasmSequencer_RequestContext& value) {
373  this->interpreter_sendSignal_run(value);
374 }
375 
376 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleSucceeded(
377  SmId smId,
379  const Svc::WasmSequencer_RequestContext& value) {
380  this->m_tlm.sequencesSucceeded++;
382 }
383 
384 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleStartFailed(
385  SmId smId,
387  const Svc::WasmSequencer_RequestContext& value) {
388  // A failure while running a module's start function (LOAD-with-start, or the
389  // start phase of a RUN-with-start).
390  this->reportSequenceRuntimeFailure(value.get_moduleIdx(), WasmSequencer_SequencePhase::START);
391 }
392 
393 void WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_action_reportModuleMainFailed(
394  SmId smId,
396  const Svc::WasmSequencer_RequestContext& value) {
397  // A failure while running a module's main function.
398  this->reportSequenceRuntimeFailure(value.get_moduleIdx(), WasmSequencer_SequencePhase::MAIN);
399 }
400 
401 void WasmSequencer ::reportSequenceRuntimeFailure(WasmSequencer_ModuleIdx moduleIdx,
402  WasmSequencer_SequencePhase phase) {
403  switch (this->m_exit.reason) {
405  this->m_tlm.sequencesCancelled++;
406  this->log_ACTIVITY_HI_SequenceCancelled(moduleIdx, phase);
407  break;
409  this->m_tlm.sequencesFailed++;
410  this->log_WARNING_HI_SequencePanic(moduleIdx, phase, this->m_exit.code);
411  break;
413  this->m_tlm.sequencesFailed++;
414  this->log_WARNING_HI_SequenceTrapped(moduleIdx, phase, this->m_exit.lastTrapReason);
415  break;
416  case WasmSequencer_ExitReason::INTERPRETER_FINISHED: // fallthrough is intended
418  // Only reached on the failure path: a non-zero main return value or a
419  // non-zero fprime.exit code.
420  this->m_tlm.sequencesFailed++;
421  this->log_WARNING_HI_SequenceExited(moduleIdx, phase, this->m_exit.code);
422  break;
428  default:
429  this->m_tlm.sequencesFailed++;
430  this->log_WARNING_HI_SequenceHostFailure(moduleIdx, phase, this->m_exit.reason,
431  this->m_exit.lastHostFunction);
432  break;
433  }
434 }
435 
436 // ----------------------------------------------------------------------
437 // Implementations for internal state machine guards
438 // ----------------------------------------------------------------------
439 
440 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_moduleHasStart(
441  SmId smId,
443  const Svc::WasmSequencer_RequestContext& value) const {
444  U32 start_module_idx;
445  U32 start_function_idx;
446  auto status = spacewasm_module_start(this->m_wasm, static_cast<U32>(value.get_moduleIdx()), &start_module_idx,
447  &start_function_idx);
448 
449  switch (status) {
450  case SPACEWASM_OK:
451  return true;
453  return false;
454  default:
455  // All other status means we passed the c api invalid options
456  FW_ASSERT(false, status);
457  return false;
458  }
459 }
460 
461 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_moduleHasValidMain(
462  SmId smId,
464  const Svc::WasmSequencer_RequestContext& value) const {
465  return this->validateModuleMain(value.get_moduleIdx()) == SPACEWASM_OK;
466 }
467 
468 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_invokeSucceeded(
469  SmId smId,
471  const Svc::WasmSequencer_RequestContext& value) const {
472  return this->m_invokeStatus == SPACEWASM_OK;
473 }
474 
475 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_interpreterSucceeded(
476  SmId smId,
478  // The engine sets m_exit.reason and m_exit.code before signalling
479  // engineFinished. A run succeeds only when it finished with a zero code:
480  // main returned 0 (a void return reports code 0) or the guest called
481  // fprime.exit(0)
482  switch (this->m_exit.reason) {
485  return this->m_exit.code == 0;
486  default:
487  return false;
488  }
489 }
490 
491 bool WasmSequencer ::Svc_WasmSequencer_ControllerStateMachine_guard_cancelRequested(
492  SmId smId,
494  return this->m_cancelRequested;
495 }
496 
497 } // 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