29#ifndef ETL_STATE_CHART_INCLUDED
30#define ETL_STATE_CHART_INCLUDED
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_, event_id_t event_id_,
const state_id_t next_state_id_,
58 void (TObject::*
const action_)(TParameter) = ETL_NULLPTR,
bool (TObject::*
const guard_)() = ETL_NULLPTR)
59 : current_state_id(current_state_id_)
61 , next_state_id(next_state_id_)
64 , from_any_state(
false)
68 ETL_CONSTEXPR transition(event_id_t event_id_,
const state_id_t next_state_id_,
void (TObject::*
const action_)(TParameter) = ETL_NULLPTR,
69 bool (TObject::*
const guard_)() = ETL_NULLPTR)
72 , next_state_id(next_state_id_)
75 , from_any_state(
true)
79 const state_id_t current_state_id;
80 const event_id_t event_id;
81 const state_id_t next_state_id;
82 void (TObject::*
const action)(TParameter);
83 bool (TObject::*
const guard)();
84 const bool from_any_state;
91 template <
typename TObject>
92 struct transition<TObject, void>
94 ETL_CONSTEXPR transition(
const state_id_t current_state_id_, event_id_t event_id_,
const state_id_t next_state_id_,
95 void (TObject::*
const action_)() = ETL_NULLPTR,
bool (TObject::*
const guard_)() = ETL_NULLPTR)
96 : current_state_id(current_state_id_)
98 , next_state_id(next_state_id_)
101 , from_any_state(
false)
105 ETL_CONSTEXPR transition(event_id_t event_id_,
const state_id_t next_state_id_,
void (TObject::*
const action_)() = ETL_NULLPTR,
106 bool (TObject::*
const guard_)() = ETL_NULLPTR)
107 : current_state_id(0)
108 , event_id(event_id_)
109 , next_state_id(next_state_id_)
112 , from_any_state(
true)
116 const state_id_t current_state_id;
117 const event_id_t event_id;
118 const state_id_t next_state_id;
119 void (TObject::*
const action)();
120 bool (TObject::*
const guard)();
121 const bool from_any_state;
127 template <
typename TObject>
130 ETL_CONSTEXPR state(
const state_id_t state_id_,
void (TObject::*
const on_entry_)() = ETL_NULLPTR,
void (TObject::*
const on_exit_)() = ETL_NULLPTR)
131 : state_id(state_id_)
132 , on_entry(on_entry_)
138 void (TObject::*
const on_entry)();
139 void (TObject::*
const on_exit)();
146 template <
typename TParameter>
151 typedef TParameter parameter_t;
152 typedef state_chart_traits::state_id_t state_id_t;
153 typedef state_chart_traits::event_id_t event_id_t;
155 istate_chart(state_id_t initial_state_id)
160 virtual void start(
bool on_entry_initial =
true) = 0;
161 virtual void process_event(event_id_t, parameter_t) = 0;
162 virtual ~istate_chart() {}
182 class istate_chart<void>
186 typedef void parameter_t;
187 typedef state_chart_traits::state_id_t state_id_t;
188 typedef state_chart_traits::event_id_t event_id_t;
190 istate_chart(state_id_t initial_state_id)
195 virtual void process_event(event_id_t) = 0;
196 virtual void start(
bool on_entry_initial =
true) = 0;
197 virtual ~istate_chart() {}
218 template <
typename TObject, TObject& TObject_Ref, const etl::state_
chart_traits::transition<TObject,
void>* Transition_Table_Begin,
219 size_t Transition_Table_Size, const etl::state_
chart_traits::state<TObject>* State_Table_Begin,
size_t State_Table_Size,
220 etl::state_
chart_traits::state_
id_t Initial_State>
225 typedef void parameter_t;
226 typedef state_chart_traits::state_id_t state_id_t;
227 typedef state_chart_traits::event_id_t event_id_t;
235 : istate_chart<void>(Initial_State)
261 virtual void start(
bool on_entry_initial =
true) ETL_OVERRIDE
265 if (on_entry_initial)
271 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_entry != ETL_NULLPTR))
273 (TObject_Ref.*(s->on_entry))();
291 const transition* t = Transition_Table_Begin;
295 while (t != (Transition_Table_Begin + Transition_Table_Size))
298 t = etl::find_if(t, (Transition_Table_Begin + Transition_Table_Size), is_transition(event_id, this->
current_state_id));
301 if (t != (Transition_Table_Begin + Transition_Table_Size))
304 if ((t->guard == ETL_NULLPTR) || ((TObject_Ref.*t->guard)()))
307 if (t->action != ETL_NULLPTR)
309 (TObject_Ref.*t->action)();
321 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_exit != ETL_NULLPTR))
323 (TObject_Ref.*(s->on_exit))();
332 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_entry != ETL_NULLPTR))
334 (TObject_Ref.*(s->on_entry))();
338 t = (Transition_Table_Begin + Transition_Table_Size);
356 const state* find_state(state_id_t state_id)
358 return etl::find_if(State_Table_Begin, State_Table_Begin + State_Table_Size, is_state(state_id));
364 is_transition(event_id_t event_id_, state_id_t state_id_)
365 : event_id(event_id_)
366 , state_id(state_id_)
370 bool operator()(
const transition& t)
const
372 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
375 const event_id_t event_id;
376 const state_id_t state_id;
382 is_state(state_id_t state_id_)
383 : state_id(state_id_)
387 bool operator()(
const state& s)
const
389 return (s.state_id == state_id);
392 const state_id_t state_id;
407 template <
typename TObject,
typename TParameter, TObject& TObject_Ref,
408 const etl::state_chart_traits::transition<TObject, TParameter>* Transition_Table_Begin,
size_t Transition_Table_Size,
409 const etl::state_chart_traits::state<TObject>* State_Table_Begin,
size_t State_Table_Size,
410 etl::state_chart_traits::state_id_t Initial_State>
415 typedef TParameter parameter_t;
416 typedef state_chart_traits::state_id_t state_id_t;
417 typedef state_chart_traits::event_id_t event_id_t;
425 : istate_chart<TParameter>(Initial_State)
451 virtual void start(
bool on_entry_initial =
true) ETL_OVERRIDE
455 if (on_entry_initial)
461 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_entry != ETL_NULLPTR))
463 (TObject_Ref.*(s->on_entry))();
481 const transition* t = Transition_Table_Begin;
485 while (t != (Transition_Table_Begin + Transition_Table_Size))
488 t = etl::find_if(t, (Transition_Table_Begin + Transition_Table_Size), is_transition(event_id, this->
current_state_id));
491 if (t != (Transition_Table_Begin + Transition_Table_Size))
494 if ((t->guard == ETL_NULLPTR) || ((TObject_Ref.*t->guard)()))
497 if (t->action != ETL_NULLPTR)
500 (TObject_Ref.*t->action)(etl::forward<parameter_t>(
data));
502 (TObject_Ref.*t->action)(
data);
515 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_exit != ETL_NULLPTR))
517 (TObject_Ref.*(s->on_exit))();
526 if ((s != (State_Table_Begin + State_Table_Size)) && (s->on_entry != ETL_NULLPTR))
528 (TObject_Ref.*(s->on_entry))();
532 t = (Transition_Table_Begin + Transition_Table_Size);
550 const state* find_state(state_id_t state_id)
552 return etl::find_if(State_Table_Begin, State_Table_Begin + State_Table_Size, is_state(state_id));
558 is_transition(event_id_t event_id_, state_id_t state_id_)
559 : event_id(event_id_)
560 , state_id(state_id_)
564 bool operator()(
const transition& t)
const
566 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
569 const event_id_t event_id;
570 const state_id_t state_id;
576 is_state(state_id_t state_id_)
577 : state_id(state_id_)
581 bool operator()(
const state& s)
const
583 return (s.state_id == state_id);
586 const state_id_t state_id;
601 template <
typename TObject,
typename TParameter =
void>
606 typedef TParameter parameter_t;
607 typedef state_chart_traits::state_id_t state_id_t;
608 typedef state_chart_traits::event_id_t event_id_t;
621 ETL_CONSTEXPR
state_chart(TObject& object_,
const transition* transition_table_begin_,
const transition* transition_table_end_,
622 const state* state_table_begin_,
const state* state_table_end_,
const state_id_t state_id_)
623 : istate_chart<TParameter>(state_id_)
625 , transition_table_begin(transition_table_begin_)
626 , state_table_begin(state_table_begin_)
627 , transition_table_size(transition_table_end_ - transition_table_begin_)
628 , state_table_size(state_table_end_ - state_table_begin_)
640 transition_table_begin = transition_table_begin_;
641 transition_table_size = transition_table_end_ - transition_table_begin_;
651 state_table_begin = state_table_begin_;
652 state_table_size = state_table_end_ - state_table_begin_;
676 virtual void start(
bool on_entry_initial =
true) ETL_OVERRIDE
680 if (on_entry_initial)
686 if ((s != state_table_end()) && (s->on_entry != ETL_NULLPTR))
688 (
object.*(s->on_entry))();
706 const transition* t = transition_table_begin;
710 while (t != transition_table_end())
713 t = etl::find_if(t, transition_table_end(), is_transition(event_id, this->
current_state_id));
716 if (t != transition_table_end())
719 if ((t->guard == ETL_NULLPTR) || ((
object.*t->guard)()))
722 if (t->action != ETL_NULLPTR)
725 (
object.*t->action)(etl::forward<parameter_t>(
data));
727 (
object.*t->action)(
data);
740 if ((s != state_table_end()) && (s->on_exit != ETL_NULLPTR))
742 (
object.*(s->on_exit))();
751 if ((s != state_table_end()) && (s->on_entry != ETL_NULLPTR))
753 (
object.*(s->on_entry))();
757 t = transition_table_end();
775 const state* find_state(state_id_t state_id)
777 if (state_table_begin == ETL_NULLPTR)
779 return state_table_end();
783 return etl::find_if(state_table_begin, state_table_end(), is_state(state_id));
788 const transition* transition_table_end()
const
790 return transition_table_begin + transition_table_size;
794 const state* state_table_end()
const
796 return state_table_begin + state_table_size;
802 is_transition(event_id_t event_id_, state_id_t state_id_)
803 : event_id(event_id_)
804 , state_id(state_id_)
808 bool operator()(
const transition& t)
const
810 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
813 const event_id_t event_id;
814 const state_id_t state_id;
820 is_state(state_id_t state_id_)
821 : state_id(state_id_)
825 bool operator()(
const state& s)
const
827 return (s.state_id == state_id);
830 const state_id_t state_id;
838 const transition* transition_table_begin;
839 const state* state_table_begin;
840 uint_least8_t transition_table_size;
841 uint_least8_t state_table_size;
850 template <
typename TObject>
855 typedef void parameter_t;
856 typedef state_chart_traits::state_id_t state_id_t;
857 typedef state_chart_traits::event_id_t event_id_t;
870 ETL_CONSTEXPR
state_chart(TObject& object_,
const transition* transition_table_begin_,
const transition* transition_table_end_,
871 const state* state_table_begin_,
const state* state_table_end_,
const state_id_t state_id_)
872 : istate_chart<void>(state_id_)
874 , transition_table_begin(transition_table_begin_)
875 , state_table_begin(state_table_begin_)
876 , transition_table_size(transition_table_end_ - transition_table_begin_)
877 , state_table_size(state_table_end_ - state_table_begin_)
889 transition_table_begin = transition_table_begin_;
890 transition_table_size = transition_table_end_ - transition_table_begin_;
900 state_table_begin = state_table_begin_;
901 state_table_size = state_table_end_ - state_table_begin_;
925 virtual void start(
bool on_entry_initial =
true) ETL_OVERRIDE
929 if (on_entry_initial)
935 if ((s != state_table_end()) && (s->on_entry != ETL_NULLPTR))
937 (
object.*(s->on_entry))();
955 const transition* t = transition_table_begin;
959 while (t != transition_table_end())
962 t = etl::find_if(t, transition_table_end(), is_transition(event_id, this->
current_state_id));
965 if (t != transition_table_end())
968 if ((t->guard == ETL_NULLPTR) || ((
object.*t->guard)()))
971 if (t->action != ETL_NULLPTR)
973 (
object.*t->action)();
985 if ((s != state_table_end()) && (s->on_exit != ETL_NULLPTR))
987 (
object.*(s->on_exit))();
996 if ((s != state_table_end()) && (s->on_entry != ETL_NULLPTR))
998 (
object.*(s->on_entry))();
1002 t = transition_table_end();
1020 const state* find_state(state_id_t state_id)
1022 if (state_table_begin == ETL_NULLPTR)
1024 return state_table_end();
1028 return etl::find_if(state_table_begin, state_table_end(), is_state(state_id));
1033 const transition* transition_table_end()
const
1035 return transition_table_begin + transition_table_size;
1039 const state* state_table_end()
const
1041 return state_table_begin + state_table_size;
1045 struct is_transition
1047 is_transition(event_id_t event_id_, state_id_t state_id_)
1048 : event_id(event_id_)
1049 , state_id(state_id_)
1053 bool operator()(
const transition& t)
const
1055 return (t.event_id == event_id) && (t.from_any_state || (t.current_state_id == state_id));
1058 const event_id_t event_id;
1059 const state_id_t state_id;
1065 is_state(state_id_t state_id_)
1066 : state_id(state_id_)
1070 bool operator()(
const state& s)
const
1072 return (s.state_id == state_id);
1075 const state_id_t state_id;
1083 const transition* transition_table_begin;
1084 const state* state_table_begin;
1085 uint_least8_t transition_table_size;
1086 uint_least8_t state_table_size;
state_id_t get_state_id() const
Definition state_chart.h:203
state_id_t current_state_id
The current state id.
Definition state_chart.h:210
state_id_t current_state_id
The current state id.
Definition state_chart.h:175
state_id_t get_state_id() const
Definition state_chart.h:168
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:870
virtual void start(bool on_entry_initial=true) ETL_OVERRIDE
Start the state chart.
Definition state_chart.h:925
void process_event(event_id_t event_id) ETL_OVERRIDE
Definition state_chart.h:951
TObject & get_object()
Definition state_chart.h:908
const TObject & get_object() const
Definition state_chart.h:917
void set_transition_table(const transition *transition_table_begin_, const transition *transition_table_end_)
Definition state_chart.h:887
void set_state_table(const state *state_table_begin_, const state *state_table_end_)
Definition state_chart.h:898
ETL_CONSTEXPR state_chart_ct()
Constructor.
Definition state_chart.h:234
const TObject & get_object() const
Definition state_chart.h:253
TObject & get_object()
Definition state_chart.h:244
virtual void start(bool on_entry_initial=true) ETL_OVERRIDE
Start the state chart.
Definition state_chart.h:261
virtual void process_event(event_id_t event_id) ETL_OVERRIDE
Definition state_chart.h:287
const TObject & get_object() const
Definition state_chart.h:443
TObject & get_object()
Definition state_chart.h:434
virtual void start(bool on_entry_initial=true) ETL_OVERRIDE
Start the state chart.
Definition state_chart.h:451
virtual void process_event(event_id_t event_id, parameter_t data) ETL_OVERRIDE
Definition state_chart.h:477
ETL_CONSTEXPR state_chart_ctp()
Constructor.
Definition state_chart.h:424
void process_event(event_id_t event_id, parameter_t data) ETL_OVERRIDE
Definition state_chart.h:702
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:621
TObject & get_object()
Definition state_chart.h:659
virtual void start(bool on_entry_initial=true) ETL_OVERRIDE
Start the state chart.
Definition state_chart.h:676
void set_transition_table(const transition *transition_table_begin_, const transition *transition_table_end_)
Definition state_chart.h:638
void set_state_table(const state *state_table_begin_, const state *state_table_end_)
Definition state_chart.h:649
const TObject & get_object() const
Definition state_chart.h:668
Simple Finite State Machine Types.
Definition state_chart.h:47
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR TContainer::pointer data(TContainer &container)
Definition iterator.h:1228
State definition.
Definition state_chart.h:129
Transition definition.
Definition state_chart.h:56