Mbed based laser tag system using IR LEDs and receivers

Dependencies:   mbed fwdcrc16library PinDetect TextLCD

This project was the result of an embedded systems design course held in 2013.

Committer:
Mike951
Date:
Mon Mar 18 03:49:33 2013 +0000
Revision:
1:24f46931d010
Parent:
0:69e5ee3b618d
Child:
2:15134f79b400
Menu system and id generation fixed to be in the correct format. Need to do statistics and tagging/respawning behavior.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mike951 0:69e5ee3b618d 1 #include "mbed.h"
Mike951 0:69e5ee3b618d 2 #include "TextLCD.h"
Mike951 0:69e5ee3b618d 3 #include "PinDetect.h"
Mike951 0:69e5ee3b618d 4 #include "crc16.h"
Mike951 0:69e5ee3b618d 5
Mike951 0:69e5ee3b618d 6
Mike951 1:24f46931d010 7 PinDetect sw2(P0_11); //switch2 debounced input
Mike951 1:24f46931d010 8 PinDetect sw3(P0_10); //switch3 debounced input
Mike951 0:69e5ee3b618d 9 TextLCD lcd(P1_15, P1_16, P1_19, P1_20, P1_21, P1_22); // rs, e, d4-d7 led pins:4,6,11-14
Mike951 0:69e5ee3b618d 10 DigitalOut LB(P1_31); //lcd backlight
Mike951 0:69e5ee3b618d 11 DigitalOut LP(P1_29); //lcd power
Mike951 0:69e5ee3b618d 12 DigitalOut led1(P0_22); //on-board led ds1
Mike951 0:69e5ee3b618d 13 DigitalOut led2(P0_23); //on-board led ds2
Mike951 0:69e5ee3b618d 14 Serial IR(P1_27,P1_26); //IR transmitter and receiver output and input control
Mike951 0:69e5ee3b618d 15 PwmOut Square_Gen(P1_25); //square wave generator for IR led
Mike951 1:24f46931d010 16 Timeout stats; //used for displaying text for limited periods of time
Mike951 1:24f46931d010 17 Timer timer; //used as seconds for reset timer
Mike951 1:24f46931d010 18 Ticker clock_tick; //used with timer for minutes of reset timer
Mike951 1:24f46931d010 19 unsigned mins = 0; //global variable for minutes in game, since ticker interrupt cannot attach functions that have parameters
Mike951 1:24f46931d010 20 bool btn2 = false; //global variable for sw2, since the PinDetect interrupt cannot attach functions that have parameters
Mike951 1:24f46931d010 21 bool btn3 = false; //global variable for sw3, since the PinDetect interrupt cannot attach functions that have parameters
Mike951 0:69e5ee3b618d 22 bool done = false; //global variable for timeout, since TimeOut interrupt cannot attach functions that have paramaters
Mike951 0:69e5ee3b618d 23 char c[3];
Mike951 0:69e5ee3b618d 24 unsigned arr = 0;
Mike951 0:69e5ee3b618d 25
Mike951 1:24f46931d010 26 void minutes()
Mike951 1:24f46931d010 27 {
Mike951 1:24f46931d010 28 mins ++;
Mike951 1:24f46931d010 29 timer.reset();
Mike951 1:24f46931d010 30 }
Mike951 1:24f46931d010 31
Mike951 0:69e5ee3b618d 32 void callback()
Mike951 0:69e5ee3b618d 33 {
Mike951 0:69e5ee3b618d 34 // Note: you need to actually read from the serial to clear the RX interrupt
Mike951 0:69e5ee3b618d 35 /*if (!taggable)
Mike951 0:69e5ee3b618d 36 { pc.getc(); return; } //ensures no extra buffering left over
Mike951 0:69e5ee3b618d 37 shot[sc] = pc.getc();
Mike951 0:69e5ee3b618d 38 if (shot[sc] != shot[0])
Mike951 0:69e5ee3b618d 39 {
Mike951 0:69e5ee3b618d 40 tick.detach();
Mike951 0:69e5ee3b618d 41 sc = 0;
Mike951 0:69e5ee3b618d 42 tick.attach(&shot_check, 0.25);
Mike951 0:69e5ee3b618d 43 shot[2] = NULL;
Mike951 0:69e5ee3b618d 44 }
Mike951 0:69e5ee3b618d 45 else
Mike951 0:69e5ee3b618d 46 { sc ++; }*/
Mike951 0:69e5ee3b618d 47 char temp;
Mike951 0:69e5ee3b618d 48 temp = IR.getc();
Mike951 0:69e5ee3b618d 49 led1 = !led1;
Mike951 0:69e5ee3b618d 50 if (c[arr] != temp)
Mike951 0:69e5ee3b618d 51 {
Mike951 0:69e5ee3b618d 52 c[arr] = temp;
Mike951 0:69e5ee3b618d 53 }
Mike951 0:69e5ee3b618d 54 arr += 1;
Mike951 0:69e5ee3b618d 55 arr = arr%3;
Mike951 0:69e5ee3b618d 56 return;
Mike951 0:69e5ee3b618d 57 }
Mike951 0:69e5ee3b618d 58
Mike951 0:69e5ee3b618d 59 /*void keyPressed1()
Mike951 0:69e5ee3b618d 60 {
Mike951 0:69e5ee3b618d 61 led1 = !led1;
Mike951 0:69e5ee3b618d 62 }
Mike951 0:69e5ee3b618d 63
Mike951 0:69e5ee3b618d 64 void keyPressed2()
Mike951 0:69e5ee3b618d 65 {
Mike951 0:69e5ee3b618d 66 led2 = !led2;
Mike951 0:69e5ee3b618d 67 }*/
Mike951 0:69e5ee3b618d 68
Mike951 1:24f46931d010 69 void btn2Pressed()
Mike951 0:69e5ee3b618d 70 {
Mike951 0:69e5ee3b618d 71 led1 = !led1;
Mike951 1:24f46931d010 72 btn2 = true;
Mike951 0:69e5ee3b618d 73 }
Mike951 0:69e5ee3b618d 74
Mike951 1:24f46931d010 75 void btn3Pressed()
Mike951 0:69e5ee3b618d 76 {
Mike951 0:69e5ee3b618d 77 led2 = !led2;
Mike951 1:24f46931d010 78 btn3 = true;
Mike951 0:69e5ee3b618d 79
Mike951 0:69e5ee3b618d 80 }
Mike951 0:69e5ee3b618d 81
Mike951 1:24f46931d010 82 void finish_disp ()
Mike951 0:69e5ee3b618d 83 {
Mike951 0:69e5ee3b618d 84 done = true;
Mike951 0:69e5ee3b618d 85 return;
Mike951 0:69e5ee3b618d 86 }
Mike951 0:69e5ee3b618d 87
Mike951 1:24f46931d010 88 /*Error Routine.
Mike951 1:24f46931d010 89 Displays "ERROR" on LCD screen and flashes leds
Mike951 1:24f46931d010 90 when called for an indefinite period of time
Mike951 1:24f46931d010 91 */
Mike951 1:24f46931d010 92 void error_custom ()
Mike951 1:24f46931d010 93 {
Mike951 1:24f46931d010 94 lcd.cls();
Mike951 1:24f46931d010 95 lcd.printf("ERROR");
Mike951 1:24f46931d010 96 led1 = 0;
Mike951 1:24f46931d010 97 led2 = 1;
Mike951 1:24f46931d010 98 while(1)
Mike951 1:24f46931d010 99 {
Mike951 1:24f46931d010 100 led1 = !led1;
Mike951 1:24f46931d010 101 led2 = !led2;
Mike951 1:24f46931d010 102 wait(0.5);
Mike951 1:24f46931d010 103 }
Mike951 1:24f46931d010 104 }
Mike951 1:24f46931d010 105 /*Alphanumeric selector
Mike951 1:24f46931d010 106 Used with char_sel function in order to select a number 0-9 or letters A-Z through user input.
Mike951 1:24f46931d010 107 Returns a char.
Mike951 1:24f46931d010 108 */
Mike951 1:24f46931d010 109 char alpha_num_sel (bool number)
Mike951 1:24f46931d010 110 {
Mike951 1:24f46931d010 111 char n0 = '0';
Mike951 1:24f46931d010 112 char n_tmp = '0';
Mike951 1:24f46931d010 113 unsigned incr = 0; //used to increment characters between 0-9 or A-Z
Mike951 1:24f46931d010 114 unsigned mod;
Mike951 1:24f46931d010 115 if (number)
Mike951 1:24f46931d010 116 {
Mike951 1:24f46931d010 117 lcd.cls();
Mike951 1:24f46931d010 118 lcd.printf("Pick\nNumber:%c",n_tmp);
Mike951 1:24f46931d010 119 n0 = '0';
Mike951 1:24f46931d010 120 n_tmp = n0;
Mike951 1:24f46931d010 121 mod = 10;
Mike951 1:24f46931d010 122 }
Mike951 1:24f46931d010 123 else
Mike951 1:24f46931d010 124 {
Mike951 1:24f46931d010 125 lcd.cls();
Mike951 1:24f46931d010 126 n0 = 'A';
Mike951 1:24f46931d010 127 n_tmp = n0;
Mike951 1:24f46931d010 128 lcd.printf("Pick\nLetter:%c",n_tmp);
Mike951 1:24f46931d010 129 mod = 26;
Mike951 1:24f46931d010 130 }
Mike951 1:24f46931d010 131 while(1)
Mike951 1:24f46931d010 132 {
Mike951 1:24f46931d010 133 while(!btn2 && !btn3) //waits until button input received
Mike951 1:24f46931d010 134 {
Mike951 1:24f46931d010 135 wait(0.05);
Mike951 1:24f46931d010 136 }
Mike951 1:24f46931d010 137 if(btn3)
Mike951 1:24f46931d010 138 {
Mike951 1:24f46931d010 139 btn3 = false;
Mike951 1:24f46931d010 140 btn2 = false; //if both butons pressed, it just selects the current character
Mike951 1:24f46931d010 141 return (n_tmp);
Mike951 1:24f46931d010 142 }
Mike951 1:24f46931d010 143 else if(btn2)
Mike951 1:24f46931d010 144 {
Mike951 1:24f46931d010 145 btn2 = false;
Mike951 1:24f46931d010 146 incr ++;
Mike951 1:24f46931d010 147 incr = incr % mod; //ensures that numbers stay within the 0-9 range
Mike951 1:24f46931d010 148 n_tmp = n0 + incr; //increment current number selected
Mike951 1:24f46931d010 149 lcd.cls();
Mike951 1:24f46931d010 150 if(number)
Mike951 1:24f46931d010 151 {
Mike951 1:24f46931d010 152 lcd.printf("Pick\nNumber:%c",n_tmp); //displays current number
Mike951 1:24f46931d010 153 }
Mike951 1:24f46931d010 154 else
Mike951 1:24f46931d010 155 {
Mike951 1:24f46931d010 156 lcd.printf("Pick\nLetter:%c",n_tmp); //displays current letter
Mike951 1:24f46931d010 157 }
Mike951 1:24f46931d010 158 }
Mike951 1:24f46931d010 159 else
Mike951 1:24f46931d010 160 {
Mike951 1:24f46931d010 161 error_custom();
Mike951 1:24f46931d010 162 }
Mike951 1:24f46931d010 163
Mike951 1:24f46931d010 164 }
Mike951 1:24f46931d010 165 }
Mike951 1:24f46931d010 166 /*Character Selection
Mike951 1:24f46931d010 167 Used with setup() function in order to pick a character A-Z and number 0-9
Mike951 1:24f46931d010 168 for use as part of user id and/or team. Passed a 0 if selecting team letter (A-Z),
Mike951 1:24f46931d010 169 otherwise will select player id letter
Mike951 1:24f46931d010 170 */
Mike951 1:24f46931d010 171 char char_sel (bool player)
Mike951 1:24f46931d010 172 {
Mike951 1:24f46931d010 173 if (player)
Mike951 1:24f46931d010 174 {
Mike951 1:24f46931d010 175 lcd.cls();
Mike951 1:24f46931d010 176 lcd.printf("A-Z? or\n0-9?");
Mike951 1:24f46931d010 177 while(!btn2 && !btn3) //waits until button input received
Mike951 1:24f46931d010 178 {
Mike951 1:24f46931d010 179 wait(0.05);
Mike951 1:24f46931d010 180 }
Mike951 1:24f46931d010 181 if(btn2) //if select button pressed, goes through numerical selection
Mike951 1:24f46931d010 182 {
Mike951 1:24f46931d010 183 btn2 = false;
Mike951 1:24f46931d010 184 btn3 = false; //if both buttons pressed at the same time, it just does numerical selection
Mike951 1:24f46931d010 185
Mike951 1:24f46931d010 186 return(alpha_num_sel(1));
Mike951 1:24f46931d010 187 }
Mike951 1:24f46931d010 188 else if(btn3)
Mike951 1:24f46931d010 189 {
Mike951 1:24f46931d010 190 btn3 = false; //pressing the option button in this case is the same as selecting a team
Mike951 1:24f46931d010 191 }
Mike951 1:24f46931d010 192 else
Mike951 1:24f46931d010 193 {
Mike951 1:24f46931d010 194 error_custom(); //if you somehow make it here without pressing buttons, it will throw an error
Mike951 1:24f46931d010 195 }
Mike951 1:24f46931d010 196 }
Mike951 1:24f46931d010 197 return(alpha_num_sel(0)); //returns capital alpha character for id or team by calling selection function
Mike951 1:24f46931d010 198 }
Mike951 1:24f46931d010 199
Mike951 1:24f46931d010 200
Mike951 1:24f46931d010 201 /*Setup Routine.
Mike951 1:24f46931d010 202 Sets the user id for use in-game.
Mike951 1:24f46931d010 203 Function must be passed an array of characters of size 15
Mike951 1:24f46931d010 204 in order to work correctly.
Mike951 1:24f46931d010 205 */
Mike951 1:24f46931d010 206 void setup (char* ID_array)
Mike951 1:24f46931d010 207 {
Mike951 1:24f46931d010 208 unsigned size = 1;
Mike951 1:24f46931d010 209
Mike951 1:24f46931d010 210 lcd.cls();
Mike951 1:24f46931d010 211 lcd.printf("ID Size?\n%u",size);
Mike951 1:24f46931d010 212 while(1)
Mike951 1:24f46931d010 213 {
Mike951 1:24f46931d010 214 while(!btn2 && !btn3) //waits until button input received
Mike951 1:24f46931d010 215 {
Mike951 1:24f46931d010 216 wait(0.05); //ensures buttons cannot be pressed extremely fast
Mike951 1:24f46931d010 217 }
Mike951 1:24f46931d010 218 if(btn2 && btn3) //routine to set size of player id in bytes
Mike951 1:24f46931d010 219 {
Mike951 1:24f46931d010 220 btn2 = false; //handling for simultaneous button pressing
Mike951 1:24f46931d010 221 btn3 = false;
Mike951 1:24f46931d010 222 size++;
Mike951 1:24f46931d010 223 if (size > 12)
Mike951 1:24f46931d010 224 {
Mike951 1:24f46931d010 225 size = 1; //ensures size cannot be greater than 12 or less than 1
Mike951 1:24f46931d010 226 }
Mike951 1:24f46931d010 227 break; //sets size to whatever current size is +1 and moves on
Mike951 1:24f46931d010 228 }
Mike951 1:24f46931d010 229 else if(btn2) //increases size or loops back to 1, displays current size
Mike951 1:24f46931d010 230 {
Mike951 1:24f46931d010 231 btn2 = false;
Mike951 1:24f46931d010 232 size++;
Mike951 1:24f46931d010 233 if (size > 12)
Mike951 1:24f46931d010 234 {
Mike951 1:24f46931d010 235 size = 1; //ensures size cannot be greater than 12 or less than 1
Mike951 1:24f46931d010 236 }
Mike951 1:24f46931d010 237 lcd.cls();
Mike951 1:24f46931d010 238 lcd.printf("ID Size?\n%u",size); //displays current size
Mike951 1:24f46931d010 239 }
Mike951 1:24f46931d010 240 else if(btn3)
Mike951 1:24f46931d010 241 {
Mike951 1:24f46931d010 242 btn3 = false; //selects current size
Mike951 1:24f46931d010 243 break;
Mike951 1:24f46931d010 244 }
Mike951 1:24f46931d010 245 else
Mike951 1:24f46931d010 246 {
Mike951 1:24f46931d010 247 error_custom(); //error called if unexpected output
Mike951 1:24f46931d010 248 }
Mike951 1:24f46931d010 249 }
Mike951 1:24f46931d010 250
Mike951 1:24f46931d010 251 for (unsigned j = 0; j < size; j ++) //sets player id
Mike951 1:24f46931d010 252 {
Mike951 1:24f46931d010 253 ID_array[j] = char_sel(1);
Mike951 1:24f46931d010 254 }
Mike951 1:24f46931d010 255 for (unsigned j = size; j < 12; j ++)
Mike951 1:24f46931d010 256 {
Mike951 1:24f46931d010 257 ID_array[j] = ' '; //fill unused characters with spaces
Mike951 1:24f46931d010 258 }
Mike951 1:24f46931d010 259 lcd.cls();
Mike951 1:24f46931d010 260 lcd.printf("On team?\n Y or N");
Mike951 1:24f46931d010 261 while(!btn2 && !btn3) //waits until button input received
Mike951 1:24f46931d010 262 {
Mike951 1:24f46931d010 263 wait(0.05); //ensures buttons cannot be pressed extremely fast
Mike951 1:24f46931d010 264 }
Mike951 1:24f46931d010 265 if(btn3)
Mike951 1:24f46931d010 266 {
Mike951 1:24f46931d010 267 btn3 = false;
Mike951 1:24f46931d010 268 btn2 = false; //you're on a team if you press both buttons
Mike951 1:24f46931d010 269 ID_array[12] = char_sel(0); //sets team letter
Mike951 1:24f46931d010 270 }
Mike951 1:24f46931d010 271 else if (btn2)
Mike951 1:24f46931d010 272 {
Mike951 1:24f46931d010 273 btn2 = false;
Mike951 1:24f46931d010 274 ID_array[12] = '0'; //sets team to 'zero', indicating no team
Mike951 1:24f46931d010 275 }
Mike951 1:24f46931d010 276 else
Mike951 1:24f46931d010 277 {
Mike951 1:24f46931d010 278 error_custom(); //throws an error if you somehow get here)
Mike951 1:24f46931d010 279 }
Mike951 1:24f46931d010 280 lcd.cls();
Mike951 1:24f46931d010 281 lcd.printf("Your ID\n is:");
Mike951 1:24f46931d010 282 wait(1.5);
Mike951 1:24f46931d010 283 lcd.cls();
Mike951 1:24f46931d010 284 for(unsigned j = 0; j <= 12; j++) //prints out player id and team
Mike951 1:24f46931d010 285 {
Mike951 1:24f46931d010 286 lcd.printf("%c",ID_array[j]);
Mike951 1:24f46931d010 287 if (j == 7)
Mike951 1:24f46931d010 288 {
Mike951 1:24f46931d010 289 lcd.printf("\n"); //puts in a new line if id is longer than eight characters
Mike951 1:24f46931d010 290 }
Mike951 1:24f46931d010 291 }
Mike951 1:24f46931d010 292 crc16_attach(ID_array,13); //attaches crc bits to last two bits of 15 character array
Mike951 1:24f46931d010 293 wait(5);
Mike951 1:24f46931d010 294 return;
Mike951 1:24f46931d010 295 }
Mike951 1:24f46931d010 296
Mike951 0:69e5ee3b618d 297 int main()
Mike951 0:69e5ee3b618d 298 {
Mike951 0:69e5ee3b618d 299 IR.attach(&callback); //attaches interrupt for serial buffer
Mike951 0:69e5ee3b618d 300 IR.baud(1200); //sets baud rate of serial output and input
Mike951 0:69e5ee3b618d 301 Square_Gen.period_us(26); //produces a 38kHz square wave to ensure proper IR communication...
Mike951 0:69e5ee3b618d 302 Square_Gen.pulsewidth_us(13); //...this signal is sent to one of the IR diode terminals through a transistor
Mike951 0:69e5ee3b618d 303 LB = 1; //turn on lcd backlight
Mike951 0:69e5ee3b618d 304 LP = 1; //turn on lcd power
Mike951 0:69e5ee3b618d 305 sw2.mode(PullUp); //set buttons to a default high voltage for logic low
Mike951 0:69e5ee3b618d 306 sw3.mode(PullUp);
Mike951 0:69e5ee3b618d 307 sw2.setSampleFrequency(); //set buttons to default sample frequency for debouncing
Mike951 0:69e5ee3b618d 308 sw3.setSampleFrequency();
Mike951 0:69e5ee3b618d 309 sw2.setAssertValue(0); //set buttons to be logic high when voltage is low.
Mike951 0:69e5ee3b618d 310 sw3.setAssertValue(0);
Mike951 1:24f46931d010 311 sw2.attach_asserted( &btn2Pressed ); //attach button interrupts
Mike951 1:24f46931d010 312 sw3.attach_asserted( &btn3Pressed );
Mike951 1:24f46931d010 313 clock_tick.attach(&minutes, 60); //ticker interrupts every 60 seconds to add 1 minute and reset timer
Mike951 1:24f46931d010 314 timer.reset(); //ensure timer starts at 0
Mike951 1:24f46931d010 315 timer.start(); //start reset timer
Mike951 1:24f46931d010 316 unsigned secs;
Mike951 0:69e5ee3b618d 317
Mike951 0:69e5ee3b618d 318 led1 = 1;
Mike951 1:24f46931d010 319 char id[15]; //id array, capable of storing user ids up to 12 bytes with 1 byte for team and 2 bytes for CRC.
Mike951 1:24f46931d010 320 lcd.cls(); //ensure lcd starts with clear screen
Mike951 1:24f46931d010 321 lcd.printf("Choose \nYour ID.");
Mike951 1:24f46931d010 322 while(btn2 == false && btn3 == false)
Mike951 1:24f46931d010 323 {
Mike951 1:24f46931d010 324 wait(0.2); //wait to start setup until select button is pressed
Mike951 1:24f46931d010 325 }
Mike951 1:24f46931d010 326 btn2 = false; //reset button values
Mike951 1:24f46931d010 327 btn3 = false;
Mike951 1:24f46931d010 328 setup(id); //setup player id and team, passing function the id array
Mike951 0:69e5ee3b618d 329 while(1)
Mike951 0:69e5ee3b618d 330 {
Mike951 1:24f46931d010 331 secs = timer.read();
Mike951 0:69e5ee3b618d 332 lcd.cls();
Mike951 1:24f46931d010 333 lcd.printf("Mins:%u\nSecs:%u", mins,secs);
Mike951 1:24f46931d010 334 wait(1);
Mike951 0:69e5ee3b618d 335 //lcd.cls();
Mike951 0:69e5ee3b618d 336 //lcd.printf("43%c%c%c!",c[0],c[1],c[2]);
Mike951 0:69e5ee3b618d 337 //IR.printf("%c%c%c",id);
Mike951 1:24f46931d010 338
Mike951 1:24f46931d010 339 if (btn3 == true)
Mike951 1:24f46931d010 340 {
Mike951 1:24f46931d010 341 btn3 = false;
Mike951 1:24f46931d010 342 lcd.cls();
Mike951 1:24f46931d010 343 if (crc16_match(id,2))
Mike951 1:24f46931d010 344 {
Mike951 1:24f46931d010 345 lcd.printf("true");
Mike951 1:24f46931d010 346 }
Mike951 1:24f46931d010 347 else
Mike951 1:24f46931d010 348 {
Mike951 1:24f46931d010 349 lcd.printf("false");
Mike951 1:24f46931d010 350 }
Mike951 1:24f46931d010 351 wait(5);
Mike951 1:24f46931d010 352 }
Mike951 1:24f46931d010 353
Mike951 1:24f46931d010 354 //crc16 matching test - works!
Mike951 1:24f46931d010 355 /*if (btn3 == true)
Mike951 0:69e5ee3b618d 356 {
Mike951 1:24f46931d010 357 btn3 = false;
Mike951 1:24f46931d010 358 lcd.cls();
Mike951 1:24f46931d010 359 if (crc16_match(id,2))
Mike951 1:24f46931d010 360 {
Mike951 1:24f46931d010 361 lcd.printf("true");
Mike951 1:24f46931d010 362 }
Mike951 1:24f46931d010 363 else
Mike951 1:24f46931d010 364 {
Mike951 1:24f46931d010 365 lcd.printf("false");
Mike951 1:24f46931d010 366 }
Mike951 1:24f46931d010 367 wait(5);
Mike951 1:24f46931d010 368 }*/
Mike951 1:24f46931d010 369
Mike951 1:24f46931d010 370 //statistics display test - works!
Mike951 1:24f46931d010 371 /*
Mike951 1:24f46931d010 372 if (btn2 == true)
Mike951 1:24f46931d010 373 {
Mike951 1:24f46931d010 374 btn2 = false;
Mike951 0:69e5ee3b618d 375 done = false;
Mike951 0:69e5ee3b618d 376 wait(0.05);
Mike951 0:69e5ee3b618d 377 stats.attach(&finish_disp, 5);
Mike951 1:24f46931d010 378 lcd.cls();
Mike951 1:24f46931d010 379 lcd.printf("ID:%c%c%c%c", id[0],id[1],id[2],id[3]);
Mike951 0:69e5ee3b618d 380 while(!done)
Mike951 0:69e5ee3b618d 381 {
Mike951 1:24f46931d010 382 if(btn2 == true)
Mike951 0:69e5ee3b618d 383 {
Mike951 1:24f46931d010 384 btn2 = false;
Mike951 0:69e5ee3b618d 385 stats.detach();
Mike951 0:69e5ee3b618d 386 lcd.cls();
Mike951 0:69e5ee3b618d 387 break;
Mike951 0:69e5ee3b618d 388 }
Mike951 1:24f46931d010 389 wait(0.2);
Mike951 0:69e5ee3b618d 390 }
Mike951 1:24f46931d010 391 }*/
Mike951 0:69e5ee3b618d 392
Mike951 0:69e5ee3b618d 393 //IR.printf("%c",id);
Mike951 0:69e5ee3b618d 394
Mike951 0:69e5ee3b618d 395
Mike951 0:69e5ee3b618d 396 }
Mike951 0:69e5ee3b618d 397 }