Andriy Makukha / Mbed 2 deprecated football_project_wo_output

Dependencies:   mbed

Fork of football_project by MZJ

Committer:
AntonLS
Date:
Tue Dec 01 16:03:15 2015 +0000
Revision:
19:afcbb425b3cf
Parent:
18:affef3a7db2a
Child:
23:26f27c462976
Updated for new hardware.  PhoneIO and protocol fixes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmbed 17:d8b901d791fd 1 #include <TA.h>
elmbed 17:d8b901d791fd 2 #include <types.h>
elmbed 17:d8b901d791fd 3
elmbed 17:d8b901d791fd 4 #define RED p3
elmbed 17:d8b901d791fd 5 #define GREEN p5
elmbed 17:d8b901d791fd 6 #define BLUE p6
elmbed 17:d8b901d791fd 7
elmbed 17:d8b901d791fd 8 #define ENABLE_1 p4
elmbed 17:d8b901d791fd 9 #define ENABLE_2 p7
elmbed 17:d8b901d791fd 10 #define ENABLE_3 p8
elmbed 17:d8b901d791fd 11
elmbed 17:d8b901d791fd 12 #define DEBUG_BAUD 57600 //57600
elmbed 17:d8b901d791fd 13 #define ADDRESS 1
elmbed 17:d8b901d791fd 14 #define MAX_LEN 24 // buffer input commands up to this length
elmbed 17:d8b901d791fd 15 #define NUM_CONES 6
elmbed 17:d8b901d791fd 16 #define STATIONS 20 // max length of a pattern
elmbed 17:d8b901d791fd 17 #define SEQUENCES 9 // number of patterns to store
elmbed 17:d8b901d791fd 18
elmbed 17:d8b901d791fd 19 #define TRILAT_CONE 99
elmbed 17:d8b901d791fd 20
elmbed 17:d8b901d791fd 21 #define DEBOUNCE_MS 100
elmbed 17:d8b901d791fd 22 #define LIGHTS 0x07
elmbed 17:d8b901d791fd 23 #define FAKEOUT 0x08
elmbed 17:d8b901d791fd 24 #define FAIL_QUICK 0x10
elmbed 17:d8b901d791fd 25 #define SILENT 0x20
elmbed 17:d8b901d791fd 26 #define GRACE_PERIOD 3000
elmbed 17:d8b901d791fd 27
elmbed 17:d8b901d791fd 28 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need //////////////////////DEBUG messages on the console;
elmbed 17:d8b901d791fd 29 * it will have an impact on code-size and power consumption. */
elmbed 17:d8b901d791fd 30
elmbed 17:d8b901d791fd 31 #define LOOPBACK_MODE 0 // Loopback mode
elmbed 17:d8b901d791fd 32
elmbed 17:d8b901d791fd 33 #if NEED_CONSOLE_OUTPUT
elmbed 17:d8b901d791fd 34 #define DEBUG(...) { printf(__VA_ARGS__); }
elmbed 17:d8b901d791fd 35 #else
elmbed 17:d8b901d791fd 36 #define DEBUG(...) /* nothing */
elmbed 17:d8b901d791fd 37 #endif /* #if NEED_CONSOLE_OUTPUT */
elmbed 17:d8b901d791fd 38
elmbed 18:affef3a7db2a 39 #if 1
elmbed 17:d8b901d791fd 40 extern int random(int numberone, int numbertwo);
elmbed 17:d8b901d791fd 41
elmbed 17:d8b901d791fd 42 unsigned long millis();
elmbed 17:d8b901d791fd 43 unsigned long micros();
elmbed 17:d8b901d791fd 44
elmbed 17:d8b901d791fd 45 TA ta;
elmbed 17:d8b901d791fd 46
elmbed 18:affef3a7db2a 47 static bool active_cones[NUM_CONES + 1]; // + 1 so we can be 1 based like the cone numbers are
elmbed 17:d8b901d791fd 48
elmbed 18:affef3a7db2a 49 static Mode_t mode = PATTERN;
elmbed 18:affef3a7db2a 50 static patternState_t state_p = IDLE_P;
elmbed 18:affef3a7db2a 51 static inputState_t state_i = IDLE_I;
elmbed 17:d8b901d791fd 52
elmbed 18:affef3a7db2a 53 static Message m1 = { 'm',0,2 };
elmbed 17:d8b901d791fd 54
elmbed 18:affef3a7db2a 55 static Message *m = &m1;
elmbed 18:affef3a7db2a 56 static Message m2 = { 'm',0,2 };
elmbed 18:affef3a7db2a 57 static Message *m_in = &m2;
elmbed 17:d8b901d791fd 58
elmbed 18:affef3a7db2a 59 static uint8_t active_cone = 0;
elmbed 18:affef3a7db2a 60 static unsigned long timeout = 0;
elmbed 18:affef3a7db2a 61 static uint8_t mask = 0x07;
elmbed 18:affef3a7db2a 62 static uint8_t fakeout = 0;
elmbed 18:affef3a7db2a 63 static uint8_t fail_quick = 0;
elmbed 18:affef3a7db2a 64 static uint8_t index = 0;
elmbed 18:affef3a7db2a 65 static bool new_state = false;
elmbed 18:affef3a7db2a 66 static bool tag_start = false; // flag to indicate we should wait for the user to activate the first station before going through the sequence
elmbed 18:affef3a7db2a 67
elmbed 17:d8b901d791fd 68 static bool in_menu = false;
elmbed 17:d8b901d791fd 69 static bool warning = false;
elmbed 17:d8b901d791fd 70 static bool penalty = false;
elmbed 17:d8b901d791fd 71 static bool logging = false;
elmbed 17:d8b901d791fd 72
elmbed 17:d8b901d791fd 73 // course setup (probably should make some of these persistant settings)
elmbed 18:affef3a7db2a 74 static uint8_t active_sequence = 0;
elmbed 18:affef3a7db2a 75 static uint8_t station = 1;
elmbed 18:affef3a7db2a 76 static uint8_t cone = 0;
elmbed 18:affef3a7db2a 77 static uint16_t ltime = 0;
elmbed 17:d8b901d791fd 78
elmbed 17:d8b901d791fd 79 volatile bool triggered;
elmbed 17:d8b901d791fd 80 volatile bool pin;
elmbed 17:d8b901d791fd 81 volatile bool ping = false;
elmbed 18:affef3a7db2a 82
elmbed 17:d8b901d791fd 83 static volatile bool captured = false;
elmbed 17:d8b901d791fd 84 static volatile unsigned long ping_timer = 0;
elmbed 17:d8b901d791fd 85 static volatile unsigned long dist_timeout = 0;
elmbed 17:d8b901d791fd 86
elmbed 17:d8b901d791fd 87 // all sequence data
elmbed 17:d8b901d791fd 88 uint8_t cone_table[STATIONS * SEQUENCES];
elmbed 17:d8b901d791fd 89 uint8_t mask_table[STATIONS * SEQUENCES];
elmbed 17:d8b901d791fd 90 uint16_t time_table[STATIONS * SEQUENCES];
elmbed 17:d8b901d791fd 91
elmbed 17:d8b901d791fd 92 // pointer to active table
elmbed 17:d8b901d791fd 93 uint8_t *cones = (uint8_t*)cone_table;
elmbed 17:d8b901d791fd 94 uint8_t *masks = (uint8_t*)mask_table;
elmbed 17:d8b901d791fd 95 uint16_t *times = (uint16_t*)time_table;
elmbed 17:d8b901d791fd 96
elmbed 17:d8b901d791fd 97 static bool lonely = false;
elmbed 17:d8b901d791fd 98
elmbed 17:d8b901d791fd 99 // Function prototypes
elmbed 17:d8b901d791fd 100 void spin();
elmbed 17:d8b901d791fd 101 patternState_t stateFromCone(uint8_t cone);
elmbed 17:d8b901d791fd 102 void printSplit(unsigned long timer);
elmbed 17:d8b901d791fd 103 uint8_t getRandomCone(void);
elmbed 17:d8b901d791fd 104 void clearCones(void);
elmbed 17:d8b901d791fd 105 void powerupCones(uint8_t sound);
elmbed 17:d8b901d791fd 106 void failCones(void);
elmbed 17:d8b901d791fd 107 void resetSensors(void);
elmbed 17:d8b901d791fd 108 void successCones(void);
elmbed 17:d8b901d791fd 109 void find_cones(void);
elmbed 17:d8b901d791fd 110 void printMsAsSeconds(unsigned long number);
elmbed 17:d8b901d791fd 111 void spinButtons(void);
elmbed 17:d8b901d791fd 112 uint8_t checkButtons(void);
elmbed 17:d8b901d791fd 113 Event getInputEvent(void);
elmbed 17:d8b901d791fd 114 void getRadioInput(char *ibuffer, int size);
elmbed 17:d8b901d791fd 115 void interpret(char parameter, int value);
elmbed 17:d8b901d791fd 116
elmbed 17:d8b901d791fd 117 char local_input[50] = {0};
elmbed 17:d8b901d791fd 118
elmbed 17:d8b901d791fd 119 //DigitalOut red(RED);
elmbed 17:d8b901d791fd 120 //DigitalOut enable1(ENABLE_1);
elmbed 17:d8b901d791fd 121 //DigitalOut green(GREEN);
elmbed 17:d8b901d791fd 122 //DigitalOut blue(BLUE);
elmbed 17:d8b901d791fd 123 //DigitalOut enable2(ENABLE_2);
elmbed 17:d8b901d791fd 124 //DigitalOut enable3(ENABLE_3);
elmbed 17:d8b901d791fd 125
elmbed 17:d8b901d791fd 126 void setup()
elmbed 17:d8b901d791fd 127 {
elmbed 17:d8b901d791fd 128 ta.initialize(ADDRESS);
elmbed 17:d8b901d791fd 129
elmbed 17:d8b901d791fd 130 uint16_t sent = 0;
elmbed 17:d8b901d791fd 131 uint16_t lost = 0;
elmbed 17:d8b901d791fd 132 unsigned long start = micros();
elmbed 17:d8b901d791fd 133 //while (millis() - now <= ACK_TIME){
elmbed 17:d8b901d791fd 134 m->command = 'p';
elmbed 17:d8b901d791fd 135 m->value = 0;
elmbed 17:d8b901d791fd 136 m->cone = 0;
elmbed 17:d8b901d791fd 137
elmbed 17:d8b901d791fd 138 find_cones(); // this causes the beep to be interrupted
elmbed 17:d8b901d791fd 139 ta.beep(100);
elmbed 17:d8b901d791fd 140 int i;
elmbed 17:d8b901d791fd 141 for(i=1;i<NUM_CONES+1;i++)active_cones[i] = true;
elmbed 17:d8b901d791fd 142
elmbed 17:d8b901d791fd 143 unsigned long time = 0;
elmbed 17:d8b901d791fd 144
elmbed 17:d8b901d791fd 145 // pull course sequences from non-volatile memory
elmbed 17:d8b901d791fd 146 for(uint8_t i=0;i<STATIONS * SEQUENCES;i++){
elmbed 17:d8b901d791fd 147 cone_table[i] = i+1;
elmbed 17:d8b901d791fd 148 mask_table[i] = 1;
elmbed 17:d8b901d791fd 149 time_table[i] = 1000;
elmbed 17:d8b901d791fd 150 }
elmbed 18:affef3a7db2a 151
elmbed 18:affef3a7db2a 152 ta.post_color(0xFF0000);
elmbed 17:d8b901d791fd 153 }
elmbed 17:d8b901d791fd 154
elmbed 17:d8b901d791fd 155 void loop()
elmbed 17:d8b901d791fd 156 {
elmbed 17:d8b901d791fd 157 static Mode_t last_mode = mode;
elmbed 18:affef3a7db2a 158
elmbed 17:d8b901d791fd 159 last_mode = mode;
elmbed 17:d8b901d791fd 160
elmbed 18:affef3a7db2a 161 //ta.spin();
elmbed 18:affef3a7db2a 162 DEBUG("spinning");
elmbed 17:d8b901d791fd 163 //spinButtons();
elmbed 17:d8b901d791fd 164 //if((logging || micros() < dist_timeout) && ta.recieve(m_in))
elmbed 17:d8b901d791fd 165 // //////DEBUG("%c",m_in->command);
elmbed 17:d8b901d791fd 166 //else
elmbed 18:affef3a7db2a 167 spin();
elmbed 17:d8b901d791fd 168 }
elmbed 17:d8b901d791fd 169
elmbed 17:d8b901d791fd 170 void getNext()
elmbed 17:d8b901d791fd 171 {
elmbed 17:d8b901d791fd 172 if(mode == FREEFORM)
elmbed 17:d8b901d791fd 173 {
elmbed 17:d8b901d791fd 174 DEBUG("get next freeform\r\n");
elmbed 17:d8b901d791fd 175 ++active_cone;//getRandomCone();
elmbed 17:d8b901d791fd 176 if (active_cone > 6)
elmbed 17:d8b901d791fd 177 {
elmbed 17:d8b901d791fd 178 active_cone = 1;
elmbed 17:d8b901d791fd 179 }
elmbed 17:d8b901d791fd 180 mask = 0x07;
elmbed 17:d8b901d791fd 181 ta.setMask(mask & LIGHTS);
elmbed 17:d8b901d791fd 182 timeout = ~0;
elmbed 17:d8b901d791fd 183 return;
elmbed 17:d8b901d791fd 184 }
elmbed 17:d8b901d791fd 185
elmbed 17:d8b901d791fd 186 active_cone = cones[index];
elmbed 17:d8b901d791fd 187 mask = masks[index];
elmbed 17:d8b901d791fd 188 fakeout = mask & FAKEOUT;
elmbed 17:d8b901d791fd 189 fail_quick = mask & FAIL_QUICK;
elmbed 17:d8b901d791fd 190 timeout = times[index];
elmbed 17:d8b901d791fd 191 index++;
elmbed 17:d8b901d791fd 192 DEBUG("Next cone is \n");
elmbed 17:d8b901d791fd 193 DEBUG("%d\n",active_cone);
elmbed 17:d8b901d791fd 194 }
elmbed 18:affef3a7db2a 195 #if 1
elmbed 17:d8b901d791fd 196 void spin()
elmbed 17:d8b901d791fd 197 {
elmbed 17:d8b901d791fd 198
elmbed 17:d8b901d791fd 199 static patternState_t last_state = START_P;
elmbed 17:d8b901d791fd 200 static uint8_t last_cone = 255;
elmbed 17:d8b901d791fd 201 static unsigned long start;
elmbed 17:d8b901d791fd 202 static unsigned long timer;
elmbed 17:d8b901d791fd 203 static bool first; // first should be true when we first enter a state (even if we just exited the same state)
elmbed 17:d8b901d791fd 204 char command = 'n';
elmbed 17:d8b901d791fd 205 unsigned long value = 0;
elmbed 17:d8b901d791fd 206
elmbed 17:d8b901d791fd 207 m_in->command = 0;
elmbed 17:d8b901d791fd 208 m_in->value = 0;
elmbed 17:d8b901d791fd 209 m_in->cone = 0;
elmbed 17:d8b901d791fd 210
elmbed 17:d8b901d791fd 211 if(ta.recieve(m_in))
elmbed 17:d8b901d791fd 212 {
elmbed 17:d8b901d791fd 213 DEBUG("spin received: %d '%c'\r\n", m_in->cone, m_in->command);
elmbed 17:d8b901d791fd 214 command = m_in->command;
elmbed 17:d8b901d791fd 215 value = m_in->value;
elmbed 17:d8b901d791fd 216 }
elmbed 17:d8b901d791fd 217
elmbed 17:d8b901d791fd 218 first = false;
elmbed 17:d8b901d791fd 219
elmbed 17:d8b901d791fd 220 if(last_state != state_p || new_state)
elmbed 17:d8b901d791fd 221 {
elmbed 17:d8b901d791fd 222 if(state_p == START_P)
elmbed 17:d8b901d791fd 223 DEBUG("State is START\n");
elmbed 17:d8b901d791fd 224 if(state_p == WAITING_P)
elmbed 17:d8b901d791fd 225 DEBUG("State is WAITING\n");
elmbed 17:d8b901d791fd 226 if(state_p == ACTIVE_TARGET_P)
elmbed 17:d8b901d791fd 227 DEBUG("State is ACTIVE_TARGET\n");
elmbed 17:d8b901d791fd 228 if(state_p == IDLE_P)
elmbed 17:d8b901d791fd 229 DEBUG("State is IDLE\n");
elmbed 17:d8b901d791fd 230 if(state_p == FAIL_P)
elmbed 17:d8b901d791fd 231 DEBUG("State is FAIL\n");
elmbed 17:d8b901d791fd 232 if(state_p == SUCCESS_P)
elmbed 17:d8b901d791fd 233 DEBUG("State is SUCCESS)\n");
elmbed 17:d8b901d791fd 234
elmbed 17:d8b901d791fd 235 first = true;
elmbed 17:d8b901d791fd 236 new_state = false;
elmbed 17:d8b901d791fd 237 }
elmbed 17:d8b901d791fd 238
elmbed 17:d8b901d791fd 239 last_state = state_p;
elmbed 17:d8b901d791fd 240 last_cone = active_cone;
elmbed 17:d8b901d791fd 241
elmbed 17:d8b901d791fd 242 timer = millis() - start;
elmbed 17:d8b901d791fd 243
elmbed 17:d8b901d791fd 244 switch(state_p)
elmbed 17:d8b901d791fd 245 {
elmbed 17:d8b901d791fd 246 case IDLE_P:
elmbed 17:d8b901d791fd 247 if(!in_menu)
elmbed 17:d8b901d791fd 248 ta.post_color((ta.activated())?0xFF:0xFF0000);
elmbed 17:d8b901d791fd 249 break;
elmbed 17:d8b901d791fd 250
elmbed 17:d8b901d791fd 251 case START_P:
elmbed 17:d8b901d791fd 252 //clearCones();
elmbed 17:d8b901d791fd 253 tag_start = false;
elmbed 17:d8b901d791fd 254 ta.post_color(0xFF0000);
elmbed 17:d8b901d791fd 255 index = 0;
elmbed 17:d8b901d791fd 256 getNext();
elmbed 17:d8b901d791fd 257
elmbed 17:d8b901d791fd 258 if(timeout == 0)
elmbed 17:d8b901d791fd 259 { // timeout of 0 means wait indefinitely for the first cone to be activated, then start the rest of the sequence
elmbed 17:d8b901d791fd 260 timeout = ~0;
elmbed 17:d8b901d791fd 261 tag_start = true;
elmbed 17:d8b901d791fd 262 DEBUG("Activate cone ");
elmbed 17:d8b901d791fd 263 DEBUG("%d",active_cone);
elmbed 17:d8b901d791fd 264 DEBUG(" to start.\n");
elmbed 17:d8b901d791fd 265 }
elmbed 17:d8b901d791fd 266
elmbed 17:d8b901d791fd 267 start = millis();
elmbed 17:d8b901d791fd 268 state_p = stateFromCone(active_cone);
elmbed 17:d8b901d791fd 269 if(active_cone == 0)
elmbed 17:d8b901d791fd 270 { // in this case stateFromCone returns SUCCESS_P, but really there was no course sequence
elmbed 17:d8b901d791fd 271 DEBUG("\n");
elmbed 17:d8b901d791fd 272 DEBUG("Empty course sequence!\n");
elmbed 17:d8b901d791fd 273 ta.post_color(0x0000FF);
elmbed 17:d8b901d791fd 274 state_p = IDLE_P;
elmbed 17:d8b901d791fd 275 break;
elmbed 17:d8b901d791fd 276 }
elmbed 17:d8b901d791fd 277 break;
elmbed 17:d8b901d791fd 278
elmbed 17:d8b901d791fd 279 case WAITING_P:
elmbed 17:d8b901d791fd 280 if(first)
elmbed 17:d8b901d791fd 281 {
elmbed 17:d8b901d791fd 282 m->command = 'm';
elmbed 17:d8b901d791fd 283 m->value = mask;
elmbed 17:d8b901d791fd 284 m->cone = active_cone;
elmbed 17:d8b901d791fd 285 ta.send(m);
elmbed 17:d8b901d791fd 286 m->command = 't';
elmbed 17:d8b901d791fd 287 m->value = (uint32_t)timeout;
elmbed 17:d8b901d791fd 288 ta.send(m);
elmbed 17:d8b901d791fd 289 m->command = 'g';
elmbed 17:d8b901d791fd 290 ta.send(m);
elmbed 17:d8b901d791fd 291
elmbed 17:d8b901d791fd 292 DEBUG("m_in cone=%d\n", active_cone);
elmbed 17:d8b901d791fd 293 m_in->cone = active_cone;
elmbed 17:d8b901d791fd 294 command = 'd';
elmbed 17:d8b901d791fd 295
elmbed 17:d8b901d791fd 296 }
elmbed 17:d8b901d791fd 297
elmbed 17:d8b901d791fd 298 ta.post_color(( ta.activated())?0xFF:0xFF0000);
elmbed 17:d8b901d791fd 299
elmbed 17:d8b901d791fd 300 DEBUG("Waiting: %d %d %c\n", m_in->cone, active_cone, command);
elmbed 17:d8b901d791fd 301
elmbed 17:d8b901d791fd 302 if((m_in->cone == active_cone && command == 'd' ) || ((timer >= timeout) && fakeout))
elmbed 17:d8b901d791fd 303 {
elmbed 17:d8b901d791fd 304 if((timer >= timeout) && !fakeout)
elmbed 17:d8b901d791fd 305 {
elmbed 17:d8b901d791fd 306 DEBUG("Timesplit penalty! ");
elmbed 17:d8b901d791fd 307 }
elmbed 17:d8b901d791fd 308 printSplit(timer);
elmbed 17:d8b901d791fd 309 getNext();
elmbed 17:d8b901d791fd 310 start = millis();
elmbed 17:d8b901d791fd 311
elmbed 17:d8b901d791fd 312 state_p = stateFromCone(active_cone);
elmbed 17:d8b901d791fd 313
elmbed 17:d8b901d791fd 314 if(state_p == WAITING_P)
elmbed 17:d8b901d791fd 315 {
elmbed 17:d8b901d791fd 316 DEBUG("New state from waiting\n");
elmbed 17:d8b901d791fd 317 new_state = true;
elmbed 17:d8b901d791fd 318 }
elmbed 17:d8b901d791fd 319 }
elmbed 17:d8b901d791fd 320 else if(~timeout != 0 && mode == PATTERN && timer >= (timeout + ((fail_quick)?0:GRACE_PERIOD)))
elmbed 17:d8b901d791fd 321 {
elmbed 17:d8b901d791fd 322 DEBUG("Failing from wait\n");
elmbed 17:d8b901d791fd 323 state_p = FAIL_P;
elmbed 17:d8b901d791fd 324 }
elmbed 17:d8b901d791fd 325 break;
elmbed 17:d8b901d791fd 326
elmbed 17:d8b901d791fd 327 case ACTIVE_TARGET_P:
elmbed 17:d8b901d791fd 328 if(first)
elmbed 17:d8b901d791fd 329 {
elmbed 17:d8b901d791fd 330 ta.setMask(mask);
elmbed 17:d8b901d791fd 331
elmbed 17:d8b901d791fd 332 warning = false;
elmbed 17:d8b901d791fd 333 penalty = false;
elmbed 17:d8b901d791fd 334 ta.pulse(50,750,~0L,0x00FF00);
elmbed 17:d8b901d791fd 335 //if(!(mask & SILENT))ta.pulse(50,750,~0L,0c00FF00);
elmbed 17:d8b901d791fd 336 }
elmbed 17:d8b901d791fd 337 if(timer >= timeout)
elmbed 17:d8b901d791fd 338 {
elmbed 17:d8b901d791fd 339 if(!penalty)
elmbed 17:d8b901d791fd 340 {
elmbed 17:d8b901d791fd 341 ta.pulse(50,325,~0L,0xFF00FF);
elmbed 17:d8b901d791fd 342
elmbed 17:d8b901d791fd 343 penalty = true;
elmbed 17:d8b901d791fd 344 }
elmbed 17:d8b901d791fd 345 ta.mask_color(0xFF00FF);
elmbed 17:d8b901d791fd 346 }
elmbed 17:d8b901d791fd 347 else if(timer > ((timeout*3)/4) && !warning)
elmbed 17:d8b901d791fd 348 {
elmbed 17:d8b901d791fd 349 warning = true;
elmbed 17:d8b901d791fd 350 ta.pulse(50,750,~0L,0xFFFF00);
elmbed 17:d8b901d791fd 351 }
elmbed 17:d8b901d791fd 352
elmbed 17:d8b901d791fd 353 if(ta.activated() || ((timer >= timeout) && fakeout))
elmbed 17:d8b901d791fd 354 {
elmbed 17:d8b901d791fd 355 if((timer >= timeout) && !fakeout)
elmbed 17:d8b901d791fd 356 DEBUG("Timesplit penalty! ");
elmbed 17:d8b901d791fd 357
elmbed 17:d8b901d791fd 358 printSplit(timer);
elmbed 17:d8b901d791fd 359 ta.post_color(0xFF0000);
elmbed 17:d8b901d791fd 360 getNext();
elmbed 17:d8b901d791fd 361 start = millis();
elmbed 17:d8b901d791fd 362 state_p = stateFromCone(active_cone);
elmbed 17:d8b901d791fd 363
elmbed 17:d8b901d791fd 364 if(state_p == ACTIVE_TARGET_P)
elmbed 17:d8b901d791fd 365 new_state = true;
elmbed 17:d8b901d791fd 366 ta.pulse_off();
elmbed 17:d8b901d791fd 367
elmbed 17:d8b901d791fd 368 }
elmbed 17:d8b901d791fd 369 else if(~timeout != 0 && mode == PATTERN && timer >= (timeout + ((fail_quick)?0:GRACE_PERIOD)))
elmbed 17:d8b901d791fd 370 {
elmbed 17:d8b901d791fd 371 state_p = FAIL_P;
elmbed 17:d8b901d791fd 372 ta.pulse_off();
elmbed 17:d8b901d791fd 373 }
elmbed 17:d8b901d791fd 374 //DEBUG.println(timeout + ((fail_quick)?0:GRACE_PERIOD));
elmbed 17:d8b901d791fd 375 //DEBUG.println(timeout);
elmbed 17:d8b901d791fd 376
elmbed 17:d8b901d791fd 377 break;
elmbed 17:d8b901d791fd 378
elmbed 17:d8b901d791fd 379 case FAIL_P:
elmbed 17:d8b901d791fd 380 if(first)
elmbed 17:d8b901d791fd 381 {
elmbed 17:d8b901d791fd 382 start = millis();
elmbed 17:d8b901d791fd 383 DEBUG("\n");
elmbed 17:d8b901d791fd 384 DEBUG("Timeout\n");
elmbed 17:d8b901d791fd 385 //ta.post_color();
elmbed 17:d8b901d791fd 386 ta.pulse(25,200,3000,0xFF0000);
elmbed 17:d8b901d791fd 387
elmbed 17:d8b901d791fd 388 failCones();
elmbed 17:d8b901d791fd 389 //ta.fail();
elmbed 17:d8b901d791fd 390 }
elmbed 17:d8b901d791fd 391 else if(timer > 3000)
elmbed 17:d8b901d791fd 392 {
elmbed 17:d8b901d791fd 393 DEBUG("Clear!\n");
elmbed 17:d8b901d791fd 394 state_p = IDLE_P;
elmbed 17:d8b901d791fd 395 clearCones();
elmbed 17:d8b901d791fd 396 }
elmbed 17:d8b901d791fd 397 break;
elmbed 17:d8b901d791fd 398 case SUCCESS_P:
elmbed 17:d8b901d791fd 399 if(first)
elmbed 17:d8b901d791fd 400 {
elmbed 17:d8b901d791fd 401 start = millis();
elmbed 17:d8b901d791fd 402 DEBUG("\n");
elmbed 17:d8b901d791fd 403 DEBUG("Done!\n");
elmbed 17:d8b901d791fd 404 ta.post_color(0x00FF00);
elmbed 17:d8b901d791fd 405 ta.beep(1500);
elmbed 17:d8b901d791fd 406 successCones();
elmbed 17:d8b901d791fd 407 //ta.success();
elmbed 17:d8b901d791fd 408 }
elmbed 17:d8b901d791fd 409 else if(timer > 1500)
elmbed 17:d8b901d791fd 410 {
elmbed 17:d8b901d791fd 411 DEBUG("Clear!\n");
elmbed 17:d8b901d791fd 412 state_p = IDLE_P;
elmbed 17:d8b901d791fd 413 clearCones();
elmbed 17:d8b901d791fd 414 }
elmbed 17:d8b901d791fd 415 break;
elmbed 17:d8b901d791fd 416
elmbed 17:d8b901d791fd 417 default:
elmbed 17:d8b901d791fd 418 break;
elmbed 17:d8b901d791fd 419 }
elmbed 17:d8b901d791fd 420
elmbed 17:d8b901d791fd 421 }
elmbed 18:affef3a7db2a 422 #endif
elmbed 18:affef3a7db2a 423
elmbed 18:affef3a7db2a 424 #if 0
elmbed 18:affef3a7db2a 425 void clearCones()
elmbed 18:affef3a7db2a 426 {
elmbed 18:affef3a7db2a 427
elmbed 18:affef3a7db2a 428 }
elmbed 18:affef3a7db2a 429
elmbed 18:affef3a7db2a 430 void find_cones()
elmbed 18:affef3a7db2a 431 {
elmbed 18:affef3a7db2a 432
elmbed 18:affef3a7db2a 433 }
elmbed 18:affef3a7db2a 434
elmbed 18:affef3a7db2a 435 void powerupCones(unsigned char c)
elmbed 18:affef3a7db2a 436 {
elmbed 18:affef3a7db2a 437
elmbed 18:affef3a7db2a 438 }
elmbed 18:affef3a7db2a 439
elmbed 18:affef3a7db2a 440 void resetSensors()
elmbed 18:affef3a7db2a 441 {
elmbed 18:affef3a7db2a 442
elmbed 18:affef3a7db2a 443 }
elmbed 18:affef3a7db2a 444
elmbed 18:affef3a7db2a 445 void printMsAsSeconds(unsigned long)
elmbed 18:affef3a7db2a 446 {
elmbed 18:affef3a7db2a 447
elmbed 18:affef3a7db2a 448 }
elmbed 18:affef3a7db2a 449 #endif
elmbed 17:d8b901d791fd 450
elmbed 17:d8b901d791fd 451 void getRadioInput(char *ibuffer, int size)
elmbed 17:d8b901d791fd 452 {
elmbed 17:d8b901d791fd 453 static int i = 0;
elmbed 17:d8b901d791fd 454 int buffer_counter = 0;
elmbed 17:d8b901d791fd 455 static char parameter = '_';
elmbed 17:d8b901d791fd 456 static char buffer[MAX_LEN + 1];
elmbed 17:d8b901d791fd 457 int value = 0;
elmbed 17:d8b901d791fd 458 char *endp = NULL;
elmbed 17:d8b901d791fd 459
elmbed 17:d8b901d791fd 460 // listen for commands coming over bluetooth
elmbed 17:d8b901d791fd 461 while (buffer_counter < size)
elmbed 17:d8b901d791fd 462 {
elmbed 17:d8b901d791fd 463 char ch = ibuffer[buffer_counter++];
elmbed 17:d8b901d791fd 464
elmbed 17:d8b901d791fd 465 if((ch == '\r' || ch == ';' || ch == '\n') && parameter != '_')
elmbed 17:d8b901d791fd 466 {
elmbed 17:d8b901d791fd 467 if(i > 1)
elmbed 17:d8b901d791fd 468 {
elmbed 17:d8b901d791fd 469 buffer[i-1] = 0;
elmbed 17:d8b901d791fd 470 value = atoi(buffer);
elmbed 17:d8b901d791fd 471
elmbed 17:d8b901d791fd 472 if(parameter == 'l')
elmbed 17:d8b901d791fd 473 value = strtoul(buffer, &endp, 2);
elmbed 17:d8b901d791fd 474 }
elmbed 18:affef3a7db2a 475
elmbed 17:d8b901d791fd 476 interpret(parameter, value);
elmbed 17:d8b901d791fd 477 DEBUG("After interp: '%c'\r\n", parameter);
elmbed 17:d8b901d791fd 478 parameter = '_';
elmbed 17:d8b901d791fd 479 buffer[0] = 0;
elmbed 17:d8b901d791fd 480 i=0;
elmbed 17:d8b901d791fd 481 }
elmbed 17:d8b901d791fd 482 else
elmbed 17:d8b901d791fd 483 {
elmbed 17:d8b901d791fd 484 if(i==0)
elmbed 17:d8b901d791fd 485 parameter = ch;
elmbed 17:d8b901d791fd 486 else
elmbed 17:d8b901d791fd 487 buffer[i-1] = ch;
elmbed 17:d8b901d791fd 488 i++;
elmbed 17:d8b901d791fd 489 }
elmbed 17:d8b901d791fd 490
elmbed 17:d8b901d791fd 491 if(ch == '_' || ch == '\r' || ch == ';' || ch == '\n')
elmbed 17:d8b901d791fd 492 {
elmbed 17:d8b901d791fd 493 parameter = '_';
elmbed 17:d8b901d791fd 494 buffer[0] = 0;
elmbed 17:d8b901d791fd 495 i=0;
elmbed 17:d8b901d791fd 496 }
elmbed 17:d8b901d791fd 497 }
elmbed 17:d8b901d791fd 498 }
elmbed 17:d8b901d791fd 499
elmbed 17:d8b901d791fd 500 void interpret(char parameter, int value)
elmbed 17:d8b901d791fd 501 {
elmbed 18:affef3a7db2a 502 int remainder;
elmbed 18:affef3a7db2a 503 uint16_t split;
elmbed 18:affef3a7db2a 504 uint16_t t;
elmbed 18:affef3a7db2a 505 uint8_t c;
elmbed 18:affef3a7db2a 506 uint8_t l;
elmbed 18:affef3a7db2a 507 int last;
elmbed 18:affef3a7db2a 508 int middle;
elmbed 18:affef3a7db2a 509 uint8_t length;
elmbed 18:affef3a7db2a 510 uint8_t offset;
elmbed 18:affef3a7db2a 511 int i;
elmbed 18:affef3a7db2a 512 uint8_t v;
elmbed 18:affef3a7db2a 513 uint16_t val;
elmbed 17:d8b901d791fd 514
elmbed 17:d8b901d791fd 515 switch(parameter)
elmbed 17:d8b901d791fd 516 {
elmbed 17:d8b901d791fd 517 case 'f':
elmbed 17:d8b901d791fd 518 if(lonely)
elmbed 17:d8b901d791fd 519 {
elmbed 18:affef3a7db2a 520 writeToPhone("Sorry, no other cones detected, please try detecting cones first.\r\n");
elmbed 17:d8b901d791fd 521 break;
elmbed 17:d8b901d791fd 522 }
elmbed 18:affef3a7db2a 523
elmbed 18:affef3a7db2a 524 writeToPhone("Entered freeform\r\n");
elmbed 17:d8b901d791fd 525 mode = FREEFORM;
elmbed 17:d8b901d791fd 526 state_p = START_P;
elmbed 17:d8b901d791fd 527 clearCones();
elmbed 18:affef3a7db2a 528 //find_cones();
elmbed 17:d8b901d791fd 529 break;
elmbed 17:d8b901d791fd 530 case 'p':
elmbed 17:d8b901d791fd 531 if(value == 0)
elmbed 17:d8b901d791fd 532 {
elmbed 18:affef3a7db2a 533 writeToPhone("\r\n");
elmbed 18:affef3a7db2a 534 writeToPhone("Running pattern %d\r\n", active_sequence + 1);
elmbed 18:affef3a7db2a 535
elmbed 17:d8b901d791fd 536 mode = PATTERN;
elmbed 17:d8b901d791fd 537 state_p = START_P;
elmbed 17:d8b901d791fd 538 active_cone = 0;
elmbed 18:affef3a7db2a 539
elmbed 17:d8b901d791fd 540 clearCones();
elmbed 17:d8b901d791fd 541 }
elmbed 17:d8b901d791fd 542 else
elmbed 17:d8b901d791fd 543 {
elmbed 18:affef3a7db2a 544 writeToPhone("Selected pattern %d\r\n", value);
elmbed 18:affef3a7db2a 545
elmbed 17:d8b901d791fd 546 if(value <= SEQUENCES && value > 0)
elmbed 17:d8b901d791fd 547 {
elmbed 17:d8b901d791fd 548 active_sequence = value - 1;
elmbed 17:d8b901d791fd 549 cones = (uint8_t*)cone_table + (value-1)*STATIONS;
elmbed 17:d8b901d791fd 550 times = (uint16_t*)time_table + (value-1)*STATIONS;
elmbed 17:d8b901d791fd 551 masks = (uint8_t*)mask_table + (value-1)*STATIONS;
elmbed 17:d8b901d791fd 552 }
elmbed 17:d8b901d791fd 553 else
elmbed 17:d8b901d791fd 554 {
elmbed 18:affef3a7db2a 555 writeToPhone("This pattern is not available. Please select a value between 1 and %d", SEQUENCES);
elmbed 17:d8b901d791fd 556 }
elmbed 17:d8b901d791fd 557 }
elmbed 17:d8b901d791fd 558 break;
elmbed 17:d8b901d791fd 559 case 's':
elmbed 17:d8b901d791fd 560 station = value;
AntonLS 19:afcbb425b3cf 561 writeToPhone("Selected station %d\r\n", value);
elmbed 17:d8b901d791fd 562 break;
elmbed 17:d8b901d791fd 563 case 'd':
elmbed 18:affef3a7db2a 564 if(value == 0){
elmbed 17:d8b901d791fd 565 logging = false;
elmbed 17:d8b901d791fd 566 m->value = 0;
elmbed 17:d8b901d791fd 567 dist_timeout = micros() + 2000000;
elmbed 17:d8b901d791fd 568 }
elmbed 18:affef3a7db2a 569 if(value == 1){
elmbed 17:d8b901d791fd 570 logging = true;
elmbed 17:d8b901d791fd 571 m->value = 1;
elmbed 17:d8b901d791fd 572 }
elmbed 17:d8b901d791fd 573 m->command = 'd';
elmbed 17:d8b901d791fd 574 m->cone = TRILAT_CONE;
elmbed 17:d8b901d791fd 575 ta.send(m);
elmbed 18:affef3a7db2a 576 //Serial.print("Sent d");
elmbed 18:affef3a7db2a 577 //Serial.println(value);
elmbed 17:d8b901d791fd 578 break;
elmbed 17:d8b901d791fd 579 case 'c':
elmbed 17:d8b901d791fd 580 c = value;
elmbed 18:affef3a7db2a 581 writeToPhone("Station %d will be cone %d\r\n", station, value);
elmbed 18:affef3a7db2a 582 if(station <= STATIONS && station > 0)cones[station-1] = c;
elmbed 17:d8b901d791fd 583 break;
elmbed 17:d8b901d791fd 584 case 't':
elmbed 17:d8b901d791fd 585 t = (uint16_t)value;
elmbed 17:d8b901d791fd 586 remainder = t%1000;
AntonLS 19:afcbb425b3cf 587 writeToPhone("Station %d split time is: %d.%03d seconds.\r\n", station, t/1000, remainder);
AntonLS 19:afcbb425b3cf 588 /// if(remainder < 100)writeToPhone("0");
AntonLS 19:afcbb425b3cf 589 /// if(remainder < 10)writeToPhone("0");
AntonLS 19:afcbb425b3cf 590 /// writeToPhone("%d seconds.\r\n",remainder);
elmbed 18:affef3a7db2a 591 if(station <= STATIONS && station > 0)times[station-1] = t;
elmbed 17:d8b901d791fd 592 break;
elmbed 17:d8b901d791fd 593 case 'l':
elmbed 17:d8b901d791fd 594 l = 0;
elmbed 17:d8b901d791fd 595 l = (uint8_t)value;
elmbed 17:d8b901d791fd 596 masks[station-1] = l;
AntonLS 19:afcbb425b3cf 597 writeToPhone( "Station %d config bits: ", station );
AntonLS 19:afcbb425b3cf 598 writeBitsToPhone( l );
AntonLS 19:afcbb425b3cf 599 writeToPhone( "\r\n" );
elmbed 17:d8b901d791fd 600 break;
elmbed 17:d8b901d791fd 601 case 'q':
elmbed 17:d8b901d791fd 602 state_p = IDLE_P;
elmbed 17:d8b901d791fd 603 new_state = true; // force state reporting, even if we're already in IDLE
elmbed 17:d8b901d791fd 604 ta.pulse_off();
elmbed 17:d8b901d791fd 605 clearCones();
elmbed 17:d8b901d791fd 606 break;
elmbed 17:d8b901d791fd 607 case 'r':
elmbed 18:affef3a7db2a 608 //Serial.println(F(""));
AntonLS 19:afcbb425b3cf 609 writeToPhone("Current pattern is %d:\r\n", active_sequence+1);
elmbed 18:affef3a7db2a 610 for(int i=0; i<STATIONS; i++){
elmbed 18:affef3a7db2a 611 writeToPhone("Station %d: cone %d, ", i+1, cones[i]);
elmbed 17:d8b901d791fd 612 split = times[i];
AntonLS 19:afcbb425b3cf 613 printMsAsSeconds(split);
elmbed 18:affef3a7db2a 614 //Serial.print(F("s timeout, lights: "));
elmbed 18:affef3a7db2a 615 writeToPhone("s timeout, config bits: ");
elmbed 17:d8b901d791fd 616 l = masks[i];
elmbed 17:d8b901d791fd 617 /*
elmbed 18:affef3a7db2a 618 if(l<0b10000000)
elmbed 18:affef3a7db2a 619 writeToPhone("0");
elmbed 18:affef3a7db2a 620 if(l<0b1000000)
elmbed 18:affef3a7db2a 621 writeToPhone("0");
elmbed 18:affef3a7db2a 622 if(l<0b100000)
elmbed 18:affef3a7db2a 623 writeToPhone("0");
elmbed 18:affef3a7db2a 624 if(l<0b10000)
elmbed 18:affef3a7db2a 625 writeToPhone("0");
elmbed 18:affef3a7db2a 626 if(l<0b1000)
elmbed 18:affef3a7db2a 627 writeToPhone("0");
elmbed 18:affef3a7db2a 628 if(l<0b100)
elmbed 18:affef3a7db2a 629 writeToPhone("0");
elmbed 18:affef3a7db2a 630 if(l<0b10)
elmbed 18:affef3a7db2a 631 writeToPhone("0");
elmbed 18:affef3a7db2a 632 */
AntonLS 19:afcbb425b3cf 633 writeBitsToPhone( l, 3 );
AntonLS 19:afcbb425b3cf 634 writeToPhone( "\r\n" );
elmbed 18:affef3a7db2a 635 //Serial.println(l, BIN);
elmbed 17:d8b901d791fd 636 }
elmbed 17:d8b901d791fd 637 break;
elmbed 17:d8b901d791fd 638 case 'u':
elmbed 17:d8b901d791fd 639 // let any pending messages clear
elmbed 18:affef3a7db2a 640 while(ta.get_buffer_size()){
elmbed 17:d8b901d791fd 641 ta.spin();
elmbed 17:d8b901d791fd 642 }
elmbed 18:affef3a7db2a 643 if(value == 1){
elmbed 18:affef3a7db2a 644 writeToPhone("Course leader!\r\n");
elmbed 17:d8b901d791fd 645 powerupCones(value);
elmbed 17:d8b901d791fd 646 ta.powerup(value);
elmbed 17:d8b901d791fd 647 }
elmbed 18:affef3a7db2a 648 if(value == 2){
elmbed 18:affef3a7db2a 649 writeToPhone("Split leader!\r\n");
elmbed 17:d8b901d791fd 650 powerupCones(value);
elmbed 18:affef3a7db2a 651 //ta.powerup(value);
elmbed 17:d8b901d791fd 652 }
elmbed 18:affef3a7db2a 653 if(value > 10 && value < 5000){
elmbed 17:d8b901d791fd 654 ta.beep(value);
elmbed 17:d8b901d791fd 655 }
elmbed 17:d8b901d791fd 656 break;
elmbed 17:d8b901d791fd 657 case 'w':
elmbed 18:affef3a7db2a 658 if(value > 0 && value <= SEQUENCES){
elmbed 17:d8b901d791fd 659 length = STATIONS;
elmbed 17:d8b901d791fd 660 offset = (value - 1) * STATIONS;
elmbed 18:affef3a7db2a 661 writeToPhone("Saved sequence %d\r\n", value);
elmbed 17:d8b901d791fd 662 }
elmbed 18:affef3a7db2a 663 else{
elmbed 17:d8b901d791fd 664 length = STATIONS * SEQUENCES;
elmbed 17:d8b901d791fd 665 offset = 0;
elmbed 18:affef3a7db2a 666 writeToPhone("Saved all sequences.\r\n");
elmbed 17:d8b901d791fd 667 }
elmbed 18:affef3a7db2a 668 for(i=offset;i<length+offset;i++){
elmbed 18:affef3a7db2a 669 //eeprom_update_byte(addressConeTable + i, cone_table[i]);
elmbed 18:affef3a7db2a 670 //eeprom_update_byte(addressMaskTable + i, mask_table[i]);
elmbed 18:affef3a7db2a 671 //eeprom_update_word(addressTimeTable + i, time_table[i]);
elmbed 17:d8b901d791fd 672 }
elmbed 17:d8b901d791fd 673 break;
elmbed 17:d8b901d791fd 674 case 'x':
elmbed 17:d8b901d791fd 675 resetSensors();
elmbed 18:affef3a7db2a 676 //digitalWrite(A3, LOW);
elmbed 18:affef3a7db2a 677 //delay(100);
elmbed 18:affef3a7db2a 678 //digitalWrite(A3, HIGH);
elmbed 17:d8b901d791fd 679 break;
elmbed 17:d8b901d791fd 680
elmbed 17:d8b901d791fd 681 case 'z':
elmbed 17:d8b901d791fd 682 find_cones();
elmbed 18:affef3a7db2a 683 /*m->value = value;
elmbed 17:d8b901d791fd 684 m->command = 'z';
elmbed 17:d8b901d791fd 685 m->cone = 2;
elmbed 18:affef3a7db2a 686 Serial.println("sending...");
elmbed 17:d8b901d791fd 687 ta.send(m);
elmbed 18:affef3a7db2a 688 Serial.println("sent");*/
elmbed 17:d8b901d791fd 689 break;
elmbed 17:d8b901d791fd 690 }
elmbed 17:d8b901d791fd 691 }
elmbed 18:affef3a7db2a 692 #if 1
elmbed 17:d8b901d791fd 693 patternState_t stateFromCone(uint8_t cone)
elmbed 17:d8b901d791fd 694 {
elmbed 17:d8b901d791fd 695 if(cone == 0 || index == STATIONS)
elmbed 17:d8b901d791fd 696 return SUCCESS_P;
elmbed 17:d8b901d791fd 697 if(cone == 1)
elmbed 17:d8b901d791fd 698 return ACTIVE_TARGET_P;
elmbed 17:d8b901d791fd 699
elmbed 17:d8b901d791fd 700 return WAITING_P;
elmbed 17:d8b901d791fd 701 }
elmbed 17:d8b901d791fd 702
elmbed 17:d8b901d791fd 703 void printSplit(unsigned long timer)
elmbed 17:d8b901d791fd 704 {
elmbed 17:d8b901d791fd 705 if(tag_start)
elmbed 17:d8b901d791fd 706 {
elmbed 17:d8b901d791fd 707 //DEBUG("Sequence started at cone ");
elmbed 17:d8b901d791fd 708 //DEBUG("%d",active_cone);
elmbed 17:d8b901d791fd 709 //DEBUG(" (");
elmbed 17:d8b901d791fd 710 printMsAsSeconds(timer);
elmbed 17:d8b901d791fd 711 //DEBUG(" seconds).\n");
elmbed 17:d8b901d791fd 712 tag_start = false;
elmbed 17:d8b901d791fd 713 }
elmbed 17:d8b901d791fd 714 else
elmbed 17:d8b901d791fd 715 {
elmbed 17:d8b901d791fd 716 //DEBUG("Target cone is: ");
elmbed 17:d8b901d791fd 717 //DEBUG("%d",active_cone);
elmbed 17:d8b901d791fd 718 //DEBUG(", ");
elmbed 17:d8b901d791fd 719 printMsAsSeconds(timer);
elmbed 17:d8b901d791fd 720 //DEBUG(" split");
elmbed 17:d8b901d791fd 721 }
elmbed 17:d8b901d791fd 722 }
elmbed 17:d8b901d791fd 723
elmbed 17:d8b901d791fd 724 uint8_t getRandomCone(void)
elmbed 17:d8b901d791fd 725 {
elmbed 17:d8b901d791fd 726 static uint8_t lastCone = 0;
elmbed 17:d8b901d791fd 727 uint8_t cone;
elmbed 17:d8b901d791fd 728
elmbed 17:d8b901d791fd 729 do
elmbed 17:d8b901d791fd 730 {
elmbed 17:d8b901d791fd 731 cone = random(1, NUM_CONES + 1);
elmbed 17:d8b901d791fd 732 }
elmbed 17:d8b901d791fd 733 while(cone == lastCone || active_cones[cone] == false);
elmbed 17:d8b901d791fd 734
elmbed 17:d8b901d791fd 735 //DEBUG("Target cone is ");
elmbed 17:d8b901d791fd 736 //DEBUG("%d\n",cone);
elmbed 17:d8b901d791fd 737 lastCone = cone;
elmbed 17:d8b901d791fd 738 return cone;
elmbed 17:d8b901d791fd 739 }
elmbed 17:d8b901d791fd 740
elmbed 17:d8b901d791fd 741 void clearCones(void)
elmbed 17:d8b901d791fd 742 {
elmbed 17:d8b901d791fd 743 uint8_t i;
elmbed 17:d8b901d791fd 744 m->command = 'q';
elmbed 17:d8b901d791fd 745
elmbed 17:d8b901d791fd 746 for(i=2;i<NUM_CONES+1;i++)
elmbed 17:d8b901d791fd 747 {
elmbed 17:d8b901d791fd 748 m->cone = i;
elmbed 17:d8b901d791fd 749 if(active_cones[i])
elmbed 17:d8b901d791fd 750 ta.send(m);
elmbed 17:d8b901d791fd 751 active_cones[i] = false;
elmbed 17:d8b901d791fd 752 //ta.send("q", i);
elmbed 17:d8b901d791fd 753 }
elmbed 17:d8b901d791fd 754
elmbed 17:d8b901d791fd 755 DEBUG("sent clear\r\n");
elmbed 17:d8b901d791fd 756 }
elmbed 17:d8b901d791fd 757
elmbed 17:d8b901d791fd 758 void powerupCones(uint8_t sound)
elmbed 17:d8b901d791fd 759 {
elmbed 17:d8b901d791fd 760 uint8_t i;
elmbed 17:d8b901d791fd 761 m->command = 'u';
elmbed 17:d8b901d791fd 762 m->value = sound;
elmbed 17:d8b901d791fd 763
elmbed 17:d8b901d791fd 764 if(sound == 2)
elmbed 17:d8b901d791fd 765 {
elmbed 17:d8b901d791fd 766 if(active_cone == ADDRESS)
elmbed 17:d8b901d791fd 767 {
elmbed 17:d8b901d791fd 768 ta.powerup(sound);
elmbed 17:d8b901d791fd 769 }
elmbed 17:d8b901d791fd 770 else
elmbed 17:d8b901d791fd 771 {
elmbed 17:d8b901d791fd 772 m->cone = active_cone;
elmbed 17:d8b901d791fd 773 ta.send(m);
elmbed 17:d8b901d791fd 774 }
elmbed 17:d8b901d791fd 775 }
elmbed 17:d8b901d791fd 776 else
elmbed 17:d8b901d791fd 777 {
elmbed 17:d8b901d791fd 778 for(i=2;i<NUM_CONES+1;i++)
elmbed 17:d8b901d791fd 779 {
elmbed 17:d8b901d791fd 780 m->cone = i;
elmbed 17:d8b901d791fd 781 if(active_cones[i])
elmbed 17:d8b901d791fd 782 ta.send(m);
elmbed 17:d8b901d791fd 783 //ta.send("f", i);
elmbed 17:d8b901d791fd 784 }
elmbed 17:d8b901d791fd 785 }
elmbed 17:d8b901d791fd 786
elmbed 17:d8b901d791fd 787 //DEBUG("sent powerup");
elmbed 17:d8b901d791fd 788 }
elmbed 17:d8b901d791fd 789
elmbed 17:d8b901d791fd 790 void failCones(void)
elmbed 17:d8b901d791fd 791 {
elmbed 17:d8b901d791fd 792 uint8_t i;
elmbed 17:d8b901d791fd 793 m->command = 'f';
elmbed 17:d8b901d791fd 794
elmbed 17:d8b901d791fd 795 for(i=2;i<NUM_CONES+1;i++)
elmbed 17:d8b901d791fd 796 {
elmbed 17:d8b901d791fd 797 m->cone = i;
elmbed 17:d8b901d791fd 798
elmbed 17:d8b901d791fd 799 if(active_cones[i])
elmbed 17:d8b901d791fd 800 ta.send(m);
elmbed 17:d8b901d791fd 801 //ta.send("f", i);
elmbed 17:d8b901d791fd 802 }
elmbed 17:d8b901d791fd 803
elmbed 17:d8b901d791fd 804 while(ta.get_buffer_size())
elmbed 17:d8b901d791fd 805 {
elmbed 17:d8b901d791fd 806 ta.spin();
elmbed 17:d8b901d791fd 807 }
elmbed 17:d8b901d791fd 808
elmbed 17:d8b901d791fd 809 //DEBUG("sent fail\n");
elmbed 17:d8b901d791fd 810 }
elmbed 17:d8b901d791fd 811
elmbed 17:d8b901d791fd 812 void resetSensors(void)
elmbed 17:d8b901d791fd 813 {
elmbed 17:d8b901d791fd 814 uint8_t i;
elmbed 17:d8b901d791fd 815 m->command = 'x';
elmbed 17:d8b901d791fd 816
elmbed 17:d8b901d791fd 817 for(i=2;i<NUM_CONES+1;i++)
elmbed 17:d8b901d791fd 818 {
elmbed 17:d8b901d791fd 819 m->cone = i;
elmbed 17:d8b901d791fd 820 if(active_cones[i])
elmbed 17:d8b901d791fd 821 ta.send(m);
elmbed 17:d8b901d791fd 822 //ta.send("f", i);
elmbed 17:d8b901d791fd 823 }
elmbed 17:d8b901d791fd 824
elmbed 17:d8b901d791fd 825 DEBUG("sent sensor reset\n");
elmbed 17:d8b901d791fd 826 }
elmbed 17:d8b901d791fd 827
elmbed 17:d8b901d791fd 828 void successCones(void)
elmbed 17:d8b901d791fd 829 {
elmbed 17:d8b901d791fd 830 uint8_t i;
elmbed 17:d8b901d791fd 831 m->command = 's';
elmbed 17:d8b901d791fd 832
elmbed 17:d8b901d791fd 833 for(i=2;i<NUM_CONES+1;i++)
elmbed 17:d8b901d791fd 834 {
elmbed 17:d8b901d791fd 835 m->cone = i;
elmbed 17:d8b901d791fd 836 if(active_cones[i])
elmbed 17:d8b901d791fd 837 ta.send(m);
elmbed 17:d8b901d791fd 838 //ta.send("s", i);
elmbed 17:d8b901d791fd 839 }
elmbed 17:d8b901d791fd 840
elmbed 17:d8b901d791fd 841 while(ta.get_buffer_size())
elmbed 17:d8b901d791fd 842 {
elmbed 17:d8b901d791fd 843 ta.spin();
elmbed 17:d8b901d791fd 844 }
elmbed 17:d8b901d791fd 845
elmbed 17:d8b901d791fd 846 //DEBUG("sent success\n");
elmbed 17:d8b901d791fd 847 }
elmbed 17:d8b901d791fd 848
elmbed 17:d8b901d791fd 849 void find_cones(void)
elmbed 17:d8b901d791fd 850 {
elmbed 17:d8b901d791fd 851
elmbed 17:d8b901d791fd 852 while(ta.get_buffer_size())
elmbed 17:d8b901d791fd 853 ta.spin(); // wait for all messages to leave queue
elmbed 17:d8b901d791fd 854
elmbed 17:d8b901d791fd 855 uint8_t i;
elmbed 17:d8b901d791fd 856 m->command = 'z';
elmbed 17:d8b901d791fd 857
elmbed 17:d8b901d791fd 858 lonely = true;
elmbed 17:d8b901d791fd 859
elmbed 17:d8b901d791fd 860 DEBUG("Finding cones\r\n");
elmbed 17:d8b901d791fd 861
elmbed 17:d8b901d791fd 862 for(i=2;i<NUM_CONES+1;i++)
elmbed 17:d8b901d791fd 863 {
elmbed 17:d8b901d791fd 864 active_cones[i] = false;
elmbed 17:d8b901d791fd 865 m->cone = i;
elmbed 17:d8b901d791fd 866 ta.send_immediate(m);
elmbed 17:d8b901d791fd 867
elmbed 17:d8b901d791fd 868 unsigned long st = millis();
elmbed 17:d8b901d791fd 869 unsigned long delta = 0;
elmbed 17:d8b901d791fd 870
elmbed 17:d8b901d791fd 871 while(1)
elmbed 17:d8b901d791fd 872 {
elmbed 17:d8b901d791fd 873 delta = millis() - st;
elmbed 17:d8b901d791fd 874
elmbed 17:d8b901d791fd 875 if(delta > 50)
elmbed 17:d8b901d791fd 876 break;
elmbed 17:d8b901d791fd 877
elmbed 17:d8b901d791fd 878 ta.spin();
elmbed 17:d8b901d791fd 879
elmbed 17:d8b901d791fd 880 if(ta.recieve(m_in))
elmbed 17:d8b901d791fd 881 {
elmbed 17:d8b901d791fd 882 lonely = false;
elmbed 17:d8b901d791fd 883 active_cones[m_in->cone] = true;
elmbed 17:d8b901d791fd 884
elmbed 17:d8b901d791fd 885 DEBUG("Reply from cone: ");
elmbed 17:d8b901d791fd 886 DEBUG("%d",m_in->cone);
elmbed 17:d8b901d791fd 887 DEBUG(", ");
elmbed 17:d8b901d791fd 888 DEBUG("%d",delta);
elmbed 17:d8b901d791fd 889 DEBUG("ms\n");
elmbed 17:d8b901d791fd 890 break;
elmbed 17:d8b901d791fd 891 }
elmbed 17:d8b901d791fd 892 }
elmbed 17:d8b901d791fd 893
elmbed 17:d8b901d791fd 894 }
elmbed 17:d8b901d791fd 895
elmbed 17:d8b901d791fd 896 DEBUG("available cones are: (1");
elmbed 17:d8b901d791fd 897
elmbed 17:d8b901d791fd 898 for(i=2;i<NUM_CONES+1;i++)
elmbed 17:d8b901d791fd 899 {
elmbed 17:d8b901d791fd 900 if(active_cones[i])
elmbed 17:d8b901d791fd 901 {
elmbed 17:d8b901d791fd 902 DEBUG(", ");
elmbed 17:d8b901d791fd 903 DEBUG("%d",i);
elmbed 17:d8b901d791fd 904 }
elmbed 17:d8b901d791fd 905 }
elmbed 17:d8b901d791fd 906 DEBUG(")\r\n");
elmbed 17:d8b901d791fd 907 }
elmbed 17:d8b901d791fd 908
elmbed 17:d8b901d791fd 909 void printMsAsSeconds(unsigned long number)
elmbed 17:d8b901d791fd 910 {
elmbed 17:d8b901d791fd 911 uint16_t remainder;
elmbed 17:d8b901d791fd 912
elmbed 17:d8b901d791fd 913 //DEBUG("%d",number/1000);
elmbed 17:d8b901d791fd 914 //DEBUG(".");
AntonLS 19:afcbb425b3cf 915
elmbed 17:d8b901d791fd 916 remainder = number%1000;
AntonLS 19:afcbb425b3cf 917
elmbed 17:d8b901d791fd 918 /*
elmbed 17:d8b901d791fd 919 if(remainder < 100)
elmbed 17:d8b901d791fd 920 //DEBUG("0");
elmbed 17:d8b901d791fd 921
elmbed 17:d8b901d791fd 922 if(remainder < 10)
elmbed 17:d8b901d791fd 923 //DEBUG("0");
elmbed 17:d8b901d791fd 924
elmbed 17:d8b901d791fd 925 //DEBUG("%d",remainder);
elmbed 17:d8b901d791fd 926 */
AntonLS 19:afcbb425b3cf 927
AntonLS 19:afcbb425b3cf 928 writeToPhone( "%d.%03d", number/1000, remainder );
elmbed 17:d8b901d791fd 929 }
elmbed 17:d8b901d791fd 930
elmbed 17:d8b901d791fd 931 void spinButtons(void)
elmbed 17:d8b901d791fd 932 {
elmbed 17:d8b901d791fd 933 static inputState_t last_state = IDLE_I;
elmbed 17:d8b901d791fd 934 static bool first_i; // first should be true when we first enter a state (even if we just exited the same state)
elmbed 17:d8b901d791fd 935 static Event event;
elmbed 17:d8b901d791fd 936 static uint8_t sequence = 0;
elmbed 17:d8b901d791fd 937 static unsigned long start = 0;
elmbed 17:d8b901d791fd 938 uint8_t section = 0;
elmbed 17:d8b901d791fd 939
elmbed 17:d8b901d791fd 940 //uint8_t buttons;
elmbed 17:d8b901d791fd 941
elmbed 17:d8b901d791fd 942 //timer = millis() - start;
elmbed 17:d8b901d791fd 943 if(millis() > 500)
elmbed 17:d8b901d791fd 944 event = getInputEvent();
elmbed 17:d8b901d791fd 945
elmbed 17:d8b901d791fd 946 if(event.type == Event::press)
elmbed 17:d8b901d791fd 947 {
elmbed 17:d8b901d791fd 948 in_menu = true;
elmbed 17:d8b901d791fd 949 state_i = MENU_I;
elmbed 17:d8b901d791fd 950 }
elmbed 17:d8b901d791fd 951
elmbed 17:d8b901d791fd 952 first_i = false;
elmbed 17:d8b901d791fd 953
elmbed 17:d8b901d791fd 954 if(last_state != state_i)
elmbed 17:d8b901d791fd 955 {
elmbed 17:d8b901d791fd 956 //if(state_i == IDLE_I)////////////DEBUG.println(F("");
elmbed 17:d8b901d791fd 957 //if(state_i == RUNNING_I)//////////////DEBUG.println(F("State is WAITING");
elmbed 17:d8b901d791fd 958 // need to print menu timeout?
elmbed 17:d8b901d791fd 959 if(state_i == MENU_I)
elmbed 17:d8b901d791fd 960 ////DEBUG("Menu\n");
elmbed 17:d8b901d791fd 961 if(state_i == PATTERN_SELECT_I)
elmbed 17:d8b901d791fd 962 ////DEBUG("Choosing pattern");
elmbed 17:d8b901d791fd 963 first_i = true;
elmbed 17:d8b901d791fd 964 }
elmbed 17:d8b901d791fd 965
elmbed 17:d8b901d791fd 966 last_state = state_i;
elmbed 17:d8b901d791fd 967
elmbed 17:d8b901d791fd 968 if(state_i == RUNNING_I)
elmbed 17:d8b901d791fd 969 in_menu = false;
elmbed 17:d8b901d791fd 970
elmbed 17:d8b901d791fd 971 switch(state_i)
elmbed 17:d8b901d791fd 972 {
elmbed 17:d8b901d791fd 973 case IDLE_I:
elmbed 17:d8b901d791fd 974 // display something distinctive
elmbed 17:d8b901d791fd 975 if(event.type == Event::tap)
elmbed 17:d8b901d791fd 976 {
elmbed 17:d8b901d791fd 977 state_i = RUNNING_I;
elmbed 17:d8b901d791fd 978 //send 'p' or 'f' command as appropriate
elmbed 17:d8b901d791fd 979 if(mode == FREEFORM)
elmbed 17:d8b901d791fd 980 interpret('f', 0);
elmbed 17:d8b901d791fd 981 else
elmbed 17:d8b901d791fd 982 interpret('p', 0);
elmbed 17:d8b901d791fd 983 }
elmbed 17:d8b901d791fd 984 break;
elmbed 17:d8b901d791fd 985 case RUNNING_I:
elmbed 17:d8b901d791fd 986 if(event.type == Event::finish)
elmbed 17:d8b901d791fd 987 state_i = IDLE_I;
elmbed 17:d8b901d791fd 988 break;
elmbed 17:d8b901d791fd 989 case MENU_I:
elmbed 17:d8b901d791fd 990 if(first_i)
elmbed 17:d8b901d791fd 991 interpret('q', 0);
elmbed 17:d8b901d791fd 992 // every 3 seconds we cycle through the menu
elmbed 17:d8b901d791fd 993 // one option per second
elmbed 17:d8b901d791fd 994 // light changes color and stays on for 500ms
elmbed 17:d8b901d791fd 995 section = ((millis() - start)%3000)/500;
elmbed 17:d8b901d791fd 996
elmbed 17:d8b901d791fd 997 if(section == 0)
elmbed 17:d8b901d791fd 998 ta.post_color(0xFF);
elmbed 17:d8b901d791fd 999 if(section == 1)
elmbed 17:d8b901d791fd 1000 ta.post_color(0);
elmbed 17:d8b901d791fd 1001 if(section == 2)
elmbed 17:d8b901d791fd 1002 ta.post_color(0xFF00);
elmbed 17:d8b901d791fd 1003 if(section == 3)
elmbed 17:d8b901d791fd 1004 ta.post_color(0);
elmbed 17:d8b901d791fd 1005 if(section == 4)
elmbed 17:d8b901d791fd 1006 ta.post_color(0xFF0000);
elmbed 17:d8b901d791fd 1007 if(section == 5)
elmbed 17:d8b901d791fd 1008 ta.post_color(0);
elmbed 17:d8b901d791fd 1009 if(event.type == Event::tap)
elmbed 17:d8b901d791fd 1010 {
elmbed 17:d8b901d791fd 1011 // set state here based on current light color
elmbed 17:d8b901d791fd 1012 if(section < 2)
elmbed 17:d8b901d791fd 1013 {
elmbed 17:d8b901d791fd 1014 mode = FREEFORM;
elmbed 17:d8b901d791fd 1015 ta.post_color(0xFF);
elmbed 17:d8b901d791fd 1016 ////////DEBUG.println(F("Freeform mode.");
elmbed 17:d8b901d791fd 1017 state_i = IDLE_I;
elmbed 17:d8b901d791fd 1018 break;
elmbed 17:d8b901d791fd 1019 }
elmbed 17:d8b901d791fd 1020
elmbed 17:d8b901d791fd 1021 if(section < 4)
elmbed 17:d8b901d791fd 1022 {
elmbed 17:d8b901d791fd 1023 mode = PATTERN;
elmbed 17:d8b901d791fd 1024 ta.post_color(0xFF00);
elmbed 17:d8b901d791fd 1025 ////////DEBUG.println(F("Pattern mode.");
elmbed 17:d8b901d791fd 1026 state_i = IDLE_I;
elmbed 17:d8b901d791fd 1027 break;
elmbed 17:d8b901d791fd 1028 }
elmbed 17:d8b901d791fd 1029
elmbed 17:d8b901d791fd 1030 if(section < 6)
elmbed 17:d8b901d791fd 1031 {
elmbed 17:d8b901d791fd 1032 state_i = PATTERN_SELECT_I;
elmbed 17:d8b901d791fd 1033 ta.post_color(0xFF0000);
elmbed 17:d8b901d791fd 1034 break;
elmbed 17:d8b901d791fd 1035 }
elmbed 17:d8b901d791fd 1036 }
elmbed 17:d8b901d791fd 1037 break;
elmbed 17:d8b901d791fd 1038 case PATTERN_SELECT_I:
elmbed 17:d8b901d791fd 1039 if(first_i)
elmbed 17:d8b901d791fd 1040 {
elmbed 17:d8b901d791fd 1041 sequence = active_sequence;
elmbed 17:d8b901d791fd 1042 mode = PATTERN;
elmbed 17:d8b901d791fd 1043 //start = millis();
elmbed 17:d8b901d791fd 1044 }
elmbed 17:d8b901d791fd 1045 if(event.type == Event::tap)
elmbed 17:d8b901d791fd 1046 {
elmbed 17:d8b901d791fd 1047 ta.beep(50);
elmbed 17:d8b901d791fd 1048 if(event.value == 1 && sequence > 0)
elmbed 17:d8b901d791fd 1049 {
elmbed 17:d8b901d791fd 1050 sequence--;
elmbed 17:d8b901d791fd 1051 }
elmbed 17:d8b901d791fd 1052
elmbed 17:d8b901d791fd 1053 if(event.value == 2 && sequence < SEQUENCES - 1)
elmbed 17:d8b901d791fd 1054 {
elmbed 17:d8b901d791fd 1055 sequence++;
elmbed 17:d8b901d791fd 1056 }
elmbed 17:d8b901d791fd 1057
elmbed 17:d8b901d791fd 1058 if(event.value == 3)
elmbed 17:d8b901d791fd 1059 {
elmbed 17:d8b901d791fd 1060 interpret('p', sequence + 1);
elmbed 17:d8b901d791fd 1061 state_i = IDLE_I;
elmbed 17:d8b901d791fd 1062 }
elmbed 17:d8b901d791fd 1063
elmbed 17:d8b901d791fd 1064 if(event.value != 3)
elmbed 17:d8b901d791fd 1065 {
elmbed 17:d8b901d791fd 1066 ////DEBUG("Menu says: sequence ");
elmbed 17:d8b901d791fd 1067 ////DEBUG("%d\n",sequence + 1);
elmbed 17:d8b901d791fd 1068 }
elmbed 17:d8b901d791fd 1069 break;
elmbed 17:d8b901d791fd 1070 case TEACH_I:
elmbed 17:d8b901d791fd 1071 // not implemented yet
elmbed 17:d8b901d791fd 1072 break;
elmbed 17:d8b901d791fd 1073 default: break;
elmbed 17:d8b901d791fd 1074 }
elmbed 17:d8b901d791fd 1075 }
elmbed 17:d8b901d791fd 1076 }
elmbed 17:d8b901d791fd 1077
elmbed 17:d8b901d791fd 1078 uint8_t checkButtons(void)
elmbed 17:d8b901d791fd 1079 {
elmbed 17:d8b901d791fd 1080 static unsigned long last_time = 0;
elmbed 17:d8b901d791fd 1081 //static uint8_t last = 0;
elmbed 17:d8b901d791fd 1082 static uint8_t buttons = 0;
elmbed 17:d8b901d791fd 1083
elmbed 17:d8b901d791fd 1084 // listen for commands from the buttons
elmbed 17:d8b901d791fd 1085 unsigned long time = millis();
elmbed 17:d8b901d791fd 1086 // only check every DEBOUNCE_MS to avoid jitter
elmbed 17:d8b901d791fd 1087 if(time - last_time > DEBOUNCE_MS)
elmbed 17:d8b901d791fd 1088 {
elmbed 17:d8b901d791fd 1089 last_time = time;
elmbed 17:d8b901d791fd 1090 buttons = ta.buttons();
elmbed 17:d8b901d791fd 1091 }
elmbed 17:d8b901d791fd 1092
elmbed 17:d8b901d791fd 1093 return buttons;
elmbed 17:d8b901d791fd 1094 }
elmbed 17:d8b901d791fd 1095
elmbed 17:d8b901d791fd 1096
elmbed 17:d8b901d791fd 1097 Event getInputEvent(void)
elmbed 17:d8b901d791fd 1098 {
elmbed 17:d8b901d791fd 1099 static uint8_t last_buttons = 0;
elmbed 17:d8b901d791fd 1100 static unsigned long time1 = 0;
elmbed 17:d8b901d791fd 1101 static unsigned long time2 = 0;
elmbed 17:d8b901d791fd 1102 static unsigned long time3 = 0;
elmbed 17:d8b901d791fd 1103 unsigned long duration = 0;
elmbed 17:d8b901d791fd 1104 uint8_t buttons = 0;
elmbed 17:d8b901d791fd 1105 Event event;
elmbed 17:d8b901d791fd 1106 event.type = Event::none;
elmbed 17:d8b901d791fd 1107 event.value = 0;
elmbed 17:d8b901d791fd 1108
elmbed 17:d8b901d791fd 1109 buttons = checkButtons();
elmbed 17:d8b901d791fd 1110 uint8_t rising = buttons & ~last_buttons;
elmbed 17:d8b901d791fd 1111 uint8_t falling = ~buttons & last_buttons;
elmbed 17:d8b901d791fd 1112
elmbed 17:d8b901d791fd 1113 /*if(rising){
elmbed 17:d8b901d791fd 1114 //DEBUG.print("Rising ");
elmbed 17:d8b901d791fd 1115 //DEBUG.println(rising);
elmbed 17:d8b901d791fd 1116 }
elmbed 17:d8b901d791fd 1117 if(falling){
elmbed 17:d8b901d791fd 1118 //DEBUG.print("Falling ");
elmbed 17:d8b901d791fd 1119 //DEBUG.println(falling);
elmbed 17:d8b901d791fd 1120 }*/
elmbed 17:d8b901d791fd 1121 if(rising & 0x01)
elmbed 17:d8b901d791fd 1122 time1 = millis();
elmbed 17:d8b901d791fd 1123 if(rising & 0x02)
elmbed 17:d8b901d791fd 1124 time2 = millis();
elmbed 17:d8b901d791fd 1125 if(rising & 0x04)
elmbed 17:d8b901d791fd 1126 time3 = millis();
elmbed 17:d8b901d791fd 1127
elmbed 17:d8b901d791fd 1128 // simultaneous falling edges will cause lower values to be ignored
elmbed 17:d8b901d791fd 1129 if(falling & 0x01)
elmbed 17:d8b901d791fd 1130 {
elmbed 17:d8b901d791fd 1131 duration = millis() - time1;
elmbed 17:d8b901d791fd 1132 event.value = 1;
elmbed 17:d8b901d791fd 1133 }
elmbed 17:d8b901d791fd 1134
elmbed 17:d8b901d791fd 1135 if(falling & 0x02)
elmbed 17:d8b901d791fd 1136 {
elmbed 17:d8b901d791fd 1137 duration = millis() - time2;
elmbed 17:d8b901d791fd 1138 event.value = 2;
elmbed 17:d8b901d791fd 1139 }
elmbed 17:d8b901d791fd 1140
elmbed 17:d8b901d791fd 1141 if(falling & 0x04)
elmbed 17:d8b901d791fd 1142 {
elmbed 17:d8b901d791fd 1143 duration = millis() - time3;
elmbed 17:d8b901d791fd 1144 event.value = 3;
elmbed 17:d8b901d791fd 1145 }
elmbed 17:d8b901d791fd 1146
elmbed 17:d8b901d791fd 1147 if(duration > 0)
elmbed 17:d8b901d791fd 1148 event.type = Event::tap;
elmbed 17:d8b901d791fd 1149 if(duration > 2000)
elmbed 17:d8b901d791fd 1150 event.type = Event::press;
elmbed 17:d8b901d791fd 1151
elmbed 17:d8b901d791fd 1152 // give feedback that we've waited lng enough for a press
elmbed 17:d8b901d791fd 1153 unsigned long t = millis() - time1;
elmbed 17:d8b901d791fd 1154
elmbed 17:d8b901d791fd 1155 if(2020 > t && t > 2000 && (buttons & 0x01))
elmbed 17:d8b901d791fd 1156 ta.beep(20);
elmbed 17:d8b901d791fd 1157
elmbed 17:d8b901d791fd 1158 t = millis() - time2;
elmbed 17:d8b901d791fd 1159
elmbed 17:d8b901d791fd 1160 if(2020 > t && t > 2000 && (buttons & 0x02))
elmbed 17:d8b901d791fd 1161 ta.beep(20);
elmbed 17:d8b901d791fd 1162
elmbed 17:d8b901d791fd 1163 t = millis() - time3;
elmbed 17:d8b901d791fd 1164
elmbed 17:d8b901d791fd 1165 if(2020 > t && t > 2000 && (buttons & 0x04))
elmbed 17:d8b901d791fd 1166 ta.beep(20);
elmbed 17:d8b901d791fd 1167
elmbed 17:d8b901d791fd 1168 if(event.type != Event::none)
elmbed 17:d8b901d791fd 1169 {
elmbed 17:d8b901d791fd 1170 //DEBUG("Event: ");
elmbed 17:d8b901d791fd 1171 if(event.type == Event::tap)
elmbed 17:d8b901d791fd 1172 ////DEBUG("tap, ");
elmbed 17:d8b901d791fd 1173 if(event.type == Event::press)
elmbed 17:d8b901d791fd 1174 ////DEBUG("press, ");
elmbed 17:d8b901d791fd 1175
elmbed 17:d8b901d791fd 1176 uint8_t val = event.value;
elmbed 17:d8b901d791fd 1177 //DEBUG("%d\n",val);
elmbed 17:d8b901d791fd 1178 //////DEBUG.println(duration);
elmbed 17:d8b901d791fd 1179 }
elmbed 17:d8b901d791fd 1180
elmbed 17:d8b901d791fd 1181 last_buttons = buttons;
elmbed 17:d8b901d791fd 1182 return event;
elmbed 17:d8b901d791fd 1183 }
elmbed 18:affef3a7db2a 1184 #endif
elmbed 18:affef3a7db2a 1185
elmbed 18:affef3a7db2a 1186 #endif