1 | ...
|
2 | // Eine Zeile wurde komplett vom Sender übertragen
|
3 | // Die kann zb so aussehen
|
4 | // y = xxx; y = xxx;
|
5 | //
|
6 | // y ... Nummer der PWM die zu setzen ist
|
7 | // xxx ... PWM Wert der zu setzen ist
|
8 | // ; ... Kennzeichnung, dass die PWM Message hier zu Ende ist
|
9 | //
|
10 | //
|
11 | // Eine Zeile vom Sender besteht also aus mehreren PWM Messages.
|
12 | // Eine PWM Message besteht aus (in der Reihenfolge)
|
13 | // Einer Zahl, die die Nummer der PWM Einheit darstellt
|
14 | // Einem '='
|
15 | // Noch einer Zahl, die den zu setzenden Wert darstellt
|
16 | // Einem ';', welches die Message abschliesst.
|
17 |
|
18 |
|
19 | #define START_PWM_MSG 0 // Maschine wartet auf den Beginn einer PWM Message
|
20 | #define FIND_EQUALS 1 // Maschine wartet auf ein '=' Zeichen
|
21 | #define GET_VALUE 2 // Maschine liest den Zahlenwert
|
22 | #define FIND_SEMICOLON 3 // Maschine wartet auf ein ';' Zeichen
|
23 |
|
24 | // Mit Ausnahme des Zustands FIND_SEMIOLON weiss die Maschine immer, was als
|
25 | // nächstes kommen muss. Wird das Erwartete nicht vorgefunden, geht die
|
26 | // Maschine sofort in den Zustand FIND_SEMICOLON über, bei dem Zeichen
|
27 | // überlesen werden, bis ein ';' angetroffen wird. Der Zustand FIND_SEMICOLON
|
28 | // fungiert als ein Art 'Wiederaufsetzen nach einem Fehler'
|
29 |
|
30 | //
|
31 | // Am Anfang ist die Maschine im Zustand:
|
32 | // Wir warten auf den Anfang einer PWM Message
|
33 | //
|
34 | State = START_PWM_MSG;
|
35 | PWM_Unit = 0;
|
36 | PWM_Value = 0;
|
37 |
|
38 | Index = 0;
|
39 | while( Input[Index] != Dein_Ende_Zeichen für eine Zeile ) {
|
40 | NextChar = Input[Index++];
|
41 |
|
42 | //
|
43 | // Whitespace Zeichen werden, egal wo sie auftreten, ignoriert
|
44 | if( NextChar == ' ' ||
|
45 | NextChar == '\t' ||
|
46 | NextChar == '\n' )
|
47 | continue;
|
48 |
|
49 |
|
50 | switch( State ) {
|
51 | case START_PWM_MSG: // Das nächste Zeichen muss eine Zahl sein, wenn nicht
|
52 | // Fehler: Alles bis zum ';' ignorieren
|
53 |
|
54 | if( NextChar >= '0' && NextChar <= '9' ) {
|
55 | PWM_Unit = NextChar - '0';
|
56 | State = FIND_EQUALS;
|
57 | }
|
58 | else
|
59 | State = FIND_SEMICOLON;
|
60 | break;
|
61 |
|
62 | case FIND_EQUALS:
|
63 | if( NextChar == '=' )
|
64 | State = GET_VALUE;
|
65 | else
|
66 | State = FIND_SEMICOLON;
|
67 | break;
|
68 |
|
69 | case GET_VALUE:
|
70 | if( NextChar >= '0' && NextChar <= '9' )
|
71 | PWM_Value = 10 * PWM_Value + ( NextChar - '0' );
|
72 |
|
73 | else if( NextChar == ';' ) {
|
74 | // Eine Message wurde komplett und fehlerfrei empfangen
|
75 | // Setze die Werte
|
76 | SetPwm( PWM_Unit, PWM_Value );
|
77 |
|
78 | // und die Maschine wieder auf Anfang zurückstellen
|
79 | State = START_PWM_MSG;
|
80 | PWM_Unit = 0;
|
81 | PWM_Value = 0;
|
82 | }
|
83 |
|
84 | else
|
85 | // Fehler. Dieses Zeichen ist weder das abschliessende ';'
|
86 | // noch etwas im Bereich '0' bis '9'
|
87 | State = FIND_SEMICOLON
|
88 |
|
89 | break;
|
90 |
|
91 | case FIND_SEMICOLON:
|
92 | if( NextChar == ';' ) {
|
93 | State = START_PWM_MSG;
|
94 | PWM_Unit = 0;
|
95 | PWM_Value = 0;
|
96 | }
|
97 | }
|