qpc/source/qf_qmact.c
Quantum Leaps b265179a77 5.4.0a
2015-05-01 08:40:16 -04:00

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 */
}