QP/C++  8.0.0
Real-Time Embedded Framework
Loading...
Searching...
No Matches
qep_msm.cpp
Go to the documentation of this file.
1//$file${src::qf::qep_msm.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
2//
3// Model: qpcpp.qm
4// File: ${src::qf::qep_msm.cpp}
5//
6// This code has been generated by QM 7.0.0 <www.state-machine.com/qm>.
7// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost.
8//
9// Copyright (C) 2005 Quantum Leaps, LLC. All rights reserved.
10//
11// Q u a n t u m L e a P s
12// ------------------------
13// Modern Embedded Software
14//
15// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial
16//
17// The QP/C++ software is dual-licensed under the terms of the open-source
18// GNU General Public License (GPL) or under the terms of one of the closed-
19// source Quantum Leaps commercial licenses.
20//
21// Redistributions in source code must retain this top-level comment block.
22// Plagiarizing this software to sidestep the license obligations is illegal.
23//
24// NOTE:
25// The GPL does NOT permit the incorporation of this code into proprietary
26// programs. Please contact Quantum Leaps for commercial licensing options,
27// which expressly supersede the GPL and are designed explicitly for
28// closed-source distribution.
29//
30// Quantum Leaps contact information:
31// <www.state-machine.com/licensing>
32// <info@state-machine.com>
33//
34//$endhead${src::qf::qep_msm.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
35#define QP_IMPL // this is QP implementation
36#include "qp_port.hpp" // QP port
37#include "qp_pkg.hpp" // QP package-scope interface
38#include "qsafe.h" // QP Functional Safety (FuSa) Subsystem
39#ifdef Q_SPY // QS software tracing enabled?
40 #include "qs_port.hpp" // QS port
41 #include "qs_pkg.hpp" // QS facilities for pre-defined trace records
42#else
43 #include "qs_dummy.hpp" // disable the QS software tracing
44#endif // Q_SPY
45
46//============================================================================
47//! @cond INTERNAL
48
49// unnamed namespace for local definitions with internal linkage
50namespace {
51
52Q_DEFINE_THIS_MODULE("qep_msm")
53
54// top-state object for QMsm-style state machines
55QP::QMState const l_msm_top_s = {
56 nullptr,
57 nullptr,
58 nullptr,
59 nullptr,
60 nullptr
61};
62
63// maximum depth of state nesting in a QMsm (including the top level)
64static constexpr std::int_fast8_t QMSM_MAX_NEST_DEPTH_ {8};
65
66// maximum length of transition-action array
67static constexpr std::int_fast8_t QMSM_MAX_TRAN_LENGTH_ {2*QMSM_MAX_NEST_DEPTH_};
68
69// maximum depth of entry levels in a MSM for tran. to history.
70static constexpr std::int_fast8_t QMSM_MAX_ENTRY_DEPTH_ {4};
71
72} // unnamed namespace
73
74//! @endcond
75//============================================================================
76
77//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
78// Check for the minimum required QP version
79#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U)%0x2710U))
80#error qpcpp version 7.3.0 or higher required
81#endif
82//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
83//$define${QEP::QMsm} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
84namespace QP {
85
86//${QEP::QMsm} ...............................................................
87
88//${QEP::QMsm::QMsm} .........................................................
89QMsm::QMsm(QStateHandler const initial) noexcept
90 : QAsm()
91{
92 m_state.obj = &l_msm_top_s; // the current state (top)
93 m_temp.fun = initial; // the initial tran. handler
94}
95
96//${QEP::QMsm::init} .........................................................
98 void const * const e,
99 std::uint_fast8_t const qsId)
100{
101 #ifndef Q_SPY
102 Q_UNUSED_PAR(qsId);
103 #endif
104
107 Q_REQUIRE_INCRIT(200, (m_temp.fun != nullptr)
108 && (m_state.obj == &l_msm_top_s));
109 QF_CRIT_EXIT();
110
111 // execute the top-most initial tran.
112 QState r = (*m_temp.fun)(this, Q_EVT_CAST(QEvt));
113
115 // the top-most initial tran. must be taken
117
118 QS_MEM_SYS();
119 QS_BEGIN_PRE(QS_QEP_STATE_INIT, qsId)
120 QS_OBJ_PRE(this); // this state machine object
121 QS_FUN_PRE(m_state.obj->stateHandler); // source state
122 QS_FUN_PRE(m_temp.tatbl->target->stateHandler); // target state
123 QS_END_PRE()
124 QS_MEM_APP();
125
126 QF_CRIT_EXIT();
127
128 // set state to the last tran. target
130
131 // drill down into the state hierarchy with initial transitions...
132 std::int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
133 do {
134 // execute the tran. table
135 r = execTatbl_(m_temp.tatbl, qsId);
136 --lbound;
137 } while ((r >= Q_RET_TRAN_INIT) && (lbound > 0));
138
140 Q_ENSURE_INCRIT(290, lbound > 0);
141
142 QS_MEM_SYS();
143 QS_BEGIN_PRE(QS_QEP_INIT_TRAN, qsId)
144 QS_TIME_PRE(); // time stamp
145 QS_OBJ_PRE(this); // this state machine object
146 QS_FUN_PRE(m_state.obj->stateHandler); // the new current state
147 QS_END_PRE()
148 QS_MEM_APP();
149
150 QF_CRIT_EXIT();
151
152 #ifndef Q_UNSAFE
153 m_temp.uint = ~m_state.uint;
154 #endif
155}
156
157//${QEP::QMsm::dispatch} .....................................................
159 QEvt const * const e,
160 std::uint_fast8_t const qsId)
161{
162 #ifndef Q_SPY
163 Q_UNUSED_PAR(qsId);
164 #endif
165
166 QMState const *s = m_state.obj; // store the current state
167 QMState const *t = s;
168
171 Q_REQUIRE_INCRIT(300, (e != nullptr) && (s != nullptr));
173 e->verify_()
174 && (m_state.uint == static_cast<std::uintptr_t>(~m_temp.uint)));
175
176 QS_MEM_SYS();
177 QS_BEGIN_PRE(QS_QEP_DISPATCH, qsId)
178 QS_TIME_PRE(); // time stamp
179 QS_SIG_PRE(e->sig); // the signal of the event
180 QS_OBJ_PRE(this); // this state machine object
181 QS_FUN_PRE(s->stateHandler); // the current state handler
182 QS_END_PRE()
183 QS_MEM_APP();
184
185 QF_CRIT_EXIT();
186
187 // scan the state hierarchy up to the top state...
188 QState r;
189 std::int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
190 do {
191 r = (*t->stateHandler)(this, e); // call state handler function
192
193 // event handled? (the most frequent case)
194 if (r >= Q_RET_HANDLED) {
195 break; // done scanning the state hierarchy
196 }
197 // event unhandled and passed to the superstate?
198 else if (r == Q_RET_SUPER) {
199 t = t->superstate; // advance to the superstate
200 }
201 else { // event unhandled due to a guard
203 // event must be unhandled due to a guard evaluating to 'false'
205
206 QS_MEM_SYS();
207 QS_BEGIN_PRE(QS_QEP_UNHANDLED, qsId)
208 QS_SIG_PRE(e->sig); // the signal of the event
209 QS_OBJ_PRE(this); // this state machine object
210 QS_FUN_PRE(t->stateHandler); // the current state
211 QS_END_PRE()
212 QS_MEM_APP();
213
214 QF_CRIT_EXIT();
215
216 t = t->superstate; // advance to the superstate
217 }
218 --lbound;
219 } while ((t != nullptr) && (lbound > 0));
221 Q_ENSURE_INCRIT(320, lbound > 0);
222 QF_CRIT_EXIT();
223
224 if (r >= Q_RET_TRAN) { // any kind of tran. taken?
226 // the tran. source state must not be nullptr
227 Q_ASSERT_INCRIT(330, t != nullptr);
228 QF_CRIT_EXIT();
229
230 #ifdef Q_SPY
231 QMState const * const ts = t; // for saving tran. table
232 #endif // Q_SPY
233 QMTranActTable const *tatbl;
234
235 if (r == Q_RET_TRAN_HIST) { // was it tran. to history?
236 QMState const * const hist = m_state.obj; // save history
237 m_state.obj = s; // restore the original state
238
240 QS_MEM_SYS();
241 QS_BEGIN_PRE(QS_QEP_TRAN_HIST, qsId)
242 QS_OBJ_PRE(this); // this state machine object
243 QS_FUN_PRE(t->stateHandler); // source state handler
244 QS_FUN_PRE(hist->stateHandler); // target state handler
245 QS_END_PRE()
246 QS_MEM_APP();
247 QS_CRIT_EXIT();
248
249 // save the tran-action table before it gets clobbered
250 tatbl = m_temp.tatbl;
251 exitToTranSource_(s, t, qsId);
252 static_cast<void>(execTatbl_(tatbl, qsId));
253 r = enterHistory_(hist, qsId);
254 s = m_state.obj;
255 t = s; // set target to the current state
256 }
257
258 lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
259 while ((r >= Q_RET_TRAN) && (lbound > 0)) {
260 // save the tran-action table before it gets clobbered
261 tatbl = m_temp.tatbl;
262 m_temp.obj = nullptr; // clear
263 exitToTranSource_(s, t, qsId);
264 r = execTatbl_(tatbl, qsId);
265 s = m_state.obj;
266 t = s; // set target to the current state
267 --lbound;
268 }
269
271 Q_ENSURE_INCRIT(360, lbound > 0);
272
273 QS_MEM_SYS();
274 QS_BEGIN_PRE(QS_QEP_TRAN, qsId)
275 QS_TIME_PRE(); // time stamp
276 QS_SIG_PRE(e->sig); // the signal of the event
277 QS_OBJ_PRE(this); // this state machine object
278 QS_FUN_PRE(ts->stateHandler); // the tran. source
279 QS_FUN_PRE(s->stateHandler); // the new active state
280 QS_END_PRE()
281 QS_MEM_APP();
282
283 QF_CRIT_EXIT();
284 }
285
286 #ifdef Q_SPY
287 // was the event handled?
288 else if (r == Q_RET_HANDLED) {
290 // internal tran. source can't be nullptr
291 Q_ASSERT_INCRIT(380, t != nullptr);
292
293 QS_MEM_SYS();
294 QS_BEGIN_PRE(QS_QEP_INTERN_TRAN, qsId)
295 QS_TIME_PRE(); // time stamp
296 QS_SIG_PRE(e->sig); // the signal of the event
297 QS_OBJ_PRE(this); // this state machine object
298 QS_FUN_PRE(t->stateHandler); // the source state
299 QS_END_PRE()
300 QS_MEM_APP();
301
302 QF_CRIT_EXIT();
303 }
304 // event bubbled to the 'top' state?
305 else if (t == nullptr) {
307 QS_MEM_SYS();
308 QS_BEGIN_PRE(QS_QEP_IGNORED, qsId)
309 QS_TIME_PRE(); // time stamp
310 QS_SIG_PRE(e->sig); // the signal of the event
311 QS_OBJ_PRE(this); // this state machine object
312 QS_FUN_PRE(s->stateHandler); // the current state
313 QS_END_PRE()
314 QS_MEM_APP();
315 QS_CRIT_EXIT();
316 }
317 #endif // Q_SPY
318 else {
319 // empty
320 }
321
322 #ifndef Q_UNSAFE
323 m_temp.uint = ~m_state.uint;
324 #endif
325}
326
327//${QEP::QMsm::isIn} .........................................................
328bool QMsm::isIn(QStateHandler const state) noexcept {
329 bool inState = false; // assume that this SM is not in 'state'
330
331 QMState const *s = m_state.obj;
332 std::int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
333 for (; (s != nullptr) && (lbound > 0); --lbound) {
334 if (s->stateHandler == state) { // match found?
335 inState = true;
336 break;
337 }
338 else {
339 s = s->superstate; // advance to the superstate
340 }
341 }
342
345 Q_ENSURE_INCRIT(490, lbound > 0);
346 QF_CRIT_EXIT();
347
348 return inState;
349}
350
351//${QEP::QMsm::childStateObj} ................................................
352QMState const * QMsm::childStateObj(QMState const * const parent) const noexcept {
353 QMState const *child = m_state.obj;
354 bool isFound = false; // start with the child not found
355 QMState const *s;
356
357 std::int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
358 for (s = m_state.obj;
359 (s != nullptr) && (lbound > 0);
360 s = s->superstate)
361 {
362 if (s == parent) {
363 isFound = true; // child is found
364 break;
365 }
366 else {
367 child = s;
368 }
369 --lbound;
370 }
373 Q_ENSURE_INCRIT(680, lbound > 0);
374 QF_CRIT_EXIT();
375
376 if (!isFound) { // still not found?
377 lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
378 for (s = m_temp.obj;
379 (s != nullptr) && (lbound > 0);
380 s = s->superstate)
381 {
382 if (s == parent) {
383 isFound = true; // child is found
384 break;
385 }
386 else {
387 child = s;
388 }
389 --lbound;
390 }
391 }
392
394 // NOTE: the following postcondition can only succeed when
395 // (lbound > 0), so no extra check is necessary.
396 Q_ENSURE_INCRIT(690, isFound);
397 QF_CRIT_EXIT();
398
399 return child; // return the child
400}
401
402//${QEP::QMsm::execTatbl_} ...................................................
404 QMTranActTable const * const tatbl,
405 std::uint_fast8_t const qsId)
406{
407 #ifndef Q_SPY
408 Q_UNUSED_PAR(qsId);
409 #endif
410
413 // precondition:
414 // - the tran-action table pointer must not be NULL
415 Q_REQUIRE_INCRIT(700, tatbl != nullptr);
416 QF_CRIT_EXIT();
417
418 QState r = Q_RET_NULL;
419 std::int_fast8_t lbound = QMSM_MAX_TRAN_LENGTH_; // fixed upper loop bound
420 QActionHandler const *a = &tatbl->act[0];
421 for (; (*a != nullptr) && (lbound > 0); ++a) {
422 r = (*(*a))(this); // call the action through the 'a' pointer
423 --lbound;
424 #ifdef Q_SPY
426 QS_MEM_SYS();
427 if (r == Q_RET_ENTRY) {
428 QS_BEGIN_PRE(QS_QEP_STATE_ENTRY, qsId)
429 QS_OBJ_PRE(this); // this state machine object
430 QS_FUN_PRE(m_temp.obj->stateHandler); // entered state
431 QS_END_PRE()
432 }
433 else if (r == Q_RET_EXIT) {
434 QS_BEGIN_PRE(QS_QEP_STATE_EXIT, qsId)
435 QS_OBJ_PRE(this); // this state machine object
436 QS_FUN_PRE(m_temp.obj->stateHandler); // exited state
437 QS_END_PRE()
438 }
439 else if (r == Q_RET_TRAN_INIT) {
440 QS_BEGIN_PRE(QS_QEP_STATE_INIT, qsId)
441 QS_OBJ_PRE(this); // this state machine object
442 QS_FUN_PRE(tatbl->target->stateHandler); // source
444 QS_END_PRE()
445 }
446 else {
447 // empty
448 }
449 QS_MEM_APP();
450 QS_CRIT_EXIT();
451 #endif // Q_SPY
452 }
454 // NOTE: the following postcondition can only succeed when
455 // (lbound > 0), so no extra check is necessary.
456 Q_ENSURE_INCRIT(790, *a == nullptr);
457 QF_CRIT_EXIT();
458
459 m_state.obj = (r >= Q_RET_TRAN)
461 : tatbl->target;
462 return r;
463}
464
465//${QEP::QMsm::exitToTranSource_} ............................................
467 QMState const * const cs,
468 QMState const * const ts,
469 std::uint_fast8_t const qsId)
470{
471 #ifndef Q_SPY
472 Q_UNUSED_PAR(qsId);
473 #endif
474
476
477 // exit states from the current state to the tran. source state
478 QMState const *s = cs;
479 std::int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
480 for (; (s != ts) && (lbound > 0); --lbound) {
481 // exit action provided in state 's'?
482 if (s->exitAction != nullptr) {
483 // execute the exit action
484 static_cast<void>((*s->exitAction)(this));
485
487 QS_MEM_SYS();
488 QS_BEGIN_PRE(QS_QEP_STATE_EXIT, qsId)
489 QS_OBJ_PRE(this); // this state machine object
490 QS_FUN_PRE(s->stateHandler); // the exited state handler
491 QS_END_PRE()
492 QS_MEM_APP();
493 QS_CRIT_EXIT();
494 }
495
496 s = s->superstate; // advance to the superstate
497 }
499 Q_ENSURE_INCRIT(890, lbound > 0);
500 QF_CRIT_EXIT();
501}
502
503//${QEP::QMsm::enterHistory_} ................................................
505 QMState const * const hist,
506 std::uint_fast8_t const qsId)
507{
508 #ifndef Q_SPY
509 Q_UNUSED_PAR(qsId);
510 #endif
511
512 // record the entry path from current state to history
513 QMState const *epath[QMSM_MAX_ENTRY_DEPTH_];
514 QMState const *s = hist;
515 std::int_fast8_t i = 0; // tran. entry path index
516 while ((s != m_state.obj) && (i < (QMSM_MAX_ENTRY_DEPTH_ - 1))) {
517 if (s->entryAction != nullptr) {
518 epath[i] = s;
519 ++i;
520 }
521 s = s->superstate;
522 }
525 Q_ASSERT_INCRIT(910, s == m_state.obj);
526 QF_CRIT_EXIT();
527
528 // retrace the entry path in reverse (desired) order...
529 while (i > 0) {
530 --i;
531 (*epath[i]->entryAction)(this); // run entry action in epath[i]
532
534 QS_MEM_SYS();
535 QS_BEGIN_PRE(QS_QEP_STATE_ENTRY, qsId)
536 QS_OBJ_PRE(this);
537 QS_FUN_PRE(epath[i]->stateHandler); // entered state handler
538 QS_END_PRE()
539 QS_MEM_APP();
540 QS_CRIT_EXIT();
541 }
542
543 m_state.obj = hist; // set current state to the tran. target
544
545 // initial tran. present?
546 QState r;
547 if (hist->initAction != nullptr) {
548 r = (*hist->initAction)(this); // execute the tran. action
550 QS_MEM_SYS();
551 QS_BEGIN_PRE(QS_QEP_STATE_INIT, qsId)
552 QS_OBJ_PRE(this); // this state machine object
553 QS_FUN_PRE(hist->stateHandler); // source
555 QS_END_PRE()
556 QS_MEM_APP();
557 QS_CRIT_EXIT();
558 }
559 else {
560 r = Q_RET_NULL;
561 }
562
563 return r;
564}
565
566//${QEP::QMsm::topQMState} ...................................................
567QMState const * QMsm::topQMState() const noexcept {
568 return &l_msm_top_s;
569}
570
571} // namespace QP
572//$enddef${QEP::QMsm} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Abstract State Machine class (state machine interface)
Definition qp.hpp:212
@ Q_RET_HANDLED
event handled (internal transition)
Definition qp.hpp:228
@ Q_RET_ENTRY
state entry action executed
Definition qp.hpp:232
@ Q_RET_UNHANDLED
event unhandled due to a guard
Definition qp.hpp:225
@ Q_RET_TRAN
regular transition
Definition qp.hpp:239
@ Q_RET_TRAN_HIST
transition to history of a given state
Definition qp.hpp:243
@ Q_RET_NULL
return value without any effect
Definition qp.hpp:236
@ Q_RET_TRAN_INIT
initial transition in a state
Definition qp.hpp:240
@ Q_RET_EXIT
state exit action executed
Definition qp.hpp:233
@ Q_RET_SUPER
event passed to superstate to handle
Definition qp.hpp:224
QAsmAttr m_temp
Temporary storage for target/act-table etc.
Definition qp.hpp:215
QAsmAttr m_state
Current state (pointer to the current state-handler function)
Definition qp.hpp:214
Event class.
Definition qp.hpp:131
QSignal sig
Signal of the event (see Event Signal)
Definition qp.hpp:133
bool verify_() const noexcept
Internal function to verify the internal integrity of the event instance (QP FuSa Subsystem)
Definition qp.hpp:154
QState execTatbl_(QMTranActTable const *const tatbl, std::uint_fast8_t const qsId)
Definition qep_msm.cpp:403
void dispatch(QEvt const *const e, std::uint_fast8_t const qsId) override
Virtual function to dispatch an event to the state machine.
Definition qep_msm.cpp:158
void exitToTranSource_(QMState const *const cs, QMState const *const ts, std::uint_fast8_t const qsId)
Definition qep_msm.cpp:466
QState enterHistory_(QMState const *const hist, std::uint_fast8_t const qsId)
Definition qep_msm.cpp:504
void init(void const *const e, std::uint_fast8_t const qsId) override
Virtual function to take the top-most initial transition in the state machine.
Definition qep_msm.cpp:97
bool isIn(QStateHandler const state) noexcept override
Definition qep_msm.cpp:328
QMsm(QStateHandler const initial) noexcept
Definition qep_msm.cpp:89
QMState const * topQMState() const noexcept
Definition qep_msm.cpp:567
QMState const * childStateObj(QMState const *const parent) const noexcept
Definition qep_msm.cpp:352
QP/C++ framework.
Definition qequeue.hpp:42
QState(*)(void *const me) QActionHandler
Pointer to an action-handler function.
Definition qp.hpp:171
std::uint_fast8_t QState
Type returned from state-handler functions.
Definition qp.hpp:165
QState(*)(void *const me, QEvt const *const e) QStateHandler
Pointer to a state-handler function.
Definition qp.hpp:168
#define Q_EVT_CAST(subclass_)
Definition qp.hpp:453
#define Q_UNUSED_PAR(par_)
Helper macro to clearly mark unused parameters of functions.
Definition qp.hpp:498
Internal (package scope) QP/C++ interface.
Sample QP/C++ port.
#define QS_OBJ_PRE(obj_)
Definition qs_dummy.hpp:158
#define QS_SIG_PRE(sig_)
Definition qs_dummy.hpp:156
#define QS_TIME_PRE()
Definition qs_dummy.hpp:155
#define QS_MEM_APP()
Definition qs_dummy.hpp:170
#define QS_FUN_PRE(fun_)
Definition qs_dummy.hpp:159
#define QS_CRIT_EXIT()
Definition qs_dummy.hpp:167
#define QS_MEM_SYS()
Definition qs_dummy.hpp:169
#define QS_END_PRE()
Definition qs_dummy.hpp:150
#define QS_CRIT_ENTRY()
Definition qs_dummy.hpp:166
#define QS_BEGIN_PRE(rec_, qsId_)
Definition qs_dummy.hpp:149
QS/C++ port to a 32-bit CPU, generic C++ compiler.
QP Functional Safety (FuSa) Subsystem.
#define QF_CRIT_ENTRY()
Definition qsafe.h:58
#define Q_ASSERT_INCRIT(id_, expr_)
Definition qsafe.h:72
#define Q_INVARIANT_INCRIT(id_, expr_)
Definition qsafe.h:154
#define Q_ENSURE_INCRIT(id_, expr_)
Definition qsafe.h:145
#define QF_CRIT_EXIT()
Definition qsafe.h:62
#define Q_REQUIRE_INCRIT(id_, expr_)
Definition qsafe.h:136
#define QF_CRIT_STAT
Definition qsafe.h:54
State object for the QP::QMsm class (QM State Machine)
Definition qp.hpp:181
QActionHandler const entryAction
Definition qp.hpp:184
QStateHandler const stateHandler
Definition qp.hpp:183
QMState const * superstate
Definition qp.hpp:182
QActionHandler const initAction
Definition qp.hpp:186
Transition-Action Table for the QP::QMsm State Machine.
Definition qp.hpp:190
QMState const * target
Definition qp.hpp:191
QActionHandler const act[1]
Definition qp.hpp:192
std::uintptr_t uint
Definition qp.hpp:203
QMState const * obj
Definition qp.hpp:200
QStateHandler fun
Definition qp.hpp:197
QMTranActTable const * tatbl
Definition qp.hpp:201