29#ifndef ETL_CALLBACK_TIMER_LOCKED_INCLUDED
30#define ETL_CALLBACK_TIMER_LOCKED_INCLUDED
38#include "static_assert.h"
57 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
62 etl::timer::id::type
register_timer(
const callback_type& callback_, uint32_t period_,
bool repeating_)
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);
106 remove_callback.call_if(
timer.
id);
112 --number_of_registered_timers;
146 for (uint8_t i = 0U; i < Max_Timers; ++i)
151 number_of_registered_timers = 0;
160 virtual bool tick(uint32_t count) = 0;
165 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
170 if (id_ != etl::timer::id::NO_TIMER)
175 if (
timer.
id != etl::timer::id::NO_TIMER)
178 if (
timer.period != etl::timer::state::Inactive)
181 if (
timer.is_active())
183 active_list.remove(
timer.
id,
false);
184 remove_callback.call_if(
timer.
id);
189 insert_callback.call_if(
timer.
id);
203 bool stop(etl::timer::id::type id_)
208 if (id_ != etl::timer::id::NO_TIMER)
213 if (
timer.
id != etl::timer::id::NO_TIMER)
215 if (
timer.is_active())
218 active_list.remove(
timer.
id,
false);
219 remove_callback.call_if(
timer.
id);
237 timer_array[id_].period = period_;
247 bool set_mode(etl::timer::id::type id_,
bool repeating_)
251 timer_array[id_].repeating = repeating_;
261 void set_locks(try_lock_type try_lock_, lock_type lock_, lock_type unlock_)
263 try_lock = try_lock_;
274 bool result = !active_list.empty();
287 uint32_t delta =
static_cast<uint32_t
>(etl::timer::interval::No_Active_Interval);
290 if (!active_list.empty())
292 delta = active_list.front().delta;
308 if (is_valid_timer_id(id_))
316 if (
timer.
id != etl::timer::id::NO_TIMER)
318 result =
timer.is_active();
332 insert_callback = insert_;
340 remove_callback = remove_;
344 void clear_insert_callback()
346 insert_callback.clear();
350 void clear_remove_callback()
352 remove_callback.clear();
361 callback_node(callback_type& callback_, uint_least8_t priority_)
362 : callback(callback_)
363 , priority(priority_)
367 bool operator<(
const callback_node& p)
const
369 return this->priority > p.priority;
373 callback_type callback;
374 uint_least8_t priority;
385 , delta(etl::timer::state::Inactive)
386 , id(etl::timer::id::NO_TIMER)
387 , previous(etl::timer::id::NO_TIMER)
388 , next(etl::timer::id::NO_TIMER)
396 timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_,
bool repeating_)
397 : callback(callback_)
399 , delta(
etl::
timer::state::Inactive)
401 , previous(
etl::
timer::id::NO_TIMER)
403 , repeating(repeating_)
412 return delta != etl::timer::state::Inactive;
420 delta = etl::timer::state::Inactive;
426 etl::timer::id::type id;
427 uint_least8_t previous;
442 : timer_array(timer_array_)
443 , active_list(timer_array_)
445 , number_of_registered_timers(0U)
446 , Max_Timers(Max_Timers_)
460 timer_list(timer_data* ptimers_)
471 return head == etl::timer::id::NO_TIMER;
477 void insert(etl::timer::id::type id_)
479 timer_data& timer = ptimers[id_];
481 if (head == etl::timer::id::NO_TIMER)
486 timer.previous = etl::timer::id::NO_TIMER;
487 timer.next = etl::timer::id::NO_TIMER;
492 etl::timer::id::type test_id = begin();
494 while (test_id != etl::timer::id::NO_TIMER)
496 timer_data& test = ptimers[test_id];
499 if (timer.delta <= test.delta)
507 timer.previous = test.previous;
508 test.previous = timer.id;
509 timer.next = test.id;
512 test.delta -= timer.delta;
514 if (timer.previous != etl::timer::id::NO_TIMER)
516 ptimers[timer.previous].next = timer.id;
522 timer.delta -= test.delta;
525 test_id = next(test_id);
529 if (test_id == etl::timer::id::NO_TIMER)
532 ptimers[tail].next = timer.id;
533 timer.previous = tail;
534 timer.next = etl::timer::id::NO_TIMER;
541 void remove(etl::timer::id::type id_,
bool has_expired)
543 timer_data& timer = ptimers[id_];
551 ptimers[timer.previous].next = timer.next;
556 tail = timer.previous;
560 ptimers[timer.next].previous = timer.previous;
566 if (timer.next != etl::timer::id::NO_TIMER)
568 ptimers[timer.next].delta += timer.delta;
572 timer.previous = etl::timer::id::NO_TIMER;
573 timer.next = etl::timer::id::NO_TIMER;
574 timer.delta = etl::timer::state::Inactive;
580 return ptimers[head];
584 const timer_data& front()
const
586 return ptimers[head];
590 etl::timer::id::type begin()
597 etl::timer::id::type previous(etl::timer::id::type last)
599 current = ptimers[last].previous;
604 etl::timer::id::type next(etl::timer::id::type last)
606 current = ptimers[last].next;
613 etl::timer::id::type
id = begin();
615 while (
id != etl::timer::id::NO_TIMER)
617 timer_data& timer = ptimers[id];
619 timer.next = etl::timer::id::NO_TIMER;
622 head = etl::timer::id::NO_TIMER;
623 tail = etl::timer::id::NO_TIMER;
624 current = etl::timer::id::NO_TIMER;
629 etl::timer::id::type head;
630 etl::timer::id::type tail;
631 etl::timer::id::type current;
633 timer_data*
const ptimers;
639 bool is_valid_timer_id(etl::timer::id::type id_)
const
641 return (id_ < Max_Timers);
648 timer_list active_list;
651 uint_least8_t number_of_registered_timers;
653 try_lock_type try_lock;
657 event_callback_type insert_callback;
658 event_callback_type remove_callback;
662 template <u
int_least8_t>
663 friend class callback_timer_locked;
665 template <u
int_least8_t, u
int32_t>
666 friend class callback_timer_deferred_locked;
668 const uint_least8_t Max_Timers;
674 template <u
int_least8_t Max_Timers_>
679 ETL_STATIC_ASSERT(Max_Timers_ <= 254U,
"No more than 254 timers are allowed");
681 typedef icallback_timer_locked::callback_type callback_type;
682 typedef icallback_timer_locked::try_lock_type try_lock_type;
683 typedef icallback_timer_locked::lock_type lock_type;
684 typedef icallback_timer_locked::unlock_type unlock_type;
706 this->
set_locks(try_lock_, lock_, unlock_);
712 bool tick(uint32_t count)
final
719 bool has_active = !active_list.empty();
723 while (has_active && (count >= active_list.front().delta))
727 count -=
timer.delta;
729 active_list.remove(
timer.
id,
true);
730 remove_callback.call_if(
timer.
id);
732 if (
timer.callback.is_valid())
742 insert_callback.call_if(
timer.
id);
745 has_active = !active_list.empty();
751 active_list.front().delta -= count;
766 timer_data timer_array[Max_Timers_];
bool tick(uint32_t count) final
Handle the tick call.
Definition callback_timer_locked.h:712
callback_timer_locked()
Constructor.
Definition callback_timer_locked.h:695
callback_timer_locked(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Constructor.
Definition callback_timer_locked.h:703
Declaration.
Definition delegate_cpp03.h:191
Definition callback_timer_locked.h:358
Interface for callback timer.
Definition callback_timer_locked.h:49
bool has_active_timer() const
Check if there is an active timer.
Definition callback_timer_locked.h:271
void set_insert_callback(event_callback_type insert_)
Set a callback when a timer is inserted on list.
Definition callback_timer_locked.h:330
void set_remove_callback(event_callback_type remove_)
Set a callback when a timer is removed from list.
Definition callback_timer_locked.h:338
icallback_timer_locked(timer_data *const timer_array_, const uint_least8_t Max_Timers_)
Constructor.
Definition callback_timer_locked.h:441
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition callback_timer_locked.h:203
void clear()
Clears the timer of data.
Definition callback_timer_locked.h:140
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:261
uint32_t time_to_next() const
Definition callback_timer_locked.h:285
etl::timer::id::type register_timer(const callback_type &callback_, uint32_t period_, bool repeating_)
Register a timer.
Definition callback_timer_locked.h:62
bool set_period(etl::timer::id::type id_, uint32_t period_)
Sets a timer's period.
Definition callback_timer_locked.h:233
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition callback_timer_locked.h:247
bool is_running() const
Get the enable/disable state.
Definition callback_timer_locked.h:132
void enable(bool state_)
Enable/disable the timer.
Definition callback_timer_locked.h:124
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:165
bool is_active(etl::timer::id::type id_) const
Definition callback_timer_locked.h:303
bitset_ext
Definition absolute.h:40
The configuration of a timer.
Definition callback_timer_locked.h:380
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition callback_timer_locked.h:396
void set_inactive()
Sets the timer to the inactive state.
Definition callback_timer_locked.h:418
bool is_active() const
Returns true if the timer is active.
Definition callback_timer_locked.h:410
Common definitions for the timer framework.
Definition timer.h:55