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"
68 etl::message_router_id_t destination_router_id_ = etl::imessage_router::ALL_MESSAGE_ROUTERS)
70 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
72 bool is_space = (number_of_registered_timers < MAX_TIMERS);
77 if (!router_.is_null_router())
80 for (uint_least8_t i = 0U; i < MAX_TIMERS; ++i)
84 if (
timer.
id == etl::timer::id::NO_TIMER)
87 new (&
timer)
timer_data(i, message_, router_, period_, repeating_, destination_router_id_);
88 ++number_of_registered_timers;
106 if (id_ != etl::timer::id::NO_TIMER)
110 if (
timer.
id != etl::timer::id::NO_TIMER)
112 if (
timer.is_active())
115 active_list.remove(
timer.
id,
true);
121 --number_of_registered_timers;
155 for (
int i = 0; i < MAX_TIMERS; ++i)
160 number_of_registered_timers = 0U;
169 bool tick(uint32_t count)
176 bool has_active = !active_list.empty();
180 while (has_active && (count >= active_list.front().delta))
182 timer_data&
timer = active_list.front();
184 count -=
timer.delta;
186 active_list.remove(
timer.
id,
true);
188 if (
timer.p_router != ETL_NULLPTR)
190 timer.p_router->receive(
timer.destination_router_id, *(
timer.p_message));
195 timer.delta = timer.period;
196 active_list.insert(timer.id);
199 has_active = !active_list.empty();
205 active_list.front().delta -= count;
221 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
226 if (id_ != etl::timer::id::NO_TIMER)
231 if (
timer.
id != etl::timer::id::NO_TIMER)
234 if (
timer.period != etl::timer::state::INACTIVE)
237 if (
timer.is_active())
239 active_list.remove(
timer.
id,
false);
257 bool stop(etl::timer::id::type id_)
262 if (id_ != etl::timer::id::NO_TIMER)
267 if (
timer.
id != etl::timer::id::NO_TIMER)
269 if (
timer.is_active())
272 active_list.remove(
timer.
id,
false);
290 timer_array[id_].period = period_;
300 bool set_mode(etl::timer::id::type id_,
bool repeating_)
304 timer_array[id_].repeating = repeating_;
316 try_lock = try_lock_;
329 : p_message(ETL_NULLPTR)
330 , p_router(ETL_NULLPTR)
332 , delta(etl::timer::state::INACTIVE)
333 , destination_router_id(etl::imessage_bus::ALL_MESSAGE_ROUTERS)
334 , id(etl::timer::id::NO_TIMER)
335 , previous(etl::timer::id::NO_TIMER)
336 , next(etl::timer::id::NO_TIMER)
347 etl::message_router_id_t destination_router_id_ = etl::imessage_bus::ALL_MESSAGE_ROUTERS)
348 : p_message(&message_)
349 , p_router(&irouter_)
351 , delta(etl::timer::state::INACTIVE)
352 , destination_router_id(destination_router_id_)
354 , previous(etl::timer::id::NO_TIMER)
355 , next(etl::timer::id::NO_TIMER)
356 , repeating(repeating_)
365 return delta != etl::timer::state::INACTIVE;
373 delta = etl::timer::state::INACTIVE;
380 etl::message_router_id_t destination_router_id;
381 etl::timer::id::type id;
382 uint_least8_t previous;
397 : timer_array(timer_array_)
398 , active_list(timer_array_)
400 , number_of_registered_timers(0U)
401 , MAX_TIMERS(MAX_TIMERS_)
422 timer_list(timer_data* ptimers_)
433 return head == etl::timer::id::NO_TIMER;
439 void insert(etl::timer::id::type id_)
441 timer_data& timer = ptimers[id_];
443 if (head == etl::timer::id::NO_TIMER)
448 timer.previous = etl::timer::id::NO_TIMER;
449 timer.next = etl::timer::id::NO_TIMER;
454 etl::timer::id::type test_id =
begin();
456 while (test_id != etl::timer::id::NO_TIMER)
458 timer_data& test = ptimers[test_id];
461 if (timer.delta <= test.delta)
469 timer.previous = test.previous;
470 test.previous = timer.id;
471 timer.next = test.id;
474 test.delta -= timer.delta;
476 if (timer.previous != etl::timer::id::NO_TIMER)
478 ptimers[timer.previous].next = timer.id;
484 timer.delta -= test.delta;
487 test_id = next(test_id);
491 if (test_id == etl::timer::id::NO_TIMER)
494 ptimers[tail].next = timer.id;
495 timer.previous = tail;
496 timer.next = etl::timer::id::NO_TIMER;
503 void remove(etl::timer::id::type id_,
bool has_expired)
505 timer_data& timer = ptimers[id_];
513 ptimers[timer.previous].next = timer.next;
518 tail = timer.previous;
522 ptimers[timer.next].previous = timer.previous;
528 if (timer.next != etl::timer::id::NO_TIMER)
530 ptimers[timer.next].delta += timer.delta;
534 timer.previous = etl::timer::id::NO_TIMER;
535 timer.next = etl::timer::id::NO_TIMER;
536 timer.delta = etl::timer::state::INACTIVE;
542 return ptimers[head];
546 etl::timer::id::type
begin()
553 etl::timer::id::type previous(etl::timer::id::type last)
555 current = ptimers[last].previous;
560 etl::timer::id::type next(etl::timer::id::type last)
562 current = ptimers[last].next;
569 etl::timer::id::type
id =
begin();
571 while (
id != etl::timer::id::NO_TIMER)
573 timer_data& timer = ptimers[id];
575 timer.next = etl::timer::id::NO_TIMER;
578 head = etl::timer::id::NO_TIMER;
579 tail = etl::timer::id::NO_TIMER;
580 current = etl::timer::id::NO_TIMER;
585 etl::timer::id::type head;
586 etl::timer::id::type tail;
587 etl::timer::id::type current;
589 timer_data*
const ptimers;
593 timer_data*
const timer_array;
596 timer_list active_list;
599 uint_least8_t number_of_registered_timers;
601 try_lock_type try_lock;
607 const uint_least8_t MAX_TIMERS;
613 template <u
int_least8_t MAX_TIMERS_>
618 ETL_STATIC_ASSERT(MAX_TIMERS_ <= 254,
"No more than 254 timers are allowed");
639 this->
set_locks(try_lock_, lock_, unlock_);
644 timer_data timer_array[MAX_TIMERS_];
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_locked.h:51
bool is_running() const
Get the enable/disable state.
Definition: message_timer_locked.h:141
~imessage_timer_locked()
Destructor.
Definition: message_timer_locked.h:408
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition: message_timer_locked.h:286
void enable(bool state_)
Enable/disable the timer.
Definition: message_timer_locked.h:133
void clear()
Clears the timer of data.
Definition: message_timer_locked.h:149
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition: message_timer_locked.h:221
imessage_timer_locked(timer_data *const timer_array_, const uint_least8_t MAX_TIMERS_)
Constructor.
Definition: message_timer_locked.h:396
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:314
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:64
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition: message_timer_locked.h:257
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition: message_timer_locked.h:102
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition: message_timer_locked.h:300
The message timer.
Definition: message_timer_locked.h:615
message_timer_locked()
Constructor.
Definition: message_timer_locked.h:628
message_timer_locked(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Constructor.
Definition: message_timer_locked.h:636
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_locked.h:326
bool is_active() const
Returns true if the timer is active.
Definition: message_timer_locked.h:363
void set_inactive()
Sets the timer to the inactive state.
Definition: message_timer_locked.h:371
Common definitions for the timer framework.
Definition: timer.h:55