mirror of
https://github.com/QuantumLeaps/qpcpp.git
synced 2025-01-28 06:02:56 +08:00
160 lines
5.2 KiB
C++
160 lines
5.2 KiB
C++
//.$file${.::launcher.cpp} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
//
|
|
// Model: start-stop.qm
|
|
// File: ${.::launcher.cpp}
|
|
//
|
|
// This code has been generated by QM 5.1.0 <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${.::launcher.cpp} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
#include "qpcpp.hpp"
|
|
#include "worker.hpp"
|
|
#include "bsp.hpp"
|
|
#include <new> // for placement new
|
|
|
|
//Q_DEFINE_THIS_FILE
|
|
|
|
static QP::QEvt const *l_workerQueueSto[10];
|
|
static StackType_t l_workerStackSto[configMINIMAL_STACK_SIZE];
|
|
|
|
//.$declare${AOs::Launcher} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
//.${AOs::Launcher} ..........................................................
|
|
class Launcher : public QP::QActive {
|
|
public:
|
|
static Launcher inst;
|
|
Worker * m_worker;
|
|
|
|
private:
|
|
QP::QTimeEvt m_te;
|
|
|
|
public:
|
|
Launcher();
|
|
|
|
protected:
|
|
Q_STATE_DECL(initial);
|
|
Q_STATE_DECL(inactive);
|
|
Q_STATE_DECL(active);
|
|
};
|
|
//.$enddecl${AOs::Launcher} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
//.$skip${QP_VERSION} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
//. Check for the minimum required QP version
|
|
#if (QP_VERSION < 680U) || (QP_VERSION != ((QP_RELEASE^4294967295U) % 0x3E8U))
|
|
#error qpcpp version 6.8.0 or higher required
|
|
#endif
|
|
//.$endskip${QP_VERSION} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
//.$define${AOs::AO_Launcher} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
//.${AOs::AO_Launcher} .......................................................
|
|
QP::QActive * const AO_Launcher = &Launcher::inst; // opaque pointer
|
|
//.$enddef${AOs::AO_Launcher} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
//.$define${AOs::Launcher} vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
|
|
//.${AOs::Launcher} ..........................................................
|
|
Launcher Launcher::inst;
|
|
//.${AOs::Launcher::Launcher} ................................................
|
|
Launcher::Launcher()
|
|
: QActive(initial),
|
|
m_worker(0),
|
|
m_te(this, TIMEOUT_SIG, 0U)
|
|
{}
|
|
|
|
//.${AOs::Launcher::SM} ......................................................
|
|
Q_STATE_DEF(Launcher, initial) {
|
|
//.${AOs::Launcher::SM::initial}
|
|
(void)e; // unused parameter
|
|
|
|
subscribe(DONE_SIG);
|
|
|
|
QS_OBJ_DICTIONARY(&Launcher::inst);
|
|
QS_OBJ_DICTIONARY(&Launcher::inst.m_te);
|
|
|
|
QS_SIG_DICTIONARY(DONE_SIG, nullptr);
|
|
QS_SIG_DICTIONARY(TIMEOUT_SIG, nullptr);
|
|
|
|
QS_FUN_DICTIONARY(&Launcher::inactive);
|
|
QS_FUN_DICTIONARY(&Launcher::active);
|
|
|
|
return tran(&inactive);
|
|
}
|
|
//.${AOs::Launcher::SM::inactive} ............................................
|
|
Q_STATE_DEF(Launcher, inactive) {
|
|
QP::QState status_;
|
|
switch (e->sig) {
|
|
//.${AOs::Launcher::SM::inactive}
|
|
case Q_ENTRY_SIG: {
|
|
m_te.armX(BSP::TICKS_PER_SEC / 5U, 0);
|
|
status_ = Q_RET_HANDLED;
|
|
break;
|
|
}
|
|
//.${AOs::Launcher::SM::inactive}
|
|
case Q_EXIT_SIG: {
|
|
m_te.disarm();
|
|
status_ = Q_RET_HANDLED;
|
|
break;
|
|
}
|
|
//.${AOs::Launcher::SM::inactive::TIMEOUT}
|
|
case TIMEOUT_SIG: {
|
|
status_ = tran(&active);
|
|
break;
|
|
}
|
|
default: {
|
|
status_ = super(&top);
|
|
break;
|
|
}
|
|
}
|
|
return status_;
|
|
}
|
|
//.${AOs::Launcher::SM::active} ..............................................
|
|
Q_STATE_DEF(Launcher, active) {
|
|
QP::QState status_;
|
|
switch (e->sig) {
|
|
//.${AOs::Launcher::SM::active}
|
|
case Q_ENTRY_SIG: {
|
|
// placement new to execute the Worker ctor
|
|
m_worker = new (&Worker::inst) Worker;
|
|
m_worker->start(
|
|
1U, // QP priority of the AO
|
|
l_workerQueueSto, // event queue storage
|
|
Q_DIM(l_workerQueueSto), // queue length [events]
|
|
l_workerStackSto, // stack storage
|
|
sizeof(l_workerStackSto)); // stack size [bytes]
|
|
status_ = Q_RET_HANDLED;
|
|
break;
|
|
}
|
|
//.${AOs::Launcher::SM::active}
|
|
case Q_EXIT_SIG: {
|
|
m_worker->~Worker(); // explicit destructor call
|
|
m_worker = nullptr;
|
|
status_ = Q_RET_HANDLED;
|
|
break;
|
|
}
|
|
//.${AOs::Launcher::SM::active::DONE}
|
|
case DONE_SIG: {
|
|
// arm a timer for at least one tick
|
|
m_te.armX(2, 0);
|
|
// wait for Worker to stop...
|
|
status_ = Q_RET_HANDLED;
|
|
break;
|
|
}
|
|
//.${AOs::Launcher::SM::active::TIMEOUT}
|
|
case TIMEOUT_SIG: {
|
|
status_ = tran(&inactive);
|
|
break;
|
|
}
|
|
default: {
|
|
status_ = super(&top);
|
|
break;
|
|
}
|
|
}
|
|
return status_;
|
|
}
|
|
//.$enddef${AOs::Launcher} ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|