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"
77#if !defined(ETL_FSM_STATE_ID_TYPE)
86#if ETL_USING_CPP17 && !defined(ETL_FSM_FORCE_CPP03_IMPLEMENTATION)
91 typename,
typename,
typename,
typename,
92 typename,
typename,
typename,
typename,
93 typename,
typename,
typename,
typename,
94 typename,
typename,
typename,
typename>
188 namespace private_fsm
190 template <
typename T =
void>
200 static ETL_CONSTANT
fsm_state_id_t Pass_To_Parent = No_State_Change - 1U;
203 static ETL_CONSTANT
fsm_state_id_t Self_Transition = No_State_Change - 2U;
206 template <
typename T>
209 template <
typename T>
212 template <
typename T>
220 template <
size_t Id,
typename TState0,
typename...
TRest>
222 :
etl::integral_constant<bool, (TState0::STATE_ID == Id) && private_fsm::check_ids<Id + 1, TRest...>::value>
281 ETL_STATIC_ASSERT((private_fsm::check_ids<0, TStates...>::value),
"State IDs must be 0..N-1 and in order");
282 ETL_STATIC_ASSERT(
sizeof...(
TStates) > 0,
"At least one state is required");
283 ETL_STATIC_ASSERT(
sizeof...(
TStates) < private_fsm::ifsm_state_helper<>::No_State_Change,
"State IDs mst be less than ifsm_state::No_State_Change");
288 static ETL_CONSTEXPR
size_t size()
290 return sizeof...(TStates);
296 template <
typename TState>
305 template <
typename TState>
344#if ETL_USING_CPP17 && !defined(ETL_FSM_FORCE_CPP03_IMPLEMENTATION)
349 typename,
typename,
typename,
typename,
350 typename,
typename,
typename,
typename,
351 typename,
typename,
typename,
typename,
352 typename,
typename,
typename,
typename>
371 state.p_parent =
this;
373 if (p_default_child == ETL_NULLPTR)
375 p_default_child = &state;
383 template <
typename TSize>
386 p_active_child = ETL_NULLPTR;
387 p_default_child = ETL_NULLPTR;
403 p_context(ETL_NULLPTR),
404 p_parent(ETL_NULLPTR),
405 p_active_child(ETL_NULLPTR),
406 p_default_child(ETL_NULLPTR)
427 virtual fsm_state_id_t on_enter_state() {
return No_State_Change; }
428 virtual void on_exit_state() {}
453 ifsm_state& operator =(
const ifsm_state&) ETL_DELETE;
464 using imessage_router::receive;
469 fsm(etl::message_router_id_t
id)
471 , p_state(ETL_NULLPTR)
472 , state_list(ETL_NULLPTR)
473 , number_of_states(0
U)
474 , is_processing_state_change(false)
482 template <
typename TSize>
495 state_list[i]->set_fsm_context(*
this);
512 state_list[i]->set_fsm_context(*
this);
530 p_state = state_list[0];
541 next_state_id = p_state->on_enter_state();
542 if (next_state_id != ifsm_state::No_State_Change)
545 p_state = state_list[next_state_id];
563 process_state_change(next_state_id);
584 return ifsm_state::No_State_Change;
588 using imessage_router::accepts;
631 return p_state != ETL_NULLPTR;
644 p_state->on_exit_state();
647 p_state = ETL_NULLPTR;
651 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
657 bool is_producer()
const ETL_OVERRIDE
663 bool is_consumer()
const ETL_OVERRIDE
674 (next_state_id != ifsm_state::No_State_Change) &&
675 (next_state_id != ifsm_state::Self_Transition);
681 return (next_state_id == ifsm_state::Self_Transition);
689 if (is_self_transition(next_state_id))
691 p_state->on_exit_state();
692 next_state_id = p_state->on_enter_state();
695 if (have_changed_state(next_state_id))
702 p_state->on_exit_state();
705 next_state_id = p_state->on_enter_state();
707 if (have_changed_state(next_state_id))
721 bool is_processing_state_change;
727#if ETL_USING_CPP17 && !defined(ETL_FSM_FORCE_CPP03_IMPLEMENTATION)
732 class fsm_state :
public ifsm_state
751 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
779 template <
typename TMessage>
782 if (TMessage::ID ==
msg.get_message_id())
829 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
868 typename T1,
typename T2,
typename T3,
typename T4,
869 typename T5,
typename T6,
typename T7,
typename T8,
870 typename T9,
typename T10,
typename T11,
typename T12,
871 typename T13,
typename T14,
typename T15>
872 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
891 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
929 typename T1,
typename T2,
typename T3,
typename T4,
930 typename T5,
typename T6,
typename T7,
typename T8,
931 typename T9,
typename T10,
typename T11,
typename T12,
932 typename T13,
typename T14>
933 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
952 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
989 typename T1,
typename T2,
typename T3,
typename T4,
990 typename T5,
typename T6,
typename T7,
typename T8,
991 typename T9,
typename T10,
typename T11,
typename T12,
993 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
1012 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1048 typename T1,
typename T2,
typename T3,
typename T4,
1049 typename T5,
typename T6,
typename T7,
typename T8,
1050 typename T9,
typename T10,
typename T11,
typename T12>
1051 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
1070 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1105 typename T1,
typename T2,
typename T3,
typename T4,
1106 typename T5,
typename T6,
typename T7,
typename T8,
1107 typename T9,
typename T10,
typename T11>
1108 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
1127 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1161 typename T1,
typename T2,
typename T3,
typename T4,
1162 typename T5,
typename T6,
typename T7,
typename T8,
1163 typename T9,
typename T10>
1164 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
1183 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1216 typename T1,
typename T2,
typename T3,
typename T4,
1217 typename T5,
typename T6,
typename T7,
typename T8,
1219 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
1238 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1270 typename T1,
typename T2,
typename T3,
typename T4,
1271 typename T5,
typename T6,
typename T7,
typename T8>
1272 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
1291 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1322 typename T1,
typename T2,
typename T3,
typename T4,
1323 typename T5,
typename T6,
typename T7>
1324 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
1343 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1373 typename T1,
typename T2,
typename T3,
typename T4,
1374 typename T5,
typename T6>
1375 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
1394 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1423 typename T1,
typename T2,
typename T3,
typename T4,
1425 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
1444 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1472 typename T1,
typename T2,
typename T3,
typename T4>
1473 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
1492 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1519 typename T1,
typename T2,
typename T3>
1520 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
1539 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1565 typename T1,
typename T2>
1566 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
1585 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1611 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
1630 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1653 template <
typename TContext,
typename TDerived, etl::fsm_state_
id_t STATE_ID_>
1654 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
1673 return static_cast<TContext&
>(ifsm_state::get_fsm_context());
1684 typename T1,
typename T2,
typename T3,
typename T4,
1685 typename T5,
typename T6,
typename T7,
typename T8,
1686 typename T9,
typename T10,
typename T11,
typename T12,
1687 typename T13,
typename T14,
typename T15,
typename T16>
1688 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:102
Exception for message received but not started.
Definition fsm.h:167
Exception for null state pointer.
Definition fsm.h:115
Exception for call to receive/start/etc. while receive/start/etc. is already happening....
Definition fsm.h:180
Exception for invalid state id.
Definition fsm.h:128
Exception for incompatible state list.
Definition fsm.h:141
Exception for incompatible order state list.
Definition fsm.h:154
The FSM class.
Definition fsm.h:460
etl::fsm_state_id_t get_state_id() const
Gets the current state id.
Definition fsm.h:602
void receive(const etl::imessage &message) ETL_OVERRIDE
Top level message handler for the FSM.
Definition fsm.h:555
virtual void start(bool call_on_enter_state=true)
Definition fsm.h:523
fsm(etl::message_router_id_t id)
Constructor.
Definition fsm.h:469
virtual void reset(bool call_on_exit_state=false)
Definition fsm.h:638
bool accepts(etl::message_id_t) const ETL_OVERRIDE
Definition fsm.h:594
etl::fsm_state_id_t transition_to(etl::fsm_state_id_t new_state_id)
Invoke a state transition.
Definition fsm.h:574
void set_states(etl::ifsm_state **p_states, TSize size)
Definition fsm.h:483
const ifsm_state & get_state() const
Gets a const reference to the current state interface.
Definition fsm.h:620
ifsm_state & get_state()
Gets a reference to the current state interface.
Definition fsm.h:611
bool is_started() const
Checks if the FSM has been started.
Definition fsm.h:629
Interface class for FSM states.
Definition fsm.h:333
void add_child_state(etl::ifsm_state &state)
Definition fsm.h:368
void set_child_states(etl::ifsm_state **state_list, TSize size)
Definition fsm.h:384
etl::fsm_state_id_t get_state_id() const
Gets the id for this state.
Definition fsm.h:359
ifsm_state(etl::fsm_state_id_t state_id_)
Constructor.
Definition fsm.h:401
virtual ~ifsm_state()
Destructor.
Definition fsm.h:413
This is the base of all message routers.
Definition message_router_generator.h:121
RAII detection mechanism to catch reentrant calls to methods that might transition the state machine ...
Definition fsm.h:232
~fsm_reentrancy_guard() ETL_NOEXCEPT
Definition fsm.h:249
fsm_reentrancy_guard(bool &transition_guard_flag)
Definition fsm.h:238
#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
integral_constant
Definition type_traits_generator.h:895
bitset_ext
Definition absolute.h:39
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
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:315
T & get(array< T, Size > &a)
Definition array.h:1216
uint_least8_t fsm_state_id_t
Allow alternative type for state id.
Definition fsm.h:78