/////////////////////////////////////////////////////////////////
/*
This example shows how to use regular and timed transitions.
The FSM emulates a traffic light.
When the button is pressed the light will turn green after a second.
Otherwise the light will transition from red to green every 6 seconds.
https://github.com/LennartHennigs/SimpleFSM/tree/master
And from green to red after 4.
https://github.com/LennartHennigs/SimpleFSM
*/
/////////////////////////////////////////////////////////////////
#include "SimpleFSM.h"
#include "Button2.h" // https://github.com/LennartHennigs/Button2
/////////////////////////////////////////////////////////////////
#define BUTTON_PIN 12
/////////////////////////////////////////////////////////////////
SimpleFSM fsm;
Button2 btn;
/////////////////////////////////////////////////////////////////
void on_red() {
Serial.println("\nState: RED!");
}
void on_green() {
Serial.println("\nState: GREEN");
}
void ongoing() {
Serial.print(".");
}
void on_button_press() {
Serial.println("\nBUTTON!");
}
/////////////////////////////////////////////////////////////////
State s[] = {
State("red light", on_red, ongoing),
State("green light", on_green, ongoing),
State("button pressed while red", on_button_press, ongoing),
State("button pressed while green", on_button_press, ongoing)
};
enum triggers {
button_was_pressed = 1
};
Transition transitions[] = {
Transition(&s[0], &s[1], button_was_pressed),
Transition(&s[0], &s[2], button_was_pressed)
};
TimedTransition timedTransitions[] = {
TimedTransition(&s[0], &s[1], 3000), // Red to green
TimedTransition(&s[1], &s[0], 2000), // Green to red
TimedTransition(&s[2], &s[0], 1000), // Button press red to green
TimedTransition(&s[2], &s[1], 1000) // Button press green to red
};
int num_transitions = sizeof(transitions) / sizeof(Transition);
int num_timed = sizeof(timedTransitions) / sizeof(TimedTransition);
/////////////////////////////////////////////////////////////////
void button_handler(Button2 &btn) {
Serial.println("button_handler()");
Serial.println(":fsm.getState(): " + fsm.getState()->getName());
Serial.println(":fsm.getPreviousState(): " + fsm.getPreviousState()->getName());
fsm.trigger(button_was_pressed);
}
/////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
while (!Serial) {
delay(300);
}
Serial.println();
Serial.println();
Serial.println("SimpleFSM - Mixed Transition (Traffic light with button for green)\n");
fsm.add(timedTransitions, num_timed);
fsm.add(transitions, num_transitions);
fsm.setInitialState(&s[0]);
btn.begin(BUTTON_PIN);
btn.setTapHandler(button_handler);
Serial.println(fsm.getDotDefinition());
}
/////////////////////////////////////////////////////////////////
void loop() {
fsm.run();
btn.loop();
}
/////////////////////////////////////////////////////////////////