You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
343 lines
12 KiB
Plaintext
343 lines
12 KiB
Plaintext
|
8 months ago
|
<?xml version="1.0" encoding="UTF-8"?>
|
||
|
|
<model version="7.0.1" links="1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.state-machine.com/qm/qm7.xsd">
|
||
|
|
<documentation>Real-time example</documentation>
|
||
|
|
<!--${qpc}-->
|
||
|
|
<framework name="qpc"/>
|
||
|
|
<!--${Shared}-->
|
||
|
|
<package name="Shared" stereotype="0x01">
|
||
|
|
<!--${Shared::AppSignals}-->
|
||
|
|
<attribute name="AppSignals" type="enum" visibility="0x04" properties="0x00">
|
||
|
|
<code>{
|
||
|
|
PERIODIC_SPEC_SIG = Q_USER_SIG,
|
||
|
|
TIMEOUT_SIG,
|
||
|
|
SPORADIC_A_SIG,
|
||
|
|
SPORADIC_B_SIG,
|
||
|
|
REMINDER_SIG,
|
||
|
|
// ...
|
||
|
|
MAX_SIG // the last signal
|
||
|
|
};</code>
|
||
|
|
</attribute>
|
||
|
|
<!--${Shared::PeriodicSpecEvt}-->
|
||
|
|
<class name="PeriodicSpecEvt" superclass="qpc::QEvt">
|
||
|
|
<!--${Shared::PeriodicSpecEvt::toggles}-->
|
||
|
|
<attribute name="toggles" type="uint16_t" visibility="0x00" properties="0x00"/>
|
||
|
|
<!--${Shared::PeriodicSpecEvt::ticks}-->
|
||
|
|
<attribute name="ticks" type="uint8_t" visibility="0x00" properties="0x00"/>
|
||
|
|
</class>
|
||
|
|
<!--${Shared::SporadicSpecEvt}-->
|
||
|
|
<class name="SporadicSpecEvt" superclass="qpc::QEvt">
|
||
|
|
<!--${Shared::SporadicSpecEvt::toggles}-->
|
||
|
|
<attribute name="toggles" type="uint16_t" visibility="0x00" properties="0x00"/>
|
||
|
|
<!--${Shared::SporadicSpecEvt::rtc_toggles}-->
|
||
|
|
<attribute name="rtc_toggles" type="uint16_t" visibility="0x00" properties="0x00"/>
|
||
|
|
</class>
|
||
|
|
<!--${Shared::AO_Periodic1}-->
|
||
|
|
<attribute name="AO_Periodic1" type="QActive * const" visibility="0x00" properties="0x00">
|
||
|
|
<code>= (QActive *)&Periodic1_inst;</code>
|
||
|
|
</attribute>
|
||
|
|
<!--${Shared::Periodic1_ctor}-->
|
||
|
|
<operation name="Periodic1_ctor" type="void" visibility="0x00" properties="0x00">
|
||
|
|
<code>Periodic1 * const me = &Periodic1_inst;
|
||
|
|
QMActive_ctor(&me->super, Q_STATE_CAST(&Periodic1_initial));
|
||
|
|
QTimeEvt_ctorX(&me->te, (QActive *)me, TIMEOUT_SIG, 0U);</code>
|
||
|
|
</operation>
|
||
|
|
<!--${Shared::AO_Periodic4}-->
|
||
|
|
<attribute name="AO_Periodic4" type="QActive * const" visibility="0x00" properties="0x00">
|
||
|
|
<code>= (QActive *)&Periodic4_inst;</code>
|
||
|
|
</attribute>
|
||
|
|
<!--${Shared::Periodic4_ctor}-->
|
||
|
|
<operation name="Periodic4_ctor" type="void" visibility="0x00" properties="0x00">
|
||
|
|
<code>Periodic4 * const me = &Periodic4_inst;
|
||
|
|
QMActive_ctor(&me->super, Q_STATE_CAST(&Periodic4_initial));
|
||
|
|
QTimeEvt_ctorX(&me->te, (QActive *)me, TIMEOUT_SIG, 0U);</code>
|
||
|
|
</operation>
|
||
|
|
<!--${Shared::AO_Sporadic2}-->
|
||
|
|
<attribute name="AO_Sporadic2" type="QActive * const" visibility="0x00" properties="0x00">
|
||
|
|
<code>= (QActive *)&Sporadic2_inst;</code>
|
||
|
|
</attribute>
|
||
|
|
<!--${Shared::Sporadic2_ctor}-->
|
||
|
|
<operation name="Sporadic2_ctor" type="void" visibility="0x00" properties="0x00">
|
||
|
|
<code>Sporadic2 * const me = &Sporadic2_inst;
|
||
|
|
QMActive_ctor(&me->super, Q_STATE_CAST(&Sporadic2_initial));</code>
|
||
|
|
</operation>
|
||
|
|
<!--${Shared::AO_Sporadic3}-->
|
||
|
|
<attribute name="AO_Sporadic3" type="QActive * const" visibility="0x00" properties="0x00">
|
||
|
|
<code>= (QActive *)&Sporadic3_inst;</code>
|
||
|
|
</attribute>
|
||
|
|
<!--${Shared::Sporadic3_ctor}-->
|
||
|
|
<operation name="Sporadic3_ctor" type="void" visibility="0x00" properties="0x00">
|
||
|
|
<code>Sporadic3 * const me = &Sporadic3_inst;
|
||
|
|
QMActive_ctor(&me->super, Q_STATE_CAST(&Sporadic3_initial));</code>
|
||
|
|
</operation>
|
||
|
|
</package>
|
||
|
|
<!--${AOs}-->
|
||
|
|
<package name="AOs" stereotype="0x02">
|
||
|
|
<!--${AOs::Periodic1}-->
|
||
|
|
<class name="Periodic1" superclass="qpc::QMActive">
|
||
|
|
<!--${AOs::Periodic1::te}-->
|
||
|
|
<attribute name="te" type="QTimeEvt" visibility="0x00" properties="0x00"/>
|
||
|
|
<!--${AOs::Periodic1::toggles}-->
|
||
|
|
<attribute name="toggles" type="uint16_t" visibility="0x00" properties="0x00"/>
|
||
|
|
<!--${AOs::Periodic1::inst}-->
|
||
|
|
<attribute name="inst" type="Periodic1" visibility="0x00" properties="0x01"/>
|
||
|
|
<!--${AOs::Periodic1::SM}-->
|
||
|
|
<statechart properties="0x02">
|
||
|
|
<!--${AOs::Periodic1::SM::initial}-->
|
||
|
|
<initial target="../1">
|
||
|
|
<action>// the initial event must be provided and must be WORKLOAD_SIG
|
||
|
|
QEvt const *e = (QEvt const *)par;
|
||
|
|
|
||
|
|
Q_REQUIRE_ID(300, (e != (QEvt const *)0)
|
||
|
|
&& (e->sig == PERIODIC_SPEC_SIG));
|
||
|
|
|
||
|
|
QTimeEvt_armX(&me->te,
|
||
|
|
Q_EVT_CAST(PeriodicSpecEvt)->ticks,
|
||
|
|
Q_EVT_CAST(PeriodicSpecEvt)->ticks);
|
||
|
|
me->toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles;</action>
|
||
|
|
<initial_glyph conn="2,4,5,1,46,4,-2">
|
||
|
|
<action box="0,-2,6,2"/>
|
||
|
|
</initial_glyph>
|
||
|
|
</initial>
|
||
|
|
<!--${AOs::Periodic1::SM::active}-->
|
||
|
|
<state name="active">
|
||
|
|
<!--${AOs::Periodic1::SM::active::TIMEOUT}-->
|
||
|
|
<tran trig="TIMEOUT">
|
||
|
|
<action brief="long-RTC">for (uint16_t i = me->toggles; i > 0U; --i) {
|
||
|
|
BSP_d6on();
|
||
|
|
BSP_d6off();
|
||
|
|
}</action>
|
||
|
|
<tran_glyph conn="2,20,3,-1,40">
|
||
|
|
<action box="0,-2,19,2"/>
|
||
|
|
</tran_glyph>
|
||
|
|
</tran>
|
||
|
|
<!--${AOs::Periodic1::SM::active::PERIODIC_SPEC}-->
|
||
|
|
<tran trig="PERIODIC_SPEC">
|
||
|
|
<action>BSP_d6on();
|
||
|
|
QTimeEvt_disarm(&me->te);
|
||
|
|
QTimeEvt_armX(&me->te,
|
||
|
|
Q_EVT_CAST(PeriodicSpecEvt)->ticks,
|
||
|
|
Q_EVT_CAST(PeriodicSpecEvt)->ticks);
|
||
|
|
me->toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles;
|
||
|
|
BSP_d6off();</action>
|
||
|
|
<tran_glyph conn="2,14,3,-1,40">
|
||
|
|
<action box="0,-2,35,2"/>
|
||
|
|
</tran_glyph>
|
||
|
|
</tran>
|
||
|
|
<state_glyph node="2,6,44,18"/>
|
||
|
|
</state>
|
||
|
|
<state_diagram size="50,28"/>
|
||
|
|
</statechart>
|
||
|
|
</class>
|
||
|
|
<!--${AOs::Periodic4}-->
|
||
|
|
<class name="Periodic4" superclass="qpc::QMActive">
|
||
|
|
<!--${AOs::Periodic4::te}-->
|
||
|
|
<attribute name="te" type="QTimeEvt" visibility="0x00" properties="0x00"/>
|
||
|
|
<!--${AOs::Periodic4::toggles}-->
|
||
|
|
<attribute name="toggles" type="uint16_t" visibility="0x00" properties="0x00"/>
|
||
|
|
<!--${AOs::Periodic4::inst}-->
|
||
|
|
<attribute name="inst" type="Periodic4" visibility="0x00" properties="0x01"/>
|
||
|
|
<!--${AOs::Periodic4::SM}-->
|
||
|
|
<statechart properties="0x02">
|
||
|
|
<!--${AOs::Periodic4::SM::initial}-->
|
||
|
|
<initial target="../1">
|
||
|
|
<action>// the initial event must be provided and must be WORKLOAD_SIG
|
||
|
|
QEvt const *e = (QEvt const *)par;
|
||
|
|
|
||
|
|
Q_REQUIRE_ID(300, (e != (QEvt const *)0)
|
||
|
|
&& (e->sig == PERIODIC_SPEC_SIG));
|
||
|
|
|
||
|
|
QTimeEvt_armX(&me->te,
|
||
|
|
Q_EVT_CAST(PeriodicSpecEvt)->ticks,
|
||
|
|
Q_EVT_CAST(PeriodicSpecEvt)->ticks);
|
||
|
|
me->toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles;</action>
|
||
|
|
<initial_glyph conn="2,4,5,1,46,4,-2">
|
||
|
|
<action box="0,-2,6,2"/>
|
||
|
|
</initial_glyph>
|
||
|
|
</initial>
|
||
|
|
<!--${AOs::Periodic4::SM::active}-->
|
||
|
|
<state name="active">
|
||
|
|
<!--${AOs::Periodic4::SM::active::TIMEOUT}-->
|
||
|
|
<tran trig="TIMEOUT">
|
||
|
|
<action brief="long-RTC">for (uint16_t i = me->toggles; i > 0U; --i) {
|
||
|
|
BSP_d3on();
|
||
|
|
BSP_d3off();
|
||
|
|
}</action>
|
||
|
|
<tran_glyph conn="2,20,3,-1,40">
|
||
|
|
<action box="0,-2,19,2"/>
|
||
|
|
</tran_glyph>
|
||
|
|
</tran>
|
||
|
|
<!--${AOs::Periodic4::SM::active::PERIODIC_SPEC}-->
|
||
|
|
<tran trig="PERIODIC_SPEC">
|
||
|
|
<action>BSP_d3on();
|
||
|
|
QTimeEvt_disarm(&me->te);
|
||
|
|
QTimeEvt_armX(&me->te,
|
||
|
|
Q_EVT_CAST(PeriodicSpecEvt)->ticks,
|
||
|
|
Q_EVT_CAST(PeriodicSpecEvt)->ticks);
|
||
|
|
me->toggles = Q_EVT_CAST(PeriodicSpecEvt)->toggles;
|
||
|
|
BSP_d3off();</action>
|
||
|
|
<tran_glyph conn="2,14,3,-1,40">
|
||
|
|
<action box="0,-2,15,2"/>
|
||
|
|
</tran_glyph>
|
||
|
|
</tran>
|
||
|
|
<state_glyph node="2,6,44,18"/>
|
||
|
|
</state>
|
||
|
|
<state_diagram size="50,28"/>
|
||
|
|
</statechart>
|
||
|
|
</class>
|
||
|
|
<!--${AOs::Sporadic2}-->
|
||
|
|
<class name="Sporadic2" superclass="qpc::QMActive">
|
||
|
|
<!--${AOs::Sporadic2::inst}-->
|
||
|
|
<attribute name="inst" type="Sporadic2" visibility="0x00" properties="0x01"/>
|
||
|
|
<!--${AOs::Sporadic2::SM}-->
|
||
|
|
<statechart properties="0x02">
|
||
|
|
<!--${AOs::Sporadic2::SM::initial}-->
|
||
|
|
<initial target="../1">
|
||
|
|
<action>Q_UNUSED_PAR(par);</action>
|
||
|
|
<initial_glyph conn="2,4,5,1,42,4,-2">
|
||
|
|
<action box="0,-2,6,2"/>
|
||
|
|
</initial_glyph>
|
||
|
|
</initial>
|
||
|
|
<!--${AOs::Sporadic2::SM::active}-->
|
||
|
|
<state name="active">
|
||
|
|
<!--${AOs::Sporadic2::SM::active::SPORADIC_A}-->
|
||
|
|
<tran trig="SPORADIC_A">
|
||
|
|
<action brief="post-Sporadic3">Q_UNUSED_PAR(me);
|
||
|
|
|
||
|
|
BSP_d5on();
|
||
|
|
QACTIVE_POST(AO_Sporadic3, e, me); // Sporadic2 --> Sporadic3
|
||
|
|
BSP_d5off();</action>
|
||
|
|
<tran_glyph conn="2,12,3,-1,34">
|
||
|
|
<action box="0,-2,35,3"/>
|
||
|
|
</tran_glyph>
|
||
|
|
</tran>
|
||
|
|
<!--${AOs::Sporadic2::SM::active::SPORADIC_B}-->
|
||
|
|
<tran trig="SPORADIC_B">
|
||
|
|
<action brief="post-to-Periodic1,long-RTC">BSP_d5on();
|
||
|
|
QACTIVE_POST(AO_Periodic1, BSP_getEvtPeriodic1(1U), me);
|
||
|
|
BSP_d5off();
|
||
|
|
|
||
|
|
for (uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles;
|
||
|
|
i > 0U; --i)
|
||
|
|
{
|
||
|
|
BSP_d5on();
|
||
|
|
BSP_d5off();
|
||
|
|
}</action>
|
||
|
|
<tran_glyph conn="2,16,3,-1,34">
|
||
|
|
<action box="0,-2,34,2"/>
|
||
|
|
</tran_glyph>
|
||
|
|
</tran>
|
||
|
|
<state_glyph node="2,6,40,14"/>
|
||
|
|
</state>
|
||
|
|
<state_diagram size="50,24"/>
|
||
|
|
</statechart>
|
||
|
|
</class>
|
||
|
|
<!--${AOs::Sporadic3}-->
|
||
|
|
<class name="Sporadic3" superclass="qpc::QMActive">
|
||
|
|
<!--${AOs::Sporadic3::inst}-->
|
||
|
|
<attribute name="inst" type="Sporadic3" visibility="0x00" properties="0x01"/>
|
||
|
|
<!--${AOs::Sporadic3::SM}-->
|
||
|
|
<statechart properties="0x02">
|
||
|
|
<!--${AOs::Sporadic3::SM::initial}-->
|
||
|
|
<initial target="../1">
|
||
|
|
<action>Q_UNUSED_PAR(par);</action>
|
||
|
|
<initial_glyph conn="2,4,5,1,42,4,-2">
|
||
|
|
<action box="0,-2,6,2"/>
|
||
|
|
</initial_glyph>
|
||
|
|
</initial>
|
||
|
|
<!--${AOs::Sporadic3::SM::active}-->
|
||
|
|
<state name="active">
|
||
|
|
<!--${AOs::Sporadic3::SM::active::SPORADIC_A}-->
|
||
|
|
<tran trig="SPORADIC_A">
|
||
|
|
<action brief="post-to-Periodic4,long-RTC">Q_UNUSED_PAR(me);
|
||
|
|
|
||
|
|
BSP_d4on();
|
||
|
|
// Sporadic3 --> Periodic4
|
||
|
|
QACTIVE_POST(AO_Periodic4, BSP_getEvtPeriodic4(1U), me);
|
||
|
|
BSP_d4off();
|
||
|
|
|
||
|
|
for (uint16_t i = Q_EVT_CAST(SporadicSpecEvt)->toggles;
|
||
|
|
i > 0U; --i)
|
||
|
|
{
|
||
|
|
BSP_d4on();
|
||
|
|
BSP_d4off();
|
||
|
|
}</action>
|
||
|
|
<tran_glyph conn="2,12,3,-1,36">
|
||
|
|
<action box="0,-2,37,2"/>
|
||
|
|
</tran_glyph>
|
||
|
|
</tran>
|
||
|
|
<state_glyph node="2,6,40,10"/>
|
||
|
|
</state>
|
||
|
|
<state_diagram size="50,18"/>
|
||
|
|
</statechart>
|
||
|
|
</class>
|
||
|
|
</package>
|
||
|
|
<!--${.}-->
|
||
|
|
<directory name=".">
|
||
|
|
<!--${.::app.h}-->
|
||
|
|
<file name="app.h">
|
||
|
|
<text>#ifndef APP_H_
|
||
|
|
#define APP_H_
|
||
|
|
|
||
|
|
$declare ${Shared}
|
||
|
|
|
||
|
|
#endif // APP_H_</text>
|
||
|
|
</file>
|
||
|
|
<!--${.::periodic1.c}-->
|
||
|
|
<file name="periodic1.c">
|
||
|
|
<text>#include "qpc.h" // QP/C real-time event framework
|
||
|
|
#include "bsp.h" // Board Support Package
|
||
|
|
#include "app.h" // Application interface
|
||
|
|
|
||
|
|
$declare ${AOs::Periodic1}
|
||
|
|
|
||
|
|
Q_DEFINE_THIS_MODULE("periodic1")
|
||
|
|
|
||
|
|
$define ${Shared::Periodic1_ctor}
|
||
|
|
$define ${Shared::AO_Periodic1}
|
||
|
|
$define ${AOs::Periodic1}</text>
|
||
|
|
</file>
|
||
|
|
<!--${.::periodic4.c}-->
|
||
|
|
<file name="periodic4.c">
|
||
|
|
<text>#include "qpc.h" // QP/C real-time event framework
|
||
|
|
#include "bsp.h" // Board Support Package
|
||
|
|
#include "app.h" // Application interface
|
||
|
|
|
||
|
|
$declare ${AOs::Periodic4}
|
||
|
|
|
||
|
|
Q_DEFINE_THIS_MODULE("periodic4")
|
||
|
|
|
||
|
|
$define ${Shared::Periodic4_ctor}
|
||
|
|
$define ${Shared::AO_Periodic4}
|
||
|
|
$define ${AOs::Periodic4}</text>
|
||
|
|
</file>
|
||
|
|
<!--${.::sporadic2.c}-->
|
||
|
|
<file name="sporadic2.c">
|
||
|
|
<text>#include "qpc.h" // QP/C real-time event framework
|
||
|
|
#include "bsp.h" // Board Support Package
|
||
|
|
#include "app.h" // Application interface
|
||
|
|
|
||
|
|
$declare ${AOs::Sporadic2}
|
||
|
|
|
||
|
|
//Q_DEFINE_THIS_MODULE("sporadic2")
|
||
|
|
|
||
|
|
$define ${Shared::Sporadic2_ctor}
|
||
|
|
$define ${Shared::AO_Sporadic2}
|
||
|
|
$define ${AOs::Sporadic2}</text>
|
||
|
|
</file>
|
||
|
|
<!--${.::sporadic3.c}-->
|
||
|
|
<file name="sporadic3.c">
|
||
|
|
<text>#include "qpc.h" // QP/C real-time event framework
|
||
|
|
#include "bsp.h" // Board Support Package
|
||
|
|
#include "app.h" // Application interface
|
||
|
|
|
||
|
|
$declare ${AOs::Sporadic3}
|
||
|
|
|
||
|
|
//Q_DEFINE_THIS_MODULE("sporadic3")
|
||
|
|
|
||
|
|
$define ${Shared::Sporadic3_ctor}
|
||
|
|
$define ${Shared::AO_Sporadic3}
|
||
|
|
$define ${AOs::Sporadic3}</text>
|
||
|
|
</file>
|
||
|
|
</directory>
|
||
|
|
</model>
|