29#ifndef ETL_CALLBACK_TIMER_LOCKED_INCLUDED
30#define ETL_CALLBACK_TIMER_LOCKED_INCLUDED
36#include "static_assert.h"
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)
75 if (
timer.
id == etl::timer::id::NO_TIMER)
79 ++number_of_registered_timers;
96 if (id_ != etl::timer::id::NO_TIMER)
100 if (
timer.
id != etl::timer::id::NO_TIMER)
102 if (
timer.is_active())
105 active_list.remove(
timer.
id,
false);
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)
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);
178 if (
timer.callback.is_valid())
186 timer.delta = timer.period;
187 active_list.insert(timer.id);
190 has_active = !active_list.empty();
196 active_list.front().delta -= count;
212 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
217 if (id_ != etl::timer::id::NO_TIMER)
222 if (
timer.
id != etl::timer::id::NO_TIMER)
225 if (
timer.period != etl::timer::state::INACTIVE)
228 if (
timer.is_active())
230 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())
263 active_list.remove(
timer.
id,
false);
281 timer_array[id_].period = period_;
291 bool set_mode(etl::timer::id::type id_,
bool repeating_)
295 timer_array[id_].repeating = repeating_;
307 try_lock = try_lock_;
322 , delta(etl::timer::state::INACTIVE)
323 , id(etl::timer::id::NO_TIMER)
324 , previous(etl::timer::id::NO_TIMER)
325 , next(etl::timer::id::NO_TIMER)
339 , delta(
etl::
timer::state::INACTIVE)
341 , previous(
etl::
timer::id::NO_TIMER)
343 , repeating(repeating_)
352 return delta != etl::timer::state::INACTIVE;
360 delta = etl::timer::state::INACTIVE;
366 etl::timer::id::type id;
367 uint_least8_t previous;
382 : timer_array(timer_array_),
383 active_list(timer_array_),
385 number_of_registered_timers(0U),
386 MAX_TIMERS(MAX_TIMERS_)
400 timer_list(timer_data* ptimers_)
411 return head == etl::timer::id::NO_TIMER;
417 void insert(etl::timer::id::type id_)
419 timer_data& timer = ptimers[id_];
421 if (head == etl::timer::id::NO_TIMER)
426 timer.previous = etl::timer::id::NO_TIMER;
427 timer.next = etl::timer::id::NO_TIMER;
432 etl::timer::id::type test_id =
begin();
434 while (test_id != etl::timer::id::NO_TIMER)
436 timer_data& test = ptimers[test_id];
439 if (timer.delta <= test.delta)
447 timer.previous = test.previous;
448 test.previous = timer.id;
449 timer.next = test.id;
452 test.delta -= timer.delta;
454 if (timer.previous != etl::timer::id::NO_TIMER)
456 ptimers[timer.previous].next = timer.id;
462 timer.delta -= test.delta;
465 test_id = next(test_id);
469 if (test_id == etl::timer::id::NO_TIMER)
472 ptimers[tail].next = timer.id;
473 timer.previous = tail;
474 timer.next = etl::timer::id::NO_TIMER;
481 void remove(etl::timer::id::type id_,
bool has_expired)
483 timer_data& timer = ptimers[id_];
491 ptimers[timer.previous].next = timer.next;
496 tail = timer.previous;
500 ptimers[timer.next].previous = timer.previous;
506 if (timer.next != etl::timer::id::NO_TIMER)
508 ptimers[timer.next].delta += timer.delta;
512 timer.previous = etl::timer::id::NO_TIMER;
513 timer.next = etl::timer::id::NO_TIMER;
514 timer.delta = etl::timer::state::INACTIVE;
520 return ptimers[head];
524 etl::timer::id::type
begin()
531 etl::timer::id::type previous(etl::timer::id::type last)
533 current = ptimers[last].previous;
538 etl::timer::id::type next(etl::timer::id::type last)
540 current = ptimers[last].next;
547 etl::timer::id::type
id =
begin();
549 while (
id != etl::timer::id::NO_TIMER)
551 timer_data& timer = ptimers[id];
553 timer.next = etl::timer::id::NO_TIMER;
556 head = etl::timer::id::NO_TIMER;
557 tail = etl::timer::id::NO_TIMER;
558 current = etl::timer::id::NO_TIMER;
563 etl::timer::id::type head;
564 etl::timer::id::type tail;
565 etl::timer::id::type current;
567 timer_data*
const ptimers;
571 timer_data*
const timer_array;
574 timer_list active_list;
577 uint_least8_t number_of_registered_timers;
579 try_lock_type try_lock;
585 const uint_least8_t MAX_TIMERS;
591 template <u
int_least8_t MAX_TIMERS_>
596 ETL_STATIC_ASSERT(MAX_TIMERS_ <= 254U,
"No more than 254 timers are allowed");
617 this->
set_locks(try_lock_, lock_, unlock_);
622 timer_data timer_array[MAX_TIMERS_];
The callback timer.
Definition: callback_timer_locked.h:593
callback_timer_locked(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Constructor.
Definition: callback_timer_locked.h:614
callback_timer_locked()
Constructor.
Definition: callback_timer_locked.h:606
Definition: callback.h:45
Declaration.
Definition: delegate_cpp03.h:175
Interface for callback timer.
Definition: callback_timer_locked.h:49
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition: callback_timer_locked.h:248
void clear()
Clears the timer of data.
Definition: callback_timer_locked.h:139
void set_locks(try_lock_type try_lock_, lock_type lock_, lock_type unlock_)
Sets the lock and unlock delegates.
Definition: callback_timer_locked.h:305
etl::timer::id::type register_timer(const callback_type &callback_, uint32_t period_, bool repeating_)
Register a timer.
Definition: callback_timer_locked.h:60
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition: callback_timer_locked.h:277
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition: callback_timer_locked.h:291
bool is_running() const
Get the enable/disable state.
Definition: callback_timer_locked.h:131
void enable(bool state_)
Enable/disable the timer.
Definition: callback_timer_locked.h:123
icallback_timer_locked(timer_data *const timer_array_, const uint_least8_t MAX_TIMERS_)
Constructor.
Definition: callback_timer_locked.h:381
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition: callback_timer_locked.h:92
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition: callback_timer_locked.h:212
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_locked.h:317
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition: callback_timer_locked.h:333
void set_inactive()
Sets the timer to the inactive state.
Definition: callback_timer_locked.h:358
bool is_active() const
Returns true if the timer is active.
Definition: callback_timer_locked.h:350
Common definitions for the timer framework.
Definition: timer.h:55