A C++ template library for embedded applications
Designed and maintained by
Aster Consulting Ltd
MIT licensed
Join the ETL community


A set of framework template classes to enable the easy creation of systems.


A set of modular template classes that can be mixed and matched together to provide message routing, finite state
machines, timer driven message generators, routers, buses and cooperative schedulers.
All of the message framework classes are based on etl::imessage_router, allowing combinations of Router/Bus/FSM.

The framework uses CRTP to eliminate the need for most virtual functions and enable direct calls to handler functions.

The class types

Message type used for router, bus and FSM classes.

Message Router
A class that will automatically route incoming messages to specific handlers based on the message list defined in the
template parameters.

Message Bus

An expansion of the observer pattern in that message routers will be able to subscribe to messages on a bus.
The messages will be either broadcast, to be automatically picked up by any router that has a handler, or addressed to
a particular router or router id.

Finite State Machine

A finite state machine driven by the reception of messages (events) . The incoming messages will be automatically
routed to specific handlers based on the message list defined in the template parameters. Optional 'on entry' and 'on
exit' handlers are available.

State Chart
A finite state machine driven by the reception of events. The incoming event will call the optional action based on a state
table. Optional 'on entry' and 'on exit' handlers can be declared in a state table. Lighter weight than the described FSM

Timer driven message/callback generators

A class that can hook in to a hardware timer service and generate messages or callbacks at asynchronous intervals.
The message timer will likely be used in conjunction with the message router, bus or finite state machine frameworks.

Cooperative Scheduler

A lightweight cooperative multi-tasking scheduler.
Can be used stand-alone or in conjunction with a messaging system such as the ETL's message router or FSM as the
back-end handler. For use when a complex OS or RTOS is overkill.

The base for tasks controlled by etl::scheduler.

Callback Service
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.

Messaging class diagram