55 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
60 etl::timer::id::type
register_timer(
const callback_type& callback_, uint32_t period_,
bool repeating_)
62 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
64 bool is_space = (number_of_registered_timers < Max_Timers);
69 for (uint_least8_t i = 0U; i < Max_Timers; ++i)
71 timer_data&
timer = timer_array[i];
73 if (
timer.
id == etl::timer::id::NO_TIMER)
75 TInterruptGuard guard;
79 new (&
timer) timer_data(i, callback_, period_, repeating_);
80 ++number_of_registered_timers;
97 if (id_ != etl::timer::id::NO_TIMER)
99 timer_data&
timer = timer_array[id_];
101 if (
timer.
id != etl::timer::id::NO_TIMER)
103 if (
timer.is_active())
105 TInterruptGuard guard;
108 active_list.remove(
timer.
id,
false);
109 remove_callback.call_if(
timer.
id);
113 new (&
timer) timer_data();
114 --number_of_registered_timers;
145 TInterruptGuard guard;
149 number_of_registered_timers = 0;
152 for (uint8_t i = 0U; i < Max_Timers; ++i)
154 ::new (&timer_array[i]) timer_data();
164 bool tick(uint32_t count)
169 bool has_active = !active_list.empty();
173 while (has_active && (count >= active_list.front().delta))
175 timer_data&
timer = active_list.front();
177 count -=
timer.delta;
179 active_list.remove(
timer.
id,
true);
180 remove_callback.call_if(
timer.
id);
182 if (
timer.callback.is_valid())
190 timer.delta = timer.period;
191 active_list.insert(timer.id);
192 insert_callback.call_if(timer.id);
195 has_active = !active_list.empty();
201 active_list.front().delta -= count;
214 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
219 if (id_ != etl::timer::id::NO_TIMER)
221 timer_data&
timer = timer_array[id_];
224 if (
timer.
id != etl::timer::id::NO_TIMER)
227 if (
timer.period != etl::timer::state::Inactive)
229 TInterruptGuard guard;
232 if (
timer.is_active())
234 active_list.remove(
timer.
id,
false);
235 remove_callback.call_if(
timer.
id);
240 insert_callback.call_if(
timer.
id);
253 bool stop(etl::timer::id::type id_)
258 if (id_ != etl::timer::id::NO_TIMER)
260 timer_data&
timer = timer_array[id_];
263 if (
timer.
id != etl::timer::id::NO_TIMER)
265 if (
timer.is_active())
267 TInterruptGuard guard;
270 active_list.remove(
timer.
id,
false);
271 remove_callback.call_if(
timer.
id);
288 timer_array[id_].period = period_;
298 bool set_mode(etl::timer::id::type id_,
bool repeating_)
302 timer_array[id_].repeating = repeating_;
314 TInterruptGuard guard;
316 return !active_list.empty();
326 uint32_t delta =
static_cast<uint32_t
>(etl::timer::interval::No_Active_Interval);
328 TInterruptGuard guard;
331 if (!active_list.empty())
333 delta = active_list.front().delta;
346 if (is_valid_timer_id(id_))
350 TInterruptGuard guard;
353 const timer_data&
timer = timer_array[id_];
356 if (
timer.
id != etl::timer::id::NO_TIMER)
358 return timer.is_active();
371 insert_callback = insert_;
379 remove_callback = remove_;
383 void clear_insert_callback()
385 insert_callback.clear();
389 void clear_remove_callback()
391 remove_callback.clear();
404 , delta(etl::timer::state::Inactive)
405 , id(etl::timer::id::NO_TIMER)
406 , previous(etl::timer::id::NO_TIMER)
407 , next(etl::timer::id::NO_TIMER)
415 timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_,
bool repeating_)
416 : callback(callback_)
418 , delta(
etl::
timer::state::Inactive)
420 , previous(
etl::
timer::id::NO_TIMER)
422 , repeating(repeating_)
431 return delta != etl::timer::state::Inactive;
439 delta = etl::timer::state::Inactive;
445 etl::timer::id::type id;
446 uint_least8_t previous;
461 : timer_array(timer_array_)
462 , active_list(timer_array_)
464 , number_of_registered_timers(0U)
465 , Max_Timers(Max_Timers_)
474 bool is_valid_timer_id(etl::timer::id::type id_)
const
476 return (id_ < Max_Timers);
487 timer_list(timer_data* ptimers_)
488 : head(
etl::timer::id::NO_TIMER)
489 , tail(
etl::timer::id::NO_TIMER)
490 , current(
etl::timer::id::NO_TIMER)
498 return head == etl::timer::id::NO_TIMER;
504 void insert(etl::timer::id::type id_)
506 timer_data& timer = ptimers[id_];
508 if (head == etl::timer::id::NO_TIMER)
513 timer.previous = etl::timer::id::NO_TIMER;
514 timer.next = etl::timer::id::NO_TIMER;
519 etl::timer::id::type test_id = begin();
521 while (test_id != etl::timer::id::NO_TIMER)
523 timer_data& test = ptimers[test_id];
526 if (timer.delta <= test.delta)
534 timer.previous = test.previous;
535 test.previous = timer.id;
536 timer.next = test.id;
539 test.delta -= timer.delta;
541 if (timer.previous != etl::timer::id::NO_TIMER)
543 ptimers[timer.previous].next = timer.id;
549 timer.delta -= test.delta;
552 test_id = next(test_id);
556 if (test_id == etl::timer::id::NO_TIMER)
559 ptimers[tail].next = timer.id;
560 timer.previous = tail;
561 timer.next = etl::timer::id::NO_TIMER;
568 void remove(etl::timer::id::type id_,
bool has_expired)
570 timer_data& timer = ptimers[id_];
578 ptimers[timer.previous].next = timer.next;
583 tail = timer.previous;
587 ptimers[timer.next].previous = timer.previous;
593 if (timer.next != etl::timer::id::NO_TIMER)
595 ptimers[timer.next].delta += timer.delta;
599 timer.previous = etl::timer::id::NO_TIMER;
600 timer.next = etl::timer::id::NO_TIMER;
601 timer.delta = etl::timer::state::Inactive;
607 return ptimers[head];
611 const timer_data& front()
const
613 return ptimers[head];
617 etl::timer::id::type begin()
624 etl::timer::id::type previous(etl::timer::id::type last)
626 current = ptimers[last].previous;
631 etl::timer::id::type next(etl::timer::id::type last)
633 current = ptimers[last].next;
640 etl::timer::id::type
id = begin();
642 while (
id != etl::timer::id::NO_TIMER)
644 timer_data& timer = ptimers[id];
646 timer.next = etl::timer::id::NO_TIMER;
649 head = etl::timer::id::NO_TIMER;
650 tail = etl::timer::id::NO_TIMER;
651 current = etl::timer::id::NO_TIMER;
656 etl::timer::id::type head;
657 etl::timer::id::type tail;
658 etl::timer::id::type current;
660 timer_data*
const ptimers;
667 timer_list active_list;
670 uint_least8_t number_of_registered_timers;
672 event_callback_type insert_callback;
673 event_callback_type remove_callback;
677 const uint_least8_t Max_Timers;