29#ifndef ETL_STATE_CHART_INCLUDED
30#define ETL_STATE_CHART_INCLUDED
46 namespace state_chart_traits
54 template <
typename TObject,
typename TParameter =
void>
67 , from_any_state(
false)
80 , from_any_state(
true)
84 const state_id_t current_state_id;
85 const event_id_t event_id;
86 const state_id_t next_state_id;
89 const bool from_any_state;
96 template <
typename TObject>
109 , from_any_state(
false)
117 : current_state_id(0)
122 , from_any_state(
true)
126 const state_id_t current_state_id;
127 const event_id_t event_id;
128 const state_id_t next_state_id;
131 const bool from_any_state;
137 template <
typename TObject>
158 template <
typename TParameter>
164 typedef state_chart_traits::state_id_t
state_id_t;
165 typedef state_chart_traits::event_id_t event_id_t;
173 virtual void process_event(event_id_t, parameter_t) = 0;
199 typedef state_chart_traits::state_id_t
state_id_t;
200 typedef state_chart_traits::event_id_t event_id_t;
207 virtual void process_event(event_id_t) = 0;
242 typedef state_chart_traits::state_id_t
state_id_t;
243 typedef state_chart_traits::event_id_t event_id_t;
319 if ((t->guard == ETL_NULLPTR) || ((
TObject_Ref.*t->guard)()))
322 if (t->action != ETL_NULLPTR)
371 const state* find_state(state_id_t state_id)
379 is_transition(event_id_t event_id_, state_id_t state_id_)
380 : event_id(event_id_)
381 , state_id(state_id_)
385 bool operator()(
const transition& t)
const
387 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
390 const event_id_t event_id;
391 const state_id_t state_id;
397 is_state(state_id_t state_id_)
398 : state_id(state_id_)
402 bool operator()(
const state& s)
const
404 return (s.state_id == state_id);
407 const state_id_t state_id;
422 template <
typename TObject,
424 TObject& TObject_Ref,
426 size_t Transition_Table_Size,
428 size_t State_Table_Size,
435 typedef state_chart_traits::state_id_t
state_id_t;
436 typedef state_chart_traits::event_id_t event_id_t;
496 virtual void process_event(event_id_t event_id, parameter_t data) ETL_OVERRIDE
512 if ((t->guard == ETL_NULLPTR) || ((
TObject_Ref.*t->guard)()))
515 if (t->action != ETL_NULLPTR)
568 const state* find_state(state_id_t state_id)
576 is_transition(event_id_t event_id_, state_id_t state_id_)
577 : event_id(event_id_)
578 , state_id(state_id_)
582 bool operator()(
const transition& t)
const
584 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
587 const event_id_t event_id;
588 const state_id_t state_id;
594 is_state(state_id_t state_id_)
595 : state_id(state_id_)
599 bool operator()(
const state& s)
const
601 return (s.state_id == state_id);
604 const state_id_t state_id;
619 template <
typename TObject,
typename TParameter =
void>
625 typedef state_chart_traits::state_id_t
state_id_t;
626 typedef state_chart_traits::event_id_t event_id_t;
710 if ((s != state_table_end()) && (
s->on_entry != ETL_NULLPTR))
712 (
object.*(
s->on_entry))();
733 while (t != transition_table_end())
736 t = etl::find_if(t, transition_table_end(), is_transition(event_id, this->
current_state_id));
739 if (t != transition_table_end())
742 if ((t->guard == ETL_NULLPTR) || ((
object.*t->guard)()))
745 if (t->action != ETL_NULLPTR)
750 (
object.*t->action)(data);
763 if ((s != state_table_end()) && (
s->on_exit != ETL_NULLPTR))
765 (
object.*(
s->on_exit))();
774 if ((s != state_table_end()) && (
s->on_entry != ETL_NULLPTR))
776 (
object.*(
s->on_entry))();
780 t = transition_table_end();
798 const state* find_state(state_id_t state_id)
800 if (state_table_begin == ETL_NULLPTR)
802 return state_table_end();
806 return etl::find_if(state_table_begin, state_table_end(), is_state(state_id));
811 const transition* transition_table_end()
const
813 return transition_table_begin + transition_table_size;
817 const state* state_table_end()
const
819 return state_table_begin + state_table_size;
825 is_transition(event_id_t event_id_, state_id_t state_id_)
826 : event_id(event_id_)
827 , state_id(state_id_)
831 bool operator()(
const transition& t)
const
833 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
836 const event_id_t event_id;
837 const state_id_t state_id;
843 is_state(state_id_t state_id_)
844 : state_id(state_id_)
848 bool operator()(
const state& s)
const
850 return (s.state_id == state_id);
853 const state_id_t state_id;
858 state_chart& operator =(
const state_chart&) ETL_DELETE;
861 const transition* transition_table_begin;
862 const state* state_table_begin;
863 uint_least8_t transition_table_size;
864 uint_least8_t state_table_size;
873 template <
typename TObject>
879 typedef state_chart_traits::state_id_t
state_id_t;
880 typedef state_chart_traits::event_id_t event_id_t;
964 if ((s != state_table_end()) && (
s->on_entry != ETL_NULLPTR))
966 (
object.*(
s->on_entry))();
987 while (t != transition_table_end())
990 t = etl::find_if(t, transition_table_end(), is_transition(event_id, this->
current_state_id));
993 if (t != transition_table_end())
996 if ((t->guard == ETL_NULLPTR) || ((
object.*t->guard)()))
999 if (t->action != ETL_NULLPTR)
1001 (
object.*t->action)();
1013 if ((s != state_table_end()) && (
s->on_exit != ETL_NULLPTR))
1015 (
object.*(
s->on_exit))();
1024 if ((s != state_table_end()) && (
s->on_entry != ETL_NULLPTR))
1026 (
object.*(
s->on_entry))();
1030 t = transition_table_end();
1048 const state* find_state(state_id_t state_id)
1050 if (state_table_begin == ETL_NULLPTR)
1052 return state_table_end();
1056 return etl::find_if(state_table_begin, state_table_end(), is_state(state_id));
1061 const transition* transition_table_end()
const
1063 return transition_table_begin + transition_table_size;
1067 const state* state_table_end()
const
1069 return state_table_begin + state_table_size;
1073 struct is_transition
1075 is_transition(event_id_t event_id_, state_id_t state_id_)
1076 : event_id(event_id_)
1077 , state_id(state_id_)
1081 bool operator()(
const transition& t)
const
1083 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
1086 const event_id_t event_id;
1087 const state_id_t state_id;
1093 is_state(state_id_t state_id_)
1094 : state_id(state_id_)
1098 bool operator()(
const state& s)
const
1100 return (s.state_id == state_id);
1103 const state_id_t state_id;
1108 state_chart& operator =(
const state_chart&) ETL_DELETE;
1111 const transition* transition_table_begin;
1112 const state* state_table_begin;
1113 uint_least8_t transition_table_size;
1114 uint_least8_t state_table_size;
state_id_t get_state_id() const
Definition state_chart.h:215
state_id_t current_state_id
The current state id.
Definition state_chart.h:222
For non-void parameter types.
Definition state_chart.h:160
state_id_t current_state_id
The current state id.
Definition state_chart.h:187
state_id_t get_state_id() const
Definition state_chart.h:180
ETL_CONSTEXPR state_chart(TObject &object_, const transition *transition_table_begin_, const transition *transition_table_end_, const state *state_table_begin_, const state *state_table_end_, const state_id_t state_id_)
Definition state_chart.h:893
virtual void start(bool on_entry_initial=true) ETL_OVERRIDE
Start the state chart.
Definition state_chart.h:954
void process_event(event_id_t event_id) ETL_OVERRIDE
Definition state_chart.h:980
TObject & get_object()
Definition state_chart.h:937
const TObject & get_object() const
Definition state_chart.h:946
void set_transition_table(const transition *transition_table_begin_, const transition *transition_table_end_)
Definition state_chart.h:914
void set_state_table(const state *state_table_begin_, const state *state_table_end_)
Definition state_chart.h:926
Definition state_chart.h:238
ETL_CONSTEXPR state_chart_ct()
Constructor.
Definition state_chart.h:250
const TObject & get_object() const
Definition state_chart.h:269
TObject & get_object()
Definition state_chart.h:260
virtual void start(bool on_entry_initial=true) ETL_OVERRIDE
Start the state chart.
Definition state_chart.h:277
virtual void process_event(event_id_t event_id) ETL_OVERRIDE
Definition state_chart.h:303
Definition state_chart.h:431
const TObject & get_object() const
Definition state_chart.h:462
TObject & get_object()
Definition state_chart.h:453
virtual void start(bool on_entry_initial=true) ETL_OVERRIDE
Start the state chart.
Definition state_chart.h:470
virtual void process_event(event_id_t event_id, parameter_t data) ETL_OVERRIDE
Definition state_chart.h:496
ETL_CONSTEXPR state_chart_ctp()
Constructor.
Definition state_chart.h:443
Definition state_chart.h:621
void process_event(event_id_t event_id, parameter_t data) ETL_OVERRIDE
Definition state_chart.h:726
ETL_CONSTEXPR state_chart(TObject &object_, const transition *transition_table_begin_, const transition *transition_table_end_, const state *state_table_begin_, const state *state_table_end_, const state_id_t state_id_)
Definition state_chart.h:639
TObject & get_object()
Definition state_chart.h:683
virtual void start(bool on_entry_initial=true) ETL_OVERRIDE
Start the state chart.
Definition state_chart.h:700
void set_transition_table(const transition *transition_table_begin_, const transition *transition_table_end_)
Definition state_chart.h:660
void set_state_table(const state *state_table_begin_, const state *state_table_end_)
Definition state_chart.h:672
const TObject & get_object() const
Definition state_chart.h:692
bitset_ext
Definition absolute.h:38
pair holds two objects of arbitrary type
Definition utility.h:164
State definition.
Definition state_chart.h:139
Definition state_chart.h:98
Transition definition.
Definition state_chart.h:56