55 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
64 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
66 bool is_space = (number_of_registered_timers < Max_Timers);
71 for (uint_least8_t i = 0U; i < Max_Timers; ++i)
73 timer_data&
timer = timer_array[i];
75 if (
timer.
id == etl::timer::id::NO_TIMER)
77 TInterruptGuard guard;
81 new (&
timer) timer_data(i, callback_, period_, repeating_);
82 ++number_of_registered_timers;
99 if (id_ != etl::timer::id::NO_TIMER)
101 timer_data&
timer = timer_array[id_];
103 if (
timer.
id != etl::timer::id::NO_TIMER)
105 if (
timer.is_active())
107 TInterruptGuard guard;
110 active_list.remove(
timer.
id,
false);
111 remove_callback.call_if(
timer.
id);
115 new (&
timer) timer_data();
116 --number_of_registered_timers;
147 TInterruptGuard guard;
151 number_of_registered_timers = 0;
154 for (uint8_t i = 0U; i < Max_Timers; ++i)
156 ::new (&timer_array[i]) timer_data();
166 bool tick(uint32_t count)
171 bool has_active = !active_list.empty();
175 while (has_active && (count >= active_list.front().delta))
177 timer_data&
timer = active_list.front();
179 count -=
timer.delta;
181 active_list.remove(
timer.
id,
true);
182 remove_callback.call_if(
timer.
id);
184 if (
timer.callback.is_valid())
192 timer.delta = timer.period;
193 active_list.insert(timer.id);
194 insert_callback.call_if(timer.id);
197 has_active = !active_list.empty();
203 active_list.front().delta -= count;
216 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
221 if (id_ != etl::timer::id::NO_TIMER)
223 timer_data&
timer = timer_array[id_];
226 if (
timer.
id != etl::timer::id::NO_TIMER)
229 if (
timer.period != etl::timer::state::Inactive)
231 TInterruptGuard guard;
234 if (
timer.is_active())
236 active_list.remove(
timer.
id,
false);
237 remove_callback.call_if(
timer.
id);
242 insert_callback.call_if(
timer.
id);
255 bool stop(etl::timer::id::type id_)
260 if (id_ != etl::timer::id::NO_TIMER)
262 timer_data&
timer = timer_array[id_];
265 if (
timer.
id != etl::timer::id::NO_TIMER)
267 if (
timer.is_active())
269 TInterruptGuard guard;
272 active_list.remove(
timer.
id,
false);
273 remove_callback.call_if(
timer.
id);
290 timer_array[id_].period = period_;
300 bool set_mode(etl::timer::id::type id_,
bool repeating_)
304 timer_array[id_].repeating = repeating_;
316 TInterruptGuard guard;
318 return !active_list.empty();
327 uint32_t delta =
static_cast<uint32_t
>(etl::timer::interval::No_Active_Interval);
329 TInterruptGuard guard;
332 if (!active_list.empty())
334 delta = active_list.front().delta;
347 if (is_valid_timer_id(id_))
351 TInterruptGuard guard;
354 const timer_data&
timer = timer_array[id_];
357 if (
timer.
id != etl::timer::id::NO_TIMER)
359 return timer.is_active();
372 insert_callback = insert_;
380 remove_callback = remove_;
384 void clear_insert_callback()
386 insert_callback.clear();
390 void clear_remove_callback()
392 remove_callback.clear();
405 , delta(etl::timer::state::Inactive)
406 , id(etl::timer::id::NO_TIMER)
407 , previous(etl::timer::id::NO_TIMER)
408 , next(etl::timer::id::NO_TIMER)
417 callback_type callback_,
420 : callback(callback_)
422 , delta(
etl::
timer::state::Inactive)
424 , previous(
etl::
timer::id::NO_TIMER)
426 , repeating(repeating_)
435 return delta != etl::timer::state::Inactive;
443 delta = etl::timer::state::Inactive;
449 etl::timer::id::type id;
450 uint_least8_t previous;
465 : timer_array(timer_array_)
466 , active_list(timer_array_)
468 , number_of_registered_timers(0U)
469 , Max_Timers(Max_Timers_)
478 bool is_valid_timer_id(etl::timer::id::type id_)
const
480 return (id_ < Max_Timers);
491 timer_list(timer_data* ptimers_)
492 : head(
etl::timer::id::NO_TIMER)
493 , tail(
etl::timer::id::NO_TIMER)
494 , current(
etl::timer::id::NO_TIMER)
502 return head == etl::timer::id::NO_TIMER;
508 void insert(etl::timer::id::type id_)
510 timer_data& timer = ptimers[id_];
512 if (head == etl::timer::id::NO_TIMER)
517 timer.previous = etl::timer::id::NO_TIMER;
518 timer.next = etl::timer::id::NO_TIMER;
523 etl::timer::id::type test_id = begin();
525 while (test_id != etl::timer::id::NO_TIMER)
527 timer_data& test = ptimers[test_id];
530 if (timer.delta <= test.delta)
538 timer.previous = test.previous;
539 test.previous = timer.id;
540 timer.next = test.id;
543 test.delta -= timer.delta;
545 if (timer.previous != etl::timer::id::NO_TIMER)
547 ptimers[timer.previous].next = timer.id;
553 timer.delta -= test.delta;
556 test_id = next(test_id);
560 if (test_id == etl::timer::id::NO_TIMER)
563 ptimers[tail].next = timer.id;
564 timer.previous = tail;
565 timer.next = etl::timer::id::NO_TIMER;
572 void remove(etl::timer::id::type id_,
bool has_expired)
574 timer_data& timer = ptimers[id_];
582 ptimers[timer.previous].next = timer.next;
587 tail = timer.previous;
591 ptimers[timer.next].previous = timer.previous;
597 if (timer.next != etl::timer::id::NO_TIMER)
599 ptimers[timer.next].delta += timer.delta;
603 timer.previous = etl::timer::id::NO_TIMER;
604 timer.next = etl::timer::id::NO_TIMER;
605 timer.delta = etl::timer::state::Inactive;
611 return ptimers[head];
615 const timer_data& front()
const
617 return ptimers[head];
621 etl::timer::id::type begin()
628 etl::timer::id::type previous(etl::timer::id::type last)
630 current = ptimers[last].previous;
635 etl::timer::id::type next(etl::timer::id::type last)
637 current = ptimers[last].next;
644 etl::timer::id::type
id = begin();
646 while (
id != etl::timer::id::NO_TIMER)
648 timer_data& timer = ptimers[id];
650 timer.next = etl::timer::id::NO_TIMER;
653 head = etl::timer::id::NO_TIMER;
654 tail = etl::timer::id::NO_TIMER;
655 current = etl::timer::id::NO_TIMER;
660 etl::timer::id::type head;
661 etl::timer::id::type tail;
662 etl::timer::id::type current;
664 timer_data*
const ptimers;
671 timer_list active_list;
674 uint_least8_t number_of_registered_timers;
676 event_callback_type insert_callback;
677 event_callback_type remove_callback;
681 const uint_least8_t Max_Timers;