-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimers.h
72 lines (64 loc) · 1.48 KB
/
timers.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#define MAX_TIMERS 5
int addTimer(unsigned long ms, void (*func)());
void removeTimer(int id);
void removeAllTimers();
void handleTimers();
typedef struct Timer {
int id;
unsigned long start;
unsigned long duration;
void (*callback)();
};
Timer timers[MAX_TIMERS];
int numtimers = 0;
int addTimer(unsigned long ms, void (*func)()) {
// create new timer
if (numtimers<MAX_TIMERS) {
// get new timer id
int newid = 0;
boolean flag = true;
while(flag) {
flag = false;
for (int i=0; i<numtimers; i++) if (timers[i].id == newid) {
newid++;
flag = true;
}
}
timers[numtimers].id = newid;
timers[numtimers].start = millis();
timers[numtimers].duration = ms;
timers[numtimers].callback = func;
numtimers++;
return newid;
}
else return -1;
}
void removeTimer(int id) {
boolean flag = false;
for (int i=0; i<numtimers; i++) {
if (timers[i].id == id) {
flag = true;
numtimers--;
}
if (flag) timers[i] = timers[i+1];
}
}
void removeAllTimers() {
numtimers = 0;
}
void handleTimers() {
void (*func)();
unsigned long currenttime = millis();
// walk through all timers
for (int i=0; i<numtimers; i++) {
// check if timer expired
if (currenttime - timers[i].start >= timers[i].duration) {
// copy callback pointer to temporary variable
func = timers[i].callback;
// remove timer
removeTimer(timers[i].id);
// invoke callback
(*func)();
}
}
}