29#ifndef ETL_CALLBACK_TIMER_INTERRUPT_INCLUDED
30#define ETL_CALLBACK_TIMER_INTERRUPT_INCLUDED
36#include "static_assert.h"
48 template <
typename TInterruptGuard>
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)
73 if (
timer.
id == etl::timer::id::NO_TIMER)
75 TInterruptGuard guard;
80 ++number_of_registered_timers;
97 if (id_ != etl::timer::id::NO_TIMER)
101 if (
timer.
id != etl::timer::id::NO_TIMER)
103 if (
timer.is_active())
105 TInterruptGuard guard;
108 active_list.remove(
timer.
id,
false);
113 --number_of_registered_timers;
144 TInterruptGuard guard;
148 number_of_registered_timers = 0;
151 for (uint8_t i = 0U; i < MAX_TIMERS; ++i)
163 bool tick(uint32_t count)
168 bool has_active = !active_list.empty();
172 while (has_active && (count >= active_list.front().delta))
174 timer_data&
timer = active_list.front();
176 count -=
timer.delta;
178 active_list.remove(
timer.
id,
true);
180 if (
timer.callback.is_valid())
188 timer.delta = timer.period;
189 active_list.insert(timer.id);
192 has_active = !active_list.empty();
198 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)
226 TInterruptGuard guard;
229 if (
timer.is_active())
231 active_list.remove(
timer.
id,
false);
248 bool stop(etl::timer::id::type id_)
253 if (id_ != etl::timer::id::NO_TIMER)
258 if (
timer.
id != etl::timer::id::NO_TIMER)
260 if (
timer.is_active())
262 TInterruptGuard guard;
265 active_list.remove(
timer.
id,
false);
282 timer_array[id_].period = period_;
292 bool set_mode(etl::timer::id::type id_,
bool repeating_)
296 timer_array[id_].repeating = repeating_;
313 , delta(etl::timer::state::INACTIVE)
314 , id(etl::timer::id::NO_TIMER)
315 , previous(etl::timer::id::NO_TIMER)
316 , next(etl::timer::id::NO_TIMER)
330 , delta(
etl::
timer::state::INACTIVE)
332 , previous(
etl::
timer::id::NO_TIMER)
334 , repeating(repeating_)
343 return delta != etl::timer::state::INACTIVE;
351 delta = etl::timer::state::INACTIVE;
357 etl::timer::id::type id;
358 uint_least8_t previous;
373 : timer_array(timer_array_),
374 active_list(timer_array_),
376 number_of_registered_timers(0U),
377 MAX_TIMERS(MAX_TIMERS_)
391 timer_list(timer_data* ptimers_)
402 return head == etl::timer::id::NO_TIMER;
408 void insert(etl::timer::id::type id_)
410 timer_data& timer = ptimers[id_];
412 if (head == etl::timer::id::NO_TIMER)
417 timer.previous = etl::timer::id::NO_TIMER;
418 timer.next = etl::timer::id::NO_TIMER;
423 etl::timer::id::type test_id =
begin();
425 while (test_id != etl::timer::id::NO_TIMER)
427 timer_data& test = ptimers[test_id];
430 if (timer.delta <= test.delta)
438 timer.previous = test.previous;
439 test.previous = timer.id;
440 timer.next = test.id;
443 test.delta -= timer.delta;
445 if (timer.previous != etl::timer::id::NO_TIMER)
447 ptimers[timer.previous].next = timer.id;
453 timer.delta -= test.delta;
456 test_id = next(test_id);
460 if (test_id == etl::timer::id::NO_TIMER)
463 ptimers[tail].next = timer.id;
464 timer.previous = tail;
465 timer.next = etl::timer::id::NO_TIMER;
472 void remove(etl::timer::id::type id_,
bool has_expired)
474 timer_data& timer = ptimers[id_];
482 ptimers[timer.previous].next = timer.next;
487 tail = timer.previous;
491 ptimers[timer.next].previous = timer.previous;
497 if (timer.next != etl::timer::id::NO_TIMER)
499 ptimers[timer.next].delta += timer.delta;
503 timer.previous = etl::timer::id::NO_TIMER;
504 timer.next = etl::timer::id::NO_TIMER;
505 timer.delta = etl::timer::state::INACTIVE;
511 return ptimers[head];
515 etl::timer::id::type
begin()
522 etl::timer::id::type previous(etl::timer::id::type last)
524 current = ptimers[last].previous;
529 etl::timer::id::type next(etl::timer::id::type last)
531 current = ptimers[last].next;
538 etl::timer::id::type
id =
begin();
540 while (
id != etl::timer::id::NO_TIMER)
542 timer_data& timer = ptimers[id];
544 timer.next = etl::timer::id::NO_TIMER;
547 head = etl::timer::id::NO_TIMER;
548 tail = etl::timer::id::NO_TIMER;
549 current = etl::timer::id::NO_TIMER;
554 etl::timer::id::type head;
555 etl::timer::id::type tail;
556 etl::timer::id::type current;
558 timer_data*
const ptimers;
562 timer_data*
const timer_array;
565 timer_list active_list;
568 uint_least8_t number_of_registered_timers;
572 const uint_least8_t MAX_TIMERS;
578 template <u
int_least8_t MAX_TIMERS_,
typename TInterruptGuard>
583 ETL_STATIC_ASSERT(MAX_TIMERS_ <= 254U,
"No more than 254 timers are allowed");
The callback timer.
Definition: callback_timer_interrupt.h:580
callback_timer_interrupt()
Constructor.
Definition: callback_timer_interrupt.h:590
Definition: callback.h:45
Declaration.
Definition: delegate_cpp03.h:175
Interface for callback timer.
Definition: callback_timer_interrupt.h:50
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition: callback_timer_interrupt.h:248
icallback_timer_interrupt(timer_data *const timer_array_, const uint_least8_t MAX_TIMERS_)
Constructor.
Definition: callback_timer_interrupt.h:372
bool is_running() const
Get the enable/disable state.
Definition: callback_timer_interrupt.h:133
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition: callback_timer_interrupt.h:292
void enable(bool state_)
Enable/disable the timer.
Definition: callback_timer_interrupt.h:125
etl::timer::id::type register_timer(const callback_type &callback_, uint32_t period_, bool repeating_)
Register a timer.
Definition: callback_timer_interrupt.h:58
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition: callback_timer_interrupt.h:93
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition: callback_timer_interrupt.h:211
void clear()
Clears the timer of data.
Definition: callback_timer_interrupt.h:141
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition: callback_timer_interrupt.h:278
ETL_CONSTEXPR14 TIterator remove(TIterator first, TIterator last, const T &value)
Definition: algorithm.h:1934
bitset_ext
Definition: absolute.h:38
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition: iterator.h:931
The configuration of a timer.
Definition: callback_timer_interrupt.h:308
void set_inactive()
Sets the timer to the inactive state.
Definition: callback_timer_interrupt.h:349
bool is_active() const
Returns true if the timer is active.
Definition: callback_timer_interrupt.h:341
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition: callback_timer_interrupt.h:324
Common definitions for the timer framework.
Definition: timer.h:55