47#define QP_VERSION_STR "7.4.0-rc.3"
48#define QP_VERSION 740U
49#define QP_RELEASE 0x7092C3BBU
55#define Q_SIGNAL_SIZE 2U
59#define QF_MAX_ACTIVE 32U
62#if (QF_MAX_ACTIVE > 64U)
63#error QF_MAX_ACTIVE exceeds the maximum of 64U;
66#ifndef QF_MAX_TICK_RATE
67#define QF_MAX_TICK_RATE 1U
70#if (QF_MAX_TICK_RATE > 15U)
71#error QF_MAX_TICK_RATE exceeds the maximum of 15U;
75#define QF_MAX_EPOOL 3U
78#if (QF_MAX_EPOOL > 15U)
79#error QF_MAX_EPOOL exceeds the maximum of 15U;
82#ifndef QF_TIMEEVT_CTR_SIZE
83#define QF_TIMEEVT_CTR_SIZE 4U
86#if (QF_TIMEEVT_CTR_SIZE > 4U)
87#error QF_TIMEEVT_CTR_SIZE defined incorrectly, expected 1U, 2U, or 4U;
90#ifndef QF_EVENT_SIZ_SIZE
91#define QF_EVENT_SIZ_SIZE 2U
94#if (QF_EVENT_SIZ_SIZE > 4U)
95#error QF_EVENT_SIZ_SIZE defined incorrectly, expected 1U, 2U, or 4U;
123#if (Q_SIGNAL_SIZE == 1U)
128#if (Q_SIGNAL_SIZE == 2U)
133#if (Q_SIGNAL_SIZE == 4U)
138#define QEVT_MARKER 0xE0U
141#define QEVT_DYNAMIC 0U
185 return (me != (
QEvt const *)0)
191 return (uint_fast8_t)me->
evtTag_ & 0x0FU;
302 void (*
init)(
QAsm *
const me,
void const *
const e,
303 uint_fast8_t
const qsId);
305 uint_fast8_t
const qsId);
324void QHsm_ctor(
QHsm *
const me,
332 void const *
const e,
333 uint_fast8_t
const qsId);
338 QEvt const *
const e,
339 uint_fast8_t
const qsId);
365int_fast8_t QHsm_tran_(
368 uint_fast8_t
const qsId);
374 QEvt const *
const e);
387void QMsm_ctor(
QMsm *
const me,
395 void const *
const e,
396 uint_fast8_t
const qsId);
403 QEvt const *
const e,
404 uint_fast8_t
const qsId);
422bool QMsm_isInState(
QMsm const *
const me,
423 QMState const *
const stateObj);
431QMState const * QMsm_childStateObj(
QMsm const *
const me,
440 uint_fast8_t
const qsId);
443void QMsm_exitToTranSource_(
447 uint_fast8_t
const qsId);
453 uint_fast8_t
const qsId);
459#define QEVT_INITIALIZER(sig_) { (QSignal)(sig_), 0U, QEVT_MARKER }
463#define QASM_INIT(me_, par_, qsId_) do { \
464 Q_ASSERT(((QAsm *)(me_))->vptr); \
465 (*((QAsm *)(me_))->vptr->init)((QAsm *)(me_), (par_), (qsId_)); \
471#define QASM_INIT(me_, par_, dummy) do { \
472 Q_ASSERT(((QAsm *)(me_))->vptr); \
473 (*((QAsm *)(me_))->vptr->init)((QAsm *)(me_), (par_), 0); \
479#define QASM_DISPATCH(me_, e_, qsId_) \
480 (*((QAsm *)(me_))->vptr->dispatch)((QAsm *)(me_), (e_), (qsId_))
485#define QASM_DISPATCH(me_, e_, dummy) \
486 (*((QAsm *)(me_))->vptr->dispatch)((QAsm *)(me_), (e_), 0U)
490#define QASM_IS_IN(me_, state_) \
491 (*((QAsm *)(me_))->vptr->isIn)((QAsm *)(me_), (state_))
494#define Q_ASM_UPCAST(ptr_) ((QAsm *)(ptr_))
497#define Q_HSM_UPCAST(ptr_) ((QHsm *)(ptr_))
500#define Q_MSM_UPCAST(ptr_) ((QMsm *)(ptr_))
503#define Q_TRAN(target_) \
504 ((Q_ASM_UPCAST(me))->temp.fun = Q_STATE_CAST(target_), \
508#define Q_TRAN_HIST(hist_) \
509 ((Q_ASM_UPCAST(me))->temp.fun = (hist_), \
510 (QState)Q_RET_TRAN_HIST)
513#define Q_SUPER(super_) \
514 ((Q_ASM_UPCAST(me))->temp.fun = Q_STATE_CAST(super_), \
518#define Q_HANDLED() ((QState)Q_RET_HANDLED)
521#define Q_UNHANDLED() ((QState)Q_RET_UNHANDLED)
524#define Q_ACTION_NULL ((QActionHandler)0)
527#define Q_EVT_CAST(class_) ((class_ const *)(e))
530#define Q_STATE_CAST(handler_) ((QStateHandler)(handler_))
533#define Q_ACTION_CAST(action_) ((QActionHandler)(action_))
536#define Q_UNUSED_PAR(par_) ((void)(par_))
539#define Q_DIM(array_) (sizeof(array_) / sizeof((array_)[0U]))
542#define Q_UINT2PTR_CAST(type_, uint_) ((type_ *)(uint_))
546#define QM_ENTRY(state_) \
547 ((Q_ASM_UPCAST(me))->temp.obj = (state_), \
553#define QM_ENTRY(dummy) ((QState)Q_RET_ENTRY)
558#define QM_EXIT(state_) \
559 ((Q_ASM_UPCAST(me))->temp.obj = (state_), \
565#define QM_EXIT(dummy) ((QState)Q_RET_EXIT)
569#define QM_SM_EXIT(state_) \
570 ((Q_ASM_UPCAST(me))->temp.obj = (state_), \
574#define QM_TRAN(tatbl_) ((Q_ASM_UPCAST(me))->temp.tatbl \
575 = (struct QMTranActTable const *)(tatbl_), \
579#define QM_TRAN_INIT(tatbl_) ((Q_ASM_UPCAST(me))->temp.tatbl \
580 = (struct QMTranActTable const *)(tatbl_), \
581 (QState)Q_RET_TRAN_INIT)
584#define QM_TRAN_HIST(history_, tatbl_) \
585 ((((Q_ASM_UPCAST(me))->state.obj = (history_)), \
586 ((Q_ASM_UPCAST(me))->temp.tatbl = \
587 (struct QMTranActTable const *)(tatbl_))), \
588 (QState)Q_RET_TRAN_HIST)
591#define QM_TRAN_EP(tatbl_) ((Q_ASM_UPCAST(me))->temp.tatbl \
592 = (struct QMTranActTable const *)(tatbl_), \
593 (QState)Q_RET_TRAN_EP)
596#define QM_TRAN_XP(xp_, tatbl_) \
597 ((((Q_ASM_UPCAST(me))->state.act = (xp_)), \
598 ((Q_ASM_UPCAST(me))->temp.tatbl = \
599 (struct QMTranActTable const *)(tatbl_))), \
600 (QState)Q_RET_TRAN_XP)
603#define QM_HANDLED() ((QState)Q_RET_HANDLED)
606#define QM_UNHANDLED() ((QState)Q_RET_UNHANDLED)
609#define QM_SUPER() ((QState)Q_RET_SUPER)
612#define QM_SUPER_SUB(host_) \
613 ((Q_ASM_UPCAST(me))->temp.obj = (host_), \
614 (QState)Q_RET_SUPER_SUB)
617#define QM_STATE_NULL ((QMState *)0)
626#if (QF_TIMEEVT_CTR_SIZE == 1U)
631#if (QF_TIMEEVT_CTR_SIZE == 2U)
636#if (QF_TIMEEVT_CTR_SIZE == 4U)
641#if (QF_MAX_ACTIVE <= 8U)
646#if (8U < QF_MAX_ACTIVE) && (QF_MAX_ACTIVE <= 16U)
651#if (16U < QF_MAX_ACTIVE)
674 #if (QF_MAX_ACTIVE > 32)
681 #if (QF_MAX_ACTIVE <= 32U)
682 return (me->
bits[0] == 0U);
684 return (me->
bits[0] == 0U) ? (me->
bits[1] == 0U) :
false;
690 #if (QF_MAX_ACTIVE <= 32U)
691 return (me->
bits[0] != 0U);
693 return (me->
bits[0] != 0U) ? true : (me->
bits[1] != 0U);
699 uint_fast8_t
const n)
701 #if (QF_MAX_ACTIVE <= 32U)
712 uint_fast8_t
const n)
714 #if (QF_MAX_ACTIVE <= 32U)
728 uint_fast8_t
const n)
730 #if (QF_MAX_ACTIVE <= 32U)
744 #if (QF_MAX_ACTIVE <= 32U)
747 return (me->
bits[1] != 0U)
760 dis->
bits[0] = ~me->bits[0];
761 #if (QF_MAX_ACTIVE > 32U)
762 dis->
bits[1] = ~me->bits[1];
770 QPSet const *
const dis)
772 #if (QF_MAX_ACTIVE <= 32U)
814#ifdef QACTIVE_THREAD_TYPE
819#ifdef QACTIVE_OS_OBJ_TYPE
824#ifdef QACTIVE_EQUEUE_TYPE
867void QActive_start_(
QActive *
const me,
869 QEvt const * *
const qSto,
870 uint_fast16_t
const qLen,
872 uint_fast16_t
const stkSize,
873 void const *
const par);
877#ifdef QACTIVE_CAN_STOP
879void QActive_stop(
QActive *
const me);
885void QActive_register_(
QActive *
const me);
888void QActive_unregister_(
QActive *
const me);
892 QEvt const *
const e,
893 uint_fast16_t
const margin,
894 void const *
const sender);
897void QActive_postLIFO_(
QActive *
const me,
898 QEvt const *
const e);
913void QActive_publish_(
914 QEvt const *
const e,
915 void const *
const sender,
916 uint_fast8_t
const qsId);
921void QActive_subscribe(
QActive const *
const me,
925void QActive_unsubscribe(
QActive const *
const me,
929void QActive_unsubscribeAll(
QActive const *
const me);
934 QEvt const *
const e);
937bool QActive_recall(
QActive *
const me,
941uint_fast16_t QActive_flushDeferred(
QActive const *
const me,
943 uint_fast16_t
const num);
964void QMActive_ctor(
QMActive *
const me,
1001 uint_fast8_t
const tickRate);
1023 uint_fast8_t
const tickRate,
1024 void const *
const sender);
1031 uint_fast8_t
const tickRate,
1032 void const *
const sender);
1054void QTicker_ctor(
QTicker *
const me,
1055 uint_fast8_t
const tickRate);
1062 void const *
const par,
1063 uint_fast8_t
const qsId);
1066void QTicker_dispatch_(
1068 QEvt const *
const e,
1069 uint_fast8_t
const qsId);
1074 void const *
const sender);
1093uint_fast16_t QF_getQueueMin(uint_fast8_t
const prio);
1104#ifdef QF_ON_CONTEXT_SW
1117 void *
const poolSto,
1118 uint_fast32_t
const poolSize,
1119 uint_fast16_t
const evtSize);
1123uint_fast16_t QF_poolGetMaxBlockSize(
void);
1127uint_fast16_t QF_getPoolMin(uint_fast8_t
const poolNum);
1132 uint_fast16_t
const evtSize,
1133 uint_fast16_t
const margin,
1138void QF_gc(
QEvt const *
const e);
1142QEvt const * QF_newRef_(
1143 QEvt const *
const e,
1144 void const *
const evtRef);
1148void QF_deleteRef_(
void const *
const evtRef);
1158#define QF_NO_MARGIN ((uint_fast16_t)0xFFFFU)
1161#define Q_PRIO(prio_, pthre_) ((QPrioSpec)((prio_) | ((pthre_) << 8U)))
1164#ifndef QEVT_PAR_INIT
1165#define Q_NEW(evtT_, sig_) ((evtT_ *)QF_newX_((uint_fast16_t)sizeof(evtT_), \
1166 QF_NO_MARGIN, (enum_t)(sig_)))
1171#define Q_NEW(evtT_, sig_, ...) \
1172 (evtT_##_init((evtT_ *)QF_newX_((uint_fast16_t)sizeof(evtT_), \
1173 QF_NO_MARGIN, (sig_)), __VA_ARGS__))
1177#ifndef QEVT_PAR_INIT
1178#define Q_NEW_X(evtT_, margin_, sig_) \
1179 ((evtT_ *)QF_newX_((uint_fast16_t)sizeof(evtT_), \
1180 (margin_), (enum_t)(sig_)))
1185#define Q_NEW_X(evtT_, margin_, sig_, ...) \
1186 (evtT_##_init((evtT_ *)QF_newX_((uint_fast16_t)sizeof(evtT_), \
1187 (margin_), (sig_)), __VA_ARGS__))
1191#define Q_NEW_REF(evtRef_, evtT_) \
1192 ((evtRef_) = (evtT_ const *)QF_newRef_(e, (evtRef_)))
1195#define Q_DELETE_REF(evtRef_) do { \
1196 QF_deleteRef_((evtRef_)); \
1197 (evtRef_) = (void *)0; \
1201#define QACTIVE_START(me_, prioSpec_, qSto_, qLen_, stkSto_, stkSize_, par_) \
1202 (QActive_start_((QActive *)(me_), (prioSpec_), \
1203 (qSto_), (qLen_), (stkSto_), (stkSize_), (par_)))
1207#define QACTIVE_POST(me_, e_, sender_) \
1208 ((void)QActive_post_((me_), (e_), QF_NO_MARGIN, (sender_)))
1213#define QACTIVE_POST(me_, e_, dummy) \
1214 ((void)QActive_post_((me_), (e_), QF_NO_MARGIN, (void *)0))
1219#define QACTIVE_POST_X(me_, e_, margin_, sender_) \
1220 (QActive_post_((me_), (e_), (margin_), (sender_)))
1225#define QACTIVE_POST_X(me_, e_, margin_, dummy) \
1226 (QActive_post_((me_), (e_), (margin_), (void *)0))
1230#define QACTIVE_POST_LIFO(me_, e_) \
1231 (QActive_postLIFO_((me_), (e_)))
1235#define QACTIVE_PUBLISH(e_, sender_) \
1236 (QActive_publish_((e_), (void const *)(sender_), (sender_)->prio))
1241#define QACTIVE_PUBLISH(e_, dummy) (QActive_publish_((e_), (void *)0, 0U))
1246#define QTIMEEVT_TICK_X(tickRate_, sender_) (QTimeEvt_tick_((tickRate_), (sender_)))
1251#define QTIMEEVT_TICK_X(tickRate_, dummy) (QTimeEvt_tick_((tickRate_), (void *)0))
1255#define QTIMEEVT_TICK(sender_) QTIMEEVT_TICK_X(0U, (sender_))
1259#define QTICKER_TRIG(ticker_, sender_) (QTicker_trig_((ticker_), (sender_)))
1264#define QTICKER_TRIG(ticker_, sender_) (QTicker_trig_((ticker_), (void *)0))
1268#ifndef QF_CRIT_EXIT_NOP
1269#define QF_CRIT_EXIT_NOP() ((void)0)
1273#define QF_TICK_X(tickRate_, sender_) QTIMEEVT_TICK_X((tickRate_), (sender_))
1276#define QF_TICK(sender_) QTIMEEVT_TICK(sender_)
1279#define QF_PUBLISH(e_, sender_) QACTIVE_PUBLISH((e_), (sender_))
1283#define QF_MEM_SYS() ((void)0)
1288#define QF_MEM_APP() ((void)0)
void QF_onStartup(void)
Startup QF callback.
void QF_poolInit(void *const poolSto, uint_fast32_t const poolSize, uint_fast16_t const evtSize)
Event pool initialization for dynamic allocation of events.
void QF_onCleanup(void)
Cleanup QF callback.
void QF_onContextSw(QActive *prev, QActive *next)
QF context switch callback used in built-in kernels (QV/QK/QXK)
void QF_gcFromISR(QEvt const *const e)
@ Q_RET_ENTRY
state entry action executed
@ Q_RET_HANDLED
event handled (internal transition)
@ Q_RET_TRAN_XP
exit-point transition out of a submachine
@ Q_RET_IGNORED
event silently ignored (bubbled up to top)
@ Q_RET_TRAN_INIT
initial transition in a state or submachine
@ Q_RET_TRAN
regular transition
@ Q_RET_UNHANDLED
event unhandled due to a guard
@ Q_RET_SUPER
event passed to superstate to handle
@ Q_RET_NULL
return value without any effect
@ Q_RET_TRAN_HIST
transition to history of a given state
@ Q_RET_SUPER_SUB
event passed to submachine superstate
@ Q_RET_TRAN_EP
entry-point transition into a submachine
@ Q_RET_EXIT
state exit action executed
QEvt const QEvt_reserved_[4]
char const QP_versionStr[16]
the current QP version number string in ROM, based on QP_VERSION_STR
float float32_t
Alias for IEEE 754 32-bit floating point number.
void(* QXThreadHandler)(struct QXThread *const me)
Pointer to an extended-thread handler function.
uint32_t QPSetBits
Bitmask for the internal representation of QPSet elements.
QState(* QStateHandler)(void *const me, QEvt const *const e)
Pointer to a state-handler function.
#define QEVT_MARKER
QEvt memory marker (for internal integrity checks)
enum QStateRet QState
Type returned from state-handler functions.
uint32_t QTimeEvtCtr
Data type to store the block-size defined based on the macro QF_TIMEEVT_CTR_SIZE.
uint_fast8_t QF_LOG2(QPSetBits const bitmask)
Log-base-2 calculation when hardware acceleration is NOT provided (QF_LOG2 not defined)
QReservedSig
Reserved signals by the QHsm-style state machine implementation.
@ Q_INIT_SIG
signal for coding initial transitions
@ Q_EMPTY_SIG
signal to execute the default case
@ Q_USER_SIG
offset for the user signals (QP Application)
@ Q_EXIT_SIG
signal for coding exit actions
@ Q_ENTRY_SIG
signal for coding entry actions
int int_t
Alias for assertion-ID numbers in QP assertions and return from QF_run()
double float64_t
Alias for IEEE 754 64-bit floating point number.
QState(* QActionHandler)(void *const me)
Pointer to an action-handler function.
uint16_t QSignal
The signal of event QEvt.
uint16_t QPrioSpec
Priority specification for Active Objects in QP.
#define QF_MAX_TICK_RATE
Maximum # clock tick rates in the system (0..15)
#define QF_MAX_ACTIVE
Maximum # Active Objects in the system (1..64)
#define QACTIVE_OS_OBJ_TYPE
QActive "OS-object" type used in various QP/C ports.
#define QACTIVE_EQUEUE_TYPE
QActive event queue type used in various QP/C ports.
#define QACTIVE_THREAD_TYPE
QActive "thread" type used in various QP/C ports.
Active object class (based on the QHsm implementation strategy)
QSubscrList * QActive_subscrList_
Static (one per-class) pointer to all subscriber AOs for a given event signal.
QACTIVE_THREAD_TYPE thread
Port-dependent representation of the thread of the active object.
bool QActive_post_(QActive *const me, QEvt const *const e, uint_fast16_t const margin, void const *const sender)
Posts an event e directly to the event queue of the active object using the First-In-First-Out (FIFO)...
void QActive_ctor(QActive *const me, QStateHandler const initial)
QActive constructor (abstract base class)
bool QActive_defer(QActive const *const me, struct QEQueue *const eq, QEvt const *const e)
Defer an event to a given separate event queue.
void QActive_setAttr(QActive *const me, uint32_t attr1, void const *attr2)
enum_t QActive_maxPubSignal_
Static (one per-class) maximum published signal (the size of the subscrList_ array)
QACTIVE_OS_OBJ_TYPE osObject
Port-dependent per-thread object.
QACTIVE_EQUEUE_TYPE eQueue
Port-dependent event-queue type (often QEQueue)
uint8_t prio
QF-priority [1..QF_MAX_ACTIVE] of this AO.
void QActive_psInit(QSubscrList *const subscrSto, enum_t const maxSignal)
Publish event to all subscribers of a given signal e->sig
uint8_t pthre
Preemption-threshold [1..QF_MAX_ACTIVE] of this AO.
void QActive_evtLoop_(QActive *const me)
Event loop thread routine for executing an active object act (defined some in QP ports)
Abstract State Machine class (state machine interface)
struct QAsmVtable const * vptr
Virtual pointer inherited by all QAsm subclasses (see also Object Orientation)
void QAsm_ctor(QAsm *const me)
Constructor of the QAsm base class.
union QAsmAttr state
Current state (pointer to the current state-handler function)
Virtual table for the QAsm class.
void(* init)(QAsm *const me, void const *const e, uint_fast8_t const qsId)
Virtual function to take the top-most initial transition in the state machine.
bool(* isIn)(QAsm *const me, QStateHandler const s)
Virtual function to check whether the state machine is in a given state.
QStateHandler(* getStateHandler)(QAsm *const me)
Virtual function to get the current state handler of the state machine.
void(* dispatch)(QAsm *const me, QEvt const *const e, uint_fast8_t const qsId)
Virtual function to dispatch an event to the state machine.
static QEvt * QEvt_init(QEvt *const me, uint8_t dummy)
Event without parameters initialization.
QSignal sig
Signal of the event (see Event Signal)
uint8_t evtTag_
Event "tag" containing pool-ID (indicating which event pool it came from) plus event marker.
uint8_t volatile refCtr_
Reference counter (for mutable events and 0 for immutable (static) events)
static uint_fast8_t QEvt_getPoolNum_(QEvt const *const me)
Internal function to get the event pool-number of the given event.
static void QEvt_ctor(QEvt *const me, enum_t const sig)
static bool QEvt_verify_(QEvt const *const me)
Internal function to verify the event pointer and the memory marker in the event (QP FuSa Subsystem)
Hierarchical State Machine class (QHsm-style state machine implementation strategy)
static QStateHandler QHsm_state(QHsm const *const me)
Obtain the current active state from a HSM (read only)
Active object class (based on QMsm implementation strategy)
State object for the QMsm class (QM State Machine)
struct QMState const * superstate
QActionHandler const entryAction
QActionHandler const initAction
QActionHandler const exitAction
QStateHandler const stateHandler
Transition-Action Table for the QMsm State Machine.
QActionHandler const act[1]
Hierarchical State Machine class (QMsm-style state machine implementation strategy)
static QStateHandler QMsm_getStateHandler_(QAsm *const me)
Implementation of getting the state handler in a QMsm subclass.
static QMState const * QMsm_stateObj(QMsm *const me)
Obtain the current active state from a MSM (read only)
Set of Active Objects of up to QF_MAX_ACTIVE elements.
static uint_fast8_t QPSet_findMax(QPSet const *const me)
Find the maximum element in the set–returns zero if the set is empty.
static bool QPSet_notEmpty(QPSet const *const me)
Find out whether the priority-set is NOT empty.
static bool QPSet_verify_(QPSet const *const me, QPSet const *const dis)
Verify the Duplicate Inverse Storage (QP FuSa Subsystem)
static bool QPSet_hasElement(QPSet const *const me, uint_fast8_t const n)
Find out whether the priority-set has element n
static void QPSet_setEmpty(QPSet *const me)
Make the priority set empty.
static void QPSet_insert(QPSet *const me, uint_fast8_t const n)
Insert element n into the priority-set (n = 1..QF_MAX_ACTIVE)
QPSetBits bits[((QF_MAX_ACTIVE+(8U *sizeof(QPSetBits))) - 1U)/(8U *sizeof(QPSetBits))]
Bitmask with a bit for each element.
static void QPSet_remove(QPSet *const me, uint_fast8_t const n)
Remove element n from the priority-set (n = 1..QF_MAX_ACTIVE)
static void QPSet_update_(QPSet const *const me, QPSet *const dis)
Update the Duplicate Inverse Storage of QPSet (QP FuSa Subsystem)
static bool QPSet_isEmpty(QPSet const *const me)
Find out whether the priority-set is empty.
Subscriber List (for publish-subscribe)
QPSet set_dis
Duplicate inverse storage for the AO set.
QPSet set
The set of AOs that subscribed to a given event signal.
"Ticker" Active Object class
void QTimeEvt_ctorX(QTimeEvt *const me, QActive *const act, enum_t const sig, uint_fast8_t const tickRate)
The "extended" constructor to initialize a Time Event.
struct QTimeEvt *volatile next
Link to the next time event in the list.
void *volatile act
Active object that receives the time events.
QTimeEvtCtr volatile ctr
Down-counter of the time event.
bool QTimeEvt_noActive(uint_fast8_t const tickRate)
Check if any time events are active at a given clock tick rate.
void QTimeEvt_tick1_(uint_fast8_t const tickRate, void const *const sender)
Processes one clock tick for QUTest.
bool QTimeEvt_rearm(QTimeEvt *const me, QTimeEvtCtr const nTicks)
Rearm a time event.
void QTimeEvt_tick_(uint_fast8_t const tickRate, void const *const sender)
Processes all armed time events at every clock tick.
QTimeEvtCtr interval
Interval for periodic time event (zero for one-shot time event)
QTimeEvtCtr QTimeEvt_currCtr(QTimeEvt const *const me)
Get the current value of the down-counter of a time event.
QTimeEvt QTimeEvt_timeEvtHead_[QF_MAX_TICK_RATE]
Array of heads of linked lists of time events (one for every clock tick rate)
bool QTimeEvt_wasDisarmed(QTimeEvt *const me)
Check the "was disarmed" status of a time event.
void QTimeEvt_armX(QTimeEvt *const me, QTimeEvtCtr const nTicks, QTimeEvtCtr const interval)
Arm a time event (extended version for one shot or periodic time event)
bool QTimeEvt_disarm(QTimeEvt *const me)
Disarm a time event.
eXtended (blocking) thread of the QXK preemptive kernel
Attribute of for the QAsm class (Abstract State Machine)
QMTranActTable const * tatbl
struct QMState const * obj