//$file${.::CPF.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//
// Model: CPF.qm
// File:  ${.::CPF.cpp}
//
// This code has been generated by QM 4.5.1 (https://www.state-machine.com/qm).
// DO NOT EDIT THIS FILE MANUALLY. All your changes will be lost.
//
// 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.
//
// 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.
//
//$endhead${.::CPF.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
#include "qpcpp.h" // QP/C++ framework API
#include "bsp.h"   // Board Support Package interface

using namespace QP;

// ask QM to declare the Mission class ----------------------------------------
//$declare${AOs::Mission} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//${AOs::Mission} ............................................................
class Mission : public QP::QActive {
private:
    QP::QTimeEvt m_timeEvt;

public:
    Mission();

protected:
    Q_STATE_DECL(initial);
    Q_STATE_DECL(off);
    Q_STATE_DECL(on);
};
//$enddecl${AOs::Mission} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

// instantiate the Mission active object --------------------------------------
static Mission l_mission;
QActive * const AO_Mission = &l_Mission;

// ask QM to define the Mission class (including the state machine) -----------
//$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
// Check for the minimum required QP version
#if (QP_VERSION < 650U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
#error qpcpp version 6.5.0 or higher required
#endif
//$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//$define${AOs::Mission} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//${AOs::Mission} ............................................................
//${AOs::Mission::Mission} ...................................................
Mission::Mission()
  : QActive(Q_STATE_CAST(&Blinky::initial)),
    m_timeEvt(this, TIMEOUT_SIG, 0U)
{}

//${AOs::Mission::SM} ........................................................
Q_STATE_DEF(Mission, initial) {
    //${AOs::Mission::SM::initial}
    // arm the private time event to expire in 1/2s
    // and periodically every 1/2 second
    m_timeEvt.armX(BSP::TICKS_PER_SEC/2,
                   BSP::TICKS_PER_SEC/2);
    (void)e; // unused parameter
    return tran(&off);
}
//${AOs::Mission::SM::off} ...................................................
Q_STATE_DEF(Mission, off) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::off}
        case Q_ENTRY_SIG: {
            BSP::ledOff();
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::off::TIMEOUT}
        case TIMEOUT_SIG: {
            status_ = tran(&on);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//${AOs::Mission::SM::on} ....................................................
Q_STATE_DEF(Mission, on) {
    QP::QState status_;
    switch (e->sig) {
        //${AOs::Mission::SM::on}
        case Q_ENTRY_SIG: {
            BSP::ledOn();
            status_ = Q_RET_HANDLED;
            break;
        }
        //${AOs::Mission::SM::on::TIMEOUT}
        case TIMEOUT_SIG: {
            status_ = tran(&off);
            break;
        }
        default: {
            status_ = super(&top);
            break;
        }
    }
    return status_;
}
//$enddef${AOs::Mission} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
