Added more documentation

Moced some documentation files to new directories
This commit is contained in:
John Wellbelove 2026-04-26 10:22:37 +02:00
parent 2bf8fd1359
commit 48ec571c9e
16 changed files with 889 additions and 558 deletions

View File

@ -0,0 +1,197 @@
---
title: "reference_counted_message"
---
{{< callout type="info">}}
Header: `reference_counted_message.h`
{{< /callout >}}
Reference counted message types that are used by `etl::shared_message`.
**Defines the following classes**
```cpp
etl::ireference_counted_message
```
The interface of all reference counted message types.
---
```cpp
etl::reference_counted_message<typename TMessage, typename TCounter>
```
Derived from `etl::ireference_counted_message`.
```cpp
etl::persistent_message<typename TMessage>
```
Derived from `etl::ireference_counted_message`.
## ireference_counted_message
```cpp
etl::ireference_counted_message
```
The interface of all reference counted message types.
---
```cpp
virtual ~ireference_counted_message()
```
---
```cpp
ETL_NODISCARD virtual etl::imessage& get_message() = 0;
```
Get a reference to the message.
---
```cpp
ETL_NODISCARD virtual const etl::imessage& get_message() const = 0;
```
Get a const reference to the message.
---
```cpp
ETL_NODISCARD virtual etl::ireference_counter& get_reference_counter() = 0;
```
Get a reference to the reference counter.
---
```cpp
ETL_NODISCARD virtual const etl::ireference_counter& get_reference_counter() const = 0;
```
Get a const reference to the reference counter.
---
```cpp
virtual void release() = 0;
```
Release back to the owner.
## reference_counted_message
```cpp
etl::reference_counted_message<typename TMessage, typename TCounter>
```
The implementation of reference counted messages owned by a pool.
Will static assert if TMessage is no derived from etl::imessage.
---
```cpp
reference_counted_message(const TMessage& message, etl::ireference_counted_message_pool& owner)
```
Constructs from a message and the pool from which the reference counted message is allocated.
The message is copied.
---
```cpp
reference_counted_message(etl::ireference_counted_message_pool& owner)
```
Constructs from a message and the pool from which the reference counted message is allocated.
The message is default constructed.
---
```cpp
ETL_NODISCARD TMessage& get_message() ETL_OVERRIDE
```
Get a reference to the message.
---
```cpp
ETL_NODISCARD const TMessage& get_message() const ETL_OVERRIDE
```
Get a const reference to the message.
---
```cpp
ETL_NODISCARD etl::ireference_counter& get_reference_counter() ETL_OVERRIDE
```
Get a reference to the reference counter.
---
```cpp
ETL_NODISCARD const etl::ireference_counter& get_reference_counter() const ETL_OVERRIDE
```
Get a const reference to the reference counter.
---
```cpp
void release() ETL_OVERRIDE
```
Release back to the owner pool.
## persistent_message
```cpp
etl::persistent_message<typename TMessage>
```
The implementation of reference counted messages not owned by a pool.
It's counter type is `void`.
Will static assert if `TMessage` is not derived from `etl::imessage`.
---
```cpp
persistent_message(const TMessage& message)
```
Constructs from a message.
The message is copied.
---
```cpp
ETL_NODISCARD TMessage& get_message() ETL_OVERRIDE
```
Get a reference to the message.
---
```cpp
ETL_NODISCARD const TMessage& get_message() const ETL_OVERRIDE
```
Get a const reference to the message.
---
```cpp
ETL_NODISCARD etl::ireference_counter& get_reference_counter() ETL_OVERRIDE
```
Get a reference to the reference counter.
---
```cpp
ETL_NODISCARD const etl::ireference_counter& get_reference_counter() const ETL_OVERRIDE
```
Get a const reference to the reference counter.
---
```cpp
void release() ETL_OVERRIDE
```
Does nothing for a persistent message.
## For C++11, with atomic support.
```cpp
template <typename TMessage>
using atomic_counted_message = etl::reference_counted_message<TMessage, etl::atomic_int32_t>;
```
Defines an alias to a reference counted message that uses an atomic.

View File

@ -0,0 +1,93 @@
---
title: "delegate_service"
---
{{< callout type="info">}}
Header: `delegate_service.h`
{{< /callout >}}
Delegate Service
This template class allows easier integration of 'C' style events (such as interrupt vectors) and C++ handlers.
It can allow abstraction between low level events such as interrupts and their application dependent handlers.
The handlers may be any combination of global, static, member functions, lambdas and functors.
It utilises the templated function wrapper.
The delegate callbacks are identified by an id. The values of the ids must range from zero or a specified offset, up to the maximum range of specified delegates. Calling an unused delegate id will either do nothing or, if the user has specified a handler, call this with the id of the delegate.
There are functions that use both runtime and compile time checks of the delegate id.
Compile time is preferable.
---
```cpp
template <size_t Range, size_t Offset = 0U, const etl::delegate<void(size_t)>* Delegates = nullptr>
delegate_service
```
`Range`
The id range of the delegates (last - first + 1).
`Offset`
The starting id for the range. Default `0`.
`Delegates`
An optional pointer to an array of delegate pointers.
If the pointer to a delegate array is supplied as a template parameter then the delegate service may be declared `constexpr`, otherwise the service is runtime only.
## Member functions
```cpp
delegate_service()
```
Runtime only.
Sets all of the delegates to route to the unhandled delegate.
Sets the unhandled delegate to default (do nothing).
---
```cpp
template <const size_t ID>
void register_delegate(etl::delegate<void(size_t)>& callback)
```
Runtime only.
Registers delegate with the id specified in the template parameter.
A compile time error will occur if the id is out of range.
---
```cpp
void register_delegate(size_t id, etl::delegate<void(size_t)>& callback)
```
Runtime only.
Registers delegate with the id specified in the template parameter.
The registration will be ignored if the id is out of range.
---
```cpp
void register_unhandled_delegate(etl::delegate<void(size_t)>& callback)
```
Runtime only.
Registers the delegate to be used for unhandled ids.
---
```cpp
template <const size_t ID>
void call()
```
Calls the delegate associated with the id.
Calls the unhandled delegate if the id has not been registered.
A compile time error will occur if the id is out of range.
---
```cpp
void call(const size_t id)
```
Calls the delegate associated with the id.
Calls the unhandled delegate if the id has not been registered or if is out of range.
## Example
See the example project in `examples\FunctionInterruptSimulation-Delegates`.

View File

@ -1,96 +1,152 @@
signal
20.44.0
---
title: "signal"
---
A class that implements simple signal/slot framework.
Uses etl::delegate as the default slot type, though other types may be used.
{{< callout type="info">}}
Header: `signal.h`
Since: `20.44.0`
{{< /callout >}}
A class that implements simple signal/slot framework.
Uses `etl::delegate` as the default slot type, though other types may be used.
```cpp
template <typename TFunction, size_t Size, typename TSlot = etl::delegate<TFunction>>
class signal
TFunction The callback function signature.
Size The maximum numbr of slots for the signal.
TSlot The callback slot type. Default = etl::delegate<TFunction>
____________________________________________________________________________________________________
Types
```
`TFunction` The callback function signature.
`Size` The maximum numbr of slots for the signal.
`TSlot` The callback slot type. Default = `etl::delegate<TFunction>`
slot_type Defined as the slot type.
size_type The size type used internally.
span_type The span type used in the connect API.
____________________________________________________________________________________________________
Constructors
## Types
`slot_type` Defined as the slot type.
`size_type` The size type used internally.
`span_type` The span type used in the connect API.
## Constructors
```cpp
template <typename... TSlots>
ETL_CONSTEXPR14 explicit signal(TSlots&&... slots) ETL_NOEXCEPT
Construct the signal from a variadic list of slots.
Can be used as a constexpr constructor.
Static asserts if any of the
____________________________________________________________________________________________________
Connect
```
Construct the signal from a variadic list of slots.
Can be used as a `constexpr` constructor.
Static asserts if any of the slots are not `slot_type`.
Static asserts if the number of slots exceeds capacity.
## Connect
```cpp
bool connect(const slot_type& slot)
Connects the slot, if not already connected and returns true.
If the signal is full, ETL_ASSERTs etl::signal_full and returns false.
____________________________________________________________________________________________________
```
Connects the slot, if not already connected and returns `true`.
If the signal is full, asserts `etl::signal_full` and returns `false`.
---
```cpp
bool connect(std::initializer_list<const slot_type> slots)
Connects all of the slots and returns true.
If the number of slots exceeds the signal's max size, asserts an etl::signal_full and returns false.
Enabled if ETL_HAS_INITIALIZER_LIST and ETL_USING_CPP17 are defined as 1.
____________________________________________________________________________________________________
```
Connects all of the slots and returns `true`.
If the number of slots exceeds the signal's max size, asserts an `etl::signal_full` and returns `false`.
Enabled if `ETL_HAS_INITIALIZER_LIST` and `ETL_USING_CPP17` are defined as `1`.
---
```cpp
bool connect(const span_type slots)
Connects all of the slots and returns true.
If the number of slots exceeds the signal's max size, asserts an etl::signal_full and returns false.
____________________________________________________________________________________________________
Disconnect
```
Connects all of the slots and returns `true`.
If the number of slots exceeds the signal's max size, asserts an `etl::signal_full` and returns `false`.
## Disconnect
```cpp
void disconnect(const slot_type& slot) ETL_NOEXCEPT
Disconnects slot from the signal.
If the signal does not contain the slot. there is no error.
____________________________________________________________________________________________________
void disconnect(std::initializer_list<const slot_type> slots) ETL_NOEXCEPT
Disconnects all of the slots from the signal.
If the signal does not contain a particular slot, there is no error.
Enabled if ETL_HAS_INITIALIZER_LIST and ETL_USING_CPP17 are defined as 1.
____________________________________________________________________________________________________
void disconnect(const span_type slots) ETL_NOEXCEPT
Disconnects all of the slots from the signal.
If the signal does not contain a particular slot, there is no error.
____________________________________________________________________________________________________
void disconnect_all() ETL_NOEXCEPT
Disconnects all slots from the signal.
____________________________________________________________________________________________________
Status
ETL_CONSTEXPR14 bool connected(const slot_type& slot) const ETL_NOEXCEPT
Checks if a slot is connected to the signal.
____________________________________________________________________________________________________
ETL_CONSTEXPR14 bool empty() const ETL_NOEXCEPT
Return true if the signal has no slots connected.
____________________________________________________________________________________________________
ETL_CONSTEXPR14 bool full() const ETL_NOEXCEPT
Return true if the signal has the maximum number of slots connected.
____________________________________________________________________________________________________
ETL_CONSTEXPR14 size_type max_size() const ETL_NOEXCEPT
Returns the total number of slots that can be connected.
____________________________________________________________________________________________________
ETL_CONSTEXPR14 size_type size() const ETL_NOEXCEPT
Returns the total slots currently connected.
____________________________________________________________________________________________________
ETL_CONSTEXPR14 size_type available() const ETL_NOEXCEPT
Returns the total empty slots available.
____________________________________________________________________________________________________
Call
```
Disconnects slot from the signal.
If the signal does not contain the slot there is no error.
---
```cpp
void disconnect(std::initializer_list<const slot_type> slots) ETL_NOEXCEPT
```
Disconnects all of the slots from the signal.
If the signal does not contain a particular slot, there is no error.
Enabled if `ETL_HAS_INITIALIZER_LIST` and `ETL_USING_CPP17` are defined as `1`.
---
```cpp
void disconnect(const span_type slots) ETL_NOEXCEPT
```
Disconnects all of the slots from the signal.
If the signal does not contain a particular slot, there is no error.
```cpp
void disconnect_all() ETL_NOEXCEPT
```
Disconnects all slots from the signal.
## Status
```cpp
ETL_CONSTEXPR14 bool connected(const slot_type& slot) const ETL_NOEXCEPT
```
Checks if a slot is connected to the signal.
---
```cpp
ETL_CONSTEXPR14 bool empty() const ETL_NOEXCEPT
```
Return `true` if the signal has no slots connected.
---
```cpp
ETL_CONSTEXPR14 bool full() const ETL_NOEXCEPT
```
Return `true` if the signal has the maximum number of slots connected.
---
```cpp
ETL_CONSTEXPR14 size_type max_size() const ETL_NOEXCEPT
```
Returns the total number of slots that can be connected.
---
```cpp
ETL_CONSTEXPR14 size_type size() const ETL_NOEXCEPT
```
Returns the total slots currently connected.
---
```cpp
ETL_CONSTEXPR14 size_type available() const ETL_NOEXCEPT
```
Returns the total empty slots available.
## Call
```cpp
template <typename... TArgs>
void operator()(TArgs&&... args) const ETL_NOEXCEPT
```
Function operator that calls each slot with the supplied parameters.
____________________________________________________________________________________________________
Errors
etl::signal_full Indicates that an attempt to add a slot to a full signal occurred.
## Errors
Inherits from etl::signal_exception
____________________________________________________________________________________________________
Examples
```cpp
etl::signal_full
```
Indicates that an attempt to add a slot to a full signal occurred.
Inherits from `etl::signal_exception`.
## Examples
```cpp
constexpr size_t MaxSlots = 3;
using callback_type = void(int a, int b);
@ -99,9 +155,11 @@ using slot_type = signal_type::slot_type;
using span_type = signal_type::span_type;
using not_slot_type = etl::delegate<void(int)>;
____________________________________________________________________________________________________
Defining the slot functions
```
**Defining the slot functions**
```cpp
void Function1(int a, int b)
{
std::cout << "Function1: " << a << "," << b << "\n";
@ -116,7 +174,7 @@ void Function3(int a, int b)
{
std::cout << "Function3: " << a << "," << b << "\n";
}
0
void Function4(int a, int b)
{
std::cout << "Function4: " << a << "," << b << "\n";
@ -126,9 +184,11 @@ void Function5(int a)
{
std::cout << "Function5: " << a << "\n";
}
____________________________________________________________________________________________________
Creating the slots
```
**Creating the slots**
```cpp
constexpr slot_type MakeSlot1() noexcept
{
return slot_type::create<Function1>();
@ -153,9 +213,11 @@ constexpr not_slot_type MakeSlot5() noexcept
{
return not_slot_type::create<Function5>();
}
____________________________________________________________________________________________________
Defining the signal as constexpr
```
**Define the signals as `constexpr`**
```cpp
// Define the signal and connect as constexpr
constexpr signal_type({ MakeSlot1(), MakeSlot2(), MakeSlot3() });
@ -166,9 +228,11 @@ constexpr signal_type({ MakeSlot1(), MakeSlot2(), MakeSlot3(), MakeSlot4() });
// Define the signal and connect as constexpr.
// Static assert "All slots must be slot_type"
constexpr signal_type({ MakeSlot1(), MakeSlot2(), MakeSlot5() });
____________________________________________________________________________________________________
Defining the signal at runtime
```
**Defining the signal at runtime**
```cpp
// Define the signal.
signal_type signal;
@ -183,9 +247,11 @@ signal.connect({ MakeSlot1(), MakeSlot2(), MakeSlot3() });
// Connect using span.
const slot_type slot_list[] = { MakeSlot1(), MakeSlot2(), MakeSlot3() };
signal.connect(slot_list);
____________________________________________________________________________________________________
Checking the status
```
**Checking the status**
```cpp
// Define the signal.
signal_type signal;
@ -243,15 +309,19 @@ signal.connected(MakeSlot2()) // Returns true
signal.connected(MakeSlot3()) // Returns true
signal.connect(MakeSlot4()); // ETL_ASSERT etl::signal_full. Returns false
____________________________________________________________________________________________________
Calling the signal
```
**Calling the signal**
```cpp
signal_type signal({ MakeSlot1(), MakeSlot2(), MakeSlot3() });
signal(1, 2); // Call all of the slots with the parameters 1 & 2
```
Output
**Output**
```
Function1: 1,2
Function2: 1,2
Function3: 1,2
```

View File

@ -0,0 +1,4 @@
---
title: "Multi-Tasking"
weight: 100
---

View File

@ -1,58 +0,0 @@
Delegate Service
This template class allows easier integration of 'C' style events (such as interrupt vectors) and C++ handlers.
It can allow abstraction between low level events such as interrupts and their application dependent handlers.
The handlers may be any combination of global, static, member functions, lambdas and functors.
It utilises the templated function wrapper. See here.
The delegate callbacks are identified by an id. The values of the ids must range from zero or a specified offset, up to the maximum range of specified delegates. Calling an unused delegate id will either do nothing or, if the user has specified a handler, call this with the id of the delegate.
There are functions that use both runtime and compile time checks of the delegate id.
Compile time is preferable.
template <size_t Range, size_t Offset = 0U, const etl::delegate<void(size_t)>* Delegates = nullptr>
etl::delegate_service
Range The id range of the delegates (last - first + 1).
Offset The starting id for the range. Default 0.
Delegates An optional pointer to an array of delegate pointers.
If the pointer to a delegate array is supplied as a template parameter then the delegate service may be declared constexpr, otherwise the service is runtime only.
____________________________________________________________________________________________________
Member functions
____________________________________________________________________________________________________
delegate_service()
Runtime only
Sets all of the delegates to route to the unhandled delegate.
Sets the unhandled delegate to default (do nothing).
____________________________________________________________________________________________________
template <const size_t ID>
void register_delegate(etl::delegate<void(size_t)>& callback)
Runtime only
Registers delegate with the id specified in the template parameter.
A compile time error will occur if the id is out of range.
____________________________________________________________________________________________________
void register_delegate(size_t id, etl::delegate<void(size_t)>& callback)
Runtime only
Registers delegate with the id specified in the template parameter.
The registration will be ignored if the id is out of range.
____________________________________________________________________________________________________
void register_unhandled_delegate(etl::delegate<void(size_t)>& callback)
Runtime only
Registers the delegate to be used for unhandled ids.
____________________________________________________________________________________________________
template <const size_t ID>
void call()
Calls the delegate associated with the id.
Calls the unhandled delegate if the id has not been registered.
A compile time error will occur if the id is out of range.
____________________________________________________________________________________________________
void call(const size_t id)
Calls the delegate associated with the id.
Calls the unhandled delegate if the id has not been registered or if is out of range.
____________________________________________________________________________________________________
Example
Tutorial
See the example project in etl\examples\FunctionInterruptSimulation-Delegates

View File

@ -1,102 +0,0 @@
Reference Counted Messages
Reference counted message types that are used by etl::shared_message.
Defines the following classes.
etl::ireference_counted_message
The interface of all reference counted message types.
etl::reference_counted_message<typename TMessage, typename TCounter>
Derived from etl::ireference_counted_message
etl::persistent_message<typename TMessage>
Derived from etl::ireference_counted_message
____________________________________________________________________________________________________
ireference_counted_message
etl::ireference_counted_message
The interface of all reference counted message types.
____________________________________________________________________________________________________
virtual ~ireference_counted_message()
____________________________________________________________________________________________________
ETL_NODISCARD virtual etl::imessage& get_message() = 0;
Get a reference to the message.
____________________________________________________________________________________________________
ETL_NODISCARD virtual const etl::imessage& get_message() const = 0;
Get a const reference to the message.
____________________________________________________________________________________________________
ETL_NODISCARD virtual etl::ireference_counter& get_reference_counter() = 0;
Get a reference to the reference counter.
____________________________________________________________________________________________________
ETL_NODISCARD virtual const etl::ireference_counter& get_reference_counter() const = 0;
Get a const reference to the reference counter.
____________________________________________________________________________________________________
virtual void release() = 0;
Release back to the owner.
____________________________________________________________________________________________________
reference_counted_message
etl::reference_counted_message<typename TMessage, typename TCounter>
The implementation of reference counted messages owned by a pool.
Will static assert if TMessage is no derived from etl::imessage.
____________________________________________________________________________________________________
reference_counted_message(const TMessage& message, etl::ireference_counted_message_pool& owner)
Constructs from a message and the pool from which the reference counted message is allocated.
The message is copied.
____________________________________________________________________________________________________
reference_counted_message(etl::ireference_counted_message_pool& owner)
Constructs from a message and the pool from which the reference counted message is allocated.
The message is default constructed.
____________________________________________________________________________________________________
ETL_NODISCARD TMessage& get_message() ETL_OVERRIDE
Get a reference to the message.
____________________________________________________________________________________________________
ETL_NODISCARD const TMessage& get_message() const ETL_OVERRIDE
Get a const reference to the message.
____________________________________________________________________________________________________
ETL_NODISCARD etl::ireference_counter& get_reference_counter() ETL_OVERRIDE
Get a reference to the reference counter.
____________________________________________________________________________________________________
ETL_NODISCARD const etl::ireference_counter& get_reference_counter() const ETL_OVERRIDE
Get a const reference to the reference counter.
____________________________________________________________________________________________________
void release() ETL_OVERRIDE
Release back to the owner pool.
____________________________________________________________________________________________________
persistent_message
etl::persistent_message<typename TMessage>
The implementation of reference counted messages not owned by a pool.
It's counter type is void.
Will static assert if TMessage is not derived from etl::imessage.
____________________________________________________________________________________________________
persistent_message(const TMessage& message)
Constructs from a message.
The message is copied.
____________________________________________________________________________________________________
ETL_NODISCARD TMessage& get_message() ETL_OVERRIDE
Get a reference to the message.
____________________________________________________________________________________________________
ETL_NODISCARD const TMessage& get_message() const ETL_OVERRIDE
Get a const reference to the message.
____________________________________________________________________________________________________
ETL_NODISCARD etl::ireference_counter& get_reference_counter() ETL_OVERRIDE
Get a reference to the reference counter.
____________________________________________________________________________________________________
ETL_NODISCARD const etl::ireference_counter& get_reference_counter() const ETL_OVERRIDE
Get a const reference to the reference counter.
____________________________________________________________________________________________________
void release() ETL_OVERRIDE
Does nothing for a persistent message.
____________________________________________________________________________________________________
For C++11, with atomic support.
template <typename TMessage>
using atomic_counted_message = etl::reference_counted_message<TMessage, etl::atomic_int32_t>;
Defines an alias to a reference counted message that uses an atomic.

View File

@ -1,310 +0,0 @@
State Chart
A finite state machine driven by the reception of events. The incoming event will call the optional action based on a transition table. Optional on_entry and on_exit handlers can be declared in a state table.
An optional parameter may be sent to event handlers.
This FSM is simpler, both in implementation and use, than the message based FSM class defined elsewhere in the ETL. See etl::fsm.
Defines the following classes:-
etl::istate_chart
etl::state_chart<TObject>
etl::state_chart<TObject, TParameter>
TParameter defines how a data parameter will be passed to event handlers.
This may be by value, pointer, reference or const reference.
For C++11 or above, you may pass an rvalue reference.
____________________________________________________________________________________________________
istate_chart<TParameter> 20.23.0
The base for all state charts.
Types
event_id_t
The type for event ids.
state_id_t
The type for state ids.
Member Functions
event_it_t get_state_id() const
Returns the id of the state.
____________________________________________________________________________________________________
virtual void process_event(event_id_t event_id, TParameter data) = 0
etl::state_chart will override this.
Processes the event message.
If a data parameter has been configured for etl::state_chart, then one will be default constructed.
____________________________________________________________________________________________________
virtual void start(bool on_entry_initial = true)
Starts the state chart.
____________________________________________________________________________________________________
istate_chart<void> 20.23.0
The base for all state charts.
Types
event_id_t
The type for event ids.
state_id_t
The type for state ids.
Member Functions
event_it_t get_state_id() const
Returns the id of the state.
____________________________________________________________________________________________________
virtual void process_event(event_id_t event_id) = 0
etl::state_chart will override this.
Processes the event message.
If a data parameter has been configured for etl::state_chart, then one will be default constructed.
____________________________________________________________________________________________________
virtual void start(bool on_entry_initial = true)
Starts the state chart.
____________________________________________________________________________________________________
state_chart
For run-time defined transition and state tables.
A templated class. Inherits from etl::istate_chart<TParameter> or etl::istate_chart<void>.
Template parameters
TObject The object type that supplies actions, guards, on entry and on exit functionality.
TParameter The type that will be passed as a parameter (optional).
____________________________________________________________________________________________________
Types
TParameter parameter_t
____________________________________________________________________________________________________
Constructor
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)
object
The instance of the that supplies actions, guards, on entry and on exit functionality.
transition_table_begin
transition_table_end
The table of transitions, defining the relationship between events and state changes; defines option actions and guards.
Note: The transition table must have the same lifetime as the state chart. i.e. It must exist while the state chart exists.
state_table_begin
state_table_end
Sets the optional state table defining any 'on entry' and 'on exit' for states.
Not all states have to have entries in the table. States with no 'on entry' and 'on_exit' functionality may be omitted.
Note: The state table must have the same lifetime as the state chart. i.e. It must exist while the state chart exists.
state_id
The initial state id.
Note: The constructors do not call the 'on entry' function for the initial state
____________________________________________________________________________________________________
state_chart_ct void parameter
state_chart_ctp non-void parameter
For compile-time defined transition and state tables.
A templated class. Inherits from etl::istate_chart<TParameter> or etl::istate_chart<void>.
Template parameters
TObject The object type that supplies actions, guards, on entry and on exit functionality.
TParameter The type that will be passed as a parameter (state_chart_ctp).
TObject_Ref A reference to the TObject instance.
Transition_Table_Begin A pointer to the start of the transition table.
Transition_Table_Size The number of elements in the transition table.
State_Table_Begin A pointer to the start of the state table.
State_Table_Size The number of elements in the transition table.
Initial_State The initial state.
____________________________________________________________________________________________________
Types
TParameter parameter_t
____________________________________________________________________________________________________
Constructor
state_chart()
____________________________________________________________________________________________________
Member Functions
void start(bool on_entry_initial = true)
Starts the state chart.
if on_entry_initial is true and the initial state has an on_entry method, then this will be called.
The function does nothing after the first call.
____________________________________________________________________________________________________
void process_event(event_id_t event_id) For void parameter.
Triggers the state chart with the event.
____________________________________________________________________________________________________
void process_event(event_id_t event_id, parameter_t data) For non-void parameter.
Triggers the state chart with the event.
Passes the parameter to the event handler.
____________________________________________________________________________________________________
TObject& get_object()
const TObject& get_object() const
Gets the implementation object instance.
____________________________________________________________________________________________________
void set_transition_table(const transition* transition_table_begin,
const transition* transition_table_end)
Not defined for state_chart_ct or state_chart_ctp.
The table of transitions, defining the relationship between events and state changes; defines option actions and guards.
Note: The transition table must have the same scope as the state chart. i.e. It must exist while the state chart exists.
____________________________________________________________________________________________________
void set_state_table(const state* state_table_begin,
const state* state_table_end)
Not defined for state_chart_ct or state_chart_ctp.
Sets the optional state table defining any on_entry and on_exit for states.
Not all states have to have entries in the table. States with no on_entry and on_exit functionality may be omitted.
Note: The state table must have the same scope as the state chart. i.e. It must exist while the state chart exists.
____________________________________________________________________________________________________
Member Types
transition
____________________________________________________________________________________________________
For etl::state_chart<TImplementation>
transition(const state_id_t current_state_id,
const event_id_t event_id,
const state_id_t next_state_id,
void (TObject::* const action)() = nullptr,
bool (TObject::* const guard)() = nullptr)
transition(const event_id_t event_id,
const state_id_t next_state_id,
void (TObject::* const action)() = nullptr,
bool (TObject::* const guard)() = nullptr)
____________________________________________________________________________________________________
For etl::state_chart<TImplementation, TParameter>
transition(const state_id_t current_state_id,
const event_id_t event_id,
const state_id_t next_state_id,
void (TObject::* const action)(data_parameter_type) = nullptr,
bool (TObject::* const guard)() = nullptr)
transition(const event_id_t event_id,
const state_id_t next_state_id,
void (TObject::* const action)(data_parameter_type) = nullptr,
bool (TObject::* const guard)() = nullptr)
current_state_id
The state id that the state chart must be in for the event to be processed.
If the second constructor form is used then the 'current state' is considered to be don't care.
event_id
The event id for this transition.
next_state_id
The state id that the state chart will be in after the event.
action
An optional pointer to the action that will be called when the transition occurs.
guard
An optional pointer to the guard for this transition. The transition will only occur if the guard returns true.
If the guard returns false then the scan of the transition table continues from the next position.
____________________________________________________________________________________________________
state
ETL_CONSTEXPR state(const state_id_t state_id_,
void (TObject::* const on_entry)() = ETL_NULLPTR,
void (TObject::* const on_exit)() = ETL_NULLPTR)
state_id
The ID of the state.
on_entry
An optional pointer to the function that will be called when a state is entered.
on_exit
An optional pointer to the function that will be called when a state is entered.
___________________________________________________________________________________________________
Example
class MotorControl : public etl::state_chart<MotorControl>
{
void OnStart();
void OnStop();
void OnSetSpeed();
bool StartGuard();
static const etl::array<MotorControl::transition, 5> transitionTable;
};
const etl::array<MotorControl::transition, 5> MotorControl::transitionTable =
{
MotorControl::transition(IDLE,
START,
RUNNING,
&MotorControl::OnStart,
&MotorControl::StartGuard),
MotorControl::transition(RUNNING,
STOP,
WINDING_DOWN,
&MotorControl::OnStop),
MotorControl::transition(WINDING_DOWN,
STOPPED,
IDLE),
MotorControl::transition(RUNNING,
EMERGENCY_STOP,
IDLE,
&MotorControl::OnStop),
MotorControl::transition(RUNNING,
SET_SPEED,
RUNNING,
&MotorControl::OnSetSpeed)
};
____________________________________________________________________________________________________
state
state(const state_id_t state_id,
void (TObject::* const on_entry)() = nullptr,
void (TObject::* const on_exit)() = nullptr)
state_id
The id for this state.
on_entry
An optional pointer to the function that will be called when the state chart enters the state.
on_exit
An optional pointer to the function that will be called when the state chart exits the state.
____________________________________________________________________________________________________
Example
class MotorControl : public etl::state_chart<MotorControl>
{
void OnExitIdle();
void OnEnterStopped();
void OnEnterRunning);
void OnExitRunning();
static const etl::array<MotorControl::state, 3> stateTable;
};
const etl::array<MotorControl::state, 3> MotorControl::stateTable =
{
MotorControl::state(IDLE, nullptr, &MotorControl::OnExitIdle),
MotorControl::state(STOPPED, &MotorControl::OnEnterStopped, nullptr),
MotorControl::state(RUNNING, &MotorControl::OnEnterRunning, &MotorControl::OnExitRunning)
};
____________________________________________________________________________________________________
Notes
____________________________________________________________________________________________________
Order of execution
When an event is processed, the execution occurs in the following order.
(Assuming all functions have been declared in the transition and state tables)
A call to the guard function.
A call to the action function.
A call to the current state's exit function (if the transition changes the state).
A call to the next state's entry function (if the transition changes the state).
____________________________________________________________________________________________________
Usage
The state chart may either used with inheritance or composition.
class Implementation : public etl::state_chart<Implementation>
class Implementation
{
etl::state_chart<Implementation> stateChart;
};
Use inheritance when the implementation is a state machine.
Use composition if the implementation contains a state machine.

View File

@ -0,0 +1,4 @@
---
title: "State Machines"
weight: 100
---

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -0,0 +1,433 @@
---
title: "state_chart"
---
{{< callout type="info">}}
Header: `state_chart.h`
{{< /callout >}}
State Chart
A finite state machine driven by the reception of events. The incoming event will call the optional action based on a transition table. Optional on_entry and on_exit handlers can be declared in a state table.
An optional parameter may be sent to event handlers.
This FSM is simpler, both in implementation and use, than the message based FSM class defined elsewhere in the ETL. `See etl::fsm`.
**Defines the following classes**
```cpp
etl::istate_chart
etl::state_chart<TObject>
etl::state_chart<TObject, TParameter>
```
`TParameter` defines how a data parameter will be passed to event handlers.
This may be by value, pointer, reference or const reference.
For C++11 or above, you may pass an rvalue reference.
---
```cpp
istate_chart<TParameter>
```
The base for all state charts.
Since: `20.23.0`
## Types
```cpp
event_id_t
```
The type for event ids.
---
```cpp
state_id_t
```
The type for state ids.
## Member Functions
```cpp
event_it_t get_state_id() const
```
Returns the id of the state.
---
```cpp
virtual void process_event(event_id_t event_id, TParameter data) = 0
```
`etl::state_chart` will override this.
Processes the event message.
If a data parameter has been configured for `etl::state_chart`, then one will be default constructed.
---
```cpp
virtual void start(bool on_entry_initial = true)
```
Starts the state chart.
---
```cpp
istate_chart<void>
```
The base for all state charts.
Since: `20.23.0`
## Types
```cpp
event_id_t
```
The type for event ids.
---
```cpp
state_id_t
```
The type for state ids.
## Member Functions
```cpp
event_it_t get_state_id() const
```
Returns the id of the state.
---
```cpp
virtual void process_event(event_id_t event_id) = 0
```
`etl::state_chart` will override this.
Processes the event message.
If a data parameter has been configured for `etl::state_chart`, then one will be default constructed.
---
```cpp
virtual void start(bool on_entry_initial = true)
```
Starts the state chart.
---
```cpp
state_chart
```
For run-time defined transition and state tables.
Inherits from `etl::istate_chart<TParameter>` or `etl::istate_chart<void>`.
## Template parameters
`TObject` The object type that supplies actions, guards, on entry and on exit functionality.
`TParameter` The type that will be passed as a parameter (optional).
## Types
`TParameter` parameter_t
## Constructor
```cpp
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)
```
`object`
The instance of the that supplies actions, guards, on entry and on exit functionality.
`transition_table_begin`
`transition_table_end`
The table of transitions, defining the relationship between events and state changes; defines option actions and guards.
Note: The transition table must have the same lifetime as the state chart. i.e. It must exist while the state chart exists.
`state_table_begin`
`state_table_end`
Sets the optional state table defining any `on entry` and `on exit` for states.
Not all states have to have entries in the table. States with no 'on entry' and 'on_exit' functionality may be omitted.
Note: The state table must have the same lifetime as the state chart. i.e. It must exist while the state chart exists.
`state_id`
The initial state id.
Note: The constructors do not call the `on entry` function for the initial state.
`state_chart_ct` void parameter.
`state_chart_ctp` non-void parameter.
---
**For compile-time defined transition and state tables.**
```cpp
A templated class. Inherits from `etl::istate_chart<TParameter>` or `etl::istate_chart<void>`.
```
`TObject`
The object type that supplies actions, guards, on entry and on exit functionality.
`TParameter`
The type that will be passed as a parameter (state_chart_ctp).
`TObject_Ref`
A reference to the TObject instance.
`Transition_Table_Begin`
A pointer to the start of the transition table.
`Transition_Table_Size`
The number of elements in the transition table.
`State_Table_Begin`
A pointer to the start of the state table.
`State_Table_Size`
The number of elements in the transition table.
`Initial_State`
The initial state.
## Types
```cpp
TParameter parameter_t
```
## Constructor
```cpp
state_chart()
```
## Member Functions
```cpp
void start(bool on_entry_initial = true)
```
Starts the state chart.
if on_entry_initial is `true` and the initial state has an on_entry method, then this will be called.
The function does nothing after the first call.
---
```cpp
void process_event(event_id_t event_id)
```
Triggers the state chart with the event.
For `void` parameter.
---
```cpp
void process_event(event_id_t event_id, parameter_t data)
```
Triggers the state chart with the event.
Passes the parameter to the event handler.
For non-void parameter.
---
```cpp
TObject& get_object()
const TObject& get_object() const
```
Gets the implementation object instance.
---
```cpp
void set_transition_table(const transition* transition_table_begin,
const transition* transition_table_end)
```
Not defined for `state_chart_ct` or `state_chart_ctp`.
The table of transitions, defining the relationship between events and state changes; defines option actions and guards.
Note: The transition table must have the same scope as the state chart. i.e. It must exist while the state chart exists.
---
```cpp
void set_state_table(const state* state_table_begin,
const state* state_table_end)
```
Not defined for `state_chart_ct` or `state_chart_ctp`.
Sets the optional state table defining any on_entry and on_exit for states.
Not all states have to have entries in the table. States with no on_entry and on_exit functionality may be omitted.
Note: The state table must have the same scope as the state chart. i.e. It must exist while the state chart exists.
## Member Types
`transition`
---
**For `etl::state_chart<TImplementation>`**
```cpp
transition(const state_id_t current_state_id,
const event_id_t event_id,
const state_id_t next_state_id,
void (TObject::* const action)() = nullptr,
bool (TObject::* const guard)() = nullptr)
```
```cpp
transition(const event_id_t event_id,
const state_id_t next_state_id,
void (TObject::* const action)() = nullptr,
bool (TObject::* const guard)() = nullptr)
```
---
**For etl::state_chart<TImplementation, TParameter>**
```cpp
transition(const state_id_t current_state_id,
const event_id_t event_id,
const state_id_t next_state_id,
void (TObject::* const action)(data_parameter_type) = nullptr,
bool (TObject::* const guard)() = nullptr)
```
---
```cpp
transition(const event_id_t event_id,
const state_id_t next_state_id,
void (TObject::* const action)(data_parameter_type) = nullptr,
bool (TObject::* const guard)() = nullptr)
```
`current_state_id`
The state id that the state chart must be in for the event to be processed.
If the second constructor form is used then the 'current state' is considered to be don't care.
`event_id`
The event id for this transition.
`next_state_id`
The state id that the state chart will be in after the event.
`action`
An optional pointer to the action that will be called when the transition occurs.
`guard`
An optional pointer to the guard for this transition. The transition will only occur if the guard returns `true`.
If the guard returns `false` then the scan of the transition table continues from the next position.
## state
```cpp
ETL_CONSTEXPR state(const state_id_t state_id_,
void (TObject::* const on_entry)() = ETL_NULLPTR,
void (TObject::* const on_exit)() = ETL_NULLPTR)
```
`state_id`
The ID of the state.
`on_entry`
An optional pointer to the function that will be called when a state is entered.
`on_exit`
An optional pointer to the function that will be called when a state is entered.
## Example
```cpp
class MotorControl : public etl::state_chart<MotorControl>
{
void OnStart();
void OnStop();
void OnSetSpeed();
bool StartGuard();
static const etl::array<MotorControl::transition, 5> transitionTable;
};
const etl::array<MotorControl::transition, 5> MotorControl::transitionTable =
{
MotorControl::transition(IDLE,
START,
RUNNING,
&MotorControl::OnStart,
&MotorControl::StartGuard),
MotorControl::transition(RUNNING,
STOP,
WINDING_DOWN,
&MotorControl::OnStop),
MotorControl::transition(WINDING_DOWN,
STOPPED,
IDLE),
MotorControl::transition(RUNNING,
EMERGENCY_STOP,
IDLE,
&MotorControl::OnStop),
MotorControl::transition(RUNNING,
SET_SPEED,
RUNNING,
&MotorControl::OnSetSpeed)
};
```
## state
```cpp
state(const state_id_t state_id,
void (TObject::* const on_entry)() = nullptr,
void (TObject::* const on_exit)() = nullptr)
```
`state_id`
The id for this state.
`on_entry`
An optional pointer to the function that will be called when the state chart enters the state.
`on_exit`
An optional pointer to the function that will be called when the state chart exits the state.
## Example
```cpp
class MotorControl : public etl::state_chart<MotorControl>
{
void OnExitIdle();
void OnEnterStopped();
void OnEnterRunning);
void OnExitRunning();
static const etl::array<MotorControl::state, 3> stateTable;
};
const etl::array<MotorControl::state, 3> MotorControl::stateTable =
{
MotorControl::state(IDLE, nullptr, &MotorControl::OnExitIdle),
MotorControl::state(STOPPED, &MotorControl::OnEnterStopped, nullptr),
MotorControl::state(RUNNING, &MotorControl::OnEnterRunning, &MotorControl::OnExitRunning)
};
```
### Notes
**Order of execution**
When an event is processed, the execution occurs in the following order.
(Assuming all functions have been declared in the transition and state tables)
A call to the guard function.
A call to the action function.
A call to the current state's exit function (if the transition changes the state).
A call to the next state's entry function (if the transition changes the state).
**Usage**
The state chart may either used with inheritance or composition.
```cpp
class Implementation : public etl::state_chart<Implementation>
class Implementation
{
etl::state_chart<Implementation> stateChart;
};
```
Use inheritance when the implementation is a state machine.
Use composition if the implementation contains a state machine.

View File

@ -1,4 +1,4 @@
---
title: "Frameworks"
title: "Timers"
weight: 100
---