Final Game. Have fun!!! :-)

Dependencies:   4DGL-uLCD-SE PinDetect mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }