Hallo Miteinander,
ich habe mir anhand der Anleitung
(https://www.mikrocontroller.net/articles/Statemachine#Implementierung_einer_objektorientiert_Finite_State_Machine_in_C.2B.2B)
eine FSM aufgebaut.
Die Umsetzung hat soweit auch ganz gut geklappt bis auf einen Punkt. In
dem Beispiel wird nur eine Abfrage nach einer Induktionsschleife
gemacht, also nur ein Schalterzustand mit der entsprechenden
Übergangsbedingung im Zustands-Struct verglichen.
In der Form einer If-Anweisung:
1 | void stateMachine()
|
2 | {
|
3 | Ampel1(state_table[state].Ampel1);
|
4 | Ampel2(state_table[state].Ampel2);
|
5 |
|
6 | if (zaehler>0) {
|
7 | zaehler--;
|
8 | } else {
|
9 | if ( (state_table[state].I_Schleife == 1 && Induktionsschleife() ) ||
|
10 | (state_table[state].I_Schleife == 0) )
|
11 | {
|
12 | state = state_table[state].Naechster;
|
13 | zaehler = state_table[state].Wartezeit;
|
14 | }
|
15 | }
|
16 | }
|
In meinem Projekt habe ich nicht nur einen Schalter wie die
Induktionsschleife, sondern 3. Also habe ich 3 entsprechende If-Abfragen
und nur wenn alle den gewünschten Zustand 1||0 haben, soll in den
nächsten Zustand gesprungen werden.
Soweit so gut, aber:
Ich habe jetzt mehrere Zustände, wo unabhängig vom Wert des Schalters S3
in den nächsten Zustand gesprungen werden soll. Es ist also egal, ob er
gerade den Wert 0 oder 1 hat.
Die im Beispiel genutzte if-Abfrage lässt mir, nach meinem Verständnis
aber keine Wahl, da immer ein bestimmter Bool-Wert des Schalters pro
Zustand vorliegen MUSS um in den nächsten Zustand zu springen.
Ich hatte mir jetzt überlegt, die If-Abfragen als Funktion zu erstellen
und je nach State nur die relevanten Schalter abzufragen. Gibt es da
eine elegantere Lösung?