//$file${include::qp.h} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv // // Model: qpc.qm // File: ${include::qp.h} // // This code has been generated by QM 6.2.0 . // DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost. // // This code is covered by the following QP license: // License # : LicenseRef-QL-dual // Issued to : Any user of the QP/C real-time embedded framework // Framework(s) : qpc // Support ends : 2025-12-31 // License scope: // // Copyright (C) 2005 Quantum Leaps, LLC . // // Q u a n t u m L e a P s // ------------------------ // Modern Embedded Software // // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-QL-commercial // // This software is dual-licensed under the terms of the open source GNU // General Public License version 3 (or any later version), or alternatively, // under the terms of one of the closed source Quantum Leaps commercial // licenses. // // The terms of the open source GNU General Public License version 3 // can be found at: // // The terms of the closed source Quantum Leaps commercial licenses // can be found at: // // Redistributions in source code must retain this top-level comment block. // Plagiarizing this software to sidestep the license obligations is illegal. // // Contact information: // // // //$endhead${include::qp.h} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #ifndef QP_H_ #define QP_H_ //============================================================================ #define QP_VERSION_STR "7.4.0-rc.3" #define QP_VERSION 740U #define QP_RELEASE 0x7092C3BBU //============================================================================ //! @cond INTERNAL #ifndef Q_SIGNAL_SIZE #define Q_SIGNAL_SIZE 2U #endif #ifndef QF_MAX_ACTIVE #define QF_MAX_ACTIVE 32U #endif #if (QF_MAX_ACTIVE > 64U) #error QF_MAX_ACTIVE exceeds the maximum of 64U; #endif #ifndef QF_MAX_TICK_RATE #define QF_MAX_TICK_RATE 1U #endif #if (QF_MAX_TICK_RATE > 15U) #error QF_MAX_TICK_RATE exceeds the maximum of 15U; #endif #ifndef QF_MAX_EPOOL #define QF_MAX_EPOOL 3U #endif #if (QF_MAX_EPOOL > 15U) #error QF_MAX_EPOOL exceeds the maximum of 15U; #endif #ifndef QF_TIMEEVT_CTR_SIZE #define QF_TIMEEVT_CTR_SIZE 4U #endif #if (QF_TIMEEVT_CTR_SIZE > 4U) #error QF_TIMEEVT_CTR_SIZE defined incorrectly, expected 1U, 2U, or 4U; #endif #ifndef QF_EVENT_SIZ_SIZE #define QF_EVENT_SIZ_SIZE 2U #endif #if (QF_EVENT_SIZ_SIZE > 4U) #error QF_EVENT_SIZ_SIZE defined incorrectly, expected 1U, 2U, or 4U; #endif //! @endcond //============================================================================ //$declare${glob-types} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${glob-types::int_t} ....................................................... typedef int int_t; //${glob-types::enum_t} ...................................................... typedef int enum_t; //${glob-types::float32_t} ................................................... typedef float float32_t; //${glob-types::float64_t} ................................................... typedef double float64_t; //$enddecl${glob-types} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QEP} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QEP::QP_versionStr[16]} .................................................. //! the current QP version number string in ROM, based on #QP_VERSION_STR extern char const QP_versionStr[16]; //${QEP::QSignal} ............................................................ #if (Q_SIGNAL_SIZE == 1U) typedef uint8_t QSignal; #endif // (Q_SIGNAL_SIZE == 1U) //${QEP::QSignal} ............................................................ #if (Q_SIGNAL_SIZE == 2U) typedef uint16_t QSignal; #endif // (Q_SIGNAL_SIZE == 2U) //${QEP::QSignal} ............................................................ #if (Q_SIGNAL_SIZE == 4U) typedef uint32_t QSignal; #endif // (Q_SIGNAL_SIZE == 4U) //${QEP::QEVT_MARKER} ........................................................ #define QEVT_MARKER 0xE0U //${QEP::QEVT_DYNAMIC} ....................................................... #define QEVT_DYNAMIC 0U //${QEP::QEvt} ............................................................... //! @class QEvt typedef struct QEvt { // public: //! @public @memberof QEvt QSignal sig; // private: //! @private @memberof QEvt uint8_t volatile refCtr_; //! @private @memberof QEvt uint8_t evtTag_; } QEvt; extern QEvt const QEvt_reserved_[4]; // public: //! @public @memberof QEvt static inline void QEvt_ctor(QEvt * const me, enum_t const sig) { me->sig = (QSignal)sig; me->refCtr_ = 0U; me->evtTag_ = QEVT_MARKER; } //! @public @memberof QEvt static inline QEvt * QEvt_init(QEvt * const me, uint8_t dummy) { (void)dummy; return me; } // private: //! @private @memberof QEvt static inline bool QEvt_verify_(QEvt const * const me) { return (me != (QEvt const *)0) && ((me->evtTag_ & 0xF0U) == QEVT_MARKER); } //! @private @memberof QEvt static inline uint_fast8_t QEvt_getPoolNum_(QEvt const * const me) { return (uint_fast8_t)me->evtTag_ & 0x0FU; } //${QEP::QStateRet} .......................................................... //! All possible values returned from state/action handlers //! @note //! The order of enumeration matters for algorithmic correctness. enum QStateRet { // unhandled and need to "bubble up" Q_RET_SUPER, //!< event passed to superstate to handle Q_RET_SUPER_SUB, //!< event passed to submachine superstate Q_RET_UNHANDLED, //!< event unhandled due to a guard // handled and do not need to "bubble up" Q_RET_HANDLED, //!< event handled (internal transition) Q_RET_IGNORED, //!< event silently ignored (bubbled up to top) // entry/exit Q_RET_ENTRY, //!< state entry action executed Q_RET_EXIT, //!< state exit action executed // no side effects Q_RET_NULL, //!< return value without any effect // transitions need to execute transition-action table in ::QMsm Q_RET_TRAN, //!< regular transition Q_RET_TRAN_INIT, //!< initial transition in a state or submachine Q_RET_TRAN_EP, //!< entry-point transition into a submachine // transitions that additionally clobber me->state Q_RET_TRAN_HIST, //!< transition to history of a given state Q_RET_TRAN_XP //!< exit-point transition out of a submachine }; //${QEP::QState} ............................................................. typedef enum QStateRet QState; //${QEP::QStateHandler} ...................................................... typedef QState (* QStateHandler )(void * const me, QEvt const * const e); //${QEP::QActionHandler} ..................................................... typedef QState (* QActionHandler )(void * const me); //${QEP::QXThread} ........................................................... // forward declaration struct QXThread; //${QEP::QXThreadHandler} .................................................... typedef void (* QXThreadHandler )(struct QXThread * const me); //${QEP::QMState} ............................................................ typedef struct QMState { struct QMState const *superstate; //!< @private @memberof QMState QStateHandler const stateHandler; //!< @private @memberof QMState QActionHandler const entryAction; //!< @private @memberof QMState QActionHandler const exitAction; //!< @private @memberof QMState QActionHandler const initAction; //!< @private @memberof QMState } QMState; //${QEP::QMTranActTable} ..................................................... typedef struct QMTranActTable { QMState const *target; //!< @private @memberof QMTranActTable QActionHandler const act[1]; //!< @private @memberof QMTranActTable } QMTranActTable; //${QEP::QReservedSig} ....................................................... //! Reserved signals by the QHsm-style state machine implementation enum QReservedSig { Q_EMPTY_SIG, //!< signal to execute the default case Q_ENTRY_SIG, //!< signal for coding entry actions Q_EXIT_SIG, //!< signal for coding exit actions Q_INIT_SIG, //!< signal for coding initial transitions Q_USER_SIG //!< offset for the user signals (QP Application) }; //${QEP::QAsmAttr} ........................................................... union QAsmAttr { QStateHandler fun; //!< @private @memberof QAsmAttr QActionHandler act; //!< @private @memberof QAsmAttr QXThreadHandler thr; //!< @private @memberof QAsmAttr QMTranActTable const *tatbl; //!< @private @memberof QAsmAttr struct QMState const *obj; //!< @private @memberof QAsmAttr #ifndef Q_UNSAFE uintptr_t uint; //!< @private @memberof QAsmAttr #endif }; //${QEP::QAsm} ............................................................... //! @class QAsm typedef struct { // private: //! @protected @memberof QAsm struct QAsmVtable const * vptr; // protected: //! @protected @memberof QAsm union QAsmAttr state; //! @protected @memberof QAsm union QAsmAttr temp; } QAsm; // protected: //! @protected @memberof QAsm void QAsm_ctor(QAsm * const me); //${QEP::QAsmVtable} ......................................................... struct QAsmVtable { void (*init)(QAsm * const me, void const * const e, uint_fast8_t const qsId); void (*dispatch)(QAsm * const me, QEvt const * const e, uint_fast8_t const qsId); bool (*isIn)(QAsm * const me, QStateHandler const s); #ifdef Q_SPY QStateHandler (*getStateHandler)(QAsm * const me); #endif // Q_SPY }; //${QEP::QHsm} ............................................................... //! @class QHsm //! @extends QAsm typedef struct { // protected: QAsm super; } QHsm; // protected: //! @protected @memberof QHsm void QHsm_ctor(QHsm * const me, QStateHandler const initial); // private: //! @private @memberof QHsm void QHsm_init_( QAsm * const me, void const * const e, uint_fast8_t const qsId); //! @private @memberof QHsm void QHsm_dispatch_( QAsm * const me, QEvt const * const e, uint_fast8_t const qsId); #ifdef Q_SPY //! @private @memberof QHsm QStateHandler QHsm_getStateHandler_(QAsm * const me); #endif // def Q_SPY // public: //! @private @memberof QHsm bool QHsm_isIn_( QAsm * const me, QStateHandler const state); //! @public @memberof QHsm static inline QStateHandler QHsm_state(QHsm const * const me) { return me->super.state.fun; } //! @public @memberof QHsm QStateHandler QHsm_childState(QHsm * const me, QStateHandler const parent); // private: //! @private @memberof QHsm int_fast8_t QHsm_tran_( QAsm * const me, QStateHandler * const path, uint_fast8_t const qsId); // protected: //! @protected @memberof QAsm QState QHsm_top(QHsm const * const me, QEvt const * const e); //${QEP::QMsm} ............................................................... //! @class QMsm //! @extends QAsm typedef struct { // protected: QAsm super; } QMsm; // protected: //! @protected @memberof QMsm void QMsm_ctor(QMsm * const me, QStateHandler const initial); // public: //! @private @memberof QMsm void QMsm_init_( QAsm * const me, void const * const e, uint_fast8_t const qsId); // private: //! @private @memberof QMsm void QMsm_dispatch_( QAsm * const me, QEvt const * const e, uint_fast8_t const qsId); // public: #ifdef Q_SPY //! @public @memberof QMsm static inline QStateHandler QMsm_getStateHandler_(QAsm * const me) { return me->state.obj->stateHandler; } #endif // def Q_SPY //! @private @memberof QMsm bool QMsm_isIn_( QAsm * const me, QStateHandler const state); //! @private @memberof QMsm //! @deprecated instead use: QASM_IS_IN() bool QMsm_isInState(QMsm const * const me, QMState const * const stateObj); //! @public @memberof QMsm static inline QMState const * QMsm_stateObj(QMsm * const me) { return me->super.state.obj; } //! @public @memberof QMsm QMState const * QMsm_childStateObj(QMsm const * const me, QMState const * const parent); // private: //! @private @memberof QMsm QState QMsm_execTatbl_( QAsm * const me, QMTranActTable const * const tatbl, uint_fast8_t const qsId); //! @private @memberof QMsm void QMsm_exitToTranSource_( QAsm * const me, QMState const * const cs, QMState const * const ts, uint_fast8_t const qsId); //! @private @memberof QMsm QState QMsm_enterHistory_( QAsm * const me, QMState const *const hist, uint_fast8_t const qsId); //$enddecl${QEP} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QEP-macros} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QEP-macros::QEVT_INITIALIZER} ............................................ #define QEVT_INITIALIZER(sig_) { (QSignal)(sig_), 0U, QEVT_MARKER } //${QEP-macros::QASM_INIT} ................................................... #ifdef Q_SPY #define QASM_INIT(me_, par_, qsId_) do { \ Q_ASSERT(((QAsm *)(me_))->vptr); \ (*((QAsm *)(me_))->vptr->init)((QAsm *)(me_), (par_), (qsId_)); \ } while (false) #endif // def Q_SPY //${QEP-macros::QASM_INIT} ................................................... #ifndef Q_SPY #define QASM_INIT(me_, par_, dummy) do { \ Q_ASSERT(((QAsm *)(me_))->vptr); \ (*((QAsm *)(me_))->vptr->init)((QAsm *)(me_), (par_), 0); \ } while (false) #endif // ndef Q_SPY //${QEP-macros::QASM_DISPATCH} ............................................... #ifdef Q_SPY #define QASM_DISPATCH(me_, e_, qsId_) \ (*((QAsm *)(me_))->vptr->dispatch)((QAsm *)(me_), (e_), (qsId_)) #endif // def Q_SPY //${QEP-macros::QASM_DISPATCH} ............................................... #ifndef Q_SPY #define QASM_DISPATCH(me_, e_, dummy) \ (*((QAsm *)(me_))->vptr->dispatch)((QAsm *)(me_), (e_), 0U) #endif // ndef Q_SPY //${QEP-macros::QASM_IS_IN} .................................................. #define QASM_IS_IN(me_, state_) \ (*((QAsm *)(me_))->vptr->isIn)((QAsm *)(me_), (state_)) //${QEP-macros::Q_ASM_UPCAST} ................................................ #define Q_ASM_UPCAST(ptr_) ((QAsm *)(ptr_)) //${QEP-macros::Q_HSM_UPCAST} ................................................ #define Q_HSM_UPCAST(ptr_) ((QHsm *)(ptr_)) //${QEP-macros::Q_MSM_UPCAST} ................................................ #define Q_MSM_UPCAST(ptr_) ((QMsm *)(ptr_)) //${QEP-macros::Q_TRAN} ...................................................... #define Q_TRAN(target_) \ ((Q_ASM_UPCAST(me))->temp.fun = Q_STATE_CAST(target_), \ (QState)Q_RET_TRAN) //${QEP-macros::Q_TRAN_HIST} ................................................. #define Q_TRAN_HIST(hist_) \ ((Q_ASM_UPCAST(me))->temp.fun = (hist_), \ (QState)Q_RET_TRAN_HIST) //${QEP-macros::Q_SUPER} ..................................................... #define Q_SUPER(super_) \ ((Q_ASM_UPCAST(me))->temp.fun = Q_STATE_CAST(super_), \ (QState)Q_RET_SUPER) //${QEP-macros::Q_HANDLED} ................................................... #define Q_HANDLED() ((QState)Q_RET_HANDLED) //${QEP-macros::Q_UNHANDLED} ................................................. #define Q_UNHANDLED() ((QState)Q_RET_UNHANDLED) //${QEP-macros::Q_ACTION_NULL} ............................................... #define Q_ACTION_NULL ((QActionHandler)0) //${QEP-macros::Q_EVT_CAST} .................................................. #define Q_EVT_CAST(class_) ((class_ const *)(e)) //${QEP-macros::Q_STATE_CAST} ................................................ #define Q_STATE_CAST(handler_) ((QStateHandler)(handler_)) //${QEP-macros::Q_ACTION_CAST} ............................................... #define Q_ACTION_CAST(action_) ((QActionHandler)(action_)) //${QEP-macros::Q_UNUSED_PAR} ................................................ #define Q_UNUSED_PAR(par_) ((void)(par_)) //${QEP-macros::Q_DIM} ....................................................... #define Q_DIM(array_) (sizeof(array_) / sizeof((array_)[0U])) //${QEP-macros::Q_UINT2PTR_CAST} ............................................. #define Q_UINT2PTR_CAST(type_, uint_) ((type_ *)(uint_)) //${QEP-macros::QM_ENTRY} .................................................... #ifdef Q_SPY #define QM_ENTRY(state_) \ ((Q_ASM_UPCAST(me))->temp.obj = (state_), \ (QState)Q_RET_ENTRY) #endif // def Q_SPY //${QEP-macros::QM_ENTRY} .................................................... #ifndef Q_SPY #define QM_ENTRY(dummy) ((QState)Q_RET_ENTRY) #endif // ndef Q_SPY //${QEP-macros::QM_EXIT} ..................................................... #ifdef Q_SPY #define QM_EXIT(state_) \ ((Q_ASM_UPCAST(me))->temp.obj = (state_), \ (QState)Q_RET_EXIT) #endif // def Q_SPY //${QEP-macros::QM_EXIT} ..................................................... #ifndef Q_SPY #define QM_EXIT(dummy) ((QState)Q_RET_EXIT) #endif // ndef Q_SPY //${QEP-macros::QM_SM_EXIT} .................................................. #define QM_SM_EXIT(state_) \ ((Q_ASM_UPCAST(me))->temp.obj = (state_), \ (QState)Q_RET_EXIT) //${QEP-macros::QM_TRAN} ..................................................... #define QM_TRAN(tatbl_) ((Q_ASM_UPCAST(me))->temp.tatbl \ = (struct QMTranActTable const *)(tatbl_), \ (QState)Q_RET_TRAN) //${QEP-macros::QM_TRAN_INIT} ................................................ #define QM_TRAN_INIT(tatbl_) ((Q_ASM_UPCAST(me))->temp.tatbl \ = (struct QMTranActTable const *)(tatbl_), \ (QState)Q_RET_TRAN_INIT) //${QEP-macros::QM_TRAN_HIST} ................................................ #define QM_TRAN_HIST(history_, tatbl_) \ ((((Q_ASM_UPCAST(me))->state.obj = (history_)), \ ((Q_ASM_UPCAST(me))->temp.tatbl = \ (struct QMTranActTable const *)(tatbl_))), \ (QState)Q_RET_TRAN_HIST) //${QEP-macros::QM_TRAN_EP} .................................................. #define QM_TRAN_EP(tatbl_) ((Q_ASM_UPCAST(me))->temp.tatbl \ = (struct QMTranActTable const *)(tatbl_), \ (QState)Q_RET_TRAN_EP) //${QEP-macros::QM_TRAN_XP} .................................................. #define QM_TRAN_XP(xp_, tatbl_) \ ((((Q_ASM_UPCAST(me))->state.act = (xp_)), \ ((Q_ASM_UPCAST(me))->temp.tatbl = \ (struct QMTranActTable const *)(tatbl_))), \ (QState)Q_RET_TRAN_XP) //${QEP-macros::QM_HANDLED} .................................................. #define QM_HANDLED() ((QState)Q_RET_HANDLED) //${QEP-macros::QM_UNHANDLED} ................................................ #define QM_UNHANDLED() ((QState)Q_RET_UNHANDLED) //${QEP-macros::QM_SUPER} .................................................... #define QM_SUPER() ((QState)Q_RET_SUPER) //${QEP-macros::QM_SUPER_SUB} ................................................ #define QM_SUPER_SUB(host_) \ ((Q_ASM_UPCAST(me))->temp.obj = (host_), \ (QState)Q_RET_SUPER_SUB) //${QEP-macros::QM_STATE_NULL} ............................................... #define QM_STATE_NULL ((QMState *)0) //$enddecl${QEP-macros} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QF::types} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QF::types::QPrioSpec} .................................................... typedef uint16_t QPrioSpec; //${QF::types::QTimeEvtCtr} .................................................. #if (QF_TIMEEVT_CTR_SIZE == 1U) typedef uint8_t QTimeEvtCtr; #endif // (QF_TIMEEVT_CTR_SIZE == 1U) //${QF::types::QTimeEvtCtr} .................................................. #if (QF_TIMEEVT_CTR_SIZE == 2U) typedef uint16_t QTimeEvtCtr; #endif // (QF_TIMEEVT_CTR_SIZE == 2U) //${QF::types::QTimeEvtCtr} .................................................. #if (QF_TIMEEVT_CTR_SIZE == 4U) typedef uint32_t QTimeEvtCtr; #endif // (QF_TIMEEVT_CTR_SIZE == 4U) //${QF::types::QPSetBits} .................................................... #if (QF_MAX_ACTIVE <= 8U) typedef uint8_t QPSetBits; #endif // (QF_MAX_ACTIVE <= 8U) //${QF::types::QPSetBits} .................................................... #if (8U < QF_MAX_ACTIVE) && (QF_MAX_ACTIVE <= 16U) typedef uint16_t QPSetBits; #endif // (8U < QF_MAX_ACTIVE) && (QF_MAX_ACTIVE <= 16U) //${QF::types::QPSetBits} .................................................... #if (16U < QF_MAX_ACTIVE) typedef uint32_t QPSetBits; #endif // (16U < QF_MAX_ACTIVE) //${QF::types::QF_LOG2} ...................................................... #ifndef QF_LOG2 uint_fast8_t QF_LOG2(QPSetBits const bitmask); #endif // ndef QF_LOG2 //${QF::types::QPSet} ........................................................ //! @class QPSet typedef struct { // private: //! @private @memberof QPSet QPSetBits bits[((QF_MAX_ACTIVE + (8U*sizeof(QPSetBits))) - 1U)/(8U*sizeof(QPSetBits))]; } QPSet; // public: //! @public @memberof QPSet static inline void QPSet_setEmpty(QPSet * const me) { me->bits[0] = 0U; #if (QF_MAX_ACTIVE > 32) me->bits[1] = 0U; #endif } //! @public @memberof QPSet static inline bool QPSet_isEmpty(QPSet const * const me) { #if (QF_MAX_ACTIVE <= 32U) return (me->bits[0] == 0U); #else return (me->bits[0] == 0U) ? (me->bits[1] == 0U) : false; #endif } //! @public @memberof QPSet static inline bool QPSet_notEmpty(QPSet const * const me) { #if (QF_MAX_ACTIVE <= 32U) return (me->bits[0] != 0U); #else return (me->bits[0] != 0U) ? true : (me->bits[1] != 0U); #endif } //! @public @memberof QPSet static inline bool QPSet_hasElement(QPSet const * const me, uint_fast8_t const n) { #if (QF_MAX_ACTIVE <= 32U) return (me->bits[0] & ((QPSetBits)1U << (n - 1U))) != 0U; #else return (n <= 32U) ? ((me->bits[0] & ((QPSetBits)1U << (n - 1U))) != 0U) : ((me->bits[1] & ((QPSetBits)1U << (n - 33U))) != 0U); #endif } //! @public @memberof QPSet static inline void QPSet_insert(QPSet * const me, uint_fast8_t const n) { #if (QF_MAX_ACTIVE <= 32U) me->bits[0] = (me->bits[0] | ((QPSetBits)1U << (n - 1U))); #else if (n <= 32U) { me->bits[0] = (me->bits[0] | ((QPSetBits)1U << (n - 1U))); } else { me->bits[1] = (me->bits[1] | ((QPSetBits)1U << (n - 33U))); } #endif } //! @public @memberof QPSet static inline void QPSet_remove(QPSet * const me, uint_fast8_t const n) { #if (QF_MAX_ACTIVE <= 32U) me->bits[0] = (me->bits[0] & (QPSetBits)(~((QPSetBits)1U << (n - 1U)))); #else if (n <= 32U) { (me->bits[0] = (me->bits[0] & ~((QPSetBits)1U << (n - 1U)))); } else { (me->bits[1] = (me->bits[1] & ~((QPSetBits)1U << (n - 33U)))); } #endif } //! @public @memberof QPSet static inline uint_fast8_t QPSet_findMax(QPSet const * const me) { #if (QF_MAX_ACTIVE <= 32U) return QF_LOG2(me->bits[0]); #else return (me->bits[1] != 0U) ? (QF_LOG2(me->bits[1]) + 32U) : (QF_LOG2(me->bits[0])); #endif } // private: #ifndef Q_UNSAFE //! @private @memberof QPSet static inline void QPSet_update_(QPSet const * const me, QPSet * const dis) { dis->bits[0] = ~me->bits[0]; #if (QF_MAX_ACTIVE > 32U) dis->bits[1] = ~me->bits[1]; #endif } #endif // ndef Q_UNSAFE #ifndef Q_UNSAFE //! @private @memberof QPSet static inline bool QPSet_verify_(QPSet const * const me, QPSet const * const dis) { #if (QF_MAX_ACTIVE <= 32U) return me->bits[0] == (QPSetBits)(~dis->bits[0]); #else return (me->bits[0] == (QPSetBits)(~dis->bits[0])) && (me->bits[1] == (QPSetBits)(~dis->bits[1])); #endif } #endif // ndef Q_UNSAFE //${QF::types::QSubscrList} .................................................. // @struct QSubscrList typedef struct { // private: //! @private @memberof QSubscrList QPSet set; #ifndef Q_UNSAFE //! @private @memberof QSubscrList QPSet set_dis; #endif // ndef Q_UNSAFE } QSubscrList; //${QF::types::QEQueue} ...................................................... struct QEQueue; //$enddecl${QF::types} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QF::QActive} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QF::QActive} ............................................................. //! @class QActive //! @extends QAsm typedef struct QActive { // protected: QAsm super; //! @protected @memberof QActive uint8_t prio; //! @protected @memberof QActive uint8_t pthre; #ifdef QACTIVE_THREAD_TYPE //! @protected @memberof QActive QACTIVE_THREAD_TYPE thread; #endif // def QACTIVE_THREAD_TYPE #ifdef QACTIVE_OS_OBJ_TYPE //! @protected @memberof QActive QACTIVE_OS_OBJ_TYPE osObject; #endif // def QACTIVE_OS_OBJ_TYPE #ifdef QACTIVE_EQUEUE_TYPE //! @protected @memberof QActive QACTIVE_EQUEUE_TYPE eQueue; #endif // def QACTIVE_EQUEUE_TYPE #ifndef Q_UNSAFE //! @protected @memberof QActive uint8_t prio_dis; #endif // ndef Q_UNSAFE #ifndef Q_UNSAFE //! @protected @memberof QActive uint8_t pthre_dis; #endif // ndef Q_UNSAFE // private: } QActive; //! @static @private @memberof QActive extern QActive * QActive_registry_[QF_MAX_ACTIVE + 1U]; //! @static @private @memberof QActive extern QSubscrList * QActive_subscrList_; //! @static @private @memberof QActive extern enum_t QActive_maxPubSignal_; // protected: //! @protected @memberof QActive void QActive_ctor(QActive * const me, QStateHandler const initial); // public: //! @public @memberof QActive void QActive_setAttr(QActive * const me, uint32_t attr1, void const * attr2); // private: //! @private @memberof QActive void QActive_start_(QActive * const me, QPrioSpec const prioSpec, QEvt const * * const qSto, uint_fast16_t const qLen, void * const stkSto, uint_fast16_t const stkSize, void const * const par); // protected: #ifdef QACTIVE_CAN_STOP //! @protected @memberof QActive void QActive_stop(QActive * const me); #endif // def QACTIVE_CAN_STOP // private: //! @private @memberof QActive void QActive_register_(QActive * const me); //! @private @memberof QActive void QActive_unregister_(QActive * const me); //! @private @memberof QActive bool QActive_post_(QActive * const me, QEvt const * const e, uint_fast16_t const margin, void const * const sender); //! @private @memberof QActive void QActive_postLIFO_(QActive * const me, QEvt const * const e); //! @private @memberof QActive QEvt const * QActive_get_(QActive * const me); // public: //! @static @public @memberof QActive void QActive_psInit( QSubscrList * const subscrSto, enum_t const maxSignal); // private: //! @static @private @memberof QActive void QActive_publish_( QEvt const * const e, void const * const sender, uint_fast8_t const qsId); // protected: //! @protected @memberof QActive void QActive_subscribe(QActive const * const me, enum_t const sig); //! @protected @memberof QActive void QActive_unsubscribe(QActive const * const me, enum_t const sig); //! @protected @memberof QActive void QActive_unsubscribeAll(QActive const * const me); //! @protected @memberof QActive bool QActive_defer(QActive const * const me, struct QEQueue * const eq, QEvt const * const e); //! @protected @memberof QActive bool QActive_recall(QActive * const me, struct QEQueue * const eq); //! @protected @memberof QActive uint_fast16_t QActive_flushDeferred(QActive const * const me, struct QEQueue * const eq, uint_fast16_t const num); // private: //! @private @memberof QActive void QActive_evtLoop_(QActive * const me); //$enddecl${QF::QActive} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QF::QMActive} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QF::QMActive} ............................................................ //! @class QMActive //! @extends QActive typedef struct { // protected: QActive super; } QMActive; // protected: //! @protected @memberof QMActive void QMActive_ctor(QMActive * const me, QStateHandler const initial); //$enddecl${QF::QMActive} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QF::QTimeEvt} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QF::QTimeEvt} ............................................................ //! @class QTimeEvt //! @extends QEvt typedef struct QTimeEvt { // protected: QEvt super; // private: //! @private @memberof QTimeEvt struct QTimeEvt * volatile next; //! @private @memberof QTimeEvt void * volatile act; //! @private @memberof QTimeEvt QTimeEvtCtr volatile ctr; //! @private @memberof QTimeEvt QTimeEvtCtr interval; } QTimeEvt; //! @static @private @memberof QTimeEvt extern QTimeEvt QTimeEvt_timeEvtHead_[QF_MAX_TICK_RATE]; // public: //! @public @memberof QTimeEvt void QTimeEvt_ctorX(QTimeEvt * const me, QActive * const act, enum_t const sig, uint_fast8_t const tickRate); //! @public @memberof QTimeEvt void QTimeEvt_armX(QTimeEvt * const me, QTimeEvtCtr const nTicks, QTimeEvtCtr const interval); //! @public @memberof QTimeEvt bool QTimeEvt_disarm(QTimeEvt * const me); //! @public @memberof QTimeEvt bool QTimeEvt_rearm(QTimeEvt * const me, QTimeEvtCtr const nTicks); //! @public @memberof QTimeEvt bool QTimeEvt_wasDisarmed(QTimeEvt * const me); //! @public @memberof QTimeEvt QTimeEvtCtr QTimeEvt_currCtr(QTimeEvt const * const me); //! @static @private @memberof QTimeEvt void QTimeEvt_tick_( uint_fast8_t const tickRate, void const * const sender); // private: #ifdef Q_UTEST //! @static @private @memberof QTimeEvt void QTimeEvt_tick1_( uint_fast8_t const tickRate, void const * const sender); #endif // def Q_UTEST // public: //! @static @public @memberof QTimeEvt bool QTimeEvt_noActive(uint_fast8_t const tickRate); //$enddecl${QF::QTimeEvt} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QF::QTicker} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QF::QTicker} ............................................................. //! @class QTicker //! @extends QActive typedef struct { // protected: QActive super; } QTicker; // public: //! @public @memberof QTicker void QTicker_ctor(QTicker * const me, uint_fast8_t const tickRate); // private: //! @private @memberof QTicker void QTicker_init_( QAsm * const me, void const * const par, uint_fast8_t const qsId); //! @private @memberof QTicker void QTicker_dispatch_( QAsm * const me, QEvt const * const e, uint_fast8_t const qsId); //! @private @memberof QTicker void QTicker_trig_( QActive * const me, void const * const sender); //$enddecl${QF::QTicker} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QF::QF-base} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QF::QF-base::init} ....................................................... //! @static @public @memberof QF void QF_init(void); //${QF::QF-base::stop} ....................................................... //! @static @public @memberof QF void QF_stop(void); //${QF::QF-base::run} ........................................................ //! @static @public @memberof QF int_t QF_run(void); //${QF::QF-base::getQueueMin} ................................................ //! @static @public @memberof QF uint_fast16_t QF_getQueueMin(uint_fast8_t const prio); //${QF::QF-base::onStartup} .................................................. //! @static @public @memberof QF void QF_onStartup(void); //${QF::QF-base::onCleanup} .................................................. //! @static @public @memberof QF void QF_onCleanup(void); //${QF::QF-base::onContextSw} ................................................ #ifdef QF_ON_CONTEXT_SW //! @static @public @memberof QF void QF_onContextSw( QActive * prev, QActive * next); #endif // def QF_ON_CONTEXT_SW //$enddecl${QF::QF-base} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QF::QF-dyn} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QF::QF-dyn::poolInit} .................................................... //! @static @public @memberof QF void QF_poolInit( void * const poolSto, uint_fast32_t const poolSize, uint_fast16_t const evtSize); //${QF::QF-dyn::poolGetMaxBlockSize} ......................................... //! @static @public @memberof QF uint_fast16_t QF_poolGetMaxBlockSize(void); //${QF::QF-dyn::getPoolMin} .................................................. //! @static @public @memberof QF uint_fast16_t QF_getPoolMin(uint_fast8_t const poolNum); //${QF::QF-dyn::newX_} ....................................................... //! @static @private @memberof QF QEvt * QF_newX_( uint_fast16_t const evtSize, uint_fast16_t const margin, enum_t const sig); //${QF::QF-dyn::gc} .......................................................... //! @static @public @memberof QF void QF_gc(QEvt const * const e); //${QF::QF-dyn::newRef_} ..................................................... //! @static @private @memberof QF QEvt const * QF_newRef_( QEvt const * const e, void const * const evtRef); //${QF::QF-dyn::deleteRef_} .................................................. //! @static @private @memberof QF void QF_deleteRef_(void const * const evtRef); //${QF::QF-dyn::gcFromISR} ................................................... //! @static @public @memberof QF void QF_gcFromISR(QEvt const * const e); //$enddecl${QF::QF-dyn} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //$declare${QF-macros} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv //${QF-macros::QF_NO_MARGIN} ................................................. #define QF_NO_MARGIN ((uint_fast16_t)0xFFFFU) //${QF-macros::Q_PRIO} ....................................................... #define Q_PRIO(prio_, pthre_) ((QPrioSpec)((prio_) | ((pthre_) << 8U))) //${QF-macros::Q_NEW} ........................................................ #ifndef QEVT_PAR_INIT #define Q_NEW(evtT_, sig_) ((evtT_ *)QF_newX_((uint_fast16_t)sizeof(evtT_), \ QF_NO_MARGIN, (enum_t)(sig_))) #endif // ndef QEVT_PAR_INIT //${QF-macros::Q_NEW} ........................................................ #ifdef QEVT_PAR_INIT #define Q_NEW(evtT_, sig_, ...) \ (evtT_##_init((evtT_ *)QF_newX_((uint_fast16_t)sizeof(evtT_), \ QF_NO_MARGIN, (sig_)), __VA_ARGS__)) #endif // def QEVT_PAR_INIT //${QF-macros::Q_NEW_X} ...................................................... #ifndef QEVT_PAR_INIT #define Q_NEW_X(evtT_, margin_, sig_) \ ((evtT_ *)QF_newX_((uint_fast16_t)sizeof(evtT_), \ (margin_), (enum_t)(sig_))) #endif // ndef QEVT_PAR_INIT //${QF-macros::Q_NEW_X} ...................................................... #ifdef QEVT_PAR_INIT #define Q_NEW_X(evtT_, margin_, sig_, ...) \ (evtT_##_init((evtT_ *)QF_newX_((uint_fast16_t)sizeof(evtT_), \ (margin_), (sig_)), __VA_ARGS__)) #endif // def QEVT_PAR_INIT //${QF-macros::Q_NEW_REF} .................................................... #define Q_NEW_REF(evtRef_, evtT_) \ ((evtRef_) = (evtT_ const *)QF_newRef_(e, (evtRef_))) //${QF-macros::Q_DELETE_REF} ................................................. #define Q_DELETE_REF(evtRef_) do { \ QF_deleteRef_((evtRef_)); \ (evtRef_) = (void *)0; \ } while (false) //${QF-macros::QACTIVE_START} ................................................ #define QACTIVE_START(me_, prioSpec_, qSto_, qLen_, stkSto_, stkSize_, par_) \ (QActive_start_((QActive *)(me_), (prioSpec_), \ (qSto_), (qLen_), (stkSto_), (stkSize_), (par_))) //${QF-macros::QACTIVE_POST} ................................................. #ifdef Q_SPY #define QACTIVE_POST(me_, e_, sender_) \ ((void)QActive_post_((me_), (e_), QF_NO_MARGIN, (sender_))) #endif // def Q_SPY //${QF-macros::QACTIVE_POST} ................................................. #ifndef Q_SPY #define QACTIVE_POST(me_, e_, dummy) \ ((void)QActive_post_((me_), (e_), QF_NO_MARGIN, (void *)0)) #endif // ndef Q_SPY //${QF-macros::QACTIVE_POST_X} ............................................... #ifdef Q_SPY #define QACTIVE_POST_X(me_, e_, margin_, sender_) \ (QActive_post_((me_), (e_), (margin_), (sender_))) #endif // def Q_SPY //${QF-macros::QACTIVE_POST_X} ............................................... #ifndef Q_SPY #define QACTIVE_POST_X(me_, e_, margin_, dummy) \ (QActive_post_((me_), (e_), (margin_), (void *)0)) #endif // ndef Q_SPY //${QF-macros::QACTIVE_POST_LIFO} ............................................ #define QACTIVE_POST_LIFO(me_, e_) \ (QActive_postLIFO_((me_), (e_))) //${QF-macros::QACTIVE_PUBLISH} .............................................. #ifdef Q_SPY #define QACTIVE_PUBLISH(e_, sender_) \ (QActive_publish_((e_), (void const *)(sender_), (sender_)->prio)) #endif // def Q_SPY //${QF-macros::QACTIVE_PUBLISH} .............................................. #ifndef Q_SPY #define QACTIVE_PUBLISH(e_, dummy) (QActive_publish_((e_), (void *)0, 0U)) #endif // ndef Q_SPY //${QF-macros::QTIMEEVT_TICK_X} .............................................. #ifdef Q_SPY #define QTIMEEVT_TICK_X(tickRate_, sender_) (QTimeEvt_tick_((tickRate_), (sender_))) #endif // def Q_SPY //${QF-macros::QTIMEEVT_TICK_X} .............................................. #ifndef Q_SPY #define QTIMEEVT_TICK_X(tickRate_, dummy) (QTimeEvt_tick_((tickRate_), (void *)0)) #endif // ndef Q_SPY //${QF-macros::QTIMEEVT_TICK} ................................................ #define QTIMEEVT_TICK(sender_) QTIMEEVT_TICK_X(0U, (sender_)) //${QF-macros::QTICKER_TRIG} ................................................. #ifdef Q_SPY #define QTICKER_TRIG(ticker_, sender_) (QTicker_trig_((ticker_), (sender_))) #endif // def Q_SPY //${QF-macros::QTICKER_TRIG} ................................................. #ifndef Q_SPY #define QTICKER_TRIG(ticker_, sender_) (QTicker_trig_((ticker_), (void *)0)) #endif // ndef Q_SPY //${QF-macros::QF_CRIT_EXIT_NOP} ............................................. #ifndef QF_CRIT_EXIT_NOP #define QF_CRIT_EXIT_NOP() ((void)0) #endif // ndef QF_CRIT_EXIT_NOP //${QF-macros::QF_TICK_X} .................................................... #define QF_TICK_X(tickRate_, sender_) QTIMEEVT_TICK_X((tickRate_), (sender_)) //${QF-macros::QF_TICK} ...................................................... #define QF_TICK(sender_) QTIMEEVT_TICK(sender_) //${QF-macros::QF_PUBLISH} ................................................... #define QF_PUBLISH(e_, sender_) QACTIVE_PUBLISH((e_), (sender_)) //${QF-macros::QF_MEM_SYS} ................................................... #ifndef QF_MEM_SYS #define QF_MEM_SYS() ((void)0) #endif // ndef QF_MEM_SYS //${QF-macros::QF_MEM_APP} ................................................... #ifndef QF_MEM_APP #define QF_MEM_APP() ((void)0) #endif // ndef QF_MEM_APP //$enddecl${QF-macros} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #endif // QP_H_