29#ifndef ETL_MESSAGE_TIMER_LOCKED_INCLUDED
30#define ETL_MESSAGE_TIMER_LOCKED_INCLUDED
34#include "message_types.h"
36#include "message_router.h"
37#include "message_bus.h"
38#include "static_assert.h"
72 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
74 bool is_space = (number_of_registered_timers < Max_Timers);
86 if (
timer.
id == etl::timer::id::NO_TIMER)
90 ++number_of_registered_timers;
108 if (
id_ != etl::timer::id::NO_TIMER)
112 if (
timer.
id != etl::timer::id::NO_TIMER)
114 if (
timer.is_active())
117 active_list.remove(
timer.
id,
true);
118 remove_callback.call_if(
timer.
id);
124 --number_of_registered_timers;
158 for (
int i = 0; i < Max_Timers; ++i)
163 number_of_registered_timers = 0
U;
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);
190 remove_callback.call_if(
timer.
id);
192 if (
timer.p_router != ETL_NULLPTR)
194 timer.p_router->receive(
timer.destination_router_id, *(
timer.p_message));
199 timer.delta = timer.period;
200 active_list.insert(timer.id);
201 insert_callback.call_if(timer.id);
210 active_list.front().delta -= count;
231 if (
id_ != etl::timer::id::NO_TIMER)
236 if (
timer.
id != etl::timer::id::NO_TIMER)
239 if (
timer.period != etl::timer::state::Inactive)
242 if (
timer.is_active())
244 active_list.remove(
timer.
id,
false);
245 remove_callback.call_if(
timer.
id);
250 insert_callback.call_if(
timer.
id);
269 if (
id_ != etl::timer::id::NO_TIMER)
274 if (
timer.
id != etl::timer::id::NO_TIMER)
276 if (
timer.is_active())
279 active_list.remove(
timer.
id,
false);
280 remove_callback.call_if(
timer.
id);
335 bool result = !active_list.empty();
347 uint32_t delta =
static_cast<uint32_t>(etl::timer::interval::No_Active_Interval);
350 if (!active_list.empty())
352 delta = active_list.front().delta;
376 void clear_insert_callback()
378 insert_callback.clear();
382 void clear_remove_callback()
384 remove_callback.clear();
395 : p_message(ETL_NULLPTR)
396 , p_router(ETL_NULLPTR)
398 , delta(etl::timer::state::Inactive)
399 , destination_router_id(etl::imessage_bus::ALL_MESSAGE_ROUTERS)
400 , id(etl::timer::id::NO_TIMER)
401 , previous(etl::timer::id::NO_TIMER)
402 , next(etl::timer::id::NO_TIMER)
417 , delta(etl::timer::state::Inactive)
420 , previous(etl::timer::id::NO_TIMER)
421 , next(etl::timer::id::NO_TIMER)
431 return delta != etl::timer::state::Inactive;
439 delta = etl::timer::state::Inactive;
446 etl::message_router_id_t destination_router_id;
447 etl::timer::id::type id;
466 , number_of_registered_timers(0
U)
499 return head == etl::timer::id::NO_TIMER;
505 void insert(etl::timer::id::type
id_)
507 timer_data& timer = ptimers[
id_];
509 if (head == etl::timer::id::NO_TIMER)
514 timer.previous = etl::timer::id::NO_TIMER;
515 timer.next = etl::timer::id::NO_TIMER;
522 while (
test_id != etl::timer::id::NO_TIMER)
524 timer_data& test = ptimers[
test_id];
527 if (timer.delta <= test.delta)
535 timer.previous = test.previous;
536 test.previous = timer.id;
537 timer.next = test.id;
540 test.delta -= timer.delta;
542 if (timer.previous != etl::timer::id::NO_TIMER)
544 ptimers[timer.previous].next = timer.id;
550 timer.delta -= test.delta;
557 if (
test_id == etl::timer::id::NO_TIMER)
560 ptimers[tail].next = timer.id;
561 timer.previous = tail;
562 timer.next = etl::timer::id::NO_TIMER;
571 timer_data& timer = ptimers[
id_];
579 ptimers[timer.previous].next = timer.next;
584 tail = timer.previous;
588 ptimers[timer.next].previous = timer.previous;
594 if (timer.next != etl::timer::id::NO_TIMER)
596 ptimers[timer.next].delta += timer.delta;
600 timer.previous = etl::timer::id::NO_TIMER;
601 timer.next = etl::timer::id::NO_TIMER;
602 timer.delta = etl::timer::state::Inactive;
608 return ptimers[head];
612 const timer_data& front()
const
614 return ptimers[head];
618 etl::timer::id::type
begin()
625 etl::timer::id::type previous(etl::timer::id::type last)
627 current = ptimers[last].previous;
632 etl::timer::id::type next(etl::timer::id::type last)
634 current = ptimers[last].next;
641 etl::timer::id::type
id =
begin();
643 while (
id != etl::timer::id::NO_TIMER)
645 timer_data& timer = ptimers[id];
647 timer.next = etl::timer::id::NO_TIMER;
650 head = etl::timer::id::NO_TIMER;
651 tail = etl::timer::id::NO_TIMER;
652 current = etl::timer::id::NO_TIMER;
657 etl::timer::id::type head;
658 etl::timer::id::type tail;
659 etl::timer::id::type current;
661 timer_data*
const ptimers;
665 timer_data*
const timer_array;
668 timer_list active_list;
673 try_lock_type try_lock;
677 event_callback_type insert_callback;
678 event_callback_type remove_callback;
687 template <u
int_least8_t Max_Timers_>
692 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_locked.h:51
void set_insert_callback(event_callback_type insert_)
Set a callback when a timer is inserted on list.
Definition message_timer_locked.h:362
bool has_active_timer() const
Check if there is an active timer.
Definition message_timer_locked.h:332
bool is_running() const
Get the enable/disable state.
Definition message_timer_locked.h:144
uint32_t time_to_next() const
Definition message_timer_locked.h:345
~imessage_timer_locked()
Destructor.
Definition message_timer_locked.h:474
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition message_timer_locked.h:294
void enable(bool state_)
Enable/disable the timer.
Definition message_timer_locked.h:136
imessage_timer_locked(timer_data *const timer_array_, const uint_least8_t Max_Timers_)
Constructor.
Definition message_timer_locked.h:462
void clear()
Clears the timer of data.
Definition message_timer_locked.h:152
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition message_timer_locked.h:226
void set_locks(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Sets the lock and unlock delegates.
Definition message_timer_locked.h:322
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_locked.h:66
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition message_timer_locked.h:264
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition message_timer_locked.h:104
void set_remove_callback(event_callback_type remove_)
Set a callback when a timer is removed from list.
Definition message_timer_locked.h:370
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition message_timer_locked.h:308
The message timer.
Definition message_timer_locked.h:689
message_timer_locked(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Constructor.
Definition message_timer_locked.h:710
message_timer_locked()
Constructor.
Definition message_timer_locked.h:702
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_locked.h:392
bool is_active() const
Returns true if the timer is active.
Definition message_timer_locked.h:429
void set_inactive()
Sets the timer to the inactive state.
Definition message_timer_locked.h:437
Common definitions for the timer framework.
Definition timer.h:55