API Reference ============= `#include ` Class Diagram ------------- ....... +--------------------------------------: T : | tinyfsm::FsmList :.....: +-----------------------------------------| | [+] set_initial_state() <> | | [+] reset() <> | | [+] enter() <> | | [+] start() <> | | [+] dispatch(Event) <> | +-----------------------------------------+ ....... +--------------------------------------: T : | tinyfsm::Fsm :.....: +-----------------------------------------| | [+] state() <> | | [+] set_initial_state() <> | | [+] reset() <> | | [+] enter() <> | | [+] start() <> | | [+] dispatch(Event) <> | | [#] transit() | | [#] transit(Action) | | [#] transit(Action, Condition) | +-----------------------------------------+ # | | +---------------------+ | MyFSM | +---------------------+ | [+] entry() | | [+] exit() | | [+] react(EventX) | | [+] react(EventY) | | ... | +---------------------+ # | +-------------+-------------+ | | | +---------+ +---------+ +---------+ | State_A | | State_B | | ... | +---------+ +---------+ +---------+ [#] protected [+] public [-] private template< typename F > class Fsm -------------------------------- ### State Machine Functions * `template< typename S > static constexpr S & state(void)` Returns a reference to a (implicitly instantiated) state S. Allows low-level access to all states; * `static void set_initial_state(void)` Function prototype, must be defined (explicit template specialization) for every state machine class (e.g. by using the `FSM_INITIAL_STATE(fsm, state`) macro). Sets current state to initial (start) state. * `static void reset(void)` Empty function, can be overridden by state machine class in order to perform custom initialization (e.g. set static state machine variables, or reset states using `StateList::reset()`) or directly via the `state()` instance). Note that this function is NOT called on start(). See example: `/examples/api/resetting_switch.cpp` * `static void enter(void)` Helper function, usually not needed to be used directly: calls entry() function of current state. * `static void start()` Sets the initial (start) state and calls its entry() function. * `template< typename E > static void dispatch(E const &)` Dispatch an event to the current state of this state machine. ### State Transition Functions * `template< typename S > void transit(void)` Transit to a new state: 1. Call exit() function on current state 2. Set new current state to S 3. Call entry() function on new state * `template< typename S, typename ActionFunction > void transit(ActionFunction)` Transit to a new state, with action function: 1. Call exit() function on current state 2. Call ActionFunction 3. Set new current state to S 4. Call entry() function on new state * `template< typename S, typename ActionFunction, typename ConditionFunction > void transit(ActionFunction, ConditionFunction)` Transit to a new state only if ConditionFunction returns true. Shortcut for: `if(ConditionFunction()) transit(ActionFunction);`. ### Derived Classes #### template< typename F > class MooreMachine Moore state machines have entry actions, but no exit actions: * `virtual void entry(void) { }` Entry action, not enforcing. Can be enforced by declaring pure virtual: `virtual void entry(void) = 0` * `void exit(void) { }` No exit actions. See example: `/examples/api/more_machine.cpp` #### template< typename F > class MealyMachine Mealy state machines do not have entry/exit actions: * `void entry(void) { }` No entry actions. * `void exit(void) { }` No exit actions. *Input actions* are modeled in react(), conditional dependent of event type or payload and using `transit<>(ActionFunction)`. See example: `/examples/api/mealy_machine.cpp` template< typename... FF > struct FsmList ----------------------------------------- * `static void set_initial_state(void)` Calls set_initial_state() on all state machines in the list. * `static void reset()` Calls reset() on all state machines in the list. * `static void enter()` Calls enter() on all state machines in the list. * `static void start()` Sets the initial (start) state for all state machines in list, then call all entry() functions. * `template< typename E > static void dispatch(E const &)` Dispatch an event to the current state of all the state machines in the list. template< typename... SS > struct StateList ------------------------------------------- * `static void reset(void)` Re-instantiate all states in the list, using copy-constructor. See example: `/examples/api/resetting_switch.cpp`