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.
main.cpp@1:24f46931d010, 2013-03-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |