#include "fsm.h" using namespace std; struct Event { int state; }; enum States { AAAA, BBBB, CCCC }; struct QQQQSwitch { typedef LIST3(AAAA, BBBB, CCCC) StateList; template int event(Event & ev) { Serial.println("undefined event -- event"); return ev.state; } template int event() { Serial.println("undefined enter"); return 0; } template void enter() { Serial.println("undefined enter"); } template void exit() { Serial.println("undefined leave"); }; template void tick() { Serial.println("undefined enter");} }; template <> void QQQQSwitch::enter() { Serial.println("enter AAAA"); } template <> void QQQQSwitch::exit() { Serial.println("exit AAAA"); } template <> void QQQQSwitch::tick() { Serial.println("tick AAAA"); } template <> void QQQQSwitch::enter() { Serial.println("enter BBBB"); } template <> void QQQQSwitch::exit() { Serial.println("exit BBBB"); } template <> void QQQQSwitch::tick() { Serial.println("tick BBBB"); } template <> void QQQQSwitch::enter() { Serial.println("enter CCCC"); } template <> void QQQQSwitch::exit() { Serial.println("exit CCCC"); } template <> void QQQQSwitch::tick() { Serial.println("tick CCCC"); } StateMachine* sm; Event event_AAAA = {AAAA}; Event event_BBBB = {BBBB}; Event event_CCCC = {CCCC}; void setup() { Serial.begin(115200); Serial.println("starts"); QQQQSwitch c; sm = new StateMachine(c); } void loop() { delay(2000); Serial.println("..."); if (Serial.available() > 0) { char in = (char) Serial.read(); switch(in) { case 'a': sm->work(event_AAAA); return; case 'b': sm->work(event_BBBB); return; case 'c': sm->work(event_CCCC); return; default: Serial.println('??'); break; } } sm->tick(); }