2015-04-28 13:45:35 -04:00
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
2015-05-22 20:36:44 -04:00
|
|
|
<model version="3.3.0">
|
2015-04-28 13:45:35 -04:00
|
|
|
<documentation>Dining Philosopher Problem example
|
|
|
|
|
2015-05-22 20:36:44 -04:00
|
|
|
NOTE: Requries QP5.</documentation>
|
2015-04-28 13:45:35 -04:00
|
|
|
<framework name="qpc"/>
|
|
|
|
<package name="Events" stereotype="0x01">
|
|
|
|
<class name="SetEvt" superclass="qpc::QEvt">
|
|
|
|
<attribute name="digit" type="uint8_t" visibility="0x00" properties="0x00"/>
|
|
|
|
</class>
|
|
|
|
<class name="TimeEvt" superclass="qpc::QEvt">
|
|
|
|
<attribute name="current_time" type="uint32_t" visibility="0x00" properties="0x00"/>
|
|
|
|
</class>
|
|
|
|
</package>
|
|
|
|
<package name="Components" stereotype="0x02">
|
|
|
|
<class name="Alarm" superclass="qpc::QMsm">
|
|
|
|
<documentation>Alarm "Orthogonal Component"</documentation>
|
|
|
|
<attribute name="alarm_time" type="uint32_t" visibility="0x02" properties="0x00"/>
|
|
|
|
<operation name="ctor" type="void" visibility="0x00" properties="0x00">
|
|
|
|
<code>QMsm_ctor(&me->super, Q_STATE_CAST(&Alarm_initial));</code>
|
|
|
|
</operation>
|
|
|
|
<statechart>
|
|
|
|
<initial target="../1">
|
|
|
|
<action>me->alarm_time = 12U*60U;
|
|
|
|
(void)e; /* avoid compiler warning about unused parameter */</action>
|
|
|
|
<initial_glyph conn="2,3,5,1,36,4,-4">
|
|
|
|
<action box="0,-2,6,2"/>
|
|
|
|
</initial_glyph>
|
|
|
|
</initial>
|
|
|
|
<state name="off">
|
|
|
|
<entry>/* while in the off state, the alarm is kept in decimal format */
|
|
|
|
me->alarm_time = (me->alarm_time/60)*100 + me->alarm_time%60;
|
|
|
|
BSP_showTime24H("*** Alarm OFF ", me->alarm_time, 100U);</entry>
|
|
|
|
<exit>/* upon exit, the alarm is converted to binary format */
|
|
|
|
me->alarm_time = (me->alarm_time/100U)*60U + me->alarm_time%100U;</exit>
|
|
|
|
<tran trig="ALARM_ON">
|
|
|
|
<choice target="../../../2">
|
|
|
|
<guard brief="alarm in range?">(me->alarm_time / 100U < 24U)
|
|
|
|
&& (me->alarm_time % 100U < 60U)</guard>
|
|
|
|
<choice_glyph conn="16,14,5,1,22,12,-4">
|
|
|
|
<action box="1,0,13,2"/>
|
|
|
|
</choice_glyph>
|
|
|
|
</choice>
|
|
|
|
<choice>
|
|
|
|
<guard brief="else"/>
|
|
|
|
<action>me->alarm_time = 0U;
|
|
|
|
BSP_showTime24H("*** Alarm reset", me->alarm_time, 100U);</action>
|
|
|
|
<choice_glyph conn="16,14,4,-1,-4,12">
|
|
|
|
<action box="0,-4,10,2"/>
|
|
|
|
</choice_glyph>
|
|
|
|
</choice>
|
|
|
|
<tran_glyph conn="2,14,3,-1,14">
|
|
|
|
<action box="0,-2,10,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<tran trig="ALARM_SET">
|
|
|
|
<action>/* while setting, the alarm is kept in decimal format */
|
|
|
|
me->alarm_time = (10U * me->alarm_time
|
|
|
|
+ ((SetEvt const *)e)->digit) % 10000U;
|
|
|
|
BSP_showTime24H("*** Alarm reset ", me->alarm_time, 100U);</action>
|
|
|
|
<tran_glyph conn="2,18,3,-1,14">
|
|
|
|
<action box="0,-2,11,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<state_glyph node="2,5,32,15">
|
|
|
|
<entry box="1,2,6,2"/>
|
|
|
|
<exit box="1,4,6,2"/>
|
|
|
|
</state_glyph>
|
|
|
|
</state>
|
|
|
|
<state name="on">
|
|
|
|
<entry>BSP_showTime24H("*** Alarm ON ", me->alarm_time, 60U);</entry>
|
|
|
|
<tran trig="ALARM_OFF" target="../../1">
|
|
|
|
<tran_glyph conn="2,32,3,1,38,-22,-6">
|
|
|
|
<action box="0,-2,14,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<tran trig="ALARM_SET">
|
|
|
|
<action>BSP_showMsg("*** Cannot set Alarm when it is ON");</action>
|
|
|
|
<tran_glyph conn="2,36,3,-1,14">
|
|
|
|
<action box="0,-2,14,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<tran trig="TIME">
|
|
|
|
<choice>
|
|
|
|
<guard>Q_EVT_CAST(TimeEvt)->current_time == me->alarm_time</guard>
|
|
|
|
<action>BSP_showMsg("ALARM!!!");
|
|
|
|
|
|
|
|
/* asynchronously post the event to the container AO */
|
|
|
|
QACTIVE_POST(APP_alarmClock, Q_NEW(QEvt, ALARM_SIG), me);</action>
|
|
|
|
<choice_glyph conn="16,40,5,-1,12">
|
|
|
|
<action box="1,0,10,2"/>
|
|
|
|
</choice_glyph>
|
|
|
|
</choice>
|
|
|
|
<tran_glyph conn="2,40,3,-1,14">
|
|
|
|
<action box="0,-2,10,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<state_glyph node="2,24,32,20">
|
|
|
|
<entry box="1,2,5,2"/>
|
|
|
|
</state_glyph>
|
|
|
|
</state>
|
|
|
|
<state_diagram size="46,48"/>
|
|
|
|
</statechart>
|
|
|
|
</class>
|
|
|
|
<class name="AlarmClock" superclass="qpc::QMActive">
|
|
|
|
<documentation>Alarm clock "Container"</documentation>
|
|
|
|
<attribute name="current_time" type="uint32_t" visibility="0x02" properties="0x00"/>
|
|
|
|
<attribute name="alarm" type="Alarm" visibility="0x02" properties="0x00"/>
|
|
|
|
<attribute name="timeEvt" type="QTimeEvt" visibility="0x00" properties="0x00"/>
|
|
|
|
<statechart>
|
|
|
|
<initial target="../1">
|
|
|
|
<action>(void)e; /* avoid compiler warning about unused parameter */
|
|
|
|
me->current_time = 0U;
|
|
|
|
|
|
|
|
/* (!) trigger the initial transition in the component */
|
|
|
|
QMSM_INIT((QMsm *)&me->alarm, (QEvt *)0);</action>
|
|
|
|
<initial_glyph conn="2,4,5,1,44,4,-2">
|
|
|
|
<action box="0,-2,6,2"/>
|
|
|
|
</initial_glyph>
|
|
|
|
</initial>
|
|
|
|
<state name="timekeeping">
|
|
|
|
<entry>/* periodic timeout every second */
|
|
|
|
QTimeEvt_armX(&me->timeEvt, BSP_TICKS_PER_SEC,
|
|
|
|
BSP_TICKS_PER_SEC);</entry>
|
|
|
|
<exit>QTimeEvt_disarm(&me->timeEvt);</exit>
|
|
|
|
<initial target="../6">
|
|
|
|
<initial_glyph conn="4,13,5,1,36,27,-4">
|
|
|
|
<action box="0,-2,10,2"/>
|
|
|
|
</initial_glyph>
|
|
|
|
</initial>
|
|
|
|
<tran trig="CLOCK_24H" target="../6">
|
|
|
|
<tran_glyph conn="2,16,3,1,36,22,-2">
|
|
|
|
<action box="0,-2,10,4"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<tran trig="CLOCK_12H" target="../7">
|
|
|
|
<tran_glyph conn="2,18,3,1,40,34,-6">
|
|
|
|
<action box="0,-2,10,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<tran trig="ALARM">
|
|
|
|
<action>BSP_showMsg("Wake up!!!");</action>
|
|
|
|
<tran_glyph conn="2,28,3,-1,18">
|
|
|
|
<action box="0,-2,10,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<tran trig="ALARM_SET, ALARM_ON, ALARM_OFF">
|
|
|
|
<action>/* (!) synchronously dispatch to the orthogonal component */
|
|
|
|
QMSM_DISPATCH((QMsm *)&me->alarm, e);</action>
|
|
|
|
<tran_glyph conn="2,22,3,-1,18">
|
|
|
|
<action box="0,-2,11,6"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<tran trig="TERMINATE" target="../../2">
|
|
|
|
<action>BSP_showMsg("--> final");</action>
|
|
|
|
<tran_glyph conn="2,32,3,1,44,38,-13">
|
|
|
|
<action box="0,-2,10,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<state name="mode24h">
|
|
|
|
<entry>BSP_showMsg("*** 24-hour mode");</entry>
|
|
|
|
<tran trig="TICK">
|
|
|
|
<action>TimeEvt pe; /* temporary synchronous event for the component */
|
|
|
|
|
|
|
|
/* roll over in 24-hr mode? */
|
|
|
|
if (++me->current_time == 24U*60U) {
|
|
|
|
me->current_time = 0U;
|
|
|
|
}
|
|
|
|
BSP_showTime24H("", me->current_time, 60U);
|
|
|
|
pe.super.sig = TIME_SIG;
|
|
|
|
pe.current_time = me->current_time;
|
|
|
|
|
|
|
|
/* (!) synchronously dispatch to the orthogonal component */
|
|
|
|
QMSM_DISPATCH(&me->alarm.super, &pe.super);</action>
|
|
|
|
<tran_glyph conn="4,44,3,-1,16">
|
|
|
|
<action box="0,-2,8,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<state_glyph node="4,36,32,12">
|
|
|
|
<entry box="1,2,27,2"/>
|
|
|
|
</state_glyph>
|
|
|
|
</state>
|
|
|
|
<state name="mode12h">
|
|
|
|
<entry>BSP_showMsg("*** 12-hour mode");</entry>
|
|
|
|
<tran trig="TICK">
|
|
|
|
<action>TimeEvt pe; /* temporary synchronous event for the component */
|
|
|
|
|
|
|
|
/* roll over in 12-hr mode? */
|
|
|
|
if (++me->current_time == 12U*60U) {
|
|
|
|
me->current_time = 0U;
|
|
|
|
}
|
|
|
|
BSP_showTime12H("", me->current_time, 60U);
|
|
|
|
pe.super.sig = TIME_SIG;
|
|
|
|
pe.current_time = me->current_time;
|
|
|
|
|
|
|
|
/* (!) synchronously dispatch to the orthogonal component */
|
|
|
|
QMSM_DISPATCH(&me->alarm.super, &pe.super);</action>
|
|
|
|
<tran_glyph conn="4,58,3,-1,16">
|
|
|
|
<action box="0,-2,8,2"/>
|
|
|
|
</tran_glyph>
|
|
|
|
</tran>
|
|
|
|
<state_glyph node="4,50,32,12">
|
|
|
|
<entry box="1,2,17,2"/>
|
|
|
|
</state_glyph>
|
|
|
|
</state>
|
|
|
|
<state_glyph node="2,6,42,58">
|
|
|
|
<entry box="1,2,6,2"/>
|
|
|
|
<exit box="1,4,6,2"/>
|
|
|
|
</state_glyph>
|
|
|
|
</state>
|
|
|
|
<state name="final">
|
|
|
|
<entry brief="terminate">BSP_showMsg("Bye! Bye!");
|
|
|
|
QF_stop(); /* terminate the application */</entry>
|
|
|
|
<state_glyph node="2,68,31,8">
|
|
|
|
<entry box="1,2,11,2"/>
|
|
|
|
</state_glyph>
|
|
|
|
</state>
|
|
|
|
<state_diagram size="50,80"/>
|
|
|
|
</statechart>
|
|
|
|
</class>
|
2015-05-14 15:45:53 -04:00
|
|
|
<attribute name="APP_alarmClock" type="QMActive * const" visibility="0x00" properties="0x00">
|
2015-04-28 13:45:35 -04:00
|
|
|
<documentation>Opaque pointer to the single instance of the AlarmClock AO</documentation>
|
|
|
|
</attribute>
|
|
|
|
<operation name="AlarmClock_ctor" type="void" visibility="0x00" properties="0x00">
|
|
|
|
<code>AlarmClock * const me = &l_alarmClock;
|
|
|
|
|
|
|
|
QMActive_ctor(&me->super, Q_STATE_CAST(&AlarmClock_initial));
|
|
|
|
Alarm_ctor(&me->alarm); /* orthogonal component ctor */
|
|
|
|
|
|
|
|
/* private time event ctor */
|
|
|
|
QTimeEvt_ctorX(&me->timeEvt, &me->super, TICK_SIG, 0U);</code>
|
|
|
|
</operation>
|
|
|
|
</package>
|
|
|
|
<directory name=".">
|
|
|
|
<file name="alarm.h">
|
|
|
|
<text>#ifndef alarm_h
|
|
|
|
#define alarm_h
|
|
|
|
|
|
|
|
$declare(Components::Alarm)
|
|
|
|
|
|
|
|
$declare(Components::Alarm::ctor)
|
|
|
|
|
|
|
|
#endif /* alarm_h */</text>
|
|
|
|
</file>
|
|
|
|
<file name="alarm.c">
|
|
|
|
<text>#include "qpc.h"
|
|
|
|
#include "bsp.h"
|
|
|
|
#include "alarm.h"
|
|
|
|
#include "clock.h"
|
|
|
|
|
|
|
|
Q_DEFINE_THIS_FILE
|
|
|
|
|
|
|
|
/* Alarm component --------------------*/
|
|
|
|
$define(Components::Alarm)</text>
|
|
|
|
</file>
|
|
|
|
<file name="clock.h">
|
|
|
|
<text>#ifndef clock_h
|
|
|
|
#define clock_h
|
|
|
|
|
|
|
|
enum AlarmClockSignals {
|
|
|
|
TICK_SIG = Q_USER_SIG, /* time tick event */
|
|
|
|
ALARM_SET_SIG, /* set the alarm */
|
|
|
|
ALARM_ON_SIG, /* turn the alarm on */
|
|
|
|
ALARM_OFF_SIG, /* turn the alarm off */
|
|
|
|
ALARM_SIG, /* alarm event from Alarm component to AlarmClock container */
|
|
|
|
CLOCK_12H_SIG, /* set the clock in 12H mode */
|
|
|
|
CLOCK_24H_SIG, /* set the clock in 24H mode */
|
|
|
|
TIME_SIG, /* time event sent to Alarm (contains current time) */
|
|
|
|
TERMINATE_SIG /* terminate the application */
|
|
|
|
};
|
|
|
|
|
|
|
|
$declare(Events::SetEvt)
|
|
|
|
$declare(Events::TimeEvt)
|
|
|
|
|
|
|
|
$declare(Components::APP_alarmClock)
|
|
|
|
$declare(Components::AlarmClock_ctor);
|
|
|
|
|
|
|
|
#endif /* clock_h */</text>
|
|
|
|
</file>
|
|
|
|
<file name="clock.c">
|
|
|
|
<text>#include "qpc.h"
|
|
|
|
#include "bsp.h"
|
|
|
|
#include "alarm.h"
|
|
|
|
#include "clock.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
Q_DEFINE_THIS_FILE
|
|
|
|
|
|
|
|
/* Active object class -----------------------------------------------------*/
|
|
|
|
$declare(Components::AlarmClock)
|
|
|
|
|
|
|
|
/* Local objects -----------------------------------------------------------*/
|
|
|
|
static AlarmClock l_alarmClock; /* the single instance of the AO */
|
|
|
|
|
|
|
|
/* Global-scope objects ----------------------------------------------------*/
|
2015-05-14 15:45:53 -04:00
|
|
|
QMActive * const APP_alarmClock = &l_alarmClock.super; /* "opaque" pointer */
|
2015-04-28 13:45:35 -04:00
|
|
|
|
|
|
|
$define(Components::AlarmClock_ctor)
|
|
|
|
|
|
|
|
/*..........................................................................*/
|
|
|
|
$define(Components::AlarmClock)</text>
|
|
|
|
</file>
|
|
|
|
</directory>
|
|
|
|
</model>
|