44
44
#include < limits.h>
45
45
46
46
#ifndef TIMER_MAX_TASKS
47
- #define TIMER_MAX_TASKS 0x10
47
+ #define TIMER_MAX_TASKS 0x10
48
48
#endif
49
49
50
50
#define _timer_foreach_task (T, task ) \
57
57
_timer_foreach_task (const struct task *, T)
58
58
59
59
template <
60
- size_t max_tasks = TIMER_MAX_TASKS, /* max allocated tasks */
60
+ size_t max_tasks = TIMER_MAX_TASKS, /* max allocated tasks */
61
61
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
+ >
64
64
class Timer {
65
- public:
66
-
67
- typedef uintptr_t Task; /* public task handle */
65
+ public:
66
+ typedef uintptr_t Task; /* public task handle */
68
67
typedef bool (*handler_t )(T opaque); /* task handler func signature */
69
68
70
69
/* Calls handler with opaque as argument in delay units of time */
71
70
Task
72
- in (unsigned long delay, handler_t h, T opaque = T ())
73
- {
71
+ in (unsigned long delay, handler_t h, T opaque = T ()) {
74
72
return task_id (add_task (time_func (), delay, h, opaque));
75
73
}
76
74
77
75
/* Calls handler with opaque as argument at time */
78
76
Task
79
- at (unsigned long time, handler_t h, T opaque = T ())
80
- {
77
+ at (unsigned long time, handler_t h, T opaque = T ()) {
81
78
const unsigned long now = time_func ();
82
79
return task_id (add_task (now, time - now, h, opaque));
83
80
}
84
81
85
82
/* Calls handler with opaque as argument every interval units of time */
86
83
Task
87
- every (unsigned long interval, handler_t h, T opaque = T ())
88
- {
84
+ every (unsigned long interval, handler_t h, T opaque = T ()) {
89
85
return task_id (add_task (time_func (), interval, h, opaque, interval));
90
86
}
91
87
92
88
/* Cancel the timer task */
93
89
void
94
- cancel (Task &task)
95
- {
90
+ cancel (Task &task) {
96
91
if (!task) return ;
97
92
98
93
timer_foreach_task (t) {
@@ -107,17 +102,15 @@ class Timer {
107
102
108
103
/* Cancel all timer tasks */
109
104
void
110
- cancel ()
111
- {
105
+ cancel () {
112
106
timer_foreach_task (t) {
113
107
remove (t);
114
108
}
115
109
}
116
110
117
111
/* Left until the task ends */
118
112
unsigned long
119
- ticks (const Task &task)
120
- {
113
+ left (const Task &task) {
121
114
auto lft = 0ul ;
122
115
if (!task)
123
116
return lft;
@@ -127,10 +120,8 @@ class Timer {
127
120
const unsigned long now = time_func ();
128
121
const unsigned long duration = now - t->start ;
129
122
130
- if (duration >= t->expires )
131
- break ;
132
-
133
- lft = t->expires - duration;
123
+ if (duration < t->expires )
124
+ lft = t->expires - duration;
134
125
break ;
135
126
}
136
127
}
@@ -140,15 +131,14 @@ class Timer {
140
131
141
132
/* Ticks the timer forward - call this function in loop() */
142
133
unsigned long
143
- tick ()
144
- {
134
+ tick () {
145
135
tick<void >();
146
136
return ticks ();
147
137
}
148
138
149
- template <typename R> void
150
- tick ()
151
- {
139
+ template <typename R>
140
+ void
141
+ tick () {
152
142
timer_foreach_task (task) {
153
143
if (task->handler ) {
154
144
const unsigned long t = time_func ();
@@ -157,17 +147,18 @@ class Timer {
157
147
if (duration >= task->expires ) {
158
148
task->repeat = task->handler (task->opaque ) && task->repeat ;
159
149
160
- if (task->repeat ) task->start = t;
161
- else remove (task);
150
+ if (task->repeat )
151
+ task->start = t;
152
+ else
153
+ remove (task);
162
154
}
163
155
}
164
156
}
165
157
}
166
158
167
159
/* Ticks until the next event */
168
160
unsigned long
169
- ticks () const
170
- {
161
+ ticks () const {
171
162
unsigned long ticks = ULONG_MAX, elapsed;
172
163
const unsigned long start = time_func ();
173
164
@@ -188,16 +179,17 @@ class Timer {
188
179
189
180
elapsed = time_func () - start;
190
181
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;
193
186
194
187
return ticks;
195
188
}
196
189
197
190
/* Number of active tasks in the timer */
198
191
size_t
199
- size () const
200
- {
192
+ size () const {
201
193
size_t s = 0 ;
202
194
203
195
timer_foreach_const_task (task) {
@@ -209,8 +201,7 @@ class Timer {
209
201
210
202
/* True if there are no active tasks */
211
203
bool
212
- empty () const
213
- {
204
+ empty () const {
214
205
timer_foreach_const_task (task) {
215
206
if (task->handler ) return false ;
216
207
}
@@ -220,23 +211,20 @@ class Timer {
220
211
221
212
Timer () : ctr (0 ), tasks{} {}
222
213
223
- private:
224
-
214
+ private:
225
215
size_t ctr;
226
216
227
217
struct task {
228
218
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 */
230
220
unsigned long start,
231
- expires; /* when the task expires */
221
+ expires; /* when the task expires */
232
222
size_t repeat, /* repeat task */
233
- id;
223
+ id;
234
224
} tasks[max_tasks];
235
225
236
- inline
237
- void
238
- remove (struct task *task)
239
- {
226
+ inline void
227
+ remove (struct task *task) {
240
228
task->handler = NULL ;
241
229
task->opaque = T ();
242
230
task->start = 0 ;
@@ -245,36 +233,30 @@ class Timer {
245
233
task->id = 0 ;
246
234
}
247
235
248
- inline
249
- Task
250
- task_id (const struct task * const t)
251
- {
236
+ inline Task
237
+ task_id (const struct task *const t) {
252
238
const Task id = reinterpret_cast <Task>(t);
253
239
254
240
return id ? id ^ t->id : id;
255
241
}
256
242
257
- inline
258
- struct task *
259
- next_task_slot ()
260
- {
243
+ inline struct task *
244
+ next_task_slot () {
261
245
timer_foreach_task (slot) {
262
246
if (slot->handler == NULL ) return slot;
263
247
}
264
248
265
249
return NULL ;
266
250
}
267
251
268
- inline
269
- struct task *
252
+ inline struct task *
270
253
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 ();
274
256
275
257
if (!slot) return NULL ;
276
258
277
- if (++ctr == 0 ) ++ctr; // overflow
259
+ if (++ctr == 0 ) ++ctr; // overflow
278
260
279
261
slot->id = ctr;
280
262
slot->handler = h;
@@ -289,8 +271,7 @@ class Timer {
289
271
290
272
/* create a timer with the default settings */
291
273
inline Timer<>
292
- timer_create_default ()
293
- {
274
+ timer_create_default () {
294
275
return Timer<>();
295
276
}
296
277
0 commit comments