56 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
61 etl::timer::id::type
register_timer(callback_type callback_, uint32_t period_,
bool repeating_)
63 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
65 bool is_space = (number_of_registered_timers < Max_Timers);
70 for (uint_least8_t i = 0U; i < Max_Timers; ++i)
74 if (
timer.
id == etl::timer::id::NO_TIMER)
78 ++number_of_registered_timers;
95 if (id_ != etl::timer::id::NO_TIMER)
99 if (
timer.
id != etl::timer::id::NO_TIMER)
101 if (
timer.is_active())
104 active_list.remove(
timer.
id,
false);
105 remove_callback.call_if(
timer.
id);
111 --number_of_registered_timers;
145 for (uint8_t i = 0U; i < Max_Timers; ++i)
150 number_of_registered_timers = 0;
159 bool tick(uint32_t count)
163 if (process_semaphore == 0U)
166 bool has_active = !active_list.empty();
170 while (has_active && (count >= active_list.front().delta))
172 timer_data&
timer = active_list.front();
174 count -=
timer.delta;
176 active_list.remove(
timer.
id,
true);
177 remove_callback.call_if(
timer.
id);
179 if (
timer.callback.is_valid())
188 timer.delta = timer.period;
189 active_list.insert(timer.id);
190 insert_callback.call_if(timer.id);
193 has_active = !active_list.empty();
199 active_list.front().delta -= count;
213 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
218 if (id_ != etl::timer::id::NO_TIMER)
223 if (
timer.
id != etl::timer::id::NO_TIMER)
226 if (
timer.period != etl::timer::state::Inactive)
229 if (
timer.is_active())
231 active_list.remove(
timer.
id,
false);
232 remove_callback.call_if(
timer.
id);
237 insert_callback.call_if(
timer.
id);
251 bool stop(etl::timer::id::type id_)
256 if (id_ != etl::timer::id::NO_TIMER)
261 if (
timer.
id != etl::timer::id::NO_TIMER)
263 if (
timer.is_active())
266 active_list.remove(
timer.
id,
false);
267 remove_callback.call_if(
timer.
id);
285 timer_array[id_].period = period_;
295 bool set_mode(etl::timer::id::type id_,
bool repeating_)
299 timer_array[id_].repeating = repeating_;
312 bool result = !active_list.empty();
325 uint32_t delta =
static_cast<uint32_t
>(etl::timer::interval::No_Active_Interval);
328 if (!active_list.empty())
330 delta = active_list.front().delta;
346 if (is_valid_timer_id(id_))
354 if (
timer.
id != etl::timer::id::NO_TIMER)
356 result =
timer.is_active();
370 insert_callback = insert_;
378 remove_callback = remove_;
382 void clear_insert_callback()
384 insert_callback.clear();
388 void clear_remove_callback()
390 remove_callback.clear();
403 , delta(etl::timer::state::Inactive)
404 , id(etl::timer::id::NO_TIMER)
405 , previous(etl::timer::id::NO_TIMER)
406 , next(etl::timer::id::NO_TIMER)
414 timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_,
bool repeating_)
415 : callback(callback_)
417 , delta(
etl::
timer::state::Inactive)
419 , previous(
etl::
timer::id::NO_TIMER)
421 , repeating(repeating_)
430 return delta != etl::timer::state::Inactive;
438 delta = etl::timer::state::Inactive;
444 etl::timer::id::type id;
445 uint_least8_t previous;
460 : timer_array(timer_array_)
461 , active_list(timer_array_)
463 , process_semaphore(0U)
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 mutable TSemaphore process_semaphore;
671 uint_least8_t number_of_registered_timers;
673 event_callback_type insert_callback;
674 event_callback_type remove_callback;
678 const uint_least8_t Max_Timers;