Introducing arduino-fsm, a library that makes it easy to use a finite state machine in an Arduino project.

# Design

This library is composed of two classes: Fsm and State:

 State Represents a state in the state machine. A state has two callback functions associated with it: on_enter and on_exit, which are called when the state is entered into and exited from, respectively. Fsm Represents the state machine. Transitions are added using the add_transition function. This function takes pointers to two states, an event id, and a callback to a function that's called when the transition takes place. Calling trigger with the event id invokes the transition, but only if the Fsm is in the start state, otherwise nothing happens.

# Tutorial

First create the Fsm and State instances at the top of your source file.

#include <Fsm.h>

#define FLIP_LIGHT_SWITCH 1
Fsm fsm;
State state_light_on(on_light_on_enter, &on_light_on_exit);
State state_light_off(on_light_off_enter, &on_light_off_exit);


In your Setup() function, add the state transitions.

void setup()
{
FLIP_LIGHT_SWITCH,
&on_trans_light_on_light_off);
FLIP_LIGHT_SWITCH,
&on_trans_light_off_light_on);
}


In this case, two transitions are added:

1. From the light on state to the light off state when the event FLIP_LIGHT_SWITCH is triggered;
2. From the light off state to the light on state when the event FLIP_LIGHT_SWITCH is triggered.

Define your callback functions. If a callback isn't required, just pass NULL to the function instead.

void on_light_on_enter()
{
// Entering LIGHT_ON state
}

void on_light_on_exit()
{
// Exiting LIGHT_ON state
}

void on_light_off_enter()
{
// Entering LIGHT_OFF state
}

void on_light_off_exit()
{
// Exiting LIGHT_OFF state
}

void on_trans_light_on_light_off()
{
// Transitioned from LIGHT_ON to LIGHT_OFF
}

void on_trans_light_off_light_on()
{
// Transitioned from LIGHT_OFF to LIGHT_ON
}


And finally, trigger a state transition.

fsm.trigger(FLIP_LIGHT_SWITCH); // Trigger the event FLIP_LIGHT_SWITCH


The full source code for this example can be found in the Github repository.