QP/C  8.0.0
Real-Time Embedded Framework
Loading...
Searching...
No Matches
qep_msm.c
Go to the documentation of this file.
1//$file${src::qf::qep_msm.c} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
2//
3// Model: qpc.qm
4// File: ${src::qf::qep_msm.c}
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 GNU
18// 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.c} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
35#define QP_IMPL // this is QP implementation
36#include "qp_port.h" // QP port
37#include "qp_pkg.h" // 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.h" // QS port
41 #include "qs_pkg.h" // QS facilities for pre-defined trace records
42#else
43 #include "qs_dummy.h" // disable the QS software tracing
44#endif // Q_SPY
45
46//============================================================================
47//! @cond INTERNAL
48
49Q_DEFINE_THIS_MODULE("qep_msm")
50
51// top-state object for QMsm-style state machines
52static struct QMState const l_msm_top_s = {
53 (struct QMState *)0,
54 Q_STATE_CAST(0),
58};
59//! @endcond
60
61enum {
62 // maximum depth of state nesting in a QMsm (including the top level)
64
65 // maximum length of transition-action array
67
68 // maximum depth of entry levels in a MSM for tran. to history
70};
71
72//============================================================================
73
74//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
75// Check for the minimum required QP version
76#if (QP_VERSION < 730U) || (QP_VERSION != ((QP_RELEASE^4294967295U)%0x2710U))
77#error qpc version 7.3.0 or higher required
78#endif
79//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
80//$define${QEP::QMsm} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
81
82//${QEP::QMsm} ...............................................................
83
84//${QEP::QMsm::ctor} .........................................................
85//! @protected @memberof QMsm
86void QMsm_ctor(QMsm * const me,
87 QStateHandler const initial)
88{
89 static struct QAsmVtable const vtable = { // QAsm virtual table
90 &QMsm_init_,
91 &QMsm_dispatch_,
92 &QMsm_isIn_
93 #ifdef Q_SPY
94 ,&QMsm_getStateHandler_
95 #endif
96 };
97 // do not call the QAsm_ctor() here
98 me->super.vptr = &vtable;
99 me->super.state.obj = &l_msm_top_s; // the current state (top)
100 me->super.temp.fun = initial; // the initial tran. handler
101}
102
103//${QEP::QMsm::init_} ........................................................
104//! @private @memberof QMsm
105void QMsm_init_(
106 QAsm * const me,
107 void const * const e,
108 uint_fast8_t const qsId)
109{
110 #ifndef Q_SPY
111 Q_UNUSED_PAR(qsId);
112 #endif
113
116 Q_REQUIRE_INCRIT(200, (me->vptr != (struct QAsmVtable *)0)
117 && (me->temp.fun != Q_STATE_CAST(0))
118 && (me->state.obj == &l_msm_top_s));
119 QF_CRIT_EXIT();
120
121 // execute the top-most initial tran.
122 QState r = (*me->temp.fun)(me, Q_EVT_CAST(QEvt));
123
125 // the top-most initial tran. must be taken
127
128 QS_MEM_SYS();
129 QS_BEGIN_PRE(QS_QEP_STATE_INIT, qsId)
130 QS_OBJ_PRE(me); // this state machine object
131 QS_FUN_PRE(me->state.obj->stateHandler); // source state
132 QS_FUN_PRE(me->temp.tatbl->target->stateHandler); // target state
133 QS_END_PRE()
134 QS_MEM_APP();
135
136 QF_CRIT_EXIT();
137
138 // set state to the last tran. target
139 me->state.obj = me->temp.tatbl->target;
140
141 // drill down into the state hierarchy with initial transitions...
142 int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
143 do {
144 // execute the tran. table
145 r = QMsm_execTatbl_(me, me->temp.tatbl, qsId);
146 --lbound;
147 } while ((r >= Q_RET_TRAN_INIT) && (lbound > 0));
148
150 Q_ENSURE_INCRIT(290, lbound > 0);
151
152 QS_MEM_SYS();
153 QS_BEGIN_PRE(QS_QEP_INIT_TRAN, qsId)
154 QS_TIME_PRE(); // time stamp
155 QS_OBJ_PRE(me); // this state machine object
156 QS_FUN_PRE(me->state.obj->stateHandler); // the new current state
157 QS_END_PRE()
158 QS_MEM_APP();
159
160 QF_CRIT_EXIT();
161
162 #ifndef Q_UNSAFE
163 me->temp.uint = ~me->state.uint;
164 #endif
165}
166
167//${QEP::QMsm::dispatch_} ....................................................
168//! @private @memberof QMsm
169void QMsm_dispatch_(
170 QAsm * const me,
171 QEvt const * const e,
172 uint_fast8_t const qsId)
173{
174 #ifndef Q_SPY
175 Q_UNUSED_PAR(qsId);
176 #endif
177
178 QMState const *s = me->state.obj; // store the current state
179 QMState const *t = s;
180
184 (e != (QEvt *)0)
185 && (s != (QMState *)0)
186 && (me->state.uint == (uintptr_t)(~me->temp.uint)));
187 #ifndef Q_UNSAFE
188 Q_INVARIANT_INCRIT(301, QEvt_verify_(e));
189 #endif
190
191 QS_MEM_SYS();
192 QS_BEGIN_PRE(QS_QEP_DISPATCH, qsId)
193 QS_TIME_PRE(); // time stamp
194 QS_SIG_PRE(e->sig); // the signal of the event
195 QS_OBJ_PRE(me); // this state machine object
196 QS_FUN_PRE(s->stateHandler); // the current state handler
197 QS_END_PRE()
198 QS_MEM_APP();
199
200 QF_CRIT_EXIT();
201
202 // scan the state hierarchy up to the top state...
203 QState r;
204 int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
205 do {
206 r = (*t->stateHandler)(me, e); // call state handler function
207
208 // event handled? (the most frequent case)
209 if (r >= Q_RET_HANDLED) {
210 break; // done scanning the state hierarchy
211 }
212 // event unhandled and passed to the superstate?
213 else if (r == Q_RET_SUPER) {
214 t = t->superstate; // advance to the superstate
215 }
216 else { // event unhandled due to a guard
218 // event must be unhandled due to a guard evaluating to 'false'
220
221 QS_MEM_SYS();
222 QS_BEGIN_PRE(QS_QEP_UNHANDLED, qsId)
223 QS_SIG_PRE(e->sig); // the signal of the event
224 QS_OBJ_PRE(me); // this state machine object
225 QS_FUN_PRE(t->stateHandler); // the current state
226 QS_END_PRE()
227 QS_MEM_APP();
228
229 QF_CRIT_EXIT();
230
231 t = t->superstate; // advance to the superstate
232 }
233 --lbound;
234 } while ((t != (QMState *)0) && (lbound > 0));
236 Q_ENSURE_INCRIT(320, lbound > 0);
237 QF_CRIT_EXIT();
238
239 if (r >= Q_RET_TRAN) { // any kind of tran. taken?
241 // the tran. source state must not be NULL
242 Q_ASSERT_INCRIT(330, t != (QMState *)0);
243 QF_CRIT_EXIT();
244
245 #ifdef Q_SPY
246 QMState const * const ts = t; // tran. source for QS tracing
247 #endif // Q_SPY
248 struct QMTranActTable const *tatbl; // for saving tran. table
249
250 if (r == Q_RET_TRAN_HIST) { // was it tran. to history?
251 QMState const * const hist = me->state.obj; // save history
252 me->state.obj = s; // restore the original state
253
255 QS_MEM_SYS();
256 QS_BEGIN_PRE(QS_QEP_TRAN_HIST, qsId)
257 QS_OBJ_PRE(me); // this state machine object
258 QS_FUN_PRE(t->stateHandler); // source state handler
259 QS_FUN_PRE(hist->stateHandler); // target state handler
260 QS_END_PRE()
261 QS_MEM_APP();
262 QS_CRIT_EXIT();
263
264 // save the tran-action table before it gets clobbered
265 tatbl = me->temp.tatbl;
266 QMsm_exitToTranSource_(me, s, t, qsId);
267 (void)QMsm_execTatbl_(me, tatbl, qsId);
268 r = QMsm_enterHistory_(me, hist, qsId);
269 s = me->state.obj;
270 t = s; // set target to the current state
271 }
272
273 lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
274 while ((r >= Q_RET_TRAN) && (lbound > 0)) {
275 // save the tran-action table before it gets clobbered
276 tatbl = me->temp.tatbl;
277 me->temp.obj = (QMState *)0; // clear
278 QMsm_exitToTranSource_(me, s, t, qsId);
279 r = QMsm_execTatbl_(me, tatbl, qsId);
280 s = me->state.obj;
281 t = s; // set target to the current state
282 --lbound;
283 }
284
286 Q_ENSURE_INCRIT(360, lbound > 0);
287
288 QS_MEM_SYS();
289 QS_BEGIN_PRE(QS_QEP_TRAN, qsId)
290 QS_TIME_PRE(); // time stamp
291 QS_SIG_PRE(e->sig); // the signal of the event
292 QS_OBJ_PRE(me); // this state machine object
293 QS_FUN_PRE(ts->stateHandler); // the tran. source
294 QS_FUN_PRE(s->stateHandler); // the new active state
295 QS_END_PRE()
296 QS_MEM_APP();
297
298 QF_CRIT_EXIT();
299 }
300
301 #ifdef Q_SPY
302 // was the event handled?
303 else if (r == Q_RET_HANDLED) {
305 // internal tran. source can't be NULL
306 Q_ASSERT_INCRIT(380, t != (QMState *)0);
307
308 QS_MEM_SYS();
309 QS_BEGIN_PRE(QS_QEP_INTERN_TRAN, qsId)
310 QS_TIME_PRE(); // time stamp
311 QS_SIG_PRE(e->sig); // the signal of the event
312 QS_OBJ_PRE(me); // this state machine object
313 QS_FUN_PRE(t->stateHandler); // the source state
314 QS_END_PRE()
315 QS_MEM_APP();
316
317 QF_CRIT_EXIT();
318 }
319 // event bubbled to the 'top' state?
320 else if (t == (QMState *)0) {
322 QS_MEM_SYS();
323 QS_BEGIN_PRE(QS_QEP_IGNORED, qsId)
324 QS_TIME_PRE(); // time stamp
325 QS_SIG_PRE(e->sig); // the signal of the event
326 QS_OBJ_PRE(me); // this state machine object
327 QS_FUN_PRE(s->stateHandler); // the current state
328 QS_END_PRE()
329 QS_MEM_APP();
330 QS_CRIT_EXIT();
331 }
332 #endif // Q_SPY
333 else {
334 // empty
335 }
336
337 #ifndef Q_UNSAFE
338 me->temp.uint = ~me->state.uint;
339 #endif
340}
341
342//${QEP::QMsm::isIn_} ........................................................
343//! @private @memberof QMsm
344bool QMsm_isIn_(
345 QAsm * const me,
346 QStateHandler const state)
347{
348 bool inState = false; // assume that this SM is not in 'state'
349
350 QMState const *s = me->state.obj;
351 int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
352 for (; (s != (QMState *)0) && (lbound > 0); --lbound) {
353 if (s->stateHandler == state) { // match found?
354 inState = true;
355 break;
356 }
357 else {
358 s = s->superstate; // advance to the superstate
359 }
360 }
361
364 Q_ENSURE_INCRIT(490, lbound > 0);
365 QF_CRIT_EXIT();
366
367 return inState;
368}
369
370//${QEP::QMsm::childStateObj} ................................................
371//! @public @memberof QMsm
372QMState const * QMsm_childStateObj(QMsm const * const me,
373 QMState const * const parent)
374{
375 QMState const *child = me->super.state.obj;
376 bool isFound = false; // start with the child not found
377 QMState const *s;
378
379 int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
380 for (s = me->super.state.obj;
381 (s != (QMState *)0) && (lbound > 0);
382 s = s->superstate)
383 {
384 if (s == parent) {
385 isFound = true; // child is found
386 break;
387 }
388 else {
389 child = s;
390 }
391 --lbound;
392 }
395 Q_ENSURE_INCRIT(680, lbound > 0);
396 QF_CRIT_EXIT();
397
398 if (!isFound) { // still not found?
399 lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
400 for (s = me->super.temp.obj;
401 (s != (QMState *)0) && (lbound > 0);
402 s = s->superstate)
403 {
404 if (s == parent) {
405 isFound = true; // child is found
406 break;
407 }
408 else {
409 child = s;
410 }
411 --lbound;
412 }
413 }
414
416 // NOTE: the following postcondition can only succeed when
417 // (lbound > 0), so no extra check is necessary.
418 Q_ENSURE_INCRIT(690, isFound);
419 QF_CRIT_EXIT();
420
421 return child; // return the child
422}
423
424//${QEP::QMsm::execTatbl_} ...................................................
425//! @private @memberof QMsm
426QState QMsm_execTatbl_(
427 QAsm * const me,
428 QMTranActTable const * const tatbl,
429 uint_fast8_t const qsId)
430{
431 #ifndef Q_SPY
432 Q_UNUSED_PAR(qsId);
433 #endif
434
437 // precondition:
438 // - the tran-action table pointer must not be NULL
439 Q_REQUIRE_INCRIT(700, tatbl != (struct QMTranActTable *)0);
440 QF_CRIT_EXIT();
441
442 QState r = Q_RET_NULL;
443 int_fast8_t lbound = QMSM_MAX_TRAN_LENGTH_; // fixed upper loop bound
444 QActionHandler const *a = &tatbl->act[0];
445 for (; (*a != Q_ACTION_CAST(0)) && (lbound > 0); ++a) {
446 r = (*(*a))(me); // call the action through the 'a' pointer
447 --lbound;
448 #ifdef Q_SPY
450 QS_MEM_SYS();
451 if (r == Q_RET_ENTRY) {
452 QS_BEGIN_PRE(QS_QEP_STATE_ENTRY, qsId)
453 QS_OBJ_PRE(me); // this state machine object
454 QS_FUN_PRE(me->temp.obj->stateHandler); // entered state
455 QS_END_PRE()
456 }
457 else if (r == Q_RET_EXIT) {
458 QS_BEGIN_PRE(QS_QEP_STATE_EXIT, qsId)
459 QS_OBJ_PRE(me); // this state machine object
460 QS_FUN_PRE(me->temp.obj->stateHandler); // exited state
461 QS_END_PRE()
462 }
463 else if (r == Q_RET_TRAN_INIT) {
464 QS_BEGIN_PRE(QS_QEP_STATE_INIT, qsId)
465 QS_OBJ_PRE(me); // this state machine object
466 QS_FUN_PRE(tatbl->target->stateHandler); // source
467 QS_FUN_PRE(me->temp.tatbl->target->stateHandler); // target
468 QS_END_PRE()
469 }
470 else {
471 // empty
472 }
473 QS_MEM_APP();
474 QS_CRIT_EXIT();
475 #endif // Q_SPY
476 }
478 // NOTE: the following postcondition can only succeed when
479 // (lbound > 0), so no extra check is necessary.
480 Q_ENSURE_INCRIT(790, *a == Q_ACTION_CAST(0));
481 QF_CRIT_EXIT();
482
483 me->state.obj = (r >= Q_RET_TRAN)
484 ? me->temp.tatbl->target
485 : tatbl->target;
486 return r;
487}
488
489//${QEP::QMsm::exitToTranSource_} ............................................
490//! @private @memberof QMsm
491void QMsm_exitToTranSource_(
492 QAsm * const me,
493 QMState const * const cs,
494 QMState const * const ts,
495 uint_fast8_t const qsId)
496{
497 #ifndef Q_SPY
498 Q_UNUSED_PAR(qsId);
499 #endif
500
502
503 // exit states from the current state to the tran. source state
504 QMState const *s = cs;
505 int_fast8_t lbound = QMSM_MAX_NEST_DEPTH_; // fixed upper loop bound
506 for (; (s != ts) && (lbound > 0); --lbound) {
507 // exit action provided in state 's'?
508 if (s->exitAction != Q_ACTION_CAST(0)) {
509 // execute the exit action
510 (void)(*s->exitAction)(me);
511
513 QS_MEM_SYS();
514 QS_BEGIN_PRE(QS_QEP_STATE_EXIT, qsId)
515 QS_OBJ_PRE(me); // this state machine object
516 QS_FUN_PRE(s->stateHandler); // the exited state handler
517 QS_END_PRE()
518 QS_MEM_APP();
519 QS_CRIT_EXIT();
520 }
521
522 s = s->superstate; // advance to the superstate
523 }
525 Q_ENSURE_INCRIT(890, lbound > 0);
526 QF_CRIT_EXIT();
527}
528
529//${QEP::QMsm::enterHistory_} ................................................
530//! @private @memberof QMsm
531QState QMsm_enterHistory_(
532 QAsm * const me,
533 QMState const *const hist,
534 uint_fast8_t const qsId)
535{
536 #ifndef Q_SPY
537 Q_UNUSED_PAR(qsId);
538 #endif
539
540 // record the entry path from current state to history
541 QMState const *epath[QMSM_MAX_ENTRY_DEPTH_];
542 QMState const *s = hist;
543 int_fast8_t i = 0; // tran. entry path index
544 while ((s != me->state.obj) && (i < (QMSM_MAX_ENTRY_DEPTH_ - 1))) {
545 if (s->entryAction != Q_ACTION_CAST(0)) {
546 epath[i] = s;
547 ++i;
548 }
549 s = s->superstate;
550 }
553 Q_ASSERT_INCRIT(910, s == me->state.obj);
554 QF_CRIT_EXIT();
555
556 // retrace the entry path in reverse (desired) order...
557 while (i > 0) {
558 --i;
559 (void)(*epath[i]->entryAction)(me); // run entry action in epath[i]
560
562 QS_MEM_SYS();
563 QS_BEGIN_PRE(QS_QEP_STATE_ENTRY, qsId)
564 QS_OBJ_PRE(me);
565 QS_FUN_PRE(epath[i]->stateHandler); // entered state handler
566 QS_END_PRE()
567 QS_MEM_APP();
568 QS_CRIT_EXIT();
569 }
570
571 me->state.obj = hist; // set current state to the tran. target
572
573 // initial tran. present?
574 QState r;
575 if (hist->initAction != Q_ACTION_CAST(0)) {
576 r = (*hist->initAction)(me); // execute the tran. action
578 QS_MEM_SYS();
579 QS_BEGIN_PRE(QS_QEP_STATE_INIT, qsId)
580 QS_OBJ_PRE(me); // this state machine object
581 QS_FUN_PRE(hist->stateHandler); // source
582 QS_FUN_PRE(me->temp.tatbl->target->stateHandler); // target
583 QS_END_PRE()
584 QS_MEM_APP();
585 QS_CRIT_EXIT();
586 }
587 else {
588 r = Q_RET_NULL;
589 }
590
591 return r;
592}
593//$enddef${QEP::QMsm} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ QMSM_MAX_TRAN_LENGTH_
Definition qep_msm.c:66
@ QMSM_MAX_NEST_DEPTH_
Definition qep_msm.c:63
@ QMSM_MAX_ENTRY_DEPTH_
Definition qep_msm.c:69
@ Q_RET_ENTRY
state entry action executed
Definition qp.h:197
@ Q_RET_HANDLED
event handled (internal transition)
Definition qp.h:193
@ Q_RET_TRAN_INIT
initial transition in a state
Definition qp.h:205
@ Q_RET_TRAN
regular transition
Definition qp.h:204
@ Q_RET_UNHANDLED
event unhandled due to guard
Definition qp.h:190
@ Q_RET_SUPER
event passed to superstate to handle
Definition qp.h:189
@ Q_RET_NULL
return value without any effect
Definition qp.h:201
@ Q_RET_TRAN_HIST
transition to history of a given state
Definition qp.h:208
@ Q_RET_EXIT
state exit action executed
Definition qp.h:198
#define Q_UNUSED_PAR(par_)
Helper macro to clearly mark unused parameters of functions.
Definition qp.h:525
#define Q_STATE_CAST(handler_)
Perform cast to QStateHandler.
Definition qp.h:519
QState(* QStateHandler)(void *const me, QEvt const *const e)
Pointer to a state-handler function.
Definition qp.h:215
#define Q_ACTION_CAST(action_)
Perform cast to QActionHandler.
Definition qp.h:522
enum QStateRet QState
Type returned from state-handler functions.
Definition qp.h:212
#define Q_EVT_CAST(class_)
Perform downcast of an event onto a subclass of QEvt class_
Definition qp.h:516
QState(* QActionHandler)(void *const me)
Pointer to an action-handler function.
Definition qp.h:218
Internal (package scope) QP/C interface.
Sample QP/C port.
#define QS_OBJ_PRE(obj_)
Definition qs_dummy.h:150
#define QS_SIG_PRE(sig_)
Definition qs_dummy.h:148
#define QS_TIME_PRE()
Definition qs_dummy.h:147
#define QS_MEM_APP()
Definition qs_dummy.h:162
#define QS_FUN_PRE(fun_)
Definition qs_dummy.h:151
#define QS_CRIT_EXIT()
Definition qs_dummy.h:159
#define QS_MEM_SYS()
Definition qs_dummy.h:161
#define QS_END_PRE()
Definition qs_dummy.h:142
#define QS_CRIT_ENTRY()
Definition qs_dummy.h:158
#define QS_BEGIN_PRE(rec_, qsId_)
Definition qs_dummy.h:141
Sample QS/C port.
QP Functional Safety (FuSa) Subsystem.
#define QF_CRIT_ENTRY()
Definition qsafe.h:50
#define Q_ASSERT_INCRIT(id_, expr_)
Definition qsafe.h:64
#define Q_INVARIANT_INCRIT(id_, expr_)
Definition qsafe.h:146
#define Q_ENSURE_INCRIT(id_, expr_)
Definition qsafe.h:137
#define QF_CRIT_EXIT()
Definition qsafe.h:54
#define Q_REQUIRE_INCRIT(id_, expr_)
Definition qsafe.h:128
#define QF_CRIT_STAT
Definition qsafe.h:46
Abstract State Machine class (state machine interface)
Definition qp.h:256
struct QAsmVtable const * vptr
Virtual pointer inherited by all QAsm subclasses (see also Object Orientation)
Definition qp.h:260
union QAsmAttr state
Current state (pointer to the current state-handler function)
Definition qp.h:265
union QAsmAttr temp
Temporary storage for target/act-table etc.
Definition qp.h:268
Virtual table for the QAsm class.
Definition qp.h:277
Event class.
Definition qp.h:131
QSignal sig
Signal of the event (see Event Signal)
Definition qp.h:135
State object for the QMsm class (QM State Machine)
Definition qp.h:228
struct QMState const * superstate
Definition qp.h:229
QActionHandler const entryAction
Definition qp.h:231
QActionHandler const initAction
Definition qp.h:233
QStateHandler const stateHandler
Definition qp.h:230
Transition-Action Table for the QMsm State Machine.
Definition qp.h:237
QActionHandler const act[1]
Definition qp.h:239
QMState const * target
Definition qp.h:238
Hierarchical State Machine class (QMsm-style state machine implementation strategy)
Definition qp.h:355
QAsm super
Definition qp.h:357
uintptr_t uint
Definition qp.h:250
QMTranActTable const * tatbl
Definition qp.h:247
QStateHandler fun
Definition qp.h:244
struct QMState const * obj
Definition qp.h:248