-
Notifications
You must be signed in to change notification settings - Fork 0
/
Event.cpp
302 lines (268 loc) · 6.15 KB
/
Event.cpp
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
/*
* File: Event.cpp
* Author: daniel
*
* Created on December 4, 2011, 4:18 PM
*/
#include "Event.h"
#include "Frequency.h"
#include "debug_tools.h"
EVENT currentEvent;
EVENT previousEvent = EVENT_NULL;
Event g_eventCenter;
extern SensorController g_sensorCtrl;
int g_lightValuePeakLeft;
int g_lightValuePeakMiddle;
int g_lightValuePeakRight;
Event::Event()
{
}
Event::Event(const Event& orig)
{
}
Event::~Event()
{
}
//Checks if a switch or sensor has been hit
EVENT Event::checkEventType(const INPUT &input)
{
switch (input.type)
{
case TYPE_INPUT_SWITCH:
{
return genSwitchEvent(input);
}
case TYPE_INPUT_SENSOR:
{
return genSensorEvent(input);
}
default:
{
break;
}
}
return EVENT_NULL;
}
//If it is a switch
EVENT Event::genSwitchEvent(const INPUT &input)
{
switch (input.subType)
{
case TYPE_SWITCH_BUMPER:
{
return genBumperEvent(input);
}
case TYPE_SWITCH_WHISKER:
{
return EVENT_NULL;
}
default:
{
// printf("genSwitchEvent - switch %d with unknown type: %d\n", input.index, input.subType);
}
}
return EVENT_NULL;
}
//If a bumper has experienced a collision
EVENT Event::genBumperEvent(const INPUT &input)
{
if (STATE_ON == input.value)
{
#if (DEBUG_MODE)
cout << "genBumperEvent - " << GetPositionChar(input.pos) << "bumper HIT!\n" << endl;
#endif
switch (input.pos)
{
case POSITION_FRONT:
{
cout<<"genBumperEvent - Position Front"<<endl;
return EVENT_HIT_FRONT;
}
case POSITION_LEFT:
{
cout<<"genBumperEvent - Position Left"<<endl;
return EVENT_HIT_FRONT_LEFT;
}
case POSITION_RIGHT:
{
cout<<"genBumperEvent - Position right"<<endl;
return EVENT_HIT_FRONT_RIGHT;
}
default:
{
//printf("genBumperEvent: unknown bumper HIT!\n");
break;
}
}
}
return EVENT_HIT;
}
//If it is a sensor
EVENT Event::genSensorEvent(const INPUT &input)
{
switch (input.subType)
{
case TYPE_SENSOR_IR:
{
return genIREvent(input);
}
case TYPE_SENSOR_LIGHT:
{
return genLightSensorEvent(input);
}
case TYPE_SENSOR_SONAR:
{
// cout << << endl;
break;
}
default:
{
//printf("genSensorEvent: unknown sensor type: %d\n", input.subType);
break;
}
}
return EVENT_NULL;
}
EVENT Event::genIREvent(const INPUT &input)
{
#if DEBUG_MODE_SENSOR_IR
cout << "genIREvent - " << GetPositionChar(input.pos) << " IR sensor: " << input.value << endl;
#endif
return EVENT_NULL;
}
EVENT Event::genLightSensorEvent(const INPUT &input)
{
switch (input.pos)
{
case POSITION_MIDDLE:
case POSITION_LEFT:
case POSITION_RIGHT:
{
return genLightSensorFrontEvent(input);
}
case POSITION_UNDER:
{
// test the value against the known value
return GenLightSensorUnderEvent(input);
}
default:
{
printf("genLightSensorEvent: light sensor %d, unkown position: %s.\n", input.index, GetPositionChar(input.pos));
break;
}
}
return EVENT_NULL;
}
EVENT Event::genLightSensorFrontEvent(const INPUT &input)
{
/*
if (input.value < VALUE_MIN_LED_LIGHT)
{
return EVENT_NULL;
}
*/
int valuePre = GetSensorValuePre(input.index);
#if DEBUG_SENSOR_LIGHT_FRONT
cout << "genLightSensorFrontEvent - value: " << input.value << endl;
cout << "genLightSensorFrontEvent - value pre: " << valuePre << endl;
#endif
// update the peak value
if (input.value >= valuePre)
{
if (POSITION_LEFT == input.pos)
{
g_lightValuePeakLeft = input.value;
}
else if (input.pos == POSITION_MIDDLE)
{
g_lightValuePeakMiddle = input.value;
}
else if (input.pos == POSITION_RIGHT)
{
g_lightValuePeakRight = input.value;
}
else
{
;
}
}
// the trend is going down
else if (input.value < valuePre)
{
switch (input.pos)
{
case POSITION_LEFT:
{
// previous is the peak
if (g_lightValuePeakLeft == valuePre)
{
FreqTickLeft();
// reset the peak
g_lightValuePeakLeft = 0;
}
break;
}
case POSITION_MIDDLE:
{
// previous is the peak
if (g_lightValuePeakMiddle == valuePre)
{
FreqTickMiddle();
// reset the peak
g_lightValuePeakMiddle = 0;
}
break;
}
case POSITION_RIGHT:
{
// previous is the peak
if (g_lightValuePeakRight == valuePre)
{
FreqTickRight();
// reset the peak
g_lightValuePeakRight = 0;
}
break;
}
default:
{
break;
}
}
}
else
{
;
}
return EVENT_NULL;
}
EVENT Event::GenLightSensorUnderEvent(const INPUT &input)
{
int valueAvrg = g_sensorCtrl.getSensorValueAvrg(input.index);
int value = g_sensorCtrl.getSensorValue(input.index);
// if the value range is in the black paper and black tape
if (bIsBlackTape(value)) //|| bIsBlackPaper(valueAvrg))
{
//cout<<"Average Value: "<<value<<endl;
//cout<<"Got to BLACK TAPE EVENT with sensor value: "<<g_sensorCtrl.getSensorValue(input.index)<<endl;
return EVENT_DETECT_BLACK;
}
else if (bIsGround(valueAvrg))
{
return EVENT_DETECT_GROUND;
}
else
{
return EVENT_DETECT_GROUND;
}
}
void Event::handleInput(const INPUT &input)
{
//cout<<"Handling Input"<<endl;
currentEvent = checkEventType(input);
if (currentEvent != previousEvent)
{
// cout<<"Current Event: "<<currentEvent<<endl;
previousEvent = currentEvent;
}
}