FSM per SMlib, oder doch ganz anders?

Hallo,

muss demnächst einen endlichen Zustandsautomaten bauen und bin am überlegen, ob ich mich der Einfachheit halber und auch im Hinblick auf Erweiterbarkeit einer Bibliothek bedienen soll.

Mir schwebt aufgrund ihres scheinbar leicht ersichtlichem Aufbaus diese Bibliothek vor:

http://playground.arduino.cc/Code/SMlib

Hat hier jmd. bereits Erfahrungen mit dieser Bibliothek oder alternative (getestete) Vorschläge?

Es geht bei dem Projekt um eine Art Mediensteuerung (siehe Bild).

Gruß Chris

Ganz einfache FSMs kann man auch schön per Hand mit Switch Case programmieren. Das wird aber schnell unübersichtlich.

Hier hatte ich mal eine (meiner Meinung) nach sehr schöne Version mit Funktionszeigern gezeigt:

Dabei gibt jede Funktion einfach einen Zeiger auf die nachfolgende Funktion zurück. Das hat den Vorteil, dass die komplette Logik in einige voneinander getrennte Funktionen ausgelagert ist.

EDIT:
Wenn ich mir deine Lib ansehe, wird das da auch so gemacht. Allerdings halt in einer Klasse verpackt.

Erste Tests mit der Lib liefen sehr gut.

Das Einzige was mir nicht gefällt ist, dass wenn ich innerhalb eines Zustands den nächsten Zustand aufrufe, erst sämtliche weiteren, in dem Zustand enthaltenen Elemente “abgearbeitet” werden und sich der Zustand somit erst am Ende des entsprechenden Zustands-Codeteils ändert. Da dieses Problem ja auch bei anderen endlichen Zustandsautomaten besteht, frage ich mich, wie man dieses Problem am elegantesten lösen könnte.

Gruß Chris

Ein Beispiel:

Hier wird “blabla” auch dann noch ausgegeben, wenn die 500ms, die der Zustand “S1B” andauern soll bereits vergangen sind:

#include <SM.h>

SM M(S1H, S1B);//create statemchine with initial head and body state functions

void setup()
{
  Serial.begin(115200);
}//setup()

void loop()
{
  EXEC(M);  //run statemachine
}  //loop()

State S1H()  //state head function, run only once at each entry
{
  Serial.println("S1 head");//print message on each re-entry
}

State S1B()  //state body function run constantly
{
  Serial.println("S1 body");
  if(M.Timeout(500)) M.Set(S1H, S1B);//re-enter state after 0,5s
  Serial.println("blabla");
}