54 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
59 etl::timer::id::type
register_timer(callback_type callback_, uint32_t period_,
bool repeating_)
61 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
63 bool is_space = (number_of_registered_timers < Max_Timers);
68 for (uint_least8_t i = 0U; i < Max_Timers; ++i)
72 if (
timer.
id == etl::timer::id::NO_TIMER)
76 ++number_of_registered_timers;
93 if (id_ != etl::timer::id::NO_TIMER)
97 if (
timer.
id != etl::timer::id::NO_TIMER)
99 if (
timer.is_active())
102 active_list.remove(
timer.
id,
false);
103 remove_callback.call_if(
timer.
id);
109 --number_of_registered_timers;
143 for (uint8_t i = 0U; i < Max_Timers; ++i)
148 number_of_registered_timers = 0;
157 bool tick(uint32_t count)
161 if (process_semaphore == 0U)
164 bool has_active = !active_list.empty();
168 while (has_active && (count >= active_list.front().delta))
170 timer_data&
timer = active_list.front();
172 count -=
timer.delta;
174 active_list.remove(
timer.
id,
true);
175 remove_callback.call_if(
timer.
id);
177 if (
timer.callback.is_valid())
186 timer.delta = timer.period;
187 active_list.insert(timer.id);
188 insert_callback.call_if(timer.id);
191 has_active = !active_list.empty();
197 active_list.front().delta -= count;
211 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
216 if (id_ != etl::timer::id::NO_TIMER)
221 if (
timer.
id != etl::timer::id::NO_TIMER)
224 if (
timer.period != etl::timer::state::Inactive)
227 if (
timer.is_active())
229 active_list.remove(
timer.
id,
false);
230 remove_callback.call_if(
timer.
id);
235 insert_callback.call_if(
timer.
id);
249 bool stop(etl::timer::id::type id_)
254 if (id_ != etl::timer::id::NO_TIMER)
259 if (
timer.
id != etl::timer::id::NO_TIMER)
261 if (
timer.is_active())
264 active_list.remove(
timer.
id,
false);
265 remove_callback.call_if(
timer.
id);
283 timer_array[id_].period = period_;
293 bool set_mode(etl::timer::id::type id_,
bool repeating_)
297 timer_array[id_].repeating = repeating_;
310 bool result = !active_list.empty();
323 uint32_t delta =
static_cast<uint32_t
>(etl::timer::interval::No_Active_Interval);
326 if (!active_list.empty())
328 delta = active_list.front().delta;
344 if (is_valid_timer_id(id_))
352 if (
timer.
id != etl::timer::id::NO_TIMER)
354 result =
timer.is_active();
368 insert_callback = insert_;
376 remove_callback = remove_;
380 void clear_insert_callback()
382 insert_callback.clear();
386 void clear_remove_callback()
388 remove_callback.clear();
401 , delta(etl::timer::state::Inactive)
402 , id(etl::timer::id::NO_TIMER)
403 , previous(etl::timer::id::NO_TIMER)
404 , next(etl::timer::id::NO_TIMER)
412 timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_,
bool repeating_)
413 : callback(callback_)
415 , delta(
etl::
timer::state::Inactive)
417 , previous(
etl::
timer::id::NO_TIMER)
419 , repeating(repeating_)
428 return delta != etl::timer::state::Inactive;
436 delta = etl::timer::state::Inactive;
442 etl::timer::id::type id;
443 uint_least8_t previous;
458 : timer_array(timer_array_)
459 , active_list(timer_array_)
461 , process_semaphore(0U)
462 , number_of_registered_timers(0U)
463 , Max_Timers(Max_Timers_)
472 bool is_valid_timer_id(etl::timer::id::type id_)
const
474 return (id_ < Max_Timers);
485 timer_list(timer_data* ptimers_)
486 : head(
etl::timer::id::NO_TIMER)
487 , tail(
etl::timer::id::NO_TIMER)
495 return head == etl::timer::id::NO_TIMER;
501 void insert(etl::timer::id::type id_)
503 timer_data& timer = ptimers[id_];
505 if (head == etl::timer::id::NO_TIMER)
510 timer.previous = etl::timer::id::NO_TIMER;
511 timer.next = etl::timer::id::NO_TIMER;
516 etl::timer::id::type test_id = begin();
518 while (test_id != etl::timer::id::NO_TIMER)
520 timer_data& test = ptimers[test_id];
523 if (timer.delta <= test.delta)
531 timer.previous = test.previous;
532 test.previous = timer.id;
533 timer.next = test.id;
536 test.delta -= timer.delta;
538 if (timer.previous != etl::timer::id::NO_TIMER)
540 ptimers[timer.previous].next = timer.id;
546 timer.delta -= test.delta;
549 test_id = next(test_id);
553 if (test_id == etl::timer::id::NO_TIMER)
556 ptimers[tail].next = timer.id;
557 timer.previous = tail;
558 timer.next = etl::timer::id::NO_TIMER;
565 void remove(etl::timer::id::type id_,
bool has_expired)
567 timer_data& timer = ptimers[id_];
575 ptimers[timer.previous].next = timer.next;
580 tail = timer.previous;
584 ptimers[timer.next].previous = timer.previous;
590 if (timer.next != etl::timer::id::NO_TIMER)
592 ptimers[timer.next].delta += timer.delta;
596 timer.previous = etl::timer::id::NO_TIMER;
597 timer.next = etl::timer::id::NO_TIMER;
598 timer.delta = etl::timer::state::Inactive;
604 return ptimers[head];
608 const timer_data& front()
const
610 return ptimers[head];
614 etl::timer::id::type begin()
620 etl::timer::id::type next(etl::timer::id::type last)
622 return ptimers[last].next;
628 etl::timer::id::type
id = begin();
630 while (
id != etl::timer::id::NO_TIMER)
632 timer_data& timer = ptimers[id];
634 timer.next = etl::timer::id::NO_TIMER;
637 head = etl::timer::id::NO_TIMER;
638 tail = etl::timer::id::NO_TIMER;
643 etl::timer::id::type head;
644 etl::timer::id::type tail;
646 timer_data*
const ptimers;
653 timer_list active_list;
656 mutable TSemaphore process_semaphore;
657 uint_least8_t number_of_registered_timers;
659 event_callback_type insert_callback;
660 event_callback_type remove_callback;
664 const uint_least8_t Max_Timers;