QP-nano  6.9.0
Real-Time Embedded Framework
qepn.h
Go to the documentation of this file.
1
40#ifndef QEPN_H
41#define QEPN_H
42
43/****************************************************************************/
48#define QP_VERSION 690U
49
54#define QP_VERSION_STR "6.9.0"
55
57#define QP_RELEASE 0x884D22FDU
58
59
60/****************************************************************************/
61/* typedefs for basic numerical types; MISRA-C 2004 rule 6.3(req). */
62
70typedef char char_t;
71
73typedef int int_t;
74
76typedef int enum_t;
77
83typedef float float32_t;
84
90typedef double float64_t;
91
93typedef uint8_t QSignal;
94
95#ifndef Q_PARAM_SIZE
97 #define Q_PARAM_SIZE 0U
98#endif
99#if (Q_PARAM_SIZE == 0U)
100#elif (Q_PARAM_SIZE == 1U)
101 typedef uint8_t QParam;
102#elif (Q_PARAM_SIZE == 2U)
103 typedef uint16_t QParam;
104#elif (Q_PARAM_SIZE == 4U)
116 typedef uint32_t QParam;
117#elif (Q_PARAM_SIZE == 8U)
118 typedef uint64_t QParam;
119#else
120 #error "Q_PARAM_SIZE defined incorrectly, expected 0U, 1U, 2U, 4U or 8U"
121#endif
122
123/****************************************************************************/
131typedef struct {
133#if (Q_PARAM_SIZE != 0U)
135#endif
136} QEvt;
137
138/****************************************************************************/
143#define Q_SIG(me_) (((QHsm *)(me_))->evt.sig)
144
145#if (Q_PARAM_SIZE != 0U)
150#define Q_PAR(me_) (((QHsm *)(me_))->evt.par)
151#endif /* (Q_PARAM_SIZE != 0U) */
152
153/****************************************************************************/
155typedef uint_fast8_t QState;
156
158typedef QState (*QStateHandler)(void * const me);
159
160/****************************************************************************/
162typedef struct QHsmVtable QHsmVtable;
163
183typedef struct {
188} QHsm;
189
193 void (*init)(QHsm * const me);
194
196 void (*dispatch)(QHsm * const me);
197};
198
210#define QHSM_INIT(me_) do { \
211 Q_ASSERT((me_)->vptr); \
212 (*(me_)->vptr->init)((me_)); \
213} while (false)
214
224#define QHSM_DISPATCH(me_) ((*(me_)->vptr->dispatch)((me_)))
225
226/* public methods */
230void QHsm_ctor(QHsm * const me, QStateHandler initial);
231
238#define QHsm_state(me_) (Q_STATE_CAST(Q_HSM_UPCAST(me_)->state))
239
249#define QHsm_childState(me_, parent_) \
250 QHsm_childState_(Q_HSM_UPCAST(me_), Q_STATE_CAST(parent_))
251
254 QStateHandler const parent);
255
259void QHsm_init_(QHsm * const me);
260
264void QHsm_dispatch_(QHsm * const me);
265
269QState QHsm_top(void const * const me);
270
271
272/****************************************************************************/
273/* All possible values returned from state/action handlers */
274
275/* unhandled and need to "bubble up"... */
276
278#define Q_RET_SUPER ((QState)0)
279
281#define Q_RET_SUPER_SUB ((QState)1)
282
284#define Q_RET_UNHANDLED ((QState)2)
285
286/* handled and do not need to "bubble up"... */
288#define Q_RET_HANDLED ((QState)3)
289
291#define Q_RET_IGNORED ((QState)4)
292
293/* entry/exit... */
295#define Q_RET_ENTRY ((QState)5)
296
298#define Q_RET_EXIT ((QState)6)
299
300/* no side effects */
302#define Q_RET_NULL ((QState)7)
303
304/* transitions need to execute transition-action table in QHsm... */
306#define Q_RET_TRAN ((QState)8)
307
309#define Q_RET_TRAN_INIT ((QState)9)
310
312#define Q_RET_TRAN_HIST ((QState)10)
313
314
328#define Q_HSM_UPCAST(ptr_) ((QHsm *)(ptr_))
329
340#define Q_STATE_CAST(handler_) ((QStateHandler)(handler_))
341
346#define Q_TRAN(target_) \
347 ((Q_HSM_UPCAST(me))->temp = Q_STATE_CAST(target_), (QState)Q_RET_TRAN)
348
355#define Q_TRAN_HIST(hist_) \
356 ((Q_HSM_UPCAST(me))->temp = (hist_), (QState)Q_RET_TRAN_HIST)
357
364#define Q_SUPER(super_) \
365 ((Q_HSM_UPCAST(me))->temp = Q_STATE_CAST(super_), Q_RET_SUPER)
366
370#define Q_HANDLED() Q_RET_HANDLED
371
376#define Q_UNHANDLED() Q_RET_UNHANDLED
377
378
382#define Q_ENTRY_SIG ((QSignal)1)
383
385#define Q_EXIT_SIG ((QSignal)2)
386
388#define Q_INIT_SIG ((QSignal)3)
389
391#define Q_TIMEOUT_SIG ((QSignal)4)
392
394#define Q_TIMEOUT1_SIG ((QSignal)5)
395
397#define Q_TIMEOUT2_SIG ((QSignal)6)
398
400#define Q_TIMEOUT3_SIG ((QSignal)7)
401
403#define Q_USER_SIG ((QSignal)8)
404
413#define Q_UINT2PTR_CAST(type_, uintptr_) ((type_ *)(uintptr_))
414
415/****************************************************************************/
416/* macros for accessing data in ROM */
417#ifndef Q_ROM /* if NOT defined, provide the default definition */
418
434 #define Q_ROM
435#endif
436
437#ifndef Q_ROM_BYTE
454 #define Q_ROM_BYTE(rom_var_) (rom_var_)
455#endif
456
457#ifndef Q_ROM_PTR
475 #define Q_ROM_PTR(rom_var_) (rom_var_)
476#endif
477
478
479/****************************************************************************/
481extern char_t const Q_ROM QP_versionStr[7];
482
484#define QP_getVersion() (QP_versionStr)
485
486#endif /* QEPN_H */
487
char char_t
Definition: qassert.h:77
QSignal sig
Definition: qepn.h:132
char char_t
Definition: qepn.h:70
float float32_t
Definition: qepn.h:83
#define Q_ROM
Definition: qepn.h:434
uint8_t QSignal
Definition: qepn.h:93
QParam par
Definition: qepn.h:134
uint16_t QParam
Definition: qepn.h:103
QState(* QStateHandler)(void *const me)
Definition: qepn.h:158
int int_t
Definition: qepn.h:73
double float64_t
Definition: qepn.h:90
int enum_t
Definition: qepn.h:76
uint_fast8_t QState
Definition: qepn.h:155
char_t const Q_ROM QP_versionStr[7]
Definition: qepn.c:47
Definition: qepn.h:131
Definition: qepn.h:183
QState QHsm_top(void const *const me)
Definition: qepn.c:172
QStateHandler temp
Definition: qepn.h:186
void QHsm_ctor(QHsm *const me, QStateHandler initial)
Definition: qepn.c:84
QHsmVtable const * vptr
Definition: qepn.h:184
QEvt evt
Definition: qepn.h:187
QStateHandler QHsm_childState_(QHsm *const me, QStateHandler const parent)
Definition: qepn.c:450
void QHsm_init_(QHsm *const me)
Definition: qepn.c:105
void QHsm_dispatch_(QHsm *const me)
Definition: qepn.c:190
QStateHandler state
Definition: qepn.h:185
void(* dispatch)(QHsm *const me)
Definition: qepn.h:196
void(* init)(QHsm *const me)
Definition: qepn.h:193