Piano Tile Racer Game for ECE 4180

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

Committer:
alanjko9
Date:
Tue May 04 20:38:25 2021 +0000
Revision:
0:eb011b288325
Piano_Tile_Racer_Source_Code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alanjko9 0:eb011b288325 1 #include "mbed.h"
alanjko9 0:eb011b288325 2 #include "SDFileSystem.h"
alanjko9 0:eb011b288325 3 #include "uLCD_4DGL.h"
alanjko9 0:eb011b288325 4 #include <string>
alanjko9 0:eb011b288325 5 #include <list>
alanjko9 0:eb011b288325 6 #include <mpr121.h>
alanjko9 0:eb011b288325 7 #include "rtos.h"
alanjko9 0:eb011b288325 8 #include <sstream>
alanjko9 0:eb011b288325 9
alanjko9 0:eb011b288325 10 // new class to play a note on Speaker based on PwmOut class
alanjko9 0:eb011b288325 11 class Speaker
alanjko9 0:eb011b288325 12 {
alanjko9 0:eb011b288325 13 public:
alanjko9 0:eb011b288325 14 Speaker(PinName pin) : _pin(pin) {
alanjko9 0:eb011b288325 15 // _pin(pin) means pass pin to the Speaker Constructor
alanjko9 0:eb011b288325 16 }
alanjko9 0:eb011b288325 17 // class method to play a note based on PwmOut class
alanjko9 0:eb011b288325 18 void playNote(float frequency) {
alanjko9 0:eb011b288325 19 _pin.period(1.0/frequency);
alanjko9 0:eb011b288325 20 _pin = 0.1;
alanjko9 0:eb011b288325 21 }
alanjko9 0:eb011b288325 22 void off() {
alanjko9 0:eb011b288325 23 _pin = 0.0;
alanjko9 0:eb011b288325 24 }
alanjko9 0:eb011b288325 25
alanjko9 0:eb011b288325 26 private:
alanjko9 0:eb011b288325 27 // sets up specified pin for PWM using PwmOut class
alanjko9 0:eb011b288325 28 PwmOut _pin;
alanjko9 0:eb011b288325 29 };
alanjko9 0:eb011b288325 30
alanjko9 0:eb011b288325 31
alanjko9 0:eb011b288325 32 //set up sd card for storing high scores
alanjko9 0:eb011b288325 33 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
alanjko9 0:eb011b288325 34 //leds to correspond to the key presses for debugging
alanjko9 0:eb011b288325 35 DigitalOut led1(LED1);
alanjko9 0:eb011b288325 36 DigitalOut led2(LED2);
alanjko9 0:eb011b288325 37 DigitalOut led3(LED3);
alanjko9 0:eb011b288325 38 DigitalOut led4(LED4);
alanjko9 0:eb011b288325 39 // Create the interrupt receiver object on pin 26
alanjko9 0:eb011b288325 40 InterruptIn interrupt(p26);
alanjko9 0:eb011b288325 41 // Setup the i2c bus on pins 9 and 10
alanjko9 0:eb011b288325 42 I2C i2c(p9, p10);
alanjko9 0:eb011b288325 43 // Setup the Mpr121:
alanjko9 0:eb011b288325 44 // constructor(i2c object, i2c address of the mpr121)
alanjko9 0:eb011b288325 45 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
alanjko9 0:eb011b288325 46 //set up uLCD
alanjko9 0:eb011b288325 47 uLCD_4DGL uLCD(p28,p27,p11); // serial tx, serial rx, reset pin;
alanjko9 0:eb011b288325 48 //set up speaker on pin 21
alanjko9 0:eb011b288325 49 Speaker speaker(p21);
alanjko9 0:eb011b288325 50
alanjko9 0:eb011b288325 51 //GLOBAL VARIABLES HERE
alanjko9 0:eb011b288325 52 //keycode for touchpad press
alanjko9 0:eb011b288325 53 volatile int key_code = 0;
alanjko9 0:eb011b288325 54 volatile int keyPressed = -1;
alanjko9 0:eb011b288325 55 //bool variables indicating when to update game and screen
alanjko9 0:eb011b288325 56 volatile bool updateGame = false;
alanjko9 0:eb011b288325 57 //state stores the current game state
alanjko9 0:eb011b288325 58 enum State {MENU, PLAYING_GAME, GAME_OVER, SET_MUSIC, SET_DURATION, HIGH_SCORES} state;
alanjko9 0:eb011b288325 59 //the total game duration (default 30 sec. can be 15, 30, 45, 60, 120 sec)
alanjko9 0:eb011b288325 60 float gameDuration = 30.0;
alanjko9 0:eb011b288325 61 //stores the randomly generated tiles in the game (value of 0 is far left, 3 is far right)
alanjko9 0:eb011b288325 62 int tileRow0;
alanjko9 0:eb011b288325 63 int tileRow1;
alanjko9 0:eb011b288325 64 int tileRow2;
alanjko9 0:eb011b288325 65 int tileRow3;
alanjko9 0:eb011b288325 66 //keeps track of the current game score
alanjko9 0:eb011b288325 67 int scoreCount;
alanjko9 0:eb011b288325 68 //Note frequencies for songs
alanjko9 0:eb011b288325 69 float C=261.63, CX=277.18, D=293.66, DX=311.13, E=329.63, F=349.23, FX=369.99, G=392, GX=415.3, A=440, AX=466.16, B=493.88, C1=523.25;
alanjko9 0:eb011b288325 70 //different song arrays
alanjko9 0:eb011b288325 71 float soundOfMusic[] = {C, D, E, C, E, C, E, D, E, F, F, E, D, F, E, F, G, E, G, E, G, F, G, A, A, G, F, A, G, C, D, E, F, G, A, A, D, E, F, G, A, B, B, E, F, G, A, B, C1, C1, B, A, F, B, G, C1, G, E, D};
alanjko9 0:eb011b288325 72 float threeBlindMice[] = {E, D, C, E, D, C, G, F, E, G, F, E, G, C1, C1, B, A, B, C1, G, G, G, C1, C1, B, A, B, C1, G, G, G, C1, C1, B, A, B, C1, G, G, F};
alanjko9 0:eb011b288325 73 float flyMeToTheMoon[] = {C1, B, A, G, F, G, A, C1, B, A, G, F, E, A, G, F, E, D, E, F, A, GX, F, E, D, C, C, D, A, A, C1, B, B, G, C, C, F, F, A, G, E, E};
alanjko9 0:eb011b288325 74 float halfStepScale[] = {C, CX, D, DX, E, F, FX, G, GX, A, AX, B, C1, C1, B, AX, A, GX, G, FX, F, E, DX, D, CX, C};
alanjko9 0:eb011b288325 75 //int used to determine which song is chosen (0-3)
alanjko9 0:eb011b288325 76 int soundToggle = 0;
alanjko9 0:eb011b288325 77 //bool to play song or not
alanjko9 0:eb011b288325 78 bool isSoundOn = false;
alanjko9 0:eb011b288325 79 //int used to toggle through highscores by game duration (0-4) corresponding to increasing time durations)
alanjko9 0:eb011b288325 80 int highScoreToggle = 0;
alanjko9 0:eb011b288325 81 //high score arrays pulled from SD card storage. only need top 5 scores
alanjko9 0:eb011b288325 82 std::list<int> hs15;
alanjko9 0:eb011b288325 83 std::list<int> hs30;
alanjko9 0:eb011b288325 84 std::list<int> hs45;
alanjko9 0:eb011b288325 85 std::list<int> hs60;
alanjko9 0:eb011b288325 86 std::list<int> hs120;
alanjko9 0:eb011b288325 87 //game timer
alanjko9 0:eb011b288325 88 Timer t;
alanjko9 0:eb011b288325 89 //threads
alanjko9 0:eb011b288325 90 Thread gameTimerThread;
alanjko9 0:eb011b288325 91 Thread playSoundThread;
alanjko9 0:eb011b288325 92 Mutex m;
alanjko9 0:eb011b288325 93
alanjko9 0:eb011b288325 94 //below are various draw fuctions to draw on the uLCD
alanjko9 0:eb011b288325 95 //draw the white grid for the piano tiles
alanjko9 0:eb011b288325 96 void refreshGrid()
alanjko9 0:eb011b288325 97 {
alanjko9 0:eb011b288325 98 uLCD.filled_rectangle(0, 0, 80, 127, 0xFFFFFF);
alanjko9 0:eb011b288325 99 }
alanjko9 0:eb011b288325 100 //draw the 4 black tiles corresponding to tileRow0-3
alanjko9 0:eb011b288325 101 void drawTiles() {
alanjko9 0:eb011b288325 102 uLCD.filled_rectangle(20 * tileRow0, 96, 20 * tileRow0 + 20, 127, 0x000000);
alanjko9 0:eb011b288325 103 uLCD.filled_rectangle(20 * tileRow1, 64, 20 * tileRow1 + 20, 95, 0x000000);
alanjko9 0:eb011b288325 104 uLCD.filled_rectangle(20 * tileRow2, 32, 20 * tileRow2 + 20, 63, 0x000000);
alanjko9 0:eb011b288325 105 uLCD.filled_rectangle(20 * tileRow3, 0, 20 * tileRow3 + 20, 31, 0x000000);
alanjko9 0:eb011b288325 106 }
alanjko9 0:eb011b288325 107 //draw the initialized game with all components
alanjko9 0:eb011b288325 108 void drawInitGame() {
alanjko9 0:eb011b288325 109 m.lock();
alanjko9 0:eb011b288325 110 uLCD.cls();
alanjko9 0:eb011b288325 111 refreshGrid();
alanjko9 0:eb011b288325 112 drawTiles();
alanjko9 0:eb011b288325 113 uLCD.color(WHITE);
alanjko9 0:eb011b288325 114 uLCD.text_height(2);
alanjko9 0:eb011b288325 115 uLCD.locate(12,0);
alanjko9 0:eb011b288325 116 uLCD.printf("Timer:");
alanjko9 0:eb011b288325 117 uLCD.locate(12, 2);
alanjko9 0:eb011b288325 118 uLCD.printf(" %.0f ", gameDuration);
alanjko9 0:eb011b288325 119 uLCD.locate(12,4);
alanjko9 0:eb011b288325 120 uLCD.printf("Score:");
alanjko9 0:eb011b288325 121 uLCD.locate(12,6);
alanjko9 0:eb011b288325 122 uLCD.printf(" %d ", scoreCount);
alanjko9 0:eb011b288325 123 m.unlock();
alanjko9 0:eb011b288325 124 }
alanjko9 0:eb011b288325 125 //draw only the updated components during gameplay
alanjko9 0:eb011b288325 126 void drawPlayingGame() {
alanjko9 0:eb011b288325 127 m.lock();
alanjko9 0:eb011b288325 128 refreshGrid();
alanjko9 0:eb011b288325 129 drawTiles();/*
alanjko9 0:eb011b288325 130 uLCD.locate(12, 2);
alanjko9 0:eb011b288325 131 uLCD.printf(" %.0f ", gameDuration - t.read());*/
alanjko9 0:eb011b288325 132 uLCD.locate(12,6);
alanjko9 0:eb011b288325 133 uLCD.printf(" %d ", scoreCount);
alanjko9 0:eb011b288325 134 m.unlock();
alanjko9 0:eb011b288325 135 }
alanjko9 0:eb011b288325 136 //draw the game over screen
alanjko9 0:eb011b288325 137 void drawGameOver() {
alanjko9 0:eb011b288325 138 m.lock();
alanjko9 0:eb011b288325 139
alanjko9 0:eb011b288325 140 uLCD.cls();
alanjko9 0:eb011b288325 141
alanjko9 0:eb011b288325 142 uLCD.text_height(2);
alanjko9 0:eb011b288325 143 uLCD.text_width(2);
alanjko9 0:eb011b288325 144 uLCD.printf("Game Over\n\n");
alanjko9 0:eb011b288325 145
alanjko9 0:eb011b288325 146 uLCD.text_height(1);
alanjko9 0:eb011b288325 147 uLCD.text_width(1);
alanjko9 0:eb011b288325 148 uLCD.printf("\nYour score: %d\n", scoreCount);
alanjko9 0:eb011b288325 149 uLCD.printf("\nPress 4 to return to menu");
alanjko9 0:eb011b288325 150
alanjko9 0:eb011b288325 151 m.unlock();
alanjko9 0:eb011b288325 152 }
alanjko9 0:eb011b288325 153 //draw static menu screen
alanjko9 0:eb011b288325 154 void drawMenu() {
alanjko9 0:eb011b288325 155 m.lock();
alanjko9 0:eb011b288325 156
alanjko9 0:eb011b288325 157 uLCD.cls();
alanjko9 0:eb011b288325 158 uLCD.color(WHITE);
alanjko9 0:eb011b288325 159 uLCD.text_height(2);
alanjko9 0:eb011b288325 160 uLCD.printf(" Piano Tile Racer \n");
alanjko9 0:eb011b288325 161
alanjko9 0:eb011b288325 162 uLCD.color(16757350);
alanjko9 0:eb011b288325 163 uLCD.text_height(1);
alanjko9 0:eb011b288325 164 uLCD.printf("\n\n0. Start Game\n");
alanjko9 0:eb011b288325 165 uLCD.color(6730495);
alanjko9 0:eb011b288325 166 uLCD.printf("\n1. Change Song\n");
alanjko9 0:eb011b288325 167 uLCD.color(6736896);
alanjko9 0:eb011b288325 168 uLCD.printf("\n2. Change Duration\n");
alanjko9 0:eb011b288325 169 uLCD.color(16751001);
alanjko9 0:eb011b288325 170 uLCD.printf("3. See Highscores\n");
alanjko9 0:eb011b288325 171 uLCD.color(13408767);
alanjko9 0:eb011b288325 172 uLCD.printf("\nSound: Duration:\n");
alanjko9 0:eb011b288325 173 if(isSoundOn) {
alanjko9 0:eb011b288325 174 uLCD.printf("[On] [%.0f]", gameDuration);
alanjko9 0:eb011b288325 175 } else {
alanjko9 0:eb011b288325 176 uLCD.printf("[Off] [%.0f]", gameDuration);
alanjko9 0:eb011b288325 177 }
alanjko9 0:eb011b288325 178 m.unlock();
alanjko9 0:eb011b288325 179 }
alanjko9 0:eb011b288325 180 //draw static song selection screen
alanjko9 0:eb011b288325 181 void drawSetMusic() {
alanjko9 0:eb011b288325 182 m.lock();
alanjko9 0:eb011b288325 183
alanjko9 0:eb011b288325 184 uLCD.cls();
alanjko9 0:eb011b288325 185
alanjko9 0:eb011b288325 186 uLCD.color(6730495);
alanjko9 0:eb011b288325 187 uLCD.text_height(2);
alanjko9 0:eb011b288325 188 uLCD.printf(" Song Selection \n");
alanjko9 0:eb011b288325 189
alanjko9 0:eb011b288325 190 uLCD.text_height(1);
alanjko9 0:eb011b288325 191 uLCD.printf("\n0. Back\n");
alanjko9 0:eb011b288325 192 uLCD.printf("\n1. No Music\n");
alanjko9 0:eb011b288325 193 uLCD.printf("\n2. Sound of Music\n");
alanjko9 0:eb011b288325 194 uLCD.printf("\n3. 3 Blind Mice\n");
alanjko9 0:eb011b288325 195 uLCD.printf("\n4. Fly Me to the Moon\n");
alanjko9 0:eb011b288325 196 uLCD.printf("\n5. Half Step Scale\n");
alanjko9 0:eb011b288325 197 m.unlock();
alanjko9 0:eb011b288325 198 }
alanjko9 0:eb011b288325 199 //draw static set duration screen
alanjko9 0:eb011b288325 200 void drawSetDuration() {
alanjko9 0:eb011b288325 201 m.lock();
alanjko9 0:eb011b288325 202
alanjko9 0:eb011b288325 203 uLCD.cls();
alanjko9 0:eb011b288325 204
alanjko9 0:eb011b288325 205 uLCD.color(6736896);
alanjko9 0:eb011b288325 206 uLCD.text_height(2);
alanjko9 0:eb011b288325 207 uLCD.printf(" Game Duration \n");
alanjko9 0:eb011b288325 208
alanjko9 0:eb011b288325 209 uLCD.text_height(1);
alanjko9 0:eb011b288325 210 uLCD.printf("\n\n0. Back\n");
alanjko9 0:eb011b288325 211 uLCD.printf("\n1. 15 seconds\n");
alanjko9 0:eb011b288325 212 uLCD.printf("\n2. 30 seconds\n");
alanjko9 0:eb011b288325 213 uLCD.printf("\n3. 45 seconds\n");
alanjko9 0:eb011b288325 214 uLCD.printf("\n4. 60 seocnds\n");
alanjko9 0:eb011b288325 215 uLCD.printf("\n5. 120 seconds\n");
alanjko9 0:eb011b288325 216 m.unlock();
alanjko9 0:eb011b288325 217 }
alanjko9 0:eb011b288325 218 //draw highscores screen
alanjko9 0:eb011b288325 219 void drawHighScores() {
alanjko9 0:eb011b288325 220 m.lock();
alanjko9 0:eb011b288325 221 uLCD.cls();
alanjko9 0:eb011b288325 222 uLCD.color(16751001);
alanjko9 0:eb011b288325 223 uLCD.text_height(2);
alanjko9 0:eb011b288325 224 uLCD.printf(" High Scores \n");
alanjko9 0:eb011b288325 225 uLCD.text_height(1);
alanjko9 0:eb011b288325 226 uLCD.printf("\n0. Back\n");
alanjko9 0:eb011b288325 227 uLCD.printf("\n1. Toggle Duration\n");
alanjko9 0:eb011b288325 228 uLCD.text_height(2);
alanjko9 0:eb011b288325 229 std::list<int>::iterator it;
alanjko9 0:eb011b288325 230 if (highScoreToggle == 0) {
alanjko9 0:eb011b288325 231 uLCD.printf(" 15 Seconds: \n");
alanjko9 0:eb011b288325 232 uLCD.locate(0,5);
alanjko9 0:eb011b288325 233 for (it=hs15.begin(); it!=hs15.end(); ++it) {
alanjko9 0:eb011b288325 234 printf("%d, ", *it);
alanjko9 0:eb011b288325 235 uLCD.printf("%d, ", *it);
alanjko9 0:eb011b288325 236 }
alanjko9 0:eb011b288325 237 } else if (highScoreToggle == 1) {
alanjko9 0:eb011b288325 238 uLCD.printf(" 30 Seconds: \n");
alanjko9 0:eb011b288325 239 uLCD.locate(0,5);
alanjko9 0:eb011b288325 240 for (it=hs30.begin(); it!=hs30.end(); ++it) {
alanjko9 0:eb011b288325 241 printf("%d, ", *it);
alanjko9 0:eb011b288325 242 uLCD.printf("%d, ", *it);
alanjko9 0:eb011b288325 243 }
alanjko9 0:eb011b288325 244 } else if (highScoreToggle == 2) {
alanjko9 0:eb011b288325 245 uLCD.printf(" 45 Seconds: \n");
alanjko9 0:eb011b288325 246 uLCD.locate(0,5);
alanjko9 0:eb011b288325 247 for (it=hs45.begin(); it!=hs45.end(); ++it) {
alanjko9 0:eb011b288325 248 printf("%d, ", *it);
alanjko9 0:eb011b288325 249 uLCD.printf("%d, ", *it);
alanjko9 0:eb011b288325 250 }
alanjko9 0:eb011b288325 251 } else if (highScoreToggle == 3) {
alanjko9 0:eb011b288325 252 uLCD.printf(" 60 Seconds: \n");
alanjko9 0:eb011b288325 253 uLCD.locate(0,5);
alanjko9 0:eb011b288325 254 for (it=hs60.begin(); it!=hs60.end(); ++it) {
alanjko9 0:eb011b288325 255 printf("%d, ", *it);
alanjko9 0:eb011b288325 256 uLCD.printf("%d, ", *it);
alanjko9 0:eb011b288325 257 }
alanjko9 0:eb011b288325 258 } else if (highScoreToggle == 4) {
alanjko9 0:eb011b288325 259 uLCD.printf(" 120 Seconds: \n");
alanjko9 0:eb011b288325 260 uLCD.locate(0,5);
alanjko9 0:eb011b288325 261 for (it=hs120.begin(); it!=hs120.end(); ++it) {
alanjko9 0:eb011b288325 262 printf("%d, ", *it);
alanjko9 0:eb011b288325 263 uLCD.printf("%d, ", *it);
alanjko9 0:eb011b288325 264 }
alanjko9 0:eb011b288325 265 }
alanjko9 0:eb011b288325 266 printf("\n");
alanjko9 0:eb011b288325 267 m.unlock();
alanjko9 0:eb011b288325 268 }
alanjko9 0:eb011b288325 269 //thread called in main to continuously update game timer
alanjko9 0:eb011b288325 270 void gameTimer() {
alanjko9 0:eb011b288325 271 t.reset();
alanjko9 0:eb011b288325 272 t.start();
alanjko9 0:eb011b288325 273 while(1) {
alanjko9 0:eb011b288325 274 //The game duration is reached and the game is over
alanjko9 0:eb011b288325 275 if (t.read() >= gameDuration) {
alanjko9 0:eb011b288325 276 speaker.off();
alanjko9 0:eb011b288325 277 state = GAME_OVER;
alanjko9 0:eb011b288325 278 drawGameOver();
alanjko9 0:eb011b288325 279 gameTimerThread.terminate();
alanjko9 0:eb011b288325 280 playSoundThread.terminate();
alanjko9 0:eb011b288325 281 }
alanjko9 0:eb011b288325 282 m.lock();
alanjko9 0:eb011b288325 283 uLCD.locate(12, 2);
alanjko9 0:eb011b288325 284 uLCD.printf(" %.0f ", gameDuration - t.read());
alanjko9 0:eb011b288325 285 m.unlock();
alanjko9 0:eb011b288325 286 Thread::wait(100);
alanjko9 0:eb011b288325 287 }
alanjko9 0:eb011b288325 288 }
alanjko9 0:eb011b288325 289 //Thread called in main to play sound
alanjko9 0:eb011b288325 290 void playSound() {
alanjko9 0:eb011b288325 291 int prevScoreCount = 0;
alanjko9 0:eb011b288325 292 Timer s;
alanjko9 0:eb011b288325 293 while(1) {
alanjko9 0:eb011b288325 294 //means correct key has been pressed and next note should play
alanjko9 0:eb011b288325 295 if (prevScoreCount != scoreCount) {
alanjko9 0:eb011b288325 296 if (soundToggle == 0)
alanjko9 0:eb011b288325 297 speaker.playNote(soundOfMusic[(scoreCount-1) % 59]);
alanjko9 0:eb011b288325 298 else if (soundToggle == 1)
alanjko9 0:eb011b288325 299 speaker.playNote(threeBlindMice[(scoreCount-1) % 40]);
alanjko9 0:eb011b288325 300 else if (soundToggle == 2)
alanjko9 0:eb011b288325 301 speaker.playNote(flyMeToTheMoon[(scoreCount-1) % 42]);
alanjko9 0:eb011b288325 302 else if (soundToggle == 3)
alanjko9 0:eb011b288325 303 speaker.playNote(halfStepScale[(scoreCount-1) % 26]);
alanjko9 0:eb011b288325 304 s.reset();
alanjko9 0:eb011b288325 305 s.start();
alanjko9 0:eb011b288325 306 prevScoreCount = scoreCount;
alanjko9 0:eb011b288325 307 }
alanjko9 0:eb011b288325 308 //only allow each note to play a max of 0.3 seconds
alanjko9 0:eb011b288325 309 else if (s.read() > 0.3) {
alanjko9 0:eb011b288325 310 speaker.off();
alanjko9 0:eb011b288325 311 s.stop();
alanjko9 0:eb011b288325 312 }
alanjko9 0:eb011b288325 313 Thread::wait(100);
alanjko9 0:eb011b288325 314 }
alanjko9 0:eb011b288325 315 }
alanjko9 0:eb011b288325 316
alanjko9 0:eb011b288325 317 //function called inside updateHighScoreArrays to update SD card
alanjko9 0:eb011b288325 318 //dur specifies which duration's highscores have been updated
alanjko9 0:eb011b288325 319 void updateHighScoreSD(int dur) {
alanjko9 0:eb011b288325 320 //mkdir("/sd/PianoTileRacer", 0777);
alanjko9 0:eb011b288325 321 std::list<int>::iterator iterator;
alanjko9 0:eb011b288325 322 if (dur == 15) {
alanjko9 0:eb011b288325 323 FILE *fp = fopen("/sd/PianoTileRacer/highScores15.txt", "w");
alanjko9 0:eb011b288325 324 if(fp == NULL) {
alanjko9 0:eb011b288325 325 error("Could not open file for write\n");
alanjko9 0:eb011b288325 326 }
alanjko9 0:eb011b288325 327 for (iterator = hs15.begin(); iterator != hs15.end(); ++iterator) {
alanjko9 0:eb011b288325 328 fprintf(fp, "%d ", *iterator);
alanjko9 0:eb011b288325 329 }
alanjko9 0:eb011b288325 330 fclose(fp);
alanjko9 0:eb011b288325 331 return;
alanjko9 0:eb011b288325 332 } else if (dur == 30) {
alanjko9 0:eb011b288325 333 FILE *fp = fopen("/sd/PianoTileRacer/highScores30.txt", "w");
alanjko9 0:eb011b288325 334 if(fp == NULL) {
alanjko9 0:eb011b288325 335 error("Could not open file for write\n");
alanjko9 0:eb011b288325 336 }
alanjko9 0:eb011b288325 337 for (iterator = hs30.begin(); iterator != hs30.end(); ++iterator) {
alanjko9 0:eb011b288325 338 fprintf(fp, "%d ", *iterator);
alanjko9 0:eb011b288325 339 }
alanjko9 0:eb011b288325 340 fclose(fp);
alanjko9 0:eb011b288325 341 return;
alanjko9 0:eb011b288325 342 } else if (dur == 45) {
alanjko9 0:eb011b288325 343 FILE *fp = fopen("/sd/PianoTileRacer/highScores45.txt", "w");
alanjko9 0:eb011b288325 344 if(fp == NULL) {
alanjko9 0:eb011b288325 345 error("Could not open file for write\n");
alanjko9 0:eb011b288325 346 }
alanjko9 0:eb011b288325 347 for (iterator = hs45.begin(); iterator != hs45.end(); ++iterator) {
alanjko9 0:eb011b288325 348 fprintf(fp, "%d ", *iterator);
alanjko9 0:eb011b288325 349 }
alanjko9 0:eb011b288325 350 fclose(fp);
alanjko9 0:eb011b288325 351 return;
alanjko9 0:eb011b288325 352 } else if (dur == 60) {
alanjko9 0:eb011b288325 353 FILE *fp = fopen("/sd/PianoTileRacer/highScores60.txt", "w");
alanjko9 0:eb011b288325 354 if(fp == NULL) {
alanjko9 0:eb011b288325 355 error("Could not open file for write\n");
alanjko9 0:eb011b288325 356 }
alanjko9 0:eb011b288325 357 for (iterator = hs60.begin(); iterator != hs60.end(); ++iterator) {
alanjko9 0:eb011b288325 358 fprintf(fp, "%d ", *iterator);
alanjko9 0:eb011b288325 359 }
alanjko9 0:eb011b288325 360 fclose(fp);
alanjko9 0:eb011b288325 361 return;
alanjko9 0:eb011b288325 362 } else if (dur == 120) {
alanjko9 0:eb011b288325 363 FILE *fp = fopen("/sd/PianoTileRacer/highScores120.txt", "w");
alanjko9 0:eb011b288325 364 if(fp == NULL) {
alanjko9 0:eb011b288325 365 error("Could not open file for write\n");
alanjko9 0:eb011b288325 366 }
alanjko9 0:eb011b288325 367 for (iterator = hs120.begin(); iterator != hs120.end(); ++iterator) {
alanjko9 0:eb011b288325 368 fprintf(fp, "%d ", *iterator);
alanjko9 0:eb011b288325 369 }
alanjko9 0:eb011b288325 370 fclose(fp);
alanjko9 0:eb011b288325 371 return;
alanjko9 0:eb011b288325 372 }
alanjko9 0:eb011b288325 373 }
alanjko9 0:eb011b288325 374
alanjko9 0:eb011b288325 375 //update highscores to arrays
alanjko9 0:eb011b288325 376 void updateHighScoreArrays(int score) {
alanjko9 0:eb011b288325 377 std::list<int>::iterator iterator;
alanjko9 0:eb011b288325 378 if (gameDuration == 15.0) {
alanjko9 0:eb011b288325 379 //empty list case
alanjko9 0:eb011b288325 380 if (hs15.empty()) {
alanjko9 0:eb011b288325 381 hs15.push_front(score);
alanjko9 0:eb011b288325 382 updateHighScoreSD(15);
alanjko9 0:eb011b288325 383 return;
alanjko9 0:eb011b288325 384 }
alanjko9 0:eb011b288325 385 //insert somewhere in the middle case
alanjko9 0:eb011b288325 386 for (iterator = hs15.begin(); iterator != hs15.end(); ++iterator) {
alanjko9 0:eb011b288325 387 if(score > *iterator) {
alanjko9 0:eb011b288325 388 hs15.insert(iterator, score);
alanjko9 0:eb011b288325 389 //make sure list is a max size of 5
alanjko9 0:eb011b288325 390 if (hs15.size() > 5) {
alanjko9 0:eb011b288325 391 hs15.pop_back();
alanjko9 0:eb011b288325 392 }
alanjko9 0:eb011b288325 393 updateHighScoreSD(15);
alanjko9 0:eb011b288325 394 return;
alanjko9 0:eb011b288325 395 }
alanjko9 0:eb011b288325 396 }
alanjko9 0:eb011b288325 397 //insert at the end of list case
alanjko9 0:eb011b288325 398 if (hs15.size() < 5) {
alanjko9 0:eb011b288325 399 hs15.push_back(score);
alanjko9 0:eb011b288325 400 updateHighScoreSD(15);
alanjko9 0:eb011b288325 401 }
alanjko9 0:eb011b288325 402 return;
alanjko9 0:eb011b288325 403 } else if (gameDuration == 30.0) {
alanjko9 0:eb011b288325 404 //empty list case
alanjko9 0:eb011b288325 405 if (hs30.empty()) {
alanjko9 0:eb011b288325 406 hs30.push_front(score);
alanjko9 0:eb011b288325 407 updateHighScoreSD(30);
alanjko9 0:eb011b288325 408 return;
alanjko9 0:eb011b288325 409 }
alanjko9 0:eb011b288325 410 //insert somewhere in the middle case
alanjko9 0:eb011b288325 411 for (iterator = hs30.begin(); iterator != hs30.end(); ++iterator) {
alanjko9 0:eb011b288325 412 if(score > *iterator) {
alanjko9 0:eb011b288325 413 hs30.insert(iterator, score);
alanjko9 0:eb011b288325 414 //make sure list is a max size of 5
alanjko9 0:eb011b288325 415 if (hs30.size() > 5) {
alanjko9 0:eb011b288325 416 hs30.pop_back();
alanjko9 0:eb011b288325 417 }
alanjko9 0:eb011b288325 418 updateHighScoreSD(30);
alanjko9 0:eb011b288325 419 return;
alanjko9 0:eb011b288325 420 }
alanjko9 0:eb011b288325 421 }
alanjko9 0:eb011b288325 422 //insert at the end of list case
alanjko9 0:eb011b288325 423 if (hs30.size() < 5) {
alanjko9 0:eb011b288325 424 hs30.push_back(score);
alanjko9 0:eb011b288325 425 updateHighScoreSD(30);
alanjko9 0:eb011b288325 426 }
alanjko9 0:eb011b288325 427 return;
alanjko9 0:eb011b288325 428 } else if (gameDuration == 45.0) {
alanjko9 0:eb011b288325 429 //empty list case
alanjko9 0:eb011b288325 430 if (hs45.empty()) {
alanjko9 0:eb011b288325 431 hs45.push_front(score);
alanjko9 0:eb011b288325 432 updateHighScoreSD(45);
alanjko9 0:eb011b288325 433 return;
alanjko9 0:eb011b288325 434 }
alanjko9 0:eb011b288325 435 //insert somewhere in the middle case
alanjko9 0:eb011b288325 436 for (iterator = hs45.begin(); iterator != hs45.end(); ++iterator) {
alanjko9 0:eb011b288325 437 if(score > *iterator) {
alanjko9 0:eb011b288325 438 hs45.insert(iterator, score);
alanjko9 0:eb011b288325 439 //make sure list is a max size of 5
alanjko9 0:eb011b288325 440 if (hs45.size() > 5) {
alanjko9 0:eb011b288325 441 hs45.pop_back();
alanjko9 0:eb011b288325 442 }
alanjko9 0:eb011b288325 443 updateHighScoreSD(45);
alanjko9 0:eb011b288325 444 return;
alanjko9 0:eb011b288325 445 }
alanjko9 0:eb011b288325 446 }
alanjko9 0:eb011b288325 447 //insert at the end of list case
alanjko9 0:eb011b288325 448 if (hs45.size() < 5) {
alanjko9 0:eb011b288325 449 hs45.push_back(score);
alanjko9 0:eb011b288325 450 updateHighScoreSD(45);
alanjko9 0:eb011b288325 451 }
alanjko9 0:eb011b288325 452 return;
alanjko9 0:eb011b288325 453 } else if (gameDuration == 60.0) {
alanjko9 0:eb011b288325 454 //empty list case
alanjko9 0:eb011b288325 455 if (hs60.empty()) {
alanjko9 0:eb011b288325 456 hs60.push_front(score);
alanjko9 0:eb011b288325 457 updateHighScoreSD(60);
alanjko9 0:eb011b288325 458 return;
alanjko9 0:eb011b288325 459 }
alanjko9 0:eb011b288325 460 //insert somewhere in the middle case
alanjko9 0:eb011b288325 461 for (iterator = hs60.begin(); iterator != hs60.end(); ++iterator) {
alanjko9 0:eb011b288325 462 if(score > *iterator) {
alanjko9 0:eb011b288325 463 hs60.insert(iterator, score);
alanjko9 0:eb011b288325 464 //make sure list is a max size of 5
alanjko9 0:eb011b288325 465 if (hs60.size() > 5) {
alanjko9 0:eb011b288325 466 hs60.pop_back();
alanjko9 0:eb011b288325 467 }
alanjko9 0:eb011b288325 468 updateHighScoreSD(60);
alanjko9 0:eb011b288325 469 return;
alanjko9 0:eb011b288325 470 }
alanjko9 0:eb011b288325 471 }
alanjko9 0:eb011b288325 472 //insert at the end of list case
alanjko9 0:eb011b288325 473 if (hs60.size() < 5) {
alanjko9 0:eb011b288325 474 hs60.push_back(score);
alanjko9 0:eb011b288325 475 updateHighScoreSD(60);
alanjko9 0:eb011b288325 476 }
alanjko9 0:eb011b288325 477 return;
alanjko9 0:eb011b288325 478 } else if (gameDuration == 120.0) {
alanjko9 0:eb011b288325 479 //empty list case
alanjko9 0:eb011b288325 480 if (hs120.empty()) {
alanjko9 0:eb011b288325 481 hs120.push_front(score);
alanjko9 0:eb011b288325 482 updateHighScoreSD(120);
alanjko9 0:eb011b288325 483 return;
alanjko9 0:eb011b288325 484 }
alanjko9 0:eb011b288325 485 //insert somewhere in the middle case
alanjko9 0:eb011b288325 486 for (iterator = hs120.begin(); iterator != hs120.end(); ++iterator) {
alanjko9 0:eb011b288325 487 if(score > *iterator) {
alanjko9 0:eb011b288325 488 hs120.insert(iterator, score);
alanjko9 0:eb011b288325 489 //make sure list is a max size of 5
alanjko9 0:eb011b288325 490 if (hs120.size() > 5) {
alanjko9 0:eb011b288325 491 hs120.pop_back();
alanjko9 0:eb011b288325 492 }
alanjko9 0:eb011b288325 493 updateHighScoreSD(120);
alanjko9 0:eb011b288325 494 return;
alanjko9 0:eb011b288325 495 }
alanjko9 0:eb011b288325 496 }
alanjko9 0:eb011b288325 497 //insert at the end of list case
alanjko9 0:eb011b288325 498 if (hs120.size() < 5) {
alanjko9 0:eb011b288325 499 hs120.push_back(score);
alanjko9 0:eb011b288325 500 updateHighScoreSD(120);
alanjko9 0:eb011b288325 501 }
alanjko9 0:eb011b288325 502 return;
alanjko9 0:eb011b288325 503 }
alanjko9 0:eb011b288325 504 }
alanjko9 0:eb011b288325 505
alanjko9 0:eb011b288325 506 //reads in highscores to the arrays. This is only called once in the very beginning of main
alanjko9 0:eb011b288325 507 void readInHighScores() {
alanjko9 0:eb011b288325 508 int tempScore;
alanjko9 0:eb011b288325 509 char c;
alanjko9 0:eb011b288325 510 std::string scoreStr = "";
alanjko9 0:eb011b288325 511 //15 second highscores
alanjko9 0:eb011b288325 512 FILE *fp = fopen("/sd/PianoTileRacer/highScores15.txt", "r");
alanjko9 0:eb011b288325 513 if(fp == NULL) {
alanjko9 0:eb011b288325 514 error("Could not open file for read 15\n");
alanjko9 0:eb011b288325 515 }
alanjko9 0:eb011b288325 516 while (!feof(fp)){ // while not end of file
alanjko9 0:eb011b288325 517 c = fgetc(fp);
alanjko9 0:eb011b288325 518 if (c != ' ') {
alanjko9 0:eb011b288325 519 scoreStr = scoreStr + c;
alanjko9 0:eb011b288325 520 } else {
alanjko9 0:eb011b288325 521 stringstream ss(scoreStr);
alanjko9 0:eb011b288325 522 ss >> tempScore;
alanjko9 0:eb011b288325 523 hs15.push_back(tempScore);
alanjko9 0:eb011b288325 524 scoreStr = "";
alanjko9 0:eb011b288325 525 }
alanjko9 0:eb011b288325 526 }
alanjko9 0:eb011b288325 527 fclose(fp);
alanjko9 0:eb011b288325 528 //30 second highscores
alanjko9 0:eb011b288325 529 tempScore = -1;
alanjko9 0:eb011b288325 530 c = NULL;
alanjko9 0:eb011b288325 531 scoreStr = "";
alanjko9 0:eb011b288325 532 fp = fopen("/sd/PianoTileRacer/highScores30.txt", "r");
alanjko9 0:eb011b288325 533 if(fp == NULL) {
alanjko9 0:eb011b288325 534 error("Could not open file for read 30\n");
alanjko9 0:eb011b288325 535 }
alanjko9 0:eb011b288325 536 while (!feof(fp)){ // while not end of file
alanjko9 0:eb011b288325 537 c = fgetc(fp);
alanjko9 0:eb011b288325 538 if (c != ' ') {
alanjko9 0:eb011b288325 539 scoreStr = scoreStr + c;
alanjko9 0:eb011b288325 540 } else {
alanjko9 0:eb011b288325 541 stringstream ss(scoreStr);
alanjko9 0:eb011b288325 542 ss >> tempScore;
alanjko9 0:eb011b288325 543 hs30.push_back(tempScore);
alanjko9 0:eb011b288325 544 scoreStr = "";
alanjko9 0:eb011b288325 545 }
alanjko9 0:eb011b288325 546 }
alanjko9 0:eb011b288325 547 fclose(fp);
alanjko9 0:eb011b288325 548 //45 second highscores
alanjko9 0:eb011b288325 549 tempScore = -1;
alanjko9 0:eb011b288325 550 c = NULL;
alanjko9 0:eb011b288325 551 scoreStr = "";
alanjko9 0:eb011b288325 552 fp = fopen("/sd/PianoTileRacer/highScores45.txt", "r");
alanjko9 0:eb011b288325 553 if(fp == NULL) {
alanjko9 0:eb011b288325 554 error("Could not open file for read 45\n");
alanjko9 0:eb011b288325 555 }
alanjko9 0:eb011b288325 556 while (!feof(fp)){ // while not end of file
alanjko9 0:eb011b288325 557 c = fgetc(fp);
alanjko9 0:eb011b288325 558 if (c != ' ') {
alanjko9 0:eb011b288325 559 scoreStr = scoreStr + c;
alanjko9 0:eb011b288325 560 } else {
alanjko9 0:eb011b288325 561 stringstream ss(scoreStr);
alanjko9 0:eb011b288325 562 ss >> tempScore;
alanjko9 0:eb011b288325 563 hs45.push_back(tempScore);
alanjko9 0:eb011b288325 564 scoreStr = "";
alanjko9 0:eb011b288325 565 }
alanjko9 0:eb011b288325 566 }
alanjko9 0:eb011b288325 567 fclose(fp);
alanjko9 0:eb011b288325 568 //60 second highscores
alanjko9 0:eb011b288325 569 tempScore = -1;
alanjko9 0:eb011b288325 570 c = NULL;
alanjko9 0:eb011b288325 571 scoreStr = "";
alanjko9 0:eb011b288325 572 fp = fopen("/sd/PianoTileRacer/highScores60.txt", "r");
alanjko9 0:eb011b288325 573 if(fp == NULL) {
alanjko9 0:eb011b288325 574 error("Could not open file for read 60\n");
alanjko9 0:eb011b288325 575 }
alanjko9 0:eb011b288325 576 while (!feof(fp)){ // while not end of file
alanjko9 0:eb011b288325 577 c = fgetc(fp);
alanjko9 0:eb011b288325 578 if (c != ' ') {
alanjko9 0:eb011b288325 579 scoreStr = scoreStr + c;
alanjko9 0:eb011b288325 580 } else {
alanjko9 0:eb011b288325 581 stringstream ss(scoreStr);
alanjko9 0:eb011b288325 582 ss >> tempScore;
alanjko9 0:eb011b288325 583 hs60.push_back(tempScore);
alanjko9 0:eb011b288325 584 scoreStr = "";
alanjko9 0:eb011b288325 585 }
alanjko9 0:eb011b288325 586 }
alanjko9 0:eb011b288325 587 fclose(fp);
alanjko9 0:eb011b288325 588 //120 second highscores
alanjko9 0:eb011b288325 589 tempScore = -1;
alanjko9 0:eb011b288325 590 c = NULL;
alanjko9 0:eb011b288325 591 scoreStr = "";
alanjko9 0:eb011b288325 592 fp = fopen("/sd/PianoTileRacer/highScores120.txt", "r");
alanjko9 0:eb011b288325 593 if(fp == NULL) {
alanjko9 0:eb011b288325 594 error("Could not open file for read 120\n");
alanjko9 0:eb011b288325 595 }
alanjko9 0:eb011b288325 596 while (!feof(fp)){ // while not end of file
alanjko9 0:eb011b288325 597 c = fgetc(fp);
alanjko9 0:eb011b288325 598 if (c != ' ') {
alanjko9 0:eb011b288325 599 scoreStr = scoreStr + c;
alanjko9 0:eb011b288325 600 } else {
alanjko9 0:eb011b288325 601 stringstream ss(scoreStr);
alanjko9 0:eb011b288325 602 ss >> tempScore;
alanjko9 0:eb011b288325 603 hs120.push_back(tempScore);
alanjko9 0:eb011b288325 604 scoreStr = "";
alanjko9 0:eb011b288325 605 }
alanjko9 0:eb011b288325 606 }
alanjko9 0:eb011b288325 607 fclose(fp);
alanjko9 0:eb011b288325 608 m.unlock();
alanjko9 0:eb011b288325 609 }
alanjko9 0:eb011b288325 610
alanjko9 0:eb011b288325 611 //function called upon touchpad press
alanjko9 0:eb011b288325 612 //this function is responsible for managing backend updates and calling the correct draw functions
alanjko9 0:eb011b288325 613 //returning 1 means the actual game is starting and starts the game timer thread
alanjko9 0:eb011b288325 614 int updateGameInfo() {
alanjko9 0:eb011b288325 615 //playing game state
alanjko9 0:eb011b288325 616 if(state == PLAYING_GAME) {
alanjko9 0:eb011b288325 617 //if the right key is pressed
alanjko9 0:eb011b288325 618 if (keyPressed == tileRow0) {
alanjko9 0:eb011b288325 619 //increase score count
alanjko9 0:eb011b288325 620 m.lock();
alanjko9 0:eb011b288325 621 scoreCount++;
alanjko9 0:eb011b288325 622 m.unlock();
alanjko9 0:eb011b288325 623 //shift down the rows and generate a new row
alanjko9 0:eb011b288325 624 tileRow0 = tileRow1;
alanjko9 0:eb011b288325 625 tileRow1 = tileRow2;
alanjko9 0:eb011b288325 626 tileRow2 = tileRow3;
alanjko9 0:eb011b288325 627 tileRow3 = rand() % 4;
alanjko9 0:eb011b288325 628 drawPlayingGame();
alanjko9 0:eb011b288325 629 return 0;
alanjko9 0:eb011b288325 630 } else { //if the wrong key is pressed
alanjko9 0:eb011b288325 631 speaker.off();
alanjko9 0:eb011b288325 632 state = GAME_OVER;
alanjko9 0:eb011b288325 633 gameTimerThread.terminate();
alanjko9 0:eb011b288325 634 playSoundThread.terminate();
alanjko9 0:eb011b288325 635 drawGameOver();
alanjko9 0:eb011b288325 636 return 0;
alanjko9 0:eb011b288325 637 }
alanjko9 0:eb011b288325 638 }
alanjko9 0:eb011b288325 639 //game over state, keypress 4 returns to menu and writes highscores to arrays and SD card
alanjko9 0:eb011b288325 640 else if (state == GAME_OVER && keyPressed == 4) {
alanjko9 0:eb011b288325 641 updateHighScoreArrays(scoreCount);
alanjko9 0:eb011b288325 642 state = MENU;
alanjko9 0:eb011b288325 643 drawMenu();
alanjko9 0:eb011b288325 644 return 0;
alanjko9 0:eb011b288325 645 }
alanjko9 0:eb011b288325 646 //menu state
alanjko9 0:eb011b288325 647 else if (state == MENU) {
alanjko9 0:eb011b288325 648 if (keyPressed == 0){
alanjko9 0:eb011b288325 649 //initialize tile rows
alanjko9 0:eb011b288325 650 srand (time(NULL));
alanjko9 0:eb011b288325 651 tileRow0 = rand() % 4;
alanjko9 0:eb011b288325 652 tileRow1 = rand() % 4;
alanjko9 0:eb011b288325 653 tileRow2 = rand() % 4;
alanjko9 0:eb011b288325 654 tileRow3 = rand() % 4;
alanjko9 0:eb011b288325 655 scoreCount = 0;
alanjko9 0:eb011b288325 656 state = PLAYING_GAME;
alanjko9 0:eb011b288325 657 drawInitGame();
alanjko9 0:eb011b288325 658 return 1;
alanjko9 0:eb011b288325 659 } else if (keyPressed == 1) {
alanjko9 0:eb011b288325 660 state = SET_MUSIC;
alanjko9 0:eb011b288325 661 drawSetMusic();
alanjko9 0:eb011b288325 662 return 0;
alanjko9 0:eb011b288325 663 } else if (keyPressed == 2) {
alanjko9 0:eb011b288325 664 state = SET_DURATION;
alanjko9 0:eb011b288325 665 drawSetDuration();
alanjko9 0:eb011b288325 666 return 0;
alanjko9 0:eb011b288325 667 } else if (keyPressed == 3) {
alanjko9 0:eb011b288325 668 state = HIGH_SCORES;
alanjko9 0:eb011b288325 669 drawHighScores();
alanjko9 0:eb011b288325 670 return 0;
alanjko9 0:eb011b288325 671 } else if (keyPressed == 11) {
alanjko9 0:eb011b288325 672 readInHighScores();
alanjko9 0:eb011b288325 673 drawMenu();
alanjko9 0:eb011b288325 674 return 0;
alanjko9 0:eb011b288325 675 }
alanjko9 0:eb011b288325 676 }
alanjko9 0:eb011b288325 677 //changing music screen
alanjko9 0:eb011b288325 678 else if (state == SET_MUSIC) {
alanjko9 0:eb011b288325 679 if (keyPressed == 1) {
alanjko9 0:eb011b288325 680 isSoundOn = false;
alanjko9 0:eb011b288325 681 } else if (keyPressed == 2) {
alanjko9 0:eb011b288325 682 isSoundOn = true;
alanjko9 0:eb011b288325 683 soundToggle = 0;
alanjko9 0:eb011b288325 684 } else if (keyPressed == 3) {
alanjko9 0:eb011b288325 685 isSoundOn = true;
alanjko9 0:eb011b288325 686 soundToggle = 1;
alanjko9 0:eb011b288325 687 } else if (keyPressed == 4) {
alanjko9 0:eb011b288325 688 isSoundOn = true;
alanjko9 0:eb011b288325 689 soundToggle = 2;
alanjko9 0:eb011b288325 690 } else if (keyPressed == 5) {
alanjko9 0:eb011b288325 691 isSoundOn = true;
alanjko9 0:eb011b288325 692 soundToggle = 3;
alanjko9 0:eb011b288325 693 }
alanjko9 0:eb011b288325 694 state = MENU;
alanjko9 0:eb011b288325 695 drawMenu();
alanjko9 0:eb011b288325 696 return 0;
alanjko9 0:eb011b288325 697 }
alanjko9 0:eb011b288325 698 //changing duration screen
alanjko9 0:eb011b288325 699 else if (state == SET_DURATION) {
alanjko9 0:eb011b288325 700 if (keyPressed == 1) {
alanjko9 0:eb011b288325 701 gameDuration = 15.0;
alanjko9 0:eb011b288325 702 } else if (keyPressed == 2) {
alanjko9 0:eb011b288325 703 gameDuration = 30.0;
alanjko9 0:eb011b288325 704 } else if (keyPressed == 3) {
alanjko9 0:eb011b288325 705 gameDuration = 45.0;
alanjko9 0:eb011b288325 706 } else if (keyPressed == 4) {
alanjko9 0:eb011b288325 707 gameDuration = 60.0;
alanjko9 0:eb011b288325 708 } else if (keyPressed == 5) {
alanjko9 0:eb011b288325 709 gameDuration = 120.0;
alanjko9 0:eb011b288325 710 }
alanjko9 0:eb011b288325 711 state = MENU;
alanjko9 0:eb011b288325 712 drawMenu();
alanjko9 0:eb011b288325 713 return 0;
alanjko9 0:eb011b288325 714 }
alanjko9 0:eb011b288325 715 //viewing highscores screen
alanjko9 0:eb011b288325 716 else if (state == HIGH_SCORES) {
alanjko9 0:eb011b288325 717 if (keyPressed == 0) {
alanjko9 0:eb011b288325 718 highScoreToggle = 0;
alanjko9 0:eb011b288325 719 state = MENU;
alanjko9 0:eb011b288325 720 drawMenu();
alanjko9 0:eb011b288325 721 return 0;
alanjko9 0:eb011b288325 722 } else if (keyPressed == 1) {
alanjko9 0:eb011b288325 723 highScoreToggle = (highScoreToggle + 1) % 5;
alanjko9 0:eb011b288325 724 drawHighScores();
alanjko9 0:eb011b288325 725 return 0;
alanjko9 0:eb011b288325 726 }
alanjko9 0:eb011b288325 727 }
alanjko9 0:eb011b288325 728 return 0;
alanjko9 0:eb011b288325 729 }
alanjko9 0:eb011b288325 730
alanjko9 0:eb011b288325 731 // Key hit/release interrupt routine
alanjko9 0:eb011b288325 732 void fallInterrupt() {
alanjko9 0:eb011b288325 733 key_code = 0;
alanjko9 0:eb011b288325 734 int i=0;
alanjko9 0:eb011b288325 735 int value=mpr121.read(0x00);
alanjko9 0:eb011b288325 736 value +=mpr121.read(0x01)<<8;
alanjko9 0:eb011b288325 737 // LED demo mod
alanjko9 0:eb011b288325 738 i=0;
alanjko9 0:eb011b288325 739 // puts key number out to LEDs for demo
alanjko9 0:eb011b288325 740 for (i=0; i<12; i++) {
alanjko9 0:eb011b288325 741 if (((value>>i)&0x01)==1) key_code=i+1;
alanjko9 0:eb011b288325 742 }
alanjko9 0:eb011b288325 743 if (key_code != 0) {
alanjko9 0:eb011b288325 744 updateGame = true;
alanjko9 0:eb011b288325 745 }
alanjko9 0:eb011b288325 746 led4=key_code & 0x01;
alanjko9 0:eb011b288325 747 led3=(key_code>>1) & 0x01;
alanjko9 0:eb011b288325 748 led2=(key_code>>2) & 0x01;
alanjko9 0:eb011b288325 749 led1=(key_code>>3) & 0x01;
alanjko9 0:eb011b288325 750 }
alanjko9 0:eb011b288325 751
alanjko9 0:eb011b288325 752 int main() {
alanjko9 0:eb011b288325 753 interrupt.fall(&fallInterrupt);
alanjko9 0:eb011b288325 754 interrupt.mode(PullUp);
alanjko9 0:eb011b288325 755 state = MENU;
alanjko9 0:eb011b288325 756 while (1) {
alanjko9 0:eb011b288325 757 if (updateGame) {
alanjko9 0:eb011b288325 758 keyPressed = key_code - 1;
alanjko9 0:eb011b288325 759 if (updateGameInfo() == 1) {
alanjko9 0:eb011b288325 760 gameTimerThread.start(gameTimer);
alanjko9 0:eb011b288325 761 if(isSoundOn) {
alanjko9 0:eb011b288325 762 playSoundThread.start(playSound);
alanjko9 0:eb011b288325 763 //playSoundThread.set_priority(osPriorityHigh);
alanjko9 0:eb011b288325 764 }
alanjko9 0:eb011b288325 765 }
alanjko9 0:eb011b288325 766 updateGame = false;
alanjko9 0:eb011b288325 767 }
alanjko9 0:eb011b288325 768 }
alanjko9 0:eb011b288325 769 }