mirror of
https://github.com/QuantumLeaps/qpc.git
synced 2025-01-14 06:43:19 +08:00
95 lines
3.4 KiB
C
95 lines
3.4 KiB
C
/**
|
|
* @file
|
|
* @brief QMActive_ctor() definition
|
|
*
|
|
* @description
|
|
* This file must remain separate from the rest to avoid pulling in the
|
|
* "virtual" functions QHsm_init_() and QHsm_dispatch_() in case they
|
|
* are not used by the application.
|
|
*
|
|
* @sa qf_qact.c
|
|
*
|
|
* @ingroup qf
|
|
* @cond
|
|
******************************************************************************
|
|
* Last updated for version 5.4.0
|
|
* Last updated on 2015-04-30
|
|
*
|
|
* Q u a n t u m L e a P s
|
|
* ---------------------------
|
|
* innovating embedded systems
|
|
*
|
|
* Copyright (C) Quantum Leaps, www.state-machine.com.
|
|
*
|
|
* This program is open source software: you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as published
|
|
* by the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Alternatively, this program may be distributed and modified under the
|
|
* terms of Quantum Leaps commercial licenses, which expressly supersede
|
|
* the GNU General Public License and are specifically designed for
|
|
* licensees interested in retaining the proprietary status of their code.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Contact information:
|
|
* Web: www.state-machine.com
|
|
* Email: info@state-machine.com
|
|
******************************************************************************
|
|
* @endcond
|
|
*/
|
|
#define QP_IMPL /* this is QP implementation */
|
|
#include "qf_port.h" /* QF port */
|
|
#include "qf_pkg.h" /* QF package-scope interface */
|
|
|
|
/*Q_DEFINE_THIS_MODULE("qf_qmact")*/
|
|
|
|
/****************************************************************************/
|
|
/**
|
|
* @description
|
|
* Performs the first step of active object initialization by assigning
|
|
* the virtual pointer and calling the superclass constructor.
|
|
*
|
|
* @param[in,out] me pointer (see @ref oop)
|
|
* @param[in] initial pointer to the event to be dispatched to the MSM
|
|
*
|
|
* @note Must be called only ONCE before QMSM_INIT().
|
|
*
|
|
* @sa QHsm_ctor() and QFsm_ctor()
|
|
*/
|
|
void QMActive_ctor(QMActive * const me, QStateHandler initial) {
|
|
static QMActiveVtbl const vtbl = { /* QMActive virtual table */
|
|
{ &QMsm_init_,
|
|
&QMsm_dispatch_ },
|
|
&QActive_start_,
|
|
&QActive_post_,
|
|
&QActive_postLIFO_
|
|
};
|
|
|
|
/* clear the whole QActive object, so that the framework can start
|
|
* correctly even if the startup code fails to clear the uninitialized
|
|
* data (as is required by the C Standard).
|
|
*/
|
|
QF_bzero(me, (uint_fast16_t)sizeof(*me));
|
|
|
|
/**
|
|
* @note QMActive inherits QActive, so by the @ref oop convention
|
|
* it should call the constructor of the superclass, i.e., QActive_ctor().
|
|
* However, this would pull in the QActiveVtbl, which in turn will pull
|
|
* in the code for QHsm_init_() and QHsm_dispatch_() implemetations,
|
|
* which is expensive. To avoid this code size penalty, in case QHsm is
|
|
* not used in a given project, the call to QMsm_ctor() avoids pulling
|
|
* in the code for QHsm.
|
|
*/
|
|
QMsm_ctor(&me->super, initial);
|
|
|
|
me->super.vptr = &vtbl.super; /* hook vptr to QMActive virtual table */
|
|
}
|