Final Game. Have fun!!! :-)
Dependencies: 4DGL-uLCD-SE PinDetect mbed-rtos mbed
main.cpp@6:f99b7d1fd770, 2018-05-03 (annotated)
- Committer:
- aamin33
- Date:
- Thu May 03 01:22:51 2018 +0000
- Revision:
- 6:f99b7d1fd770
- Parent:
- 4:c136aa81f52a
Final Game. Have fun!!! :-)
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
bricecroxton | 0:71e79407f6d5 | 1 | #include "mbed.h" |
bricecroxton | 0:71e79407f6d5 | 2 | #include "rtos.h" |
bricecroxton | 0:71e79407f6d5 | 3 | #include "uLCD_4DGL.h" |
bricecroxton | 0:71e79407f6d5 | 4 | #include "SDFileSystem.h" |
bricecroxton | 0:71e79407f6d5 | 5 | #include "wave_player.h" |
aamin33 | 6:f99b7d1fd770 | 6 | #include "PinDetect.h" |
dkelsey6 | 2:fae2bc19d19d | 7 | #include <string> |
dkelsey6 | 2:fae2bc19d19d | 8 | |
dkelsey6 | 3:0d678aefc1d0 | 9 | //***** HW and signal setup *****// |
aamin33 | 6:f99b7d1fd770 | 10 | Serial bluemod(p28,p27); //bluetooth setup |
dkelsey6 | 3:0d678aefc1d0 | 11 | |
aamin33 | 6:f99b7d1fd770 | 12 | //Pushbuttons |
aamin33 | 6:f99b7d1fd770 | 13 | PinDetect pb1(p24); |
aamin33 | 6:f99b7d1fd770 | 14 | PinDetect pb2(p23); |
aamin33 | 6:f99b7d1fd770 | 15 | PinDetect pb3(p22); |
aamin33 | 6:f99b7d1fd770 | 16 | PinDetect pb4(p21); |
dkelsey6 | 3:0d678aefc1d0 | 17 | |
aamin33 | 6:f99b7d1fd770 | 18 | int pb1Score = 0; |
aamin33 | 6:f99b7d1fd770 | 19 | int pb2Score = 0; |
aamin33 | 6:f99b7d1fd770 | 20 | int pb3Score = 0; |
aamin33 | 6:f99b7d1fd770 | 21 | int pb4Score = 0; |
aamin33 | 6:f99b7d1fd770 | 22 | |
aamin33 | 6:f99b7d1fd770 | 23 | //Setup RGB led using PWM pins and class |
dkelsey6 | 4:c136aa81f52a | 24 | DigitalOut redLed(p19); |
dkelsey6 | 4:c136aa81f52a | 25 | DigitalOut greenLed(p20); |
dkelsey6 | 3:0d678aefc1d0 | 26 | |
aamin33 | 6:f99b7d1fd770 | 27 | uLCD_4DGL uLCD(p13, p14, p12); // main screen for game |
dkelsey6 | 3:0d678aefc1d0 | 28 | |
dkelsey6 | 3:0d678aefc1d0 | 29 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
dkelsey6 | 3:0d678aefc1d0 | 30 | |
dkelsey6 | 3:0d678aefc1d0 | 31 | PwmOut speakerPWM(p26); |
dkelsey6 | 3:0d678aefc1d0 | 32 | AnalogOut DACout(p18); |
dkelsey6 | 3:0d678aefc1d0 | 33 | wave_player waver(&DACout, &speakerPWM); |
dkelsey6 | 3:0d678aefc1d0 | 34 | |
dkelsey6 | 3:0d678aefc1d0 | 35 | //***** Constants *****// |
aamin33 | 6:f99b7d1fd770 | 36 | const int songLength = 100; //adjust as needed |
dkelsey6 | 3:0d678aefc1d0 | 37 | |
dkelsey6 | 2:fae2bc19d19d | 38 | //Arrays for notes |
dkelsey6 | 2:fae2bc19d19d | 39 | int L1[songLength]; |
dkelsey6 | 2:fae2bc19d19d | 40 | int L2[songLength]; |
dkelsey6 | 2:fae2bc19d19d | 41 | int L3[songLength]; |
dkelsey6 | 2:fae2bc19d19d | 42 | int L4[songLength]; |
bricecroxton | 0:71e79407f6d5 | 43 | |
aamin33 | 6:f99b7d1fd770 | 44 | int circleAligner = -6; //count for drawing the circles |
aamin33 | 6:f99b7d1fd770 | 45 | int value = 0; //keypad input value |
aamin33 | 6:f99b7d1fd770 | 46 | int score = 0; //score |
aamin33 | 6:f99b7d1fd770 | 47 | int playGame = 1; //game state toggle to start game |
aamin33 | 6:f99b7d1fd770 | 48 | int restartGame = 1; //game state toggle to restart or quit |
dkelsey6 | 3:0d678aefc1d0 | 49 | |
aamin33 | 6:f99b7d1fd770 | 50 | char blueIn = '0'; //Bluetooth setup |
dkelsey6 | 2:fae2bc19d19d | 51 | int selectedSong = 0; |
bricecroxton | 0:71e79407f6d5 | 52 | |
aamin33 | 6:f99b7d1fd770 | 53 | FILE *wav_file; // song file |
aamin33 | 6:f99b7d1fd770 | 54 | |
aamin33 | 6:f99b7d1fd770 | 55 | //----------------------------------------------------------------------------------------------------------------------- |
bricecroxton | 0:71e79407f6d5 | 56 | |
aamin33 | 6:f99b7d1fd770 | 57 | void pb1_hit_interrupt(void) { |
aamin33 | 6:f99b7d1fd770 | 58 | if (circleAligner > -1) { |
aamin33 | 6:f99b7d1fd770 | 59 | if (L4[circleAligner] == 1) { |
aamin33 | 6:f99b7d1fd770 | 60 | pb1Score = pb1Score + 1; //increment points if tapped correctly |
aamin33 | 6:f99b7d1fd770 | 61 | redLed = 0; |
aamin33 | 6:f99b7d1fd770 | 62 | greenLed = 1; |
aamin33 | 6:f99b7d1fd770 | 63 | } else { |
aamin33 | 6:f99b7d1fd770 | 64 | redLed = 1; |
aamin33 | 6:f99b7d1fd770 | 65 | greenLed = 0; |
aamin33 | 6:f99b7d1fd770 | 66 | } |
aamin33 | 6:f99b7d1fd770 | 67 | } |
aamin33 | 6:f99b7d1fd770 | 68 | wait(.05); |
aamin33 | 6:f99b7d1fd770 | 69 | redLed = 1; |
aamin33 | 6:f99b7d1fd770 | 70 | greenLed = 0; |
aamin33 | 6:f99b7d1fd770 | 71 | } |
bricecroxton | 0:71e79407f6d5 | 72 | |
aamin33 | 6:f99b7d1fd770 | 73 | void pb2_hit_interrupt(void) { |
aamin33 | 6:f99b7d1fd770 | 74 | if (circleAligner > -1) { |
aamin33 | 6:f99b7d1fd770 | 75 | if (L3[circleAligner] == 1) { |
aamin33 | 6:f99b7d1fd770 | 76 | pb2Score = pb2Score + 1; |
aamin33 | 6:f99b7d1fd770 | 77 | redLed = 0; |
aamin33 | 6:f99b7d1fd770 | 78 | greenLed = 1; |
aamin33 | 6:f99b7d1fd770 | 79 | } else { |
aamin33 | 6:f99b7d1fd770 | 80 | redLed = 1; |
aamin33 | 6:f99b7d1fd770 | 81 | greenLed = 0; |
bricecroxton | 0:71e79407f6d5 | 82 | } |
aamin33 | 6:f99b7d1fd770 | 83 | } |
aamin33 | 6:f99b7d1fd770 | 84 | wait(.05); |
aamin33 | 6:f99b7d1fd770 | 85 | redLed = 1; |
aamin33 | 6:f99b7d1fd770 | 86 | greenLed = 0; |
aamin33 | 6:f99b7d1fd770 | 87 | } |
aamin33 | 6:f99b7d1fd770 | 88 | |
aamin33 | 6:f99b7d1fd770 | 89 | void pb3_hit_interrupt(void) { |
aamin33 | 6:f99b7d1fd770 | 90 | if (circleAligner > -1) { |
aamin33 | 6:f99b7d1fd770 | 91 | if (L2[circleAligner] == 1) { |
aamin33 | 6:f99b7d1fd770 | 92 | pb3Score = pb3Score + 1; |
aamin33 | 6:f99b7d1fd770 | 93 | redLed = 0; |
aamin33 | 6:f99b7d1fd770 | 94 | greenLed = 1; |
aamin33 | 6:f99b7d1fd770 | 95 | } else { |
aamin33 | 6:f99b7d1fd770 | 96 | redLed = 1; |
aamin33 | 6:f99b7d1fd770 | 97 | greenLed = 0; |
aamin33 | 6:f99b7d1fd770 | 98 | } |
bricecroxton | 0:71e79407f6d5 | 99 | } |
aamin33 | 6:f99b7d1fd770 | 100 | wait(.05); |
aamin33 | 6:f99b7d1fd770 | 101 | redLed = 1; |
aamin33 | 6:f99b7d1fd770 | 102 | greenLed = 0; |
aamin33 | 6:f99b7d1fd770 | 103 | } |
aamin33 | 6:f99b7d1fd770 | 104 | |
aamin33 | 6:f99b7d1fd770 | 105 | void pb4_hit_interrupt(void) { |
aamin33 | 6:f99b7d1fd770 | 106 | if (circleAligner > -1) { |
aamin33 | 6:f99b7d1fd770 | 107 | if (L1[circleAligner] == 1) { |
aamin33 | 6:f99b7d1fd770 | 108 | pb4Score = pb4Score + 1; |
aamin33 | 6:f99b7d1fd770 | 109 | redLed = 0; |
aamin33 | 6:f99b7d1fd770 | 110 | greenLed = 1; |
aamin33 | 6:f99b7d1fd770 | 111 | } else { |
aamin33 | 6:f99b7d1fd770 | 112 | redLed = 1; |
aamin33 | 6:f99b7d1fd770 | 113 | greenLed = 0; |
aamin33 | 6:f99b7d1fd770 | 114 | } |
aamin33 | 6:f99b7d1fd770 | 115 | } |
aamin33 | 6:f99b7d1fd770 | 116 | wait(.05); |
aamin33 | 6:f99b7d1fd770 | 117 | redLed = 1; |
aamin33 | 6:f99b7d1fd770 | 118 | greenLed = 0; |
bricecroxton | 0:71e79407f6d5 | 119 | } |
bricecroxton | 0:71e79407f6d5 | 120 | |
aamin33 | 6:f99b7d1fd770 | 121 | //----------------------------------------------------------------------------------------------------------------------- |
aamin33 | 6:f99b7d1fd770 | 122 | |
aamin33 | 6:f99b7d1fd770 | 123 | void lcdThread1(void const *args) { |
aamin33 | 6:f99b7d1fd770 | 124 | while(playGame) { |
aamin33 | 6:f99b7d1fd770 | 125 | circleAligner++; |
aamin33 | 6:f99b7d1fd770 | 126 | uLCD.filled_circle(110, 20, 12, BLACK); |
aamin33 | 6:f99b7d1fd770 | 127 | uLCD.filled_circle(110, 50, 12, BLACK); |
aamin33 | 6:f99b7d1fd770 | 128 | uLCD.filled_circle(110, 80, 12, BLACK); |
aamin33 | 6:f99b7d1fd770 | 129 | uLCD.filled_circle(110, 110, 12, BLACK); |
aamin33 | 6:f99b7d1fd770 | 130 | if (circleAligner >= 0) { //draw the path of the circles |
aamin33 | 6:f99b7d1fd770 | 131 | if (L1[circleAligner]) { |
aamin33 | 6:f99b7d1fd770 | 132 | uLCD.filled_circle(86, 20, 10, BLACK); |
aamin33 | 6:f99b7d1fd770 | 133 | uLCD.filled_circle(110, 20, 12, BLUE); |
aamin33 | 6:f99b7d1fd770 | 134 | } |
aamin33 | 6:f99b7d1fd770 | 135 | if (L2[circleAligner]) { |
aamin33 | 6:f99b7d1fd770 | 136 | uLCD.filled_circle(86, 50, 10, BLACK); |
aamin33 | 6:f99b7d1fd770 | 137 | uLCD.filled_circle(110, 50, 12, RED); |
dkelsey6 | 2:fae2bc19d19d | 138 | } |
aamin33 | 6:f99b7d1fd770 | 139 | if (L3[circleAligner]) { |
aamin33 | 6:f99b7d1fd770 | 140 | uLCD.filled_circle(86, 80, 10, BLACK); |
aamin33 | 6:f99b7d1fd770 | 141 | uLCD.filled_circle(110, 80, 12, GREEN); |
aamin33 | 6:f99b7d1fd770 | 142 | } |
aamin33 | 6:f99b7d1fd770 | 143 | if (L4[circleAligner]) { |
aamin33 | 6:f99b7d1fd770 | 144 | uLCD.filled_circle(86, 110, 10, BLACK); |
aamin33 | 6:f99b7d1fd770 | 145 | uLCD.filled_circle(110, 110, 12, LGREY); |
aamin33 | 6:f99b7d1fd770 | 146 | } |
aamin33 | 6:f99b7d1fd770 | 147 | } |
aamin33 | 6:f99b7d1fd770 | 148 | if (circleAligner >= -1) { |
aamin33 | 6:f99b7d1fd770 | 149 | if (L1[circleAligner + 1]) { |
aamin33 | 6:f99b7d1fd770 | 150 | uLCD.filled_circle(66, 20, 8, BLACK); |
aamin33 | 6:f99b7d1fd770 | 151 | uLCD.filled_circle(86, 20, 10, BLUE);} |
aamin33 | 6:f99b7d1fd770 | 152 | if (L2[circleAligner + 1]) { |
aamin33 | 6:f99b7d1fd770 | 153 | uLCD.filled_circle(66, 50, 8, BLACK); |
aamin33 | 6:f99b7d1fd770 | 154 | uLCD.filled_circle(86, 50, 10, RED);} |
aamin33 | 6:f99b7d1fd770 | 155 | if (L3[circleAligner + 1]) { |
aamin33 | 6:f99b7d1fd770 | 156 | uLCD.filled_circle(66, 80, 8, BLACK); |
aamin33 | 6:f99b7d1fd770 | 157 | uLCD.filled_circle(86, 80, 10, GREEN); |
aamin33 | 6:f99b7d1fd770 | 158 | } |
aamin33 | 6:f99b7d1fd770 | 159 | if (L4[circleAligner + 1]) { |
aamin33 | 6:f99b7d1fd770 | 160 | uLCD.filled_circle(66, 110, 8, BLACK); |
aamin33 | 6:f99b7d1fd770 | 161 | uLCD.filled_circle(86, 110, 10, LGREY); |
dkelsey6 | 2:fae2bc19d19d | 162 | } |
dkelsey6 | 2:fae2bc19d19d | 163 | } |
aamin33 | 6:f99b7d1fd770 | 164 | if (circleAligner >= -2) { |
aamin33 | 6:f99b7d1fd770 | 165 | if (L1[circleAligner + 2]) { |
aamin33 | 6:f99b7d1fd770 | 166 | uLCD.filled_circle(50, 20, 6, BLACK); |
aamin33 | 6:f99b7d1fd770 | 167 | uLCD.filled_circle(66, 20, 8, BLUE); |
aamin33 | 6:f99b7d1fd770 | 168 | } |
aamin33 | 6:f99b7d1fd770 | 169 | if (L2[circleAligner + 2]) { |
aamin33 | 6:f99b7d1fd770 | 170 | uLCD.filled_circle(50, 50, 6, BLACK); |
aamin33 | 6:f99b7d1fd770 | 171 | uLCD.filled_circle(66, 50, 8, RED); |
aamin33 | 6:f99b7d1fd770 | 172 | } |
aamin33 | 6:f99b7d1fd770 | 173 | if (L3[circleAligner + 2]) { |
aamin33 | 6:f99b7d1fd770 | 174 | uLCD.filled_circle(50, 80, 6, BLACK); |
aamin33 | 6:f99b7d1fd770 | 175 | uLCD.filled_circle(66, 80, 8, GREEN); |
aamin33 | 6:f99b7d1fd770 | 176 | } |
aamin33 | 6:f99b7d1fd770 | 177 | if (L4[circleAligner + 2]) { |
aamin33 | 6:f99b7d1fd770 | 178 | uLCD.filled_circle(50, 110, 6, BLACK); |
aamin33 | 6:f99b7d1fd770 | 179 | uLCD.filled_circle(66, 110, 8, LGREY); |
aamin33 | 6:f99b7d1fd770 | 180 | } |
aamin33 | 6:f99b7d1fd770 | 181 | } |
aamin33 | 6:f99b7d1fd770 | 182 | if (circleAligner >= -3) { |
aamin33 | 6:f99b7d1fd770 | 183 | if (L1[circleAligner + 3]) { |
aamin33 | 6:f99b7d1fd770 | 184 | uLCD.filled_circle(38, 20, 4, BLACK); |
aamin33 | 6:f99b7d1fd770 | 185 | uLCD.filled_circle(50, 20, 6, BLUE); |
aamin33 | 6:f99b7d1fd770 | 186 | } |
aamin33 | 6:f99b7d1fd770 | 187 | if (L2[circleAligner + 3]) { |
aamin33 | 6:f99b7d1fd770 | 188 | uLCD.filled_circle(38, 50, 4, BLACK); |
aamin33 | 6:f99b7d1fd770 | 189 | uLCD.filled_circle(50, 50, 6, RED); |
aamin33 | 6:f99b7d1fd770 | 190 | } |
aamin33 | 6:f99b7d1fd770 | 191 | if (L3[circleAligner + 3]) { |
aamin33 | 6:f99b7d1fd770 | 192 | uLCD.filled_circle(38, 80, 4, BLACK); |
aamin33 | 6:f99b7d1fd770 | 193 | uLCD.filled_circle(50, 80, 6, GREEN); |
aamin33 | 6:f99b7d1fd770 | 194 | } |
aamin33 | 6:f99b7d1fd770 | 195 | if (L4[circleAligner + 3]) { |
aamin33 | 6:f99b7d1fd770 | 196 | uLCD.filled_circle(38, 110, 4, BLACK); |
aamin33 | 6:f99b7d1fd770 | 197 | uLCD.filled_circle(50, 110, 6, LGREY); |
aamin33 | 6:f99b7d1fd770 | 198 | } |
aamin33 | 6:f99b7d1fd770 | 199 | } |
aamin33 | 6:f99b7d1fd770 | 200 | if (circleAligner >= -4) { |
aamin33 | 6:f99b7d1fd770 | 201 | if (L1[circleAligner + 4]) { |
aamin33 | 6:f99b7d1fd770 | 202 | uLCD.filled_circle(30, 20, 2, BLACK); |
aamin33 | 6:f99b7d1fd770 | 203 | uLCD.filled_circle(38, 20, 4, BLUE); |
aamin33 | 6:f99b7d1fd770 | 204 | } |
aamin33 | 6:f99b7d1fd770 | 205 | if (L2[circleAligner + 4]) { |
aamin33 | 6:f99b7d1fd770 | 206 | uLCD.filled_circle(30, 50, 2, BLACK); |
aamin33 | 6:f99b7d1fd770 | 207 | uLCD.filled_circle(38, 50, 4, RED); |
aamin33 | 6:f99b7d1fd770 | 208 | } |
aamin33 | 6:f99b7d1fd770 | 209 | if (L3[circleAligner + 4]) { |
aamin33 | 6:f99b7d1fd770 | 210 | uLCD.filled_circle(30, 80, 2, BLACK); |
aamin33 | 6:f99b7d1fd770 | 211 | uLCD.filled_circle(38, 80, 4, GREEN); |
aamin33 | 6:f99b7d1fd770 | 212 | } |
aamin33 | 6:f99b7d1fd770 | 213 | if (L4[circleAligner + 4]) { |
aamin33 | 6:f99b7d1fd770 | 214 | uLCD.filled_circle(30, 110, 2, BLACK); |
aamin33 | 6:f99b7d1fd770 | 215 | uLCD.filled_circle(38, 110, 4, LGREY); |
aamin33 | 6:f99b7d1fd770 | 216 | } |
aamin33 | 6:f99b7d1fd770 | 217 | } |
aamin33 | 6:f99b7d1fd770 | 218 | if (L1[circleAligner + 5]) { |
aamin33 | 6:f99b7d1fd770 | 219 | uLCD.filled_circle(30, 20, 2, BLUE); |
aamin33 | 6:f99b7d1fd770 | 220 | } |
aamin33 | 6:f99b7d1fd770 | 221 | if (L2[circleAligner + 5]) { |
aamin33 | 6:f99b7d1fd770 | 222 | uLCD.filled_circle(30, 50, 2, RED); |
aamin33 | 6:f99b7d1fd770 | 223 | } |
aamin33 | 6:f99b7d1fd770 | 224 | if (L3[circleAligner + 5]) { |
aamin33 | 6:f99b7d1fd770 | 225 | uLCD.filled_circle(30, 80, 2, GREEN); |
aamin33 | 6:f99b7d1fd770 | 226 | } |
aamin33 | 6:f99b7d1fd770 | 227 | if (L4[circleAligner + 5]) { |
aamin33 | 6:f99b7d1fd770 | 228 | uLCD.filled_circle(30, 110, 2, LGREY); |
aamin33 | 6:f99b7d1fd770 | 229 | } |
aamin33 | 6:f99b7d1fd770 | 230 | uLCD.circle(110, 20, 12, WHITE); //draw circles at base |
aamin33 | 6:f99b7d1fd770 | 231 | uLCD.circle(110, 50, 12, WHITE); |
aamin33 | 6:f99b7d1fd770 | 232 | uLCD.circle(110, 80, 12, WHITE); |
aamin33 | 6:f99b7d1fd770 | 233 | uLCD.circle(110, 110, 12, WHITE); |
aamin33 | 6:f99b7d1fd770 | 234 | if(circleAligner >= songLength) { //stop game if game ends before songs ends |
aamin33 | 6:f99b7d1fd770 | 235 | playGame = 0; |
aamin33 | 6:f99b7d1fd770 | 236 | } |
aamin33 | 6:f99b7d1fd770 | 237 | Thread::wait(250); |
dkelsey6 | 2:fae2bc19d19d | 238 | } |
dkelsey6 | 2:fae2bc19d19d | 239 | } |
dkelsey6 | 2:fae2bc19d19d | 240 | |
aamin33 | 6:f99b7d1fd770 | 241 | //----------------------------------------------------------------------------------------------------------------------- |
dkelsey6 | 2:fae2bc19d19d | 242 | |
aamin33 | 6:f99b7d1fd770 | 243 | void musicThread(void const *args) { //Thread to play song, song is selected in mainMenu() |
aamin33 | 6:f99b7d1fd770 | 244 | speakerPWM.period(1.0 / 400000.0); |
dkelsey6 | 2:fae2bc19d19d | 245 | switch(selectedSong) { |
dkelsey6 | 2:fae2bc19d19d | 246 | case 1: |
dkelsey6 | 2:fae2bc19d19d | 247 | wav_file = fopen("/sd/GTShake.wav", "r"); |
dkelsey6 | 2:fae2bc19d19d | 248 | break; |
dkelsey6 | 2:fae2bc19d19d | 249 | case 2: |
dkelsey6 | 2:fae2bc19d19d | 250 | wav_file = fopen("/sd/DarkHorse.wav", "r"); |
dkelsey6 | 2:fae2bc19d19d | 251 | break; |
dkelsey6 | 2:fae2bc19d19d | 252 | case 3: |
dkelsey6 | 2:fae2bc19d19d | 253 | wav_file = fopen("/sd/OneRepublic.wav", "r"); |
dkelsey6 | 2:fae2bc19d19d | 254 | break; |
dkelsey6 | 2:fae2bc19d19d | 255 | case 4: |
dkelsey6 | 2:fae2bc19d19d | 256 | wav_file = fopen("/sd/ShakeItOff.wav", "r"); |
dkelsey6 | 2:fae2bc19d19d | 257 | break; |
dkelsey6 | 2:fae2bc19d19d | 258 | default: |
dkelsey6 | 2:fae2bc19d19d | 259 | wav_file = fopen("/sd/ShakeItOff.wav", "r"); |
dkelsey6 | 2:fae2bc19d19d | 260 | break; |
dkelsey6 | 2:fae2bc19d19d | 261 | } |
dkelsey6 | 3:0d678aefc1d0 | 262 | waver.play(wav_file); |
dkelsey6 | 4:c136aa81f52a | 263 | while (playGame) { |
aamin33 | 6:f99b7d1fd770 | 264 | Thread::wait(100); |
bricecroxton | 0:71e79407f6d5 | 265 | } |
dkelsey6 | 4:c136aa81f52a | 266 | fclose(wav_file); |
bricecroxton | 0:71e79407f6d5 | 267 | } |
bricecroxton | 0:71e79407f6d5 | 268 | |
aamin33 | 6:f99b7d1fd770 | 269 | //----------------------------------------------------------------------------------------------------------------------- |
dkelsey6 | 2:fae2bc19d19d | 270 | |
dkelsey6 | 2:fae2bc19d19d | 271 | //Function to read notes from a text file into arrays |
dkelsey6 | 2:fae2bc19d19d | 272 | //parameters: path of file (string), name of file with no suffix (string) |
dkelsey6 | 2:fae2bc19d19d | 273 | //Example: readFile("/sd/", "test"); gets data from file /sd/test.txt |
dkelsey6 | 2:fae2bc19d19d | 274 | // |
aamin33 | 6:f99b7d1fd770 | 275 | void readFile(const string path, const string fileName) { |
dkelsey6 | 2:fae2bc19d19d | 276 | char name[64]; |
dkelsey6 | 2:fae2bc19d19d | 277 | snprintf(name, sizeof(name), "%s%s.txt", path.c_str(), fileName.c_str()); |
dkelsey6 | 2:fae2bc19d19d | 278 | FILE *fp = fopen(name, "r"); |
dkelsey6 | 2:fae2bc19d19d | 279 | |
dkelsey6 | 2:fae2bc19d19d | 280 | int index = 0; |
dkelsey6 | 2:fae2bc19d19d | 281 | int c; |
dkelsey6 | 2:fae2bc19d19d | 282 | |
dkelsey6 | 2:fae2bc19d19d | 283 | do { |
dkelsey6 | 2:fae2bc19d19d | 284 | c = getc(fp); |
dkelsey6 | 2:fae2bc19d19d | 285 | if(c != '\n') { |
aamin33 | 6:f99b7d1fd770 | 286 | switch (c) { |
dkelsey6 | 2:fae2bc19d19d | 287 | case '1': |
dkelsey6 | 2:fae2bc19d19d | 288 | L1[index] = 1; |
dkelsey6 | 2:fae2bc19d19d | 289 | L2[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 290 | L3[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 291 | L4[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 292 | break; |
dkelsey6 | 2:fae2bc19d19d | 293 | case '2': |
dkelsey6 | 2:fae2bc19d19d | 294 | L1[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 295 | L2[index] = 1; |
dkelsey6 | 2:fae2bc19d19d | 296 | L3[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 297 | L4[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 298 | break; |
dkelsey6 | 2:fae2bc19d19d | 299 | case '3': |
dkelsey6 | 2:fae2bc19d19d | 300 | L1[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 301 | L2[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 302 | L3[index] = 1; |
dkelsey6 | 2:fae2bc19d19d | 303 | L4[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 304 | break; |
dkelsey6 | 2:fae2bc19d19d | 305 | case '4': |
dkelsey6 | 2:fae2bc19d19d | 306 | L1[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 307 | L2[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 308 | L3[index] = 0; |
dkelsey6 | 2:fae2bc19d19d | 309 | L4[index] = 1; |
dkelsey6 | 2:fae2bc19d19d | 310 | break; |
dkelsey6 | 2:fae2bc19d19d | 311 | } |
dkelsey6 | 2:fae2bc19d19d | 312 | index++; |
bricecroxton | 0:71e79407f6d5 | 313 | } |
dkelsey6 | 4:c136aa81f52a | 314 | } while ((c!=EOF) && (index < songLength)); |
dkelsey6 | 2:fae2bc19d19d | 315 | |
dkelsey6 | 2:fae2bc19d19d | 316 | fclose(fp); |
dkelsey6 | 2:fae2bc19d19d | 317 | } |
dkelsey6 | 2:fae2bc19d19d | 318 | |
aamin33 | 6:f99b7d1fd770 | 319 | //Gets data for selected song |
aamin33 | 6:f99b7d1fd770 | 320 | void readSong(int selection) { |
dkelsey6 | 3:0d678aefc1d0 | 321 | switch(selection) { |
dkelsey6 | 4:c136aa81f52a | 322 | case 1: |
dkelsey6 | 4:c136aa81f52a | 323 | readFile("/sd/", "GTShake"); |
dkelsey6 | 4:c136aa81f52a | 324 | break; |
dkelsey6 | 4:c136aa81f52a | 325 | case 2: |
dkelsey6 | 4:c136aa81f52a | 326 | readFile("/sd/", "DarkHorse"); |
dkelsey6 | 4:c136aa81f52a | 327 | break; |
dkelsey6 | 4:c136aa81f52a | 328 | case 3: |
dkelsey6 | 4:c136aa81f52a | 329 | readFile("/sd/", "OneRepublic"); |
dkelsey6 | 4:c136aa81f52a | 330 | break; |
dkelsey6 | 4:c136aa81f52a | 331 | case 4: |
dkelsey6 | 4:c136aa81f52a | 332 | readFile("/sd/", "ShakeItOff"); |
dkelsey6 | 4:c136aa81f52a | 333 | break; |
dkelsey6 | 4:c136aa81f52a | 334 | default: |
dkelsey6 | 4:c136aa81f52a | 335 | readFile("/sd/", "ShakeItOff"); |
dkelsey6 | 4:c136aa81f52a | 336 | break; |
dkelsey6 | 3:0d678aefc1d0 | 337 | } |
dkelsey6 | 3:0d678aefc1d0 | 338 | } |
aamin33 | 6:f99b7d1fd770 | 339 | |
aamin33 | 6:f99b7d1fd770 | 340 | //----------------------------------------------------------------------------------------------------------------------- |
aamin33 | 6:f99b7d1fd770 | 341 | |
aamin33 | 6:f99b7d1fd770 | 342 | void bootMainMenu() { |
aamin33 | 6:f99b7d1fd770 | 343 | uLCD.display_control(PORTRAIT_R); |
aamin33 | 6:f99b7d1fd770 | 344 | uLCD.locate(5,0); |
aamin33 | 6:f99b7d1fd770 | 345 | uLCD.printf("Welcome!"); |
aamin33 | 6:f99b7d1fd770 | 346 | uLCD.locate(2,2); |
aamin33 | 6:f99b7d1fd770 | 347 | uLCD.printf("Choose a song\n\n"); |
aamin33 | 6:f99b7d1fd770 | 348 | uLCD.printf("1: GTShake\n\n"); |
aamin33 | 6:f99b7d1fd770 | 349 | uLCD.printf("2: DarkHorse\n\n"); |
aamin33 | 6:f99b7d1fd770 | 350 | uLCD.printf("3: OneRepublic\n\n"); |
aamin33 | 6:f99b7d1fd770 | 351 | uLCD.printf("4: ShakeItOff\n\n"); |
aamin33 | 6:f99b7d1fd770 | 352 | |
aamin33 | 6:f99b7d1fd770 | 353 | int startGame = 0; |
aamin33 | 6:f99b7d1fd770 | 354 | |
aamin33 | 6:f99b7d1fd770 | 355 | //reset variables used in game |
aamin33 | 6:f99b7d1fd770 | 356 | playGame = 1; |
aamin33 | 6:f99b7d1fd770 | 357 | circleAligner = -6; |
aamin33 | 6:f99b7d1fd770 | 358 | blueIn = '0'; |
aamin33 | 6:f99b7d1fd770 | 359 | score = 0; |
aamin33 | 6:f99b7d1fd770 | 360 | pb1Score = 0; |
aamin33 | 6:f99b7d1fd770 | 361 | pb2Score = 0; |
aamin33 | 6:f99b7d1fd770 | 362 | pb3Score = 0; |
aamin33 | 6:f99b7d1fd770 | 363 | pb4Score = 0; |
aamin33 | 6:f99b7d1fd770 | 364 | |
aamin33 | 6:f99b7d1fd770 | 365 | selectedSong = 0; |
dkelsey6 | 2:fae2bc19d19d | 366 | |
aamin33 | 6:f99b7d1fd770 | 367 | while (!startGame) { //Loop until a valid song is selected |
aamin33 | 6:f99b7d1fd770 | 368 | while (bluemod.readable()) { |
aamin33 | 6:f99b7d1fd770 | 369 | blueIn = bluemod.getc(); //Read bluetooth input and select song. |
aamin33 | 6:f99b7d1fd770 | 370 | switch(blueIn) { |
aamin33 | 6:f99b7d1fd770 | 371 | case '1': |
aamin33 | 6:f99b7d1fd770 | 372 | selectedSong = 1; |
aamin33 | 6:f99b7d1fd770 | 373 | break; |
aamin33 | 6:f99b7d1fd770 | 374 | case '2': |
aamin33 | 6:f99b7d1fd770 | 375 | selectedSong = 2; |
aamin33 | 6:f99b7d1fd770 | 376 | break; |
aamin33 | 6:f99b7d1fd770 | 377 | case '3': |
aamin33 | 6:f99b7d1fd770 | 378 | selectedSong = 3; |
aamin33 | 6:f99b7d1fd770 | 379 | break; |
aamin33 | 6:f99b7d1fd770 | 380 | case '4': |
aamin33 | 6:f99b7d1fd770 | 381 | selectedSong = 4; |
aamin33 | 6:f99b7d1fd770 | 382 | break; |
aamin33 | 6:f99b7d1fd770 | 383 | } |
aamin33 | 6:f99b7d1fd770 | 384 | break; //Only read 1 character at a time |
aamin33 | 6:f99b7d1fd770 | 385 | } |
aamin33 | 6:f99b7d1fd770 | 386 | if(selectedSong >= 1 && selectedSong <= 4) { //Start game once song is selected |
aamin33 | 6:f99b7d1fd770 | 387 | startGame = 1; |
aamin33 | 6:f99b7d1fd770 | 388 | } |
aamin33 | 6:f99b7d1fd770 | 389 | } |
aamin33 | 6:f99b7d1fd770 | 390 | uLCD.cls(); |
aamin33 | 6:f99b7d1fd770 | 391 | } |
aamin33 | 6:f99b7d1fd770 | 392 | |
aamin33 | 6:f99b7d1fd770 | 393 | //----------------------------------------------------------------------------------------------------------------------- |
aamin33 | 6:f99b7d1fd770 | 394 | |
aamin33 | 6:f99b7d1fd770 | 395 | void bootEndScreen() { |
aamin33 | 6:f99b7d1fd770 | 396 | uLCD.cls(); |
aamin33 | 6:f99b7d1fd770 | 397 | uLCD.display_control(PORTRAIT_R); |
aamin33 | 6:f99b7d1fd770 | 398 | score = pb1Score + pb2Score + pb3Score + pb4Score; |
aamin33 | 6:f99b7d1fd770 | 399 | uLCD.printf("Score: %d\n", score); |
aamin33 | 6:f99b7d1fd770 | 400 | uLCD.printf("Percent Correct:\n%04.1f\n\n", (float) score / (float) songLength * 100); |
aamin33 | 6:f99b7d1fd770 | 401 | uLCD.printf("1: Play Again\n"); |
aamin33 | 6:f99b7d1fd770 | 402 | uLCD.printf("2: Quit."); |
aamin33 | 6:f99b7d1fd770 | 403 | blueIn = '0'; |
aamin33 | 6:f99b7d1fd770 | 404 | while (restartGame < 0) { //Loop waiting for bluetooth input |
aamin33 | 6:f99b7d1fd770 | 405 | while (bluemod.readable()) { |
aamin33 | 6:f99b7d1fd770 | 406 | blueIn = bluemod.getc(); //Read bluetooth input and select song. |
aamin33 | 6:f99b7d1fd770 | 407 | if (blueIn == '1') { |
aamin33 | 6:f99b7d1fd770 | 408 | restartGame = 1; //if 1 go back to main menu |
aamin33 | 6:f99b7d1fd770 | 409 | break; |
aamin33 | 6:f99b7d1fd770 | 410 | } else if (blueIn == '2') { |
aamin33 | 6:f99b7d1fd770 | 411 | restartGame = 0; //if 2 end game |
aamin33 | 6:f99b7d1fd770 | 412 | break; |
aamin33 | 6:f99b7d1fd770 | 413 | } |
aamin33 | 6:f99b7d1fd770 | 414 | } |
aamin33 | 6:f99b7d1fd770 | 415 | } |
aamin33 | 6:f99b7d1fd770 | 416 | } |
aamin33 | 6:f99b7d1fd770 | 417 | |
aamin33 | 6:f99b7d1fd770 | 418 | //----------------------------------------------------------------------------------------------------------------------- |
aamin33 | 6:f99b7d1fd770 | 419 | |
aamin33 | 6:f99b7d1fd770 | 420 | int main() { |
aamin33 | 6:f99b7d1fd770 | 421 | uLCD.baudrate(3000000); |
aamin33 | 6:f99b7d1fd770 | 422 | |
aamin33 | 6:f99b7d1fd770 | 423 | pb1.mode(PullUp); |
aamin33 | 6:f99b7d1fd770 | 424 | pb2.mode(PullUp); |
aamin33 | 6:f99b7d1fd770 | 425 | pb3.mode(PullUp); |
aamin33 | 6:f99b7d1fd770 | 426 | pb4.mode(PullUp); |
aamin33 | 6:f99b7d1fd770 | 427 | wait(0.001); |
aamin33 | 6:f99b7d1fd770 | 428 | pb1.attach_deasserted(&pb1_hit_interrupt); |
aamin33 | 6:f99b7d1fd770 | 429 | pb2.attach_deasserted(&pb2_hit_interrupt); |
aamin33 | 6:f99b7d1fd770 | 430 | pb3.attach_deasserted(&pb3_hit_interrupt); |
aamin33 | 6:f99b7d1fd770 | 431 | pb4.attach_deasserted(&pb4_hit_interrupt); |
aamin33 | 6:f99b7d1fd770 | 432 | pb1.setSampleFrequency(); |
aamin33 | 6:f99b7d1fd770 | 433 | pb2.setSampleFrequency(); |
aamin33 | 6:f99b7d1fd770 | 434 | pb3.setSampleFrequency(); |
aamin33 | 6:f99b7d1fd770 | 435 | pb4.setSampleFrequency(); |
aamin33 | 6:f99b7d1fd770 | 436 | |
aamin33 | 6:f99b7d1fd770 | 437 | while(restartGame) { |
aamin33 | 6:f99b7d1fd770 | 438 | bootMainMenu(); //Game stays at menu until player chooses song through bluetooth |
aamin33 | 6:f99b7d1fd770 | 439 | readSong(selectedSong); //create note arrays based on chosen song |
dkelsey6 | 2:fae2bc19d19d | 440 | |
aamin33 | 6:f99b7d1fd770 | 441 | uLCD.display_control(LANDSCAPE_R); //Orient the game in landscape mode. |
dkelsey6 | 4:c136aa81f52a | 442 | |
aamin33 | 6:f99b7d1fd770 | 443 | Thread thread1(lcdThread1); //thread that displays the circles |
aamin33 | 6:f99b7d1fd770 | 444 | Thread thread2(musicThread); //thread that plays the song |
aamin33 | 6:f99b7d1fd770 | 445 | |
dkelsey6 | 2:fae2bc19d19d | 446 | while (playGame) { |
dkelsey6 | 3:0d678aefc1d0 | 447 | Thread::wait(10); |
dkelsey6 | 2:fae2bc19d19d | 448 | } |
dkelsey6 | 2:fae2bc19d19d | 449 | |
aamin33 | 6:f99b7d1fd770 | 450 | thread2.terminate(); //End music thread |
dkelsey6 | 2:fae2bc19d19d | 451 | |
aamin33 | 6:f99b7d1fd770 | 452 | playGame = 1; //reset game state switches |
dkelsey6 | 2:fae2bc19d19d | 453 | restartGame = -1; |
dkelsey6 | 2:fae2bc19d19d | 454 | |
aamin33 | 6:f99b7d1fd770 | 455 | bootEndScreen(); //Game stays at end screen until player restarts or quits |
aamin33 | 6:f99b7d1fd770 | 456 | |
dkelsey6 | 2:fae2bc19d19d | 457 | uLCD.cls(); |
bricecroxton | 0:71e79407f6d5 | 458 | } |
aamin33 | 6:f99b7d1fd770 | 459 | } |