-
Notifications
You must be signed in to change notification settings - Fork 0
/
EinAus_v2_BSP_Style.qm
183 lines (164 loc) · 6.15 KB
/
EinAus_v2_BSP_Style.qm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<?xml version="1.0" encoding="UTF-8"?>
<model version="4.0.3" links="0">
<documentation>Ein- und Ausgang sind im BSP-Stil enumerated, so dass sie in der State Machine nur indirekt angesprochen werden.
Der aktuelle State wird ausgegeben.</documentation>
<framework name="qpn"/>
<package name="AOs" stereotype="0x02">
<class name="EinAus" superclass="qpn::QActive">
<statechart>
<initial target="../1">
<initial_glyph conn="2,4,5,1,26,4,-2">
<action box="0,-2,10,2"/>
</initial_glyph>
</initial>
<state name="Aus">
<entry>BSP_showState("AusState");
BSP_SignaleAusgang(LED_AUS);</entry>
<tran trig="AN" target="../../2">
<tran_glyph conn="2,16,3,1,26,6,-2">
<action box="0,-2,4,2"/>
</tran_glyph>
</tran>
<state_glyph node="2,6,24,12">
<entry box="1,2,23,6"/>
</state_glyph>
</state>
<state name="An">
<entry>BSP_showState("AnState");
BSP_SignaleAusgang(LED_AN);</entry>
<tran trig="AUS" target="../../1">
<tran_glyph conn="2,30,3,1,28,-20,-4">
<action box="0,-2,10,2"/>
</tran_glyph>
</tran>
<state_glyph node="2,20,24,12">
<entry box="1,2,23,6"/>
</state_glyph>
</state>
<state_diagram size="32,34"/>
</statechart>
</class>
</package>
<directory name=".">
<file name="EinAus.ino">
<text>#include "qpn.h" // QP-nano framework
#include "Arduino.h" // Arduino API
//============================================================================
// events used in this application...
enum BSP_Eingangssignale {
AN_SIG = Q_USER_SIG, // over keyboard
AUS_SIG // over keyboard
};
//============================================================================
// declare all AO classes...
$declare(AOs::EinAus)
//...
// AO instances and event queue buffers for them...
EinAus AO_EinAus;
static QEvt l_einausQSto[10]; // Event queue storage for EinAus
//...
//============================================================================
// QF_active[] array defines all active object control blocks ----------------
QActiveCB const Q_ROM QF_active[] = {
{ (QActive *)0, (QEvt *)0, 0U },
{ (QActive *)&AO_EinAus, l_einausQSto, Q_DIM(l_einausQSto) }
};
//============================================================================
// Board Support Package (BSP)
enum BSP_Ausgangssignale {
LED_AN,
LED_AUS
};
// various constants for the application...
enum {
BSP_TICKS_PER_SEC = 100, // number of system clock ticks in one second
LED_L = 13 // the pin number of the on-board LED (L)
};
//............................................................................
void BSP_SignaleAusgang(enum BSP_Ausgangssignale sig) {
switch (sig) {
case LED_AN:
digitalWrite(LED_L, HIGH);
break;
case LED_AUS:
digitalWrite(LED_L, LOW);
break;
}
}
//............................................................................
void BSP_showState(char const *state) {
Serial.print(F("State->"));
Serial.println(state);
}
//............................................................................
void setup() {
// initialize the QF-nano framework
QF_init(Q_DIM(QF_active));
// initialize all AOs...
QActive_ctor(&AO_EinAus.super, Q_STATE_CAST(&EinAus_initial));
// initialize the hardware used in this sketch...
pinMode(LED_L, OUTPUT); // set the LED-L pin to output
Serial.begin(115200); // set the highest standard baud rate of 115200 bps
Serial.print(F("Start, QP-nano version: "));
Serial.println(QP_VERSION);
Serial.println("");
Serial.println(F("EinAus"));
Serial.println(F("Ein = n"));
Serial.println(F("Aus = u"));
Serial.println("");
}
//............................................................................
void loop() {
QF_run(); // run the QF-nano framework
}
//============================================================================
// interrupts...
ISR(TIMER2_COMPA_vect) {
QF_tickXISR(0); // process time events for tick rate 0
// read inputs over Serial
if (Serial.available() > 0) {
switch (Serial.read()) { // read the incoming byte
// events are posted directly instead of publishing
case 'n':
QACTIVE_POST_ISR((QMActive *)&AO_EinAus, AN_SIG, 0U);
break;
case 'u':
QACTIVE_POST_ISR((QMActive *)&AO_EinAus, AUS_SIG, 0U);
break;
}
}
}
//============================================================================
// QF callbacks...
void QF_onStartup(void) {
// set Timer2 in CTC mode, 1/1024 prescaler, start the timer ticking...
TCCR2A = (1U << WGM21) | (0U << WGM20);
TCCR2B = (1U << CS22 ) | (1U << CS21) | (1U << CS20); // 1/2^10
ASSR &= ~(1U << AS2);
TIMSK2 = (1U << OCIE2A); // enable TIMER2 compare Interrupt
TCNT2 = 0U;
// set the output-compare register based on the desired tick frequency
OCR2A = (F_CPU / BSP_TICKS_PER_SEC / 1024U) - 1U;
}
//............................................................................
void QV_onIdle(void) { // called with interrupts DISABLED
// Put the CPU and peripherals to the low-power mode. You might
// need to customize the clock management for your application,
// see the datasheet for your particular AVR MCU.
SMCR = (0 << SM0) | (1 << SE); // idle mode, adjust to your project
QV_CPU_SLEEP(); // atomically go to sleep and enable interrupts
}
//............................................................................
void Q_onAssert(char const Q_ROM * const file, int line) {
// implement the error-handling policy for your application!!!
QF_INT_DISABLE(); // disable all interrupts
QF_RESET(); // reset the CPU
}
//============================================================================
// define all AO classes (state machine)...
$define(AOs::EinAus)
//...
</text>
</file>
</directory>
</model>