4444#include  < limits.h> 
4545
4646#ifndef  TIMER_MAX_TASKS
47-      #define  TIMER_MAX_TASKS  0x10 
47+ #define  TIMER_MAX_TASKS  0x10 
4848#endif 
4949
5050#define  _timer_foreach_task (T, task ) \
5757    _timer_foreach_task (const  struct  task  *, T)
5858
5959template <
60-     size_t max_tasks = TIMER_MAX_TASKS, /*  max allocated tasks */ 
60+     size_t max_tasks = TIMER_MAX_TASKS,     /*  max allocated tasks */ 
6161    unsigned long (*time_func)() = millis, /*  time function for timer */ 
62-     typename T = void * /*  handler argument type */ 
63- >
62+     typename T = void *                     /*  handler argument type */ 
63+      >
6464class Timer {
65-   public: 
66- 
67-     typedef  uintptr_t  Task; /*  public task handle */ 
65+    public: 
66+     typedef  uintptr_t  Task;              /*  public task handle */ 
6867    typedef  bool  (*handler_t )(T opaque); /*  task handler func signature */ 
6968
7069    /*  Calls handler with opaque as argument in delay units of time */ 
7170    Task
72-     in (unsigned  long  delay, handler_t  h, T opaque = T ())
73-     {
71+     in (unsigned  long  delay, handler_t  h, T opaque = T ()) {
7472        return  task_id (add_task (time_func (), delay, h, opaque));
7573    }
7674
7775    /*  Calls handler with opaque as argument at time */ 
7876    Task
79-     at (unsigned  long  time, handler_t  h, T opaque = T ())
80-     {
77+     at (unsigned  long  time, handler_t  h, T opaque = T ()) {
8178        const  unsigned  long  now = time_func ();
8279        return  task_id (add_task (now, time - now, h, opaque));
8380    }
8481
8582    /*  Calls handler with opaque as argument every interval units of time */ 
8683    Task
87-     every (unsigned  long  interval, handler_t  h, T opaque = T ())
88-     {
84+     every (unsigned  long  interval, handler_t  h, T opaque = T ()) {
8985        return  task_id (add_task (time_func (), interval, h, opaque, interval));
9086    }
9187
9288    /*  Cancel the timer task */ 
9389    void 
94-     cancel (Task &task)
95-     {
90+     cancel (Task &task) {
9691        if  (!task) return ;
9792
9893        timer_foreach_task (t) {
@@ -107,17 +102,15 @@ class Timer {
107102
108103    /*  Cancel all timer tasks */ 
109104    void 
110-     cancel ()
111-     {
105+     cancel () {
112106        timer_foreach_task (t) {
113107            remove (t);
114108        }
115109    }
116110
117111    /*  Left until the task ends */ 
118112    unsigned  long 
119-     ticks (const  Task &task)
120- 	{
113+     left (const  Task &task) {
121114        auto  lft = 0ul ;
122115        if  (!task)
123116            return  lft;
@@ -127,10 +120,8 @@ class Timer {
127120                const  unsigned  long  now = time_func ();
128121                const  unsigned  long  duration = now - t->start ;
129122
130-                 if  (duration >= t->expires )
131-                     break ;
132- 
133-                 lft = t->expires  - duration;
123+                 if  (duration < t->expires )
124+                     lft = t->expires  - duration;
134125                break ;
135126            }
136127        }
@@ -140,15 +131,14 @@ class Timer {
140131
141132    /*  Ticks the timer forward - call this function in loop() */ 
142133    unsigned  long 
143-     tick ()
144-     {
134+     tick () {
145135        tick<void >();
146136        return  ticks ();
147137    }
148138
149-     template  <typename  R>  void 
150-     tick () 
151-     {
139+     template  <typename  R>
140+     void 
141+     tick ()  {
152142        timer_foreach_task (task) {
153143            if  (task->handler ) {
154144                const  unsigned  long  t = time_func ();
@@ -157,17 +147,18 @@ class Timer {
157147                if  (duration >= task->expires ) {
158148                    task->repeat  = task->handler (task->opaque ) && task->repeat ;
159149
160-                     if  (task->repeat ) task->start  = t;
161-                     else  remove (task);
150+                     if  (task->repeat )
151+                         task->start  = t;
152+                     else 
153+                         remove (task);
162154                }
163155            }
164156        }
165157    }
166158
167159    /*  Ticks until the next event */ 
168160    unsigned  long 
169-     ticks () const 
170-     {
161+     ticks () const  {
171162        unsigned  long  ticks = ULONG_MAX, elapsed;
172163        const  unsigned  long  start = time_func ();
173164
@@ -188,16 +179,17 @@ class Timer {
188179
189180        elapsed = time_func () - start;
190181
191-         if  (elapsed >= ticks || ticks == ULONG_MAX) ticks = 0 ;
192-         else  ticks -= elapsed;
182+         if  (elapsed >= ticks || ticks == ULONG_MAX)
183+             ticks = 0 ;
184+         else 
185+             ticks -= elapsed;
193186
194187        return  ticks;
195188    }
196189
197190    /*  Number of active tasks in the timer */ 
198191    size_t 
199-     size () const 
200-     {
192+     size () const  {
201193        size_t  s = 0 ;
202194
203195        timer_foreach_const_task (task) {
@@ -209,8 +201,7 @@ class Timer {
209201
210202    /*  True if there are no active tasks */ 
211203    bool 
212-     empty () const 
213-     {
204+     empty () const  {
214205        timer_foreach_const_task (task) {
215206            if  (task->handler ) return  false ;
216207        }
@@ -220,23 +211,20 @@ class Timer {
220211
221212    Timer () : ctr (0 ), tasks{} {}
222213
223-   private: 
224- 
214+    private: 
225215    size_t  ctr;
226216
227217    struct  task  {
228218        handler_t  handler; /*  task handler callback func */ 
229-         T opaque; /*  argument given to the callback handler */ 
219+         T opaque;           /*  argument given to the callback handler */ 
230220        unsigned  long  start,
231-                        expires; /*  when the task expires */ 
221+             expires;    /*  when the task expires */ 
232222        size_t  repeat, /*  repeat task */ 
233-                 id;
223+             id;
234224    } tasks[max_tasks];
235225
236-     inline 
237-     void 
238-     remove (struct  task  *task)
239-     {
226+     inline  void 
227+     remove (struct  task  *task) {
240228        task->handler  = NULL ;
241229        task->opaque  = T ();
242230        task->start  = 0 ;
@@ -245,36 +233,30 @@ class Timer {
245233        task->id  = 0 ;
246234    }
247235
248-     inline 
249-     Task
250-     task_id (const  struct  task  * const  t)
251-     {
236+     inline  Task
237+     task_id (const  struct  task  *const  t) {
252238        const  Task id = reinterpret_cast <Task>(t);
253239
254240        return  id ? id ^ t->id  : id;
255241    }
256242
257-     inline 
258-     struct  task  *
259-     next_task_slot ()
260-     {
243+     inline  struct  task  *
244+     next_task_slot () {
261245        timer_foreach_task (slot) {
262246            if  (slot->handler  == NULL ) return  slot;
263247        }
264248
265249        return  NULL ;
266250    }
267251
268-     inline 
269-     struct  task  *
252+     inline  struct  task  *
270253    add_task (unsigned  long  start, unsigned  long  expires,
271-              handler_t  h, T opaque, bool  repeat = 0 )
272-     {
273-         struct  task  * const  slot = next_task_slot ();
254+              handler_t  h, T opaque, bool  repeat = 0 ) {
255+         struct  task  *const  slot = next_task_slot ();
274256
275257        if  (!slot) return  NULL ;
276258
277-         if  (++ctr == 0 ) ++ctr; //  overflow
259+         if  (++ctr == 0 ) ++ctr;   //  overflow
278260
279261        slot->id  = ctr;
280262        slot->handler  = h;
@@ -289,8 +271,7 @@ class Timer {
289271
290272/*  create a timer with the default settings */ 
291273inline  Timer<>
292- timer_create_default ()
293- {
274+ timer_create_default () {
294275    return  Timer<>();
295276}
296277
0 commit comments