29 #ifndef ETL_STATE_CHART_INCLUDED
30 #define ETL_STATE_CHART_INCLUDED
48 typedef int state_id_t;
49 typedef int event_id_t;
51 virtual void start(
const bool on_entry_initial =
true) = 0;
52 virtual void process_event(
const event_id_t event_id) = 0;
69 istate_chart(state_id_t current_state_id_)
80 template <
typename TObject>
90 ETL_CONSTEXPR
transition(
const state_id_t current_state_id_,
91 const event_id_t event_id_,
92 const state_id_t next_state_id_,
93 void (TObject::*
const action_)() = ETL_NULLPTR,
94 bool (TObject::*
const guard_)() = ETL_NULLPTR)
95 : from_any_state(
false),
96 current_state_id(current_state_id_),
98 next_state_id(next_state_id_),
104 ETL_CONSTEXPR
transition(
const event_id_t event_id_,
105 const state_id_t next_state_id_,
106 void (TObject::*
const action_)() = ETL_NULLPTR,
107 bool (TObject::*
const guard_)() = ETL_NULLPTR)
108 : from_any_state(
true),
111 next_state_id(next_state_id_),
117 const bool from_any_state;
118 const state_id_t current_state_id;
119 const event_id_t event_id;
120 const state_id_t next_state_id;
121 void (TObject::*
const action)();
122 bool (TObject::*
const guard)();
130 ETL_CONSTEXPR
state(
const state_id_t state_id_,
131 void (TObject::*
const on_entry_)() = ETL_NULLPTR,
132 void (TObject::*
const on_exit_)() = ETL_NULLPTR)
133 : state_id(state_id_),
140 void (TObject::*
const on_entry)();
141 void (TObject::*
const on_exit)();
154 const state_id_t state_id_)
157 transition_table(transition_table_begin_, transition_table_end_),
174 const state* state_table_begin_,
175 const state* state_table_end_,
176 const state_id_t state_id_)
179 transition_table(transition_table_begin_, transition_table_end_),
180 state_table(state_table_begin_, state_table_end_),
193 transition_table.assign(transition_table_begin_, transition_table_end_);
202 const state* state_table_end_)
204 state_table.assign(state_table_begin_, state_table_end_);
231 if (state_table.empty())
233 return state_table.end();
237 return etl::find_if(state_table.begin(),
246 virtual void start(
const bool on_entry_initial =
true)
250 if (on_entry_initial)
256 if ((s != state_table.end()) && (s->on_entry != ETL_NULLPTR))
258 (
object.*(s->on_entry))();
276 const transition* t = transition_table.begin();
279 while (t != transition_table.end())
283 transition_table.end(),
287 if (t != transition_table.end())
290 if ((t->guard == ETL_NULLPTR) || ((
object.*t->guard)()))
293 if (t->action != ETL_NULLPTR)
295 (
object.*t->action)();
307 if ((s != state_table.end()) && (s->on_exit != ETL_NULLPTR))
309 (
object.*(s->on_exit))();
318 if ((s != state_table.end()) && (s->on_entry != ETL_NULLPTR))
320 (
object.*(s->on_entry))();
324 t = transition_table.end();
341 is_transition(event_id_t event_id_, state_id_t state_id_)
342 : event_id(event_id_),
347 bool operator()(
const transition& t)
const
349 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
352 const event_id_t event_id;
353 const state_id_t state_id;
359 is_state(state_id_t state_id_)
360 : state_id(state_id_)
364 bool operator()(
const state& s)
const
366 return (s.state_id == state_id);
369 const state_id_t state_id;
Array view.
Definition: array_view.h:100
Simple Finite State Machine Interface.
Definition: state_chart.h:45
state_id_t get_state_id() const
Definition: state_chart.h:58
state_id_t current_state_id
The current state id.
Definition: state_chart.h:74
Simple Finite State Machine.
Definition: state_chart.h:82
const TObject & get_object() const
Definition: state_chart.h:220
void set_transition_table(const transition *transition_table_begin_, const transition *transition_table_end_)
Definition: state_chart.h:190
const state * find_state(state_id_t state_id)
Definition: state_chart.h:229
TObject & get_object()
Definition: state_chart.h:211
virtual void process_event(const event_id_t event_id)
Definition: state_chart.h:272
void set_state_table(const state *state_table_begin_, const state *state_table_end_)
Definition: state_chart.h:201
ETL_CONSTEXPR state_chart(TObject &object_, const transition *transition_table_begin_, const transition *transition_table_end_, const state_id_t state_id_)
Definition: state_chart.h:151
Definition: absolute.h:37
State definition.
Definition: state_chart.h:129
Transition definition.
Definition: state_chart.h:89