59 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
70 etl::message_router_id_t destination_router_id_ = etl::imessage_router::ALL_MESSAGE_ROUTERS)
72 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
74 bool is_space = (number_of_registered_timers < Max_Timers);
79 if (!router_.is_null_router())
82 for (uint_least8_t i = 0U; i < Max_Timers; ++i)
86 if (
timer.
id == etl::timer::id::NO_TIMER)
89 new (&
timer)
timer_data(i, message_, router_, period_, repeating_, destination_router_id_);
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 = 0U;
172 bool tick(uint32_t count)
179 bool has_active = !active_list.empty();
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);
204 has_active = !active_list.empty();
210 active_list.front().delta -= count;
226 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
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);
264 bool stop(etl::timer::id::type 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);
298 timer_array[id_].period = period_;
308 bool set_mode(etl::timer::id::type id_,
bool repeating_)
312 timer_array[id_].repeating = repeating_;
322 void set_locks(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
324 try_lock = try_lock_;
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;
364 insert_callback = insert_;
372 remove_callback = remove_;
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)
408 timer_data(etl::timer::id::type id_,
413 etl::message_router_id_t destination_router_id_ = etl::imessage_bus::ALL_MESSAGE_ROUTERS)
414 : p_message(&message_)
415 , p_router(&irouter_)
417 , delta(etl::timer::state::Inactive)
418 , destination_router_id(destination_router_id_)
420 , previous(etl::timer::id::NO_TIMER)
421 , next(etl::timer::id::NO_TIMER)
422 , repeating(repeating_)
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;
448 uint_least8_t previous;
463 : timer_array(timer_array_)
464 , active_list(timer_array_)
466 , number_of_registered_timers(0U)
467 , Max_Timers(Max_Timers_)
488 timer_list(timer_data* ptimers_)
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;
520 etl::timer::id::type test_id = begin();
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;
553 test_id = next(test_id);
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;
569 void remove(etl::timer::id::type id_,
bool has_expired)
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;
668 timer_list active_list;
671 uint_least8_t number_of_registered_timers;
673 try_lock_type try_lock;
677 event_callback_type insert_callback;
678 event_callback_type remove_callback;
681 const uint_least8_t Max_Timers;
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