29#ifndef ETL_CALLBACK_TIMER_LOCKED_INCLUDED
30#define ETL_CALLBACK_TIMER_LOCKED_INCLUDED
36#include "static_assert.h"
57 typedef etl::delegate<void(etl::timer::id::type)> event_callback_type;
66 etl::timer::id::type
id = etl::timer::id::NO_TIMER;
68 bool is_space = (number_of_registered_timers < Max_Timers);
73 for (uint_least8_t i = 0U; i < Max_Timers; ++i)
77 if (
timer.
id == etl::timer::id::NO_TIMER)
81 ++number_of_registered_timers;
98 if (id_ != etl::timer::id::NO_TIMER)
102 if (
timer.
id != etl::timer::id::NO_TIMER)
104 if (
timer.is_active())
107 active_list.remove(
timer.
id,
false);
108 remove_callback.call_if(
timer.
id);
114 --number_of_registered_timers;
148 for (uint8_t i = 0U; i < Max_Timers; ++i)
153 number_of_registered_timers = 0;
162 virtual bool tick(uint32_t count) = 0;
167 bool start(etl::timer::id::type id_,
bool immediate_ =
false)
172 if (id_ != etl::timer::id::NO_TIMER)
177 if (
timer.
id != etl::timer::id::NO_TIMER)
180 if (
timer.period != etl::timer::state::Inactive)
183 if (
timer.is_active())
185 active_list.remove(
timer.
id,
false);
186 remove_callback.call_if(
timer.
id);
191 insert_callback.call_if(
timer.
id);
205 bool stop(etl::timer::id::type id_)
210 if (id_ != etl::timer::id::NO_TIMER)
215 if (
timer.
id != etl::timer::id::NO_TIMER)
217 if (
timer.is_active())
220 active_list.remove(
timer.
id,
false);
221 remove_callback.call_if(
timer.
id);
239 timer_array[id_].period = period_;
249 bool set_mode(etl::timer::id::type id_,
bool repeating_)
253 timer_array[id_].repeating = repeating_;
263 void set_locks(try_lock_type try_lock_, lock_type lock_, lock_type unlock_)
265 try_lock = try_lock_;
276 bool result = !active_list.empty();
288 uint32_t delta =
static_cast<uint32_t
>(etl::timer::interval::No_Active_Interval);
291 if (!active_list.empty())
293 delta = active_list.front().delta;
309 if (is_valid_timer_id(id_))
317 if (
timer.
id != etl::timer::id::NO_TIMER)
319 result =
timer.is_active();
333 insert_callback = insert_;
341 remove_callback = remove_;
345 void clear_insert_callback()
347 insert_callback.clear();
351 void clear_remove_callback()
353 remove_callback.clear();
362 callback_node(callback_type &callback_,uint_least8_t priority_) : callback(callback_), priority(priority_)
366 bool operator < (
const callback_node& p)
const
368 return this->priority > p.priority;
371 callback_type callback;
372 uint_least8_t priority;
383 , delta(etl::timer::state::Inactive)
384 , id(etl::timer::id::NO_TIMER)
385 , previous(etl::timer::id::NO_TIMER)
386 , next(etl::timer::id::NO_TIMER)
395 callback_type callback_,
398 : callback(callback_)
400 , delta(
etl::
timer::state::Inactive)
402 , previous(
etl::
timer::id::NO_TIMER)
404 , repeating(repeating_)
413 return delta != etl::timer::state::Inactive;
421 delta = etl::timer::state::Inactive;
427 etl::timer::id::type id;
428 uint_least8_t previous;
443 : timer_array(timer_array_),
444 active_list(timer_array_),
446 number_of_registered_timers(0U),
447 Max_Timers(Max_Timers_)
461 timer_list(timer_data* ptimers_)
472 return head == etl::timer::id::NO_TIMER;
478 void insert(etl::timer::id::type id_)
480 timer_data& timer = ptimers[id_];
482 if (head == etl::timer::id::NO_TIMER)
487 timer.previous = etl::timer::id::NO_TIMER;
488 timer.next = etl::timer::id::NO_TIMER;
493 etl::timer::id::type test_id = begin();
495 while (test_id != etl::timer::id::NO_TIMER)
497 timer_data& test = ptimers[test_id];
500 if (timer.delta <= test.delta)
508 timer.previous = test.previous;
509 test.previous = timer.id;
510 timer.next = test.id;
513 test.delta -= timer.delta;
515 if (timer.previous != etl::timer::id::NO_TIMER)
517 ptimers[timer.previous].next = timer.id;
523 timer.delta -= test.delta;
526 test_id = next(test_id);
530 if (test_id == etl::timer::id::NO_TIMER)
533 ptimers[tail].next = timer.id;
534 timer.previous = tail;
535 timer.next = etl::timer::id::NO_TIMER;
542 void remove(etl::timer::id::type id_,
bool has_expired)
544 timer_data& timer = ptimers[id_];
552 ptimers[timer.previous].next = timer.next;
557 tail = timer.previous;
561 ptimers[timer.next].previous = timer.previous;
567 if (timer.next != etl::timer::id::NO_TIMER)
569 ptimers[timer.next].delta += timer.delta;
573 timer.previous = etl::timer::id::NO_TIMER;
574 timer.next = etl::timer::id::NO_TIMER;
575 timer.delta = etl::timer::state::Inactive;
581 return ptimers[head];
585 const timer_data& front()
const
587 return ptimers[head];
591 etl::timer::id::type begin()
598 etl::timer::id::type previous(etl::timer::id::type last)
600 current = ptimers[last].previous;
605 etl::timer::id::type next(etl::timer::id::type last)
607 current = ptimers[last].next;
614 etl::timer::id::type
id = begin();
616 while (
id != etl::timer::id::NO_TIMER)
618 timer_data& timer = ptimers[id];
620 timer.next = etl::timer::id::NO_TIMER;
623 head = etl::timer::id::NO_TIMER;
624 tail = etl::timer::id::NO_TIMER;
625 current = etl::timer::id::NO_TIMER;
630 etl::timer::id::type head;
631 etl::timer::id::type tail;
632 etl::timer::id::type current;
634 timer_data*
const ptimers;
640 bool is_valid_timer_id(etl::timer::id::type id_)
const
642 return (id_ < Max_Timers);
649 timer_list active_list;
652 uint_least8_t number_of_registered_timers;
654 try_lock_type try_lock;
658 event_callback_type insert_callback;
659 event_callback_type remove_callback;
663 template <u
int_least8_t>
664 friend class callback_timer_locked;
666 template <u
int_least8_t, u
int32_t>
667 friend class callback_timer_deferred_locked;
669 const uint_least8_t Max_Timers;
675 template <u
int_least8_t Max_Timers_>
680 ETL_STATIC_ASSERT(Max_Timers_ <= 254U,
"No more than 254 timers are allowed");
682 typedef icallback_timer_locked::callback_type callback_type;
683 typedef icallback_timer_locked::try_lock_type try_lock_type;
684 typedef icallback_timer_locked::lock_type lock_type;
685 typedef icallback_timer_locked::unlock_type unlock_type;
707 this->
set_locks(try_lock_, lock_, unlock_);
713 bool tick(uint32_t count)
final
720 bool has_active = !active_list.empty();
724 while (has_active && (count >= active_list.front().delta))
728 count -=
timer.delta;
730 active_list.remove(
timer.
id,
true);
731 remove_callback.call_if(
timer.
id);
733 if (
timer.callback.is_valid())
743 insert_callback.call_if(
timer.
id);
746 has_active = !active_list.empty();
752 active_list.front().delta -= count;
767 timer_data timer_array[Max_Timers_];
bool tick(uint32_t count) final
Handle the tick call.
Definition callback_timer_locked.h:713
callback_timer_locked()
Constructor.
Definition callback_timer_locked.h:696
callback_timer_locked(try_lock_type try_lock_, lock_type lock_, unlock_type unlock_)
Constructor.
Definition callback_timer_locked.h:704
Declaration.
Definition delegate_cpp03.h:191
Definition callback_timer_locked.h:359
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:273
void set_insert_callback(event_callback_type insert_)
Set a callback when a timer is inserted on list.
Definition callback_timer_locked.h:331
void set_remove_callback(event_callback_type remove_)
Set a callback when a timer is removed from list.
Definition callback_timer_locked.h:339
icallback_timer_locked(timer_data *const timer_array_, const uint_least8_t Max_Timers_)
Constructor.
Definition callback_timer_locked.h:442
bool stop(etl::timer::id::type id_)
Stops a timer.
Definition callback_timer_locked.h:205
void clear()
Clears the timer of data.
Definition callback_timer_locked.h:142
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:263
uint32_t time_to_next() const
Definition callback_timer_locked.h:286
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:235
bool set_mode(etl::timer::id::type id_, bool repeating_)
Sets a timer's mode.
Definition callback_timer_locked.h:249
bool is_running() const
Get the enable/disable state.
Definition callback_timer_locked.h:134
void enable(bool state_)
Enable/disable the timer.
Definition callback_timer_locked.h:126
bool unregister_timer(etl::timer::id::type id_)
Unregister a timer.
Definition callback_timer_locked.h:94
bool start(etl::timer::id::type id_, bool immediate_=false)
Starts a timer.
Definition callback_timer_locked.h:167
bool is_active(etl::timer::id::type id_) const
Definition callback_timer_locked.h:304
bitset_ext
Definition absolute.h:39
The configuration of a timer.
Definition callback_timer_locked.h:378
timer_data(etl::timer::id::type id_, callback_type callback_, uint32_t period_, bool repeating_)
ETL delegate callback.
Definition callback_timer_locked.h:394
void set_inactive()
Sets the timer to the inactive state.
Definition callback_timer_locked.h:419
bool is_active() const
Returns true if the timer is active.
Definition callback_timer_locked.h:411
Common definitions for the timer framework.
Definition timer.h:55