57 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
65 etl::message_router_id_t destination_router_id_ = etl::imessage_router::ALL_MESSAGE_ROUTERS)
67 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
69 bool is_space = (number_of_registered_timers < Max_Timers);
74 if (!router_.is_null_router())
77 for (uint_least8_t i = 0U; i < Max_Timers; ++i)
79 timer_data&
timer = timer_array[i];
81 if (
timer.
id == etl::timer::id::NO_TIMER)
83 TInterruptGuard guard;
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)
108 timer_data&
timer = timer_array[id_];
110 if (
timer.
id != etl::timer::id::NO_TIMER)
112 if (
timer.is_active())
114 TInterruptGuard guard;
117 active_list.remove(
timer.
id,
true);
118 remove_callback.call_if(
timer.
id);
122 new (&
timer) timer_data();
123 --number_of_registered_timers;
154 TInterruptGuard guard;
160 for (
int i = 0; i < Max_Timers; ++i)
162 new (&timer_array[i]) timer_data();
165 number_of_registered_timers = 0U;
174 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));
200 timer.delta = timer.period;
201 active_list.insert(timer.id);
202 insert_callback.call_if(timer.id);
205 has_active = !active_list.empty();
211 active_list.front().delta -= count;
224 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
229 if (id_ != etl::timer::id::NO_TIMER)
231 timer_data&
timer = timer_array[id_];
234 if (
timer.
id != etl::timer::id::NO_TIMER)
237 if (
timer.period != etl::timer::state::Inactive)
239 TInterruptGuard guard;
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);
263 bool stop(etl::timer::id::type id_)
268 if (id_ != etl::timer::id::NO_TIMER)
270 timer_data&
timer = timer_array[id_];
273 if (
timer.
id != etl::timer::id::NO_TIMER)
275 if (
timer.is_active())
277 TInterruptGuard guard;
280 active_list.remove(
timer.
id,
false);
281 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_;
324 TInterruptGuard guard;
326 return !active_list.empty();
336 uint32_t delta =
static_cast<uint32_t
>(etl::timer::interval::No_Active_Interval);
338 TInterruptGuard guard;
341 if (!active_list.empty())
343 delta = active_list.front().delta;
354 insert_callback = insert_;
362 remove_callback = remove_;
366 void clear_insert_callback()
368 insert_callback.clear();
372 void clear_remove_callback()
374 remove_callback.clear();
385 : p_message(ETL_NULLPTR)
386 , p_router(ETL_NULLPTR)
388 , delta(etl::timer::state::Inactive)
389 , destination_router_id(etl::imessage_bus::ALL_MESSAGE_ROUTERS)
390 , id(etl::timer::id::NO_TIMER)
391 , previous(etl::timer::id::NO_TIMER)
392 , next(etl::timer::id::NO_TIMER)
399 etl::message_router_id_t destination_router_id_ = etl::imessage_bus::ALL_MESSAGE_ROUTERS)
400 : p_message(&message_)
401 , p_router(&irouter_)
403 , delta(etl::timer::state::Inactive)
404 , destination_router_id(destination_router_id_)
406 , previous(etl::timer::id::NO_TIMER)
407 , next(etl::timer::id::NO_TIMER)
408 , repeating(repeating_)
417 return delta != etl::timer::state::Inactive;
425 delta = etl::timer::state::Inactive;
432 etl::message_router_id_t destination_router_id;
433 etl::timer::id::type id;
434 uint_least8_t previous;
449 : timer_array(timer_array_)
450 , active_list(timer_array_)
452 , number_of_registered_timers(0U)
453 , Max_Timers(Max_Timers_)
472 timer_list(timer_data* ptimers_)
483 return head == etl::timer::id::NO_TIMER;
489 void insert(etl::timer::id::type id_)
491 timer_data& timer = ptimers[id_];
493 if (head == etl::timer::id::NO_TIMER)
498 timer.previous = etl::timer::id::NO_TIMER;
499 timer.next = etl::timer::id::NO_TIMER;
504 etl::timer::id::type test_id = begin();
506 while (test_id != etl::timer::id::NO_TIMER)
508 timer_data& test = ptimers[test_id];
511 if (timer.delta <= test.delta)
519 timer.previous = test.previous;
520 test.previous = timer.id;
521 timer.next = test.id;
524 test.delta -= timer.delta;
526 if (timer.previous != etl::timer::id::NO_TIMER)
528 ptimers[timer.previous].next = timer.id;
534 timer.delta -= test.delta;
537 test_id = next(test_id);
541 if (test_id == etl::timer::id::NO_TIMER)
544 ptimers[tail].next = timer.id;
545 timer.previous = tail;
546 timer.next = etl::timer::id::NO_TIMER;
553 void remove(etl::timer::id::type id_,
bool has_expired)
555 timer_data& timer = ptimers[id_];
563 ptimers[timer.previous].next = timer.next;
568 tail = timer.previous;
572 ptimers[timer.next].previous = timer.previous;
578 if (timer.next != etl::timer::id::NO_TIMER)
580 ptimers[timer.next].delta += timer.delta;
584 timer.previous = etl::timer::id::NO_TIMER;
585 timer.next = etl::timer::id::NO_TIMER;
586 timer.delta = etl::timer::state::Inactive;
592 return ptimers[head];
596 const timer_data& front()
const
598 return ptimers[head];
602 etl::timer::id::type begin()
609 etl::timer::id::type previous(etl::timer::id::type last)
611 current = ptimers[last].previous;
616 etl::timer::id::type next(etl::timer::id::type last)
618 current = ptimers[last].next;
625 etl::timer::id::type
id = begin();
627 while (
id != etl::timer::id::NO_TIMER)
629 timer_data& timer = ptimers[id];
631 timer.next = etl::timer::id::NO_TIMER;
634 head = etl::timer::id::NO_TIMER;
635 tail = etl::timer::id::NO_TIMER;
636 current = etl::timer::id::NO_TIMER;
641 etl::timer::id::type head;
642 etl::timer::id::type tail;
643 etl::timer::id::type current;
645 timer_data*
const ptimers;
652 timer_list active_list;
655 uint_least8_t number_of_registered_timers;
657 event_callback_type insert_callback;
658 event_callback_type remove_callback;
662 const uint_least8_t Max_Timers;