29#ifndef ETL_STATE_CHART_INCLUDED
30#define ETL_STATE_CHART_INCLUDED
46 namespace state_chart_traits
48 typedef uint_least8_t state_id_t;
49 typedef uint_least8_t event_id_t;
54 template <
typename TObject,
typename TParameter =
void>
57 ETL_CONSTEXPR
transition(
const state_id_t current_state_id_,
59 const state_id_t next_state_id_,
60 void (TObject::*
const action_)(TParameter) = ETL_NULLPTR,
61 bool (TObject::*
const guard_)() = ETL_NULLPTR)
62 : current_state_id(current_state_id_)
64 , next_state_id(next_state_id_)
67 , from_any_state(
false)
72 const state_id_t next_state_id_,
73 void (TObject::*
const action_)(TParameter) = ETL_NULLPTR,
74 bool (TObject::*
const guard_)() = ETL_NULLPTR)
77 , next_state_id(next_state_id_)
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;
87 void (TObject::*
const action)(TParameter);
88 bool (TObject::*
const guard)();
89 const bool from_any_state;
96 template <
typename TObject>
99 ETL_CONSTEXPR
transition(
const state_id_t current_state_id_,
100 event_id_t event_id_,
101 const state_id_t next_state_id_,
102 void (TObject::*
const action_)() = ETL_NULLPTR,
103 bool (TObject::*
const guard_)() = ETL_NULLPTR)
104 : current_state_id(current_state_id_)
105 , event_id(event_id_)
106 , next_state_id(next_state_id_)
109 , from_any_state(
false)
113 ETL_CONSTEXPR
transition(event_id_t event_id_,
114 const state_id_t next_state_id_,
115 void (TObject::*
const action_)() = ETL_NULLPTR,
116 bool (TObject::*
const guard_)() = ETL_NULLPTR)
117 : current_state_id(0)
118 , event_id(event_id_)
119 , next_state_id(next_state_id_)
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;
129 void (TObject::*
const action)();
130 bool (TObject::*
const guard)();
131 const bool from_any_state;
137 template <
typename TObject>
140 ETL_CONSTEXPR
state(
const state_id_t state_id_,
141 void (TObject::*
const on_entry_)() = ETL_NULLPTR,
142 void (TObject::*
const on_exit_)() = ETL_NULLPTR)
143 : state_id(state_id_)
144 , on_entry(on_entry_)
150 void (TObject::*
const on_entry)();
151 void (TObject::*
const on_exit)();
158 template <
typename TParameter>
163 typedef TParameter parameter_t;
164 typedef state_chart_traits::state_id_t state_id_t;
165 typedef state_chart_traits::event_id_t event_id_t;
172 virtual void start(
bool on_entry_initial =
true) = 0;
173 virtual void process_event(event_id_t, parameter_t) = 0;
198 typedef void parameter_t;
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;
208 virtual void start(
bool on_entry_initial =
true) = 0;
230 template <
typename TObject,
231 TObject& TObject_Ref,
233 size_t Transition_Table_Size,
235 size_t State_Table_Size,
236 etl::state_chart_traits::state_id_t Initial_State>
241 typedef void parameter_t;
242 typedef state_chart_traits::state_id_t state_id_t;
243 typedef state_chart_traits::event_id_t event_id_t;
277 virtual void start(
bool on_entry_initial =
true) ETL_OVERRIDE
281 if (on_entry_initial)
287 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_entry != ETL_NULLPTR))
289 (TObject_Ref.*(s->on_entry))();
310 while (t != (Transition_Table_Begin + Transition_Table_Size))
313 t = etl::find_if(t, (Transition_Table_Begin + Transition_Table_Size), is_transition(event_id, this->
current_state_id));
316 if (t != (Transition_Table_Begin + Transition_Table_Size))
319 if ((t->guard == ETL_NULLPTR) || ((TObject_Ref.*t->guard)()))
322 if (t->action != ETL_NULLPTR)
324 (TObject_Ref.*t->action)();
336 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_exit != ETL_NULLPTR))
338 (TObject_Ref.*(s->on_exit))();
347 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_entry != ETL_NULLPTR))
349 (TObject_Ref.*(s->on_entry))();
353 t = (Transition_Table_Begin + Transition_Table_Size);
371 const state* find_state(state_id_t state_id)
373 return etl::find_if(State_Table_Begin, State_Table_Begin + State_Table_Size, is_state(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,
429 etl::state_chart_traits::state_id_t Initial_State>
434 typedef TParameter parameter_t;
435 typedef state_chart_traits::state_id_t state_id_t;
436 typedef state_chart_traits::event_id_t event_id_t;
470 virtual void start(
bool on_entry_initial =
true) ETL_OVERRIDE
474 if (on_entry_initial)
480 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_entry != ETL_NULLPTR))
482 (TObject_Ref.*(s->on_entry))();
496 virtual void process_event(event_id_t event_id, parameter_t data) ETL_OVERRIDE
503 while (t != (Transition_Table_Begin + Transition_Table_Size))
506 t = etl::find_if(t, (Transition_Table_Begin + Transition_Table_Size), is_transition(event_id, this->
current_state_id));
509 if (t != (Transition_Table_Begin + Transition_Table_Size))
512 if ((t->guard == ETL_NULLPTR) || ((TObject_Ref.*t->guard)()))
515 if (t->action != ETL_NULLPTR)
518 (TObject_Ref.*t->action)(etl::forward<parameter_t>(data));
520 (TObject_Ref.*t->action)(data);
533 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_exit != ETL_NULLPTR))
535 (TObject_Ref.*(s->on_exit))();
544 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_entry != ETL_NULLPTR))
546 (TObject_Ref.*(s->on_entry))();
550 t = (Transition_Table_Begin + Transition_Table_Size);
568 const state* find_state(state_id_t state_id)
570 return etl::find_if(State_Table_Begin, State_Table_Begin + State_Table_Size, is_state(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>
624 typedef TParameter parameter_t;
625 typedef state_chart_traits::state_id_t state_id_t;
626 typedef state_chart_traits::event_id_t event_id_t;
642 const state* state_table_begin_,
643 const state* state_table_end_,
644 const state_id_t state_id_)
647 , transition_table_begin(transition_table_begin_)
648 , state_table_begin(state_table_begin_)
649 , transition_table_size(transition_table_end_ - transition_table_begin_)
650 , state_table_size(state_table_end_ - state_table_begin_)
663 transition_table_begin = transition_table_begin_;
664 transition_table_size = transition_table_end_ - transition_table_begin_;
673 const state* state_table_end_)
675 state_table_begin = state_table_begin_;
676 state_table_size = state_table_end_ - state_table_begin_;
700 virtual void start(
bool on_entry_initial =
true) ETL_OVERRIDE
704 if (on_entry_initial)
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)
748 (
object.*t->action)(etl::forward<parameter_t>(data));
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;
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>
878 typedef void parameter_t;
879 typedef state_chart_traits::state_id_t state_id_t;
880 typedef state_chart_traits::event_id_t event_id_t;
896 const state* state_table_begin_,
897 const state* state_table_end_,
898 const state_id_t state_id_)
901 , transition_table_begin(transition_table_begin_)
902 , state_table_begin(state_table_begin_)
903 , transition_table_size(transition_table_end_ - transition_table_begin_)
904 , state_table_size(state_table_end_ - state_table_begin_)
917 transition_table_begin = transition_table_begin_;
918 transition_table_size = transition_table_end_ - transition_table_begin_;
927 const state* state_table_end_)
929 state_table_begin = state_table_begin_;
930 state_table_size = state_table_end_ - state_table_begin_;
954 virtual void start(
bool on_entry_initial =
true) ETL_OVERRIDE
958 if (on_entry_initial)
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;
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
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
State definition.
Definition: state_chart.h:139
Definition: state_chart.h:98
Transition definition.
Definition: state_chart.h:56