-
Notifications
You must be signed in to change notification settings - Fork 0
/
EinAus_v1_Minimal.qm
160 lines (142 loc) · 5.54 KB
/
EinAus_v1_Minimal.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
<?xml version="1.0" encoding="UTF-8"?>
<model version="4.0.3" links="0">
<documentation>Wahrscheinlich die kürzeste Variante, um einen Ausgang in Abhängigkeit von einem Eingang zu setzen.
Der Ausgang wird direkt in der entry-Aktion des State angesteuert.
Der "Eingang" (Tastatur) wird interrupt-getriggert abgefragt.
Die event-Signale sind in der allgemeinen Enumeration.</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,21,4,-2">
<action box="0,-2,10,2"/>
</initial_glyph>
</initial>
<state name="Aus">
<entry>digitalWrite(LED_L, LOW);</entry>
<tran trig="AN" target="../../2">
<tran_glyph conn="2,14,3,1,21,6,-2">
<action box="0,-2,4,2"/>
</tran_glyph>
</tran>
<state_glyph node="2,6,19,10">
<entry box="1,2,17,4"/>
</state_glyph>
</state>
<state name="An">
<entry>digitalWrite(LED_L, HIGH);</entry>
<tran trig="AUS" target="../../1">
<tran_glyph conn="2,26,3,1,23,-16,-4">
<action box="0,-2,4,3"/>
</tran_glyph>
</tran>
<state_glyph node="2,18,19,10">
<entry box="1,2,17,4"/>
</state_glyph>
</state>
<state_diagram size="28,30"/>
</statechart>
</class>
</package>
<directory name=".">
<file name="EinAus.ino">
<text>#include "qpn.h" // QP-nano framework
#include "Arduino.h" // Arduino API
//============================================================================
// 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) }
};
//============================================================================
// 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)
};
// various signals for the application...
enum {
AN_SIG, // over keyboard
AUS_SIG // over keyboard
};
//............................................................................
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 = e"));
Serial.println(F("Aus = a"));
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 'e':
QACTIVE_POST_ISR((QMActive *)&AO_EinAus, AN_SIG, 0U);
break;
case 'a':
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>