-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEvents.cpp
More file actions
89 lines (82 loc) · 1.82 KB
/
Copy pathEvents.cpp
File metadata and controls
89 lines (82 loc) · 1.82 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//
// Copyright (c) 2013 - Allen Bauer - http://blog.thereadoracleatdelphi.com
// Under MIT License
//
#include <stdint.h>
#include "Events.h"
#include "FastTimer.h"
bool Events::EventData::Check()
{
bool result = false;
if (conditionRef != NULL)
result = (volatile bool)*conditionRef;
else if (conditionProc != NULL)
conditionProc(result);
return result;
}
Events::~Events()
{
EventData *data = eventData;
while (data != NULL)
{
EventData *next = data->next;
delete data;
data = next;
}
}
uint8_t Events::AddEvent(ConditionRef conditionRef)
{
EventData *data = new EventData();
data->conditionRef = conditionRef;
data->eventID = ++_eventID;
data->next = eventData;
eventData = data;
return data->eventID;
}
uint8_t Events::AddEvent(ConditionProc conditionProc)
{
EventData *data = new EventData();
data->conditionProc = conditionProc;
data->eventID = ++_eventID;
data->next = eventData;
eventData = data;
return data->eventID;
}
void Events::RemoveEvent(uint8_t eventID)
{
EventData *data;
EventData *last = NULL;
for (data = eventData; data != NULL; last = data, data = data->next)
if (data->eventID == eventID)
{
if (last != NULL)
last->next = data->next;
if (eventData == data)
eventData = data->next;
delete data;
break;
}
}
void Events::SetEnabled(uint8_t eventID, bool enabled)
{
EventData *data;
for (data = eventData; data != NULL; data = data->next)
if (data->eventID == eventID)
{
data->enabled = enabled;
break;
}
}
int Events::WaitForAnyEvent(unsigned long timeout)
{
FastTimer tm;
unsigned long startTime = tm.micros();
while ((timeout == (unsigned long)0xFFFFFFFF) || (tm.micros() - startTime < timeout))
{
EventData *data;
for (data = eventData; data != NULL; data = data->next)
if (data->enabled && data->Check())
return data->eventID;
}
return -1;
}