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 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
72 bool is_space = (number_of_registered_timers < Max_Timers);
84 if (
timer.
id == etl::timer::id::NO_TIMER)
91 ++number_of_registered_timers;
109 if (
id_ != etl::timer::id::NO_TIMER)
113 if (
timer.
id != etl::timer::id::NO_TIMER)
115 if (
timer.is_active())
120 active_list.remove(
timer.
id,
true);
121 remove_callback.call_if(
timer.
id);
126 --number_of_registered_timers;
163 for (
int i = 0; i < Max_Timers; ++i)
168 number_of_registered_timers = 0
U;
186 while (
has_active && (count >= active_list.front().delta))
188 timer_data&
timer = active_list.front();
190 count -=
timer.delta;
192 active_list.remove(
timer.
id,
true);
193 remove_callback.call_if(
timer.
id);
195 if (
timer.p_router != ETL_NULLPTR)
197 timer.p_router->receive(
timer.destination_router_id, *(
timer.p_message));
203 timer.delta = timer.period;
204 active_list.insert(timer.id);
205 insert_callback.call_if(timer.id);
214 active_list.front().delta -= count;
232 if (
id_ != etl::timer::id::NO_TIMER)
237 if (
timer.
id != etl::timer::id::NO_TIMER)
240 if (
timer.period != etl::timer::state::Inactive)
245 if (
timer.is_active())
247 active_list.remove(
timer.
id,
false);
248 remove_callback.call_if(
timer.
id);
253 insert_callback.call_if(
timer.
id);
271 if (
id_ != etl::timer::id::NO_TIMER)
276 if (
timer.
id != etl::timer::id::NO_TIMER)
278 if (
timer.is_active())
283 active_list.remove(
timer.
id,
false);
284 remove_callback.call_if(
timer.
id);
329 return !active_list.empty();
338 uint32_t delta =
static_cast<uint32_t>(etl::timer::interval::No_Active_Interval);
343 if (!active_list.empty())
345 delta = active_list.front().delta;
368 void clear_insert_callback()
370 insert_callback.clear();
374 void clear_remove_callback()
376 remove_callback.clear();
387 : p_message(ETL_NULLPTR)
388 , p_router(ETL_NULLPTR)
390 , delta(etl::timer::state::Inactive)
391 , destination_router_id(etl::imessage_bus::ALL_MESSAGE_ROUTERS)
392 , id(etl::timer::id::NO_TIMER)
393 , previous(etl::timer::id::NO_TIMER)
394 , next(etl::timer::id::NO_TIMER)
409 , delta(etl::timer::state::Inactive)
412 , previous(etl::timer::id::NO_TIMER)
413 , next(etl::timer::id::NO_TIMER)
423 return delta != etl::timer::state::Inactive;
431 delta = etl::timer::state::Inactive;
438 etl::message_router_id_t destination_router_id;
439 etl::timer::id::type id;
458 , number_of_registered_timers(0
U)
491 return head == etl::timer::id::NO_TIMER;
497 void insert(etl::timer::id::type
id_)
499 timer_data& timer = ptimers[
id_];
501 if (head == etl::timer::id::NO_TIMER)
506 timer.previous = etl::timer::id::NO_TIMER;
507 timer.next = etl::timer::id::NO_TIMER;
514 while (
test_id != etl::timer::id::NO_TIMER)
516 timer_data& test = ptimers[
test_id];
519 if (timer.delta <= test.delta)
527 timer.previous = test.previous;
528 test.previous = timer.id;
529 timer.next = test.id;
532 test.delta -= timer.delta;
534 if (timer.previous != etl::timer::id::NO_TIMER)
536 ptimers[timer.previous].next = timer.id;
542 timer.delta -= test.delta;
549 if (
test_id == etl::timer::id::NO_TIMER)
552 ptimers[tail].next = timer.id;
553 timer.previous = tail;
554 timer.next = etl::timer::id::NO_TIMER;
563 timer_data& timer = ptimers[
id_];
571 ptimers[timer.previous].next = timer.next;
576 tail = timer.previous;
580 ptimers[timer.next].previous = timer.previous;
586 if (timer.next != etl::timer::id::NO_TIMER)
588 ptimers[timer.next].delta += timer.delta;
592 timer.previous = etl::timer::id::NO_TIMER;
593 timer.next = etl::timer::id::NO_TIMER;
594 timer.delta = etl::timer::state::Inactive;
600 return ptimers[head];
604 const timer_data& front()
const
606 return ptimers[head];
610 etl::timer::id::type
begin()
617 etl::timer::id::type previous(etl::timer::id::type last)
619 current = ptimers[last].previous;
624 etl::timer::id::type next(etl::timer::id::type last)
626 current = ptimers[last].next;
633 etl::timer::id::type
id =
begin();
635 while (
id != etl::timer::id::NO_TIMER)
637 timer_data& timer = ptimers[id];
639 timer.next = etl::timer::id::NO_TIMER;
642 head = etl::timer::id::NO_TIMER;
643 tail = etl::timer::id::NO_TIMER;
644 current = etl::timer::id::NO_TIMER;
649 etl::timer::id::type head;
650 etl::timer::id::type tail;
651 etl::timer::id::type current;
653 timer_data*
const ptimers;
657 timer_data*
const timer_array;
660 timer_list active_list;
665 event_callback_type insert_callback;
666 event_callback_type remove_callback;
676 template <u
int_least8_t Max_Timers_,
typename TInterruptGuard>
681 ETL_STATIC_ASSERT(
Max_Timers_ <= 254,
"No more than 254 timers are allowed");
Declaration.
Definition delegate_cpp03.h:191
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:311
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition message_timer_interrupt.h:227
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition message_timer_interrupt.h:105
void set_insert_callback(event_callback_type insert_)
Set a callback when a timer is inserted on list.
Definition message_timer_interrupt.h:354
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:64
void set_remove_callback(event_callback_type remove_)
Set a callback when a timer is removed from list.
Definition message_timer_interrupt.h:362
void clear()
Clears the timer of data.
Definition message_timer_interrupt.h:154
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition message_timer_interrupt.h:266
void enable(bool state_)
Enable/disable the timer.
Definition message_timer_interrupt.h:138
~imessage_timer_interrupt()
Destructor.
Definition message_timer_interrupt.h:466
imessage_timer_interrupt(timer_data *const timer_array_, const uint_least8_t Max_Timers_)
Constructor.
Definition message_timer_interrupt.h:454
bool has_active_timer() const
Check if there is an active timer.
Definition message_timer_interrupt.h:325
bool is_running() const
Get the enable/disable state.
Definition message_timer_interrupt.h:146
uint32_t time_to_next() const
Definition message_timer_interrupt.h:336
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition message_timer_interrupt.h:297
The message timer.
Definition message_timer_interrupt.h:678
message_timer_interrupt()
Constructor.
Definition message_timer_interrupt.h:688
ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T &value)
Definition algorithm.h:2300
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:962
ETL_NODISCARD ETL_CONSTEXPR14 T round_half_even_unscaled(T value) ETL_NOEXCEPT
Definition scaled_rounding.h:315
The configuration of a timer.
Definition message_timer_interrupt.h:384
bool is_active() const
Returns true if the timer is active.
Definition message_timer_interrupt.h:421
void set_inactive()
Sets the timer to the inactive state.
Definition message_timer_interrupt.h:429
Common definitions for the timer framework.
Definition timer.h:55