29#ifndef ETL_MESSAGE_TIMER_INTERRUPT_INCLUDED
30#define ETL_MESSAGE_TIMER_INTERRUPT_INCLUDED
34#include "message_types.h"
36#include "message_router.h"
37#include "message_bus.h"
38#include "static_assert.h"
50 template <
typename TInterruptGuard>
70 bool is_space = (number_of_registered_timers < MAX_TIMERS);
82 if (
timer.
id == etl::timer::id::NO_TIMER)
89 ++number_of_registered_timers;
107 if (
id_ != etl::timer::id::NO_TIMER)
111 if (
timer.
id != etl::timer::id::NO_TIMER)
113 if (
timer.is_active())
118 active_list.remove(
timer.
id,
true);
123 --number_of_registered_timers;
160 for (
int i = 0;
i < MAX_TIMERS; ++
i)
165 number_of_registered_timers = 0U;
183 while (
has_active && (count >= active_list.front().delta))
185 timer_data&
timer = active_list.front();
187 count -=
timer.delta;
189 active_list.remove(
timer.
id,
true);
191 if (
timer.p_router != ETL_NULLPTR)
193 timer.p_router->receive(
timer.destination_router_id, *(
timer.p_message));
199 timer.delta = timer.period;
200 active_list.insert(timer.id);
203 has_active = !active_list.empty();
209 active_list.front().delta -= count;
227 if (
id_ != etl::timer::id::NO_TIMER)
232 if (
timer.
id != etl::timer::id::NO_TIMER)
235 if (
timer.period != etl::timer::state::INACTIVE)
240 if (
timer.is_active())
242 active_list.remove(
timer.
id,
false);
264 if (
id_ != etl::timer::id::NO_TIMER)
269 if (
timer.
id != etl::timer::id::NO_TIMER)
271 if (
timer.is_active())
276 active_list.remove(
timer.
id,
false);
322 : p_message(ETL_NULLPTR)
323 , p_router(ETL_NULLPTR)
325 , delta(etl::timer::state::INACTIVE)
326 , destination_router_id(etl::imessage_bus::ALL_MESSAGE_ROUTERS)
327 , id(etl::timer::id::NO_TIMER)
328 , previous(etl::timer::id::NO_TIMER)
329 , next(etl::timer::id::NO_TIMER)
344 , delta(etl::timer::state::INACTIVE)
347 , previous(etl::timer::id::NO_TIMER)
348 , next(etl::timer::id::NO_TIMER)
358 return delta != etl::timer::state::INACTIVE;
366 delta = etl::timer::state::INACTIVE;
393 , number_of_registered_timers(0U)
426 return head == etl::timer::id::NO_TIMER;
434 timer_data& timer = ptimers[id_];
436 if (head == etl::timer::id::NO_TIMER)
441 timer.previous = etl::timer::id::NO_TIMER;
442 timer.next = etl::timer::id::NO_TIMER;
449 while (test_id != etl::timer::id::NO_TIMER)
451 timer_data& test = ptimers[test_id];
454 if (timer.delta <= test.delta)
462 timer.previous = test.previous;
463 test.previous = timer.id;
464 timer.next = test.id;
467 test.delta -= timer.delta;
469 if (timer.previous != etl::timer::id::NO_TIMER)
471 ptimers[timer.previous].next = timer.id;
477 timer.delta -= test.delta;
480 test_id = next(test_id);
484 if (test_id == etl::timer::id::NO_TIMER)
487 ptimers[tail].next = timer.id;
488 timer.previous = tail;
489 timer.next = etl::timer::id::NO_TIMER;
498 timer_data& timer = ptimers[id_];
506 ptimers[timer.previous].next = timer.next;
511 tail = timer.previous;
515 ptimers[timer.next].previous = timer.previous;
521 if (timer.next != etl::timer::id::NO_TIMER)
523 ptimers[timer.next].delta += timer.delta;
527 timer.previous = etl::timer::id::NO_TIMER;
528 timer.next = etl::timer::id::NO_TIMER;
529 timer.delta = etl::timer::state::INACTIVE;
535 return ptimers[head];
548 current = ptimers[last].previous;
555 current = ptimers[last].next;
564 while (
id != etl::timer::id::NO_TIMER)
566 timer_data& timer = ptimers[id];
568 timer.next = etl::timer::id::NO_TIMER;
571 head = etl::timer::id::NO_TIMER;
572 tail = etl::timer::id::NO_TIMER;
573 current = etl::timer::id::NO_TIMER;
582 timer_data*
const ptimers;
586 timer_data*
const timer_array;
589 timer_list active_list;
592 uint_least8_t number_of_registered_timers;
596 const uint_least8_t MAX_TIMERS;
602 template <u
int_least8_t MAX_TIMERS_,
typename TInterruptGuard>
607 ETL_STATIC_ASSERT(
MAX_TIMERS_ <= 254,
"No more than 254 timers are allowed");
Declaration.
Definition delegate_cpp03.h:175
This is the base of all message routers.
Definition message_router_generator.h:121
Interface for message timer.
Definition message_timer_interrupt.h:52
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition message_timer_interrupt.h:303
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition message_timer_interrupt.h:222
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition message_timer_interrupt.h:103
etl::timer::id::type register_timer(const etl::imessage &message_, etl::imessage_router &router_, uint32_t period_, bool repeating_, etl::message_router_id_t destination_router_id_=etl::imessage_router::ALL_MESSAGE_ROUTERS)
Register a timer.
Definition message_timer_interrupt.h:62
imessage_timer_interrupt(timer_data *const timer_array_, const uint_least8_t MAX_TIMERS_)
Constructor.
Definition message_timer_interrupt.h:389
void clear()
Clears the timer of data.
Definition message_timer_interrupt.h:151
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition message_timer_interrupt.h:259
void enable(bool state_)
Enable/disable the timer.
Definition message_timer_interrupt.h:135
~imessage_timer_interrupt()
Destructor.
Definition message_timer_interrupt.h:401
bool is_running() const
Get the enable/disable state.
Definition message_timer_interrupt.h:143
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition message_timer_interrupt.h:289
The message timer.
Definition message_timer_interrupt.h:604
message_timer_interrupt()
Constructor.
Definition message_timer_interrupt.h:614
ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T &value)
Definition algorithm.h:1934
bitset_ext
Definition absolute.h:38
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:931
The configuration of a timer.
Definition message_timer_interrupt.h:319
bool is_active() const
Returns true if the timer is active.
Definition message_timer_interrupt.h:356
void set_inactive()
Sets the timer to the inactive state.
Definition message_timer_interrupt.h:364
pair holds two objects of arbitrary type
Definition utility.h:164
Common definitions for the timer framework.
Definition timer.h:55