30#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
51#ifndef ETL_FSM_INCLUDED
52#define ETL_FSM_INCLUDED
60#include "message_router.h"
74#if !defined(ETL_FSM_STATE_ID_TYPE)
83#if ETL_USING_CPP17 && !defined(ETL_FSM_FORCE_CPP03_IMPLEMENTATION)
88 typename,
typename,
typename,
typename,
89 typename,
typename,
typename,
typename,
90 typename,
typename,
typename,
typename,
91 typename,
typename,
typename,
typename>
184 namespace private_fsm
186 template <
typename T =
void>
196 static ETL_CONSTANT
fsm_state_id_t Pass_To_Parent = No_State_Change - 1U;
199 static ETL_CONSTANT
fsm_state_id_t Self_Transition = No_State_Change - 2U;
202 template <
typename T>
205 template <
typename T>
208 template <
typename T>
227#if ETL_USING_CPP17 && !defined(ETL_FSM_FORCE_CPP03_IMPLEMENTATION)
232 typename,
typename,
typename,
typename,
233 typename,
typename,
typename,
typename,
234 typename,
typename,
typename,
typename,
235 typename,
typename,
typename,
typename>
254 state.p_parent =
this;
256 if (p_default_child == ETL_NULLPTR)
258 p_active_child = &state;
259 p_default_child = &state;
267 template <
typename TSize>
270 p_active_child = ETL_NULLPTR;
271 p_default_child = ETL_NULLPTR;
287 p_context(ETL_NULLPTR),
288 p_parent(ETL_NULLPTR),
289 p_active_child(ETL_NULLPTR),
290 p_default_child(ETL_NULLPTR)
311 virtual fsm_state_id_t on_enter_state() {
return No_State_Change; }
312 virtual void on_exit_state() {}
315 void set_fsm_context(
etl::fsm& context)
317 p_context = &context;
348 using imessage_router::receive;
353 fsm(etl::message_router_id_t
id)
355 , p_state(ETL_NULLPTR)
356 , state_list(ETL_NULLPTR)
357 , number_of_states(0
U)
364 template <
typename TSize>
377 state_list[
i]->set_fsm_context(*
this);
390 if (p_state == ETL_NULLPTR)
392 p_state = state_list[0];
403 next_state_id = p_state->on_enter_state();
404 if (next_state_id != ifsm_state::No_State_Change)
407 p_state = state_list[next_state_id];
423 if (have_changed_state(next_state_id))
430 p_state->on_exit_state();
433 next_state_id = p_state->on_enter_state();
435 if (have_changed_state(next_state_id))
442 else if (is_self_transition(next_state_id))
444 p_state->on_exit_state();
445 p_state->on_enter_state();
454 using imessage_router::accepts;
497 return p_state != ETL_NULLPTR;
508 p_state->on_exit_state();
511 p_state = ETL_NULLPTR;
515 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
521 bool is_producer() const ETL_OVERRIDE
527 bool is_consumer() const ETL_OVERRIDE
538 (next_state_id != ifsm_state::No_State_Change) &&
539 (next_state_id != ifsm_state::Self_Transition);
545 return (next_state_id == ifsm_state::Self_Transition);
556#if ETL_USING_CPP17 && !defined(ETL_FSM_FORCE_CPP03_IMPLEMENTATION)
560 template <
typename TContext,
typename TDerived,
etl::fsm_state_id_t STATE_ID_,
typename... TMessageTypes>
561 class fsm_state :
public ifsm_state
578 TContext& get_fsm_context()
const
580 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
597 const bool was_handled = (process_event_type<TMessageTypes>(message, new_state_id) || ...);
599 if (!was_handled || (new_state_id == Pass_To_Parent))
601 new_state_id = (p_parent !=
nullptr) ? p_parent->process_event(message) :
static_cast<TDerived*
>(
this)->on_event_unknown(message);
608 template <
typename TMessage>
611 if (TMessage::ID == msg.get_message_id())
613 new_state_id =
static_cast<TDerived*
>(
this)->on_event(
static_cast<const TMessage&
>(msg));
624 template <
typename TContext,
typename TDerived,
etl::fsm_state_id_t STATE_ID_,
typename... TMessageTypes>
625 ETL_CONSTANT
etl::fsm_state_id_t fsm_state<TContext, TDerived, STATE_ID_, TMessageTypes...>::STATE_ID;
635 typename T1 = void,
typename T2 = void,
typename T3 = void,
typename T4 = void,
636 typename T5 = void,
typename T6 = void,
typename T7 = void,
typename T8 = void,
637 typename T9 = void,
typename T10 = void,
typename T11 = void,
typename T12 = void,
638 typename T13 = void,
typename T14 = void,
typename T15 = void,
typename T16 =
void>
658 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
697 typename T1,
typename T2,
typename T3,
typename T4,
698 typename T5,
typename T6,
typename T7,
typename T8,
699 typename T9,
typename T10,
typename T11,
typename T12,
700 typename T13,
typename T14,
typename T15>
701 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
void> :
public ifsm_state
720 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
758 typename T1,
typename T2,
typename T3,
typename T4,
759 typename T5,
typename T6,
typename T7,
typename T8,
760 typename T9,
typename T10,
typename T11,
typename T12,
761 typename T13,
typename T14>
762 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
void,
void> :
public ifsm_state
781 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
818 typename T1,
typename T2,
typename T3,
typename T4,
819 typename T5,
typename T6,
typename T7,
typename T8,
820 typename T9,
typename T10,
typename T11,
typename T12,
822 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
void,
void,
void> :
public ifsm_state
841 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
877 typename T1,
typename T2,
typename T3,
typename T4,
878 typename T5,
typename T6,
typename T7,
typename T8,
879 typename T9,
typename T10,
typename T11,
typename T12>
880 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
void,
void,
void,
void> :
public ifsm_state
899 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
934 typename T1,
typename T2,
typename T3,
typename T4,
935 typename T5,
typename T6,
typename T7,
typename T8,
936 typename T9,
typename T10,
typename T11>
937 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
void,
void,
void,
void,
void> :
public ifsm_state
956 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
990 typename T1,
typename T2,
typename T3,
typename T4,
991 typename T5,
typename T6,
typename T7,
typename T8,
992 typename T9,
typename T10>
993 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1012 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1045 typename T1,
typename T2,
typename T3,
typename T4,
1046 typename T5,
typename T6,
typename T7,
typename T8,
1048 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1067 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1099 typename T1,
typename T2,
typename T3,
typename T4,
1100 typename T5,
typename T6,
typename T7,
typename T8>
1101 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1120 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1151 typename T1,
typename T2,
typename T3,
typename T4,
1152 typename T5,
typename T6,
typename T7>
1153 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
void,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1172 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1202 typename T1,
typename T2,
typename T3,
typename T4,
1203 typename T5,
typename T6>
1204 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
T6,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1223 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1252 typename T1,
typename T2,
typename T3,
typename T4,
1254 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
T5,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1273 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1301 typename T1,
typename T2,
typename T3,
typename T4>
1302 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
T4,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1321 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1348 typename T1,
typename T2,
typename T3>
1349 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
T3,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1368 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1394 typename T1,
typename T2>
1395 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
T2,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1414 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1440 class fsm_state<
TContext,
TDerived,
STATE_ID_,
T1,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1459 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1482 template <
typename TContext,
typename TDerived, etl::fsm_state_
id_t STATE_ID_>
1483 class fsm_state<
TContext,
TDerived,
STATE_ID_,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void> :
public ifsm_state
1502 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1513 typename T1,
typename T2,
typename T3,
typename T4,
1514 typename T5,
typename T6,
typename T7,
typename T8,
1515 typename T9,
typename T10,
typename T11,
typename T12,
1516 typename T13,
typename T14,
typename T15,
typename T16>
1517 ETL_CONSTANT
etl::fsm_state_id_t fsm_state<TContext, TDerived, STATE_ID_, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::STATE_ID;
Base exception class for FSM.
Definition fsm.h:99
Exception for message received but not started.
Definition fsm.h:176
Exception for null state pointer.
Definition fsm.h:112
Exception for forbidden state changes.
Definition fsm.h:164
Exception for invalid state id.
Definition fsm.h:125
Exception for incompatible state list.
Definition fsm.h:138
Exception for incompatible order state list.
Definition fsm.h:151
The FSM class.
Definition fsm.h:344
etl::fsm_state_id_t get_state_id() const
Gets the current state id.
Definition fsm.h:468
void receive(const etl::imessage &message) ETL_OVERRIDE
Top level message handler for the FSM.
Definition fsm.h:417
virtual void start(bool call_on_enter_state=true)
Definition fsm.h:387
fsm(etl::message_router_id_t id)
Constructor.
Definition fsm.h:353
virtual void reset(bool call_on_exit_state=false)
Definition fsm.h:504
bool accepts(etl::message_id_t) const ETL_OVERRIDE
Definition fsm.h:460
void set_states(etl::ifsm_state **p_states, TSize size)
Set the states for the FSM.
Definition fsm.h:365
const ifsm_state & get_state() const
Gets a const reference to the current state interface.
Definition fsm.h:486
ifsm_state & get_state()
Gets a reference to the current state interface.
Definition fsm.h:477
bool is_started() const
Checks if the FSM has been started.
Definition fsm.h:495
Interface class for FSM states.
Definition fsm.h:216
void add_child_state(etl::ifsm_state &state)
Definition fsm.h:251
void set_child_states(etl::ifsm_state **state_list, TSize size)
Definition fsm.h:268
etl::fsm_state_id_t get_state_id() const
Gets the id for this state.
Definition fsm.h:242
ifsm_state(etl::fsm_state_id_t state_id_)
Constructor.
Definition fsm.h:285
virtual ~ifsm_state()
Destructor.
Definition fsm.h:297
This is the base of all message routers.
Definition message_router_generator.h:121
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
Definition exception.h:47
Definition integral_limits.h:516
Defines a type that is as larger or larger than the specified type. Will return the specified type is...
Definition largest_generator.h:352
bitset_ext
Definition absolute.h:38
uint_least8_t message_id_t
Allow alternative type for message id.
Definition message_types.h:40
ETL_CONSTEXPR TContainer::size_type size(const TContainer &container)
Definition iterator.h:1187
uint_least8_t fsm_state_id_t
Allow alternative type for state id.
Definition fsm.h:75
pair holds two objects of arbitrary type
Definition utility.h:164