W R / Mbed 2 deprecated 4180_Final_Project

Dependencies:   mbed wave_player mbed-rtos 4180Final SDFileSystem

Committer:
bfarmer
Date:
Wed Apr 29 03:11:28 2020 +0000
Revision:
7:1c87d89b74f1
Parent:
6:65216abe57c3
added countdown timer for the beginning of each round; added Speaker.h file to play a tone from the speaker

Who changed what in which revision?

UserRevisionLine numberNew contents of line
William12 0:c5d6f214ba01 1 // TODO:
William12 0:c5d6f214ba01 2 // - Add actual way to calulate scores (in play() or add helper method)
William12 0:c5d6f214ba01 3 // - Add more inputs/outputs
William12 0:c5d6f214ba01 4 // - add pot to increase selector size
William12 0:c5d6f214ba01 5 // - add sound
William12 0:c5d6f214ba01 6 #include "mbed.h"
William12 0:c5d6f214ba01 7 #include "uLCD_4DGL.h"
William12 0:c5d6f214ba01 8 #include "Nav_Switch.h"
William12 0:c5d6f214ba01 9 #include "SDFileSystem.h"
William12 0:c5d6f214ba01 10 #include "microphone.h"
William12 3:927028389e55 11 #include "fireflies.h"
William12 3:927028389e55 12 #include "wave_player.h"
William12 0:c5d6f214ba01 13 #include "rtos.h"
bfarmer 6:65216abe57c3 14 #include "menumusic.h"
bfarmer 7:1c87d89b74f1 15 #include "Speaker.h"
William12 0:c5d6f214ba01 16
William12 0:c5d6f214ba01 17 Nav_Switch myNav(p9, p6, p7, p5, p8); //pin order on Sparkfun breakout
William12 0:c5d6f214ba01 18 uLCD_4DGL uLCD(p28, p27, p30); // serial tx, serial rx, reset pin;
William12 0:c5d6f214ba01 19 PwmOut myled(LED1);
William12 5:1e8b48d6682b 20 SDFileSystem sd(p11, p12, p13, p10, "sd");
William12 0:c5d6f214ba01 21 microphone mymic1(p15);
William12 0:c5d6f214ba01 22 AnalogIn pot(p16);
William12 3:927028389e55 23 AnalogOut DACout(p18);
William12 3:927028389e55 24 DigitalOut led(LED2);
William12 5:1e8b48d6682b 25 PwmOut myled3(LED3);
bfarmer 7:1c87d89b74f1 26 Speaker mySpeaker(p18);
William12 0:c5d6f214ba01 27
William12 5:1e8b48d6682b 28 Thread thread1, thread2;
William12 0:c5d6f214ba01 29
William12 3:927028389e55 30 // Stuff for sound
William12 3:927028389e55 31 unsigned char *music = NULL;
William12 3:927028389e55 32 wave_player waver(&DACout);
William12 3:927028389e55 33 Ticker nextsample;
William12 3:927028389e55 34 volatile int sIndx = 0;
William12 3:927028389e55 35 int playMusic = 0;
William12 3:927028389e55 36
William12 3:927028389e55 37 // Globals
William12 0:c5d6f214ba01 38 int rounds = 3;
William12 0:c5d6f214ba01 39 int curRound = 1;
William12 0:c5d6f214ba01 40 int score1 = 0;
William12 0:c5d6f214ba01 41 int score2 = 0;
William12 0:c5d6f214ba01 42 int scores1[7] = {0};
William12 0:c5d6f214ba01 43 int scores2[7] = {0};
William12 0:c5d6f214ba01 44 int curTime = 0;
William12 0:c5d6f214ba01 45 int wonRnds1 = 0;
William12 0:c5d6f214ba01 46 int wonRnds2 = 0;
William12 0:c5d6f214ba01 47 int highScoresArr[10] = {100, 90, 83, 73, 64, 54, 44, 34, 24, 14};
William12 0:c5d6f214ba01 48 int s = 0;
William12 0:c5d6f214ba01 49 int timer = 0;
William12 5:1e8b48d6682b 50 volatile int micScore = 0;
William12 0:c5d6f214ba01 51
William12 0:c5d6f214ba01 52 int main();
William12 0:c5d6f214ba01 53 void play();
William12 0:c5d6f214ba01 54
bfarmer 7:1c87d89b74f1 55 //Method to create count down till game starts
bfarmer 7:1c87d89b74f1 56 void countdown() {
bfarmer 7:1c87d89b74f1 57 uLCD.cls();
bfarmer 7:1c87d89b74f1 58 uLCD.background_color(BLACK);
bfarmer 7:1c87d89b74f1 59 uLCD.textbackground_color(BLACK);
bfarmer 7:1c87d89b74f1 60 wait(0.5);
bfarmer 7:1c87d89b74f1 61 uLCD.cls();
bfarmer 7:1c87d89b74f1 62 uLCD.color(GREEN);
bfarmer 7:1c87d89b74f1 63 uLCD.locate(1,0);
bfarmer 7:1c87d89b74f1 64 uLCD.text_height(2);
bfarmer 7:1c87d89b74f1 65 uLCD.text_width(2);
bfarmer 7:1c87d89b74f1 66 uLCD.printf("Ready");
bfarmer 7:1c87d89b74f1 67 mySpeaker.PlayNote(600.0, 0.5, 0.5);
bfarmer 7:1c87d89b74f1 68 wait(1);
bfarmer 7:1c87d89b74f1 69 uLCD.cls();
bfarmer 7:1c87d89b74f1 70 uLCD.color(GREEN);
bfarmer 7:1c87d89b74f1 71 uLCD.locate(1,0);
bfarmer 7:1c87d89b74f1 72 uLCD.text_height(2);
bfarmer 7:1c87d89b74f1 73 uLCD.text_width(2);
bfarmer 7:1c87d89b74f1 74 uLCD.printf("Set ");
bfarmer 7:1c87d89b74f1 75 mySpeaker.PlayNote(600.0, 0.5, 0.5);
bfarmer 7:1c87d89b74f1 76 wait(1);
bfarmer 7:1c87d89b74f1 77 uLCD.cls();
bfarmer 7:1c87d89b74f1 78 uLCD.color(GREEN);
bfarmer 7:1c87d89b74f1 79 uLCD.locate(1,0);
bfarmer 7:1c87d89b74f1 80 uLCD.text_height(2);
bfarmer 7:1c87d89b74f1 81 uLCD.text_width(2);
bfarmer 7:1c87d89b74f1 82 uLCD.printf("SHOUT!!!");
bfarmer 7:1c87d89b74f1 83 mySpeaker.PlayNote(600.0, 0.5, 0.5);
bfarmer 7:1c87d89b74f1 84 wait(1);
bfarmer 7:1c87d89b74f1 85 }
bfarmer 7:1c87d89b74f1 86
William12 3:927028389e55 87
William12 3:927028389e55 88 // Method for ticker for sound
William12 3:927028389e55 89 void playMenuMusic() {
William12 3:927028389e55 90 if (playMusic) {
bfarmer 6:65216abe57c3 91 music = (unsigned char*) menumusic;
William12 3:927028389e55 92 led = 1;
William12 3:927028389e55 93 DACout.write(music[sIndx++] / 255.0);
bfarmer 6:65216abe57c3 94 if(sIndx > 79420) {
William12 3:927028389e55 95 sIndx = 0;
William12 3:927028389e55 96 led = 0;
William12 3:927028389e55 97 }
William12 3:927028389e55 98 } else {
William12 3:927028389e55 99 DACout.write(0.0);
William12 3:927028389e55 100 sIndx = 0;
William12 3:927028389e55 101 }
William12 3:927028389e55 102 }
William12 3:927028389e55 103
William12 0:c5d6f214ba01 104 // thread1
William12 0:c5d6f214ba01 105 void pot_thread() {
William12 0:c5d6f214ba01 106 while (1) {
William12 0:c5d6f214ba01 107 if (timer == 99) {
William12 0:c5d6f214ba01 108 s = (int) (pot * 2.0);
William12 0:c5d6f214ba01 109 }
William12 0:c5d6f214ba01 110 // Thread::wait(100);
William12 0:c5d6f214ba01 111 }
William12 0:c5d6f214ba01 112 }
William12 0:c5d6f214ba01 113
William12 5:1e8b48d6682b 114 // thread 2
William12 5:1e8b48d6682b 115 void mic_thread() {
William12 5:1e8b48d6682b 116 while (1) {
William12 5:1e8b48d6682b 117 myled = pot;
William12 5:1e8b48d6682b 118 micScore = int(mymic1*1000.0);
William12 5:1e8b48d6682b 119 Thread::wait(100);
William12 5:1e8b48d6682b 120 }
William12 5:1e8b48d6682b 121 }
William12 5:1e8b48d6682b 122
William12 0:c5d6f214ba01 123 void clearVals() {
William12 0:c5d6f214ba01 124 score1 = 0;
William12 0:c5d6f214ba01 125 score2 = 0;
William12 0:c5d6f214ba01 126 wonRnds1 = 0;
William12 0:c5d6f214ba01 127 wonRnds2 = 0;
William12 0:c5d6f214ba01 128 curRound = 1;
William12 0:c5d6f214ba01 129 curTime = 0;
William12 0:c5d6f214ba01 130 for (int i=0; i<sizeof(scores1)/4; i++) {
William12 0:c5d6f214ba01 131 scores1[i] = 0;
William12 0:c5d6f214ba01 132 scores2[i] = 0;
William12 0:c5d6f214ba01 133 }
William12 0:c5d6f214ba01 134 }
William12 0:c5d6f214ba01 135
William12 0:c5d6f214ba01 136 void saveHS() {
William12 0:c5d6f214ba01 137 mkdir("/sd/finalProj", 0777);
William12 0:c5d6f214ba01 138 FILE *fp = fopen("/sd/finalProj/highscores.txt", "w");
William12 0:c5d6f214ba01 139 if(fp == NULL) {
William12 0:c5d6f214ba01 140 uLCD.printf("Error Open \n");
William12 0:c5d6f214ba01 141 }
William12 0:c5d6f214ba01 142 for (int i=0; i<sizeof(highScoresArr)/4; i++) {
William12 0:c5d6f214ba01 143 fprintf(fp, "%4d", highScoresArr[i]);
William12 0:c5d6f214ba01 144 }
William12 0:c5d6f214ba01 145 fclose(fp);
William12 0:c5d6f214ba01 146 }
William12 0:c5d6f214ba01 147
William12 0:c5d6f214ba01 148 void gameOver() {
William12 0:c5d6f214ba01 149 uLCD.filled_rectangle(13, 25, 115, 120, LRED);
William12 0:c5d6f214ba01 150 // header
William12 0:c5d6f214ba01 151 uLCD.color(BLACK);
William12 0:c5d6f214ba01 152 uLCD.text_height(2);
William12 0:c5d6f214ba01 153 uLCD.text_width(2);
William12 0:c5d6f214ba01 154 uLCD.textbackground_color(LRED);
William12 0:c5d6f214ba01 155 uLCD.locate(1,2);
William12 0:c5d6f214ba01 156 uLCD.printf("Results");
William12 0:c5d6f214ba01 157 uLCD.locate(1,3);
William12 0:c5d6f214ba01 158 uLCD.color(DGOLD);
William12 0:c5d6f214ba01 159 uLCD.printf("Winner:");
William12 0:c5d6f214ba01 160 uLCD.filled_rectangle(13, 47, 115, 48, RED);
William12 0:c5d6f214ba01 161 uLCD.text_height(3);
William12 0:c5d6f214ba01 162 uLCD.text_width(3);
William12 0:c5d6f214ba01 163 // get total scores
William12 0:c5d6f214ba01 164 int total1 = 0;
William12 0:c5d6f214ba01 165 int total2 = 0;
William12 0:c5d6f214ba01 166 for (int i=0; i<sizeof(scores1)/4; i++) {
William12 0:c5d6f214ba01 167 total1 += scores1[i];
William12 0:c5d6f214ba01 168 total2 += scores2[i];
William12 0:c5d6f214ba01 169 }
William12 0:c5d6f214ba01 170 int avg1 = total1 / rounds;
William12 0:c5d6f214ba01 171 int avg2 = total2 / rounds;
William12 0:c5d6f214ba01 172 // Save new high scores if needed
William12 0:c5d6f214ba01 173 // ---- Player1 ----
William12 0:c5d6f214ba01 174 int indx = -1;
William12 0:c5d6f214ba01 175 for (int i=0; i<sizeof(highScoresArr)/4; i++) {
William12 0:c5d6f214ba01 176 if (avg1 > highScoresArr[i]) {
William12 0:c5d6f214ba01 177 indx = i;
William12 0:c5d6f214ba01 178 break;
William12 0:c5d6f214ba01 179 }
William12 0:c5d6f214ba01 180 }
William12 0:c5d6f214ba01 181 // Save new highscore
William12 0:c5d6f214ba01 182 if (indx != -1) {
William12 0:c5d6f214ba01 183 for (int i=sizeof(highScoresArr)/4-1; i>indx; i--) {
William12 0:c5d6f214ba01 184 highScoresArr[i] = highScoresArr[i-1];
William12 0:c5d6f214ba01 185 }
William12 0:c5d6f214ba01 186 highScoresArr[indx] = avg1;
William12 0:c5d6f214ba01 187 saveHS(); // Save highScoresArr to SD card
William12 0:c5d6f214ba01 188 }
William12 0:c5d6f214ba01 189 // ---- End P1 ----
William12 0:c5d6f214ba01 190 // ---- Player2 ----
William12 0:c5d6f214ba01 191 indx = -1;
William12 0:c5d6f214ba01 192 for (int i=0; i<sizeof(highScoresArr)/4; i++) {
William12 0:c5d6f214ba01 193 if (avg2 > highScoresArr[i]) {
William12 0:c5d6f214ba01 194 indx = i;
William12 0:c5d6f214ba01 195 break;
William12 0:c5d6f214ba01 196 }
William12 0:c5d6f214ba01 197 }
William12 0:c5d6f214ba01 198 // Save new highscore
William12 0:c5d6f214ba01 199 if (indx != -1) {
William12 0:c5d6f214ba01 200 for (int i=sizeof(highScoresArr)/4-1; i>indx; i--) {
William12 0:c5d6f214ba01 201 highScoresArr[i] = highScoresArr[i-1];
William12 0:c5d6f214ba01 202 }
William12 0:c5d6f214ba01 203 highScoresArr[indx] = avg2;
William12 0:c5d6f214ba01 204 saveHS(); // Save highScoresArr to SD card
William12 0:c5d6f214ba01 205 }
William12 0:c5d6f214ba01 206 // ---- End P2 ----
William12 0:c5d6f214ba01 207 // Print winner info to screen
William12 0:c5d6f214ba01 208 if (wonRnds1 > wonRnds2) {
William12 0:c5d6f214ba01 209 uLCD.color(BLUE);
William12 0:c5d6f214ba01 210 uLCD.locate(2,3);
William12 0:c5d6f214ba01 211 uLCD.printf("P1");
William12 0:c5d6f214ba01 212 uLCD.text_height(1);
William12 0:c5d6f214ba01 213 uLCD.text_width(1);
William12 0:c5d6f214ba01 214 uLCD.locate(3,12);
William12 0:c5d6f214ba01 215 uLCD.printf("Rounds won: %1d", wonRnds1);
William12 0:c5d6f214ba01 216 uLCD.locate(5,13);
William12 0:c5d6f214ba01 217 uLCD.printf("Avg: %4d", avg1);
William12 0:c5d6f214ba01 218
William12 0:c5d6f214ba01 219 } else if (wonRnds2 > wonRnds1) {
William12 0:c5d6f214ba01 220 uLCD.color(PURPLE);
William12 0:c5d6f214ba01 221 uLCD.locate(2,3);
William12 0:c5d6f214ba01 222 uLCD.printf("P2");
William12 0:c5d6f214ba01 223 uLCD.text_height(1);
William12 0:c5d6f214ba01 224 uLCD.text_width(1);
William12 0:c5d6f214ba01 225 uLCD.locate(3,12);
William12 0:c5d6f214ba01 226 uLCD.printf("Rounds won: %1d", wonRnds2);
William12 0:c5d6f214ba01 227 uLCD.locate(5,13);
William12 0:c5d6f214ba01 228 uLCD.printf("Avg: %4d", avg2);
William12 0:c5d6f214ba01 229 } else {
William12 0:c5d6f214ba01 230 uLCD.locate(2,3);
William12 0:c5d6f214ba01 231 uLCD.color(BLACK);
William12 0:c5d6f214ba01 232 uLCD.printf("Tie");
William12 0:c5d6f214ba01 233 }
William12 0:c5d6f214ba01 234 uLCD.text_height(3);
William12 0:c5d6f214ba01 235 uLCD.text_width(3);
William12 0:c5d6f214ba01 236 while (1) {
William12 0:c5d6f214ba01 237 timer = 0;
William12 0:c5d6f214ba01 238 while (timer<80) {
William12 0:c5d6f214ba01 239 if (myNav.fire()) {
William12 0:c5d6f214ba01 240 // clear values
William12 0:c5d6f214ba01 241 clearVals();
William12 0:c5d6f214ba01 242 main();
William12 0:c5d6f214ba01 243 }
William12 0:c5d6f214ba01 244 // Blink winner
William12 0:c5d6f214ba01 245 if (timer == 0) {
William12 0:c5d6f214ba01 246 if (wonRnds1 > wonRnds2) {
William12 0:c5d6f214ba01 247 uLCD.color(BLUE);
William12 0:c5d6f214ba01 248 uLCD.locate(2,3);
William12 0:c5d6f214ba01 249 uLCD.printf("P1");
William12 0:c5d6f214ba01 250 } else if (wonRnds2 > wonRnds1) {
William12 0:c5d6f214ba01 251 uLCD.color(PURPLE);
William12 0:c5d6f214ba01 252 uLCD.locate(2,3);
William12 0:c5d6f214ba01 253 uLCD.printf("P2");
William12 0:c5d6f214ba01 254 } else {
William12 0:c5d6f214ba01 255 uLCD.locate(2,3);
William12 0:c5d6f214ba01 256 uLCD.color(BLACK);
William12 0:c5d6f214ba01 257 uLCD.printf("Tie");
William12 0:c5d6f214ba01 258 }
William12 0:c5d6f214ba01 259 } else if (timer == 60) {
William12 0:c5d6f214ba01 260 uLCD.color(LRED);
William12 0:c5d6f214ba01 261 uLCD.locate(2,3);
William12 0:c5d6f214ba01 262 uLCD.printf("CLS");
William12 0:c5d6f214ba01 263 }
William12 0:c5d6f214ba01 264 wait(.01);
William12 0:c5d6f214ba01 265 timer++;
William12 0:c5d6f214ba01 266 }
William12 0:c5d6f214ba01 267 }
William12 0:c5d6f214ba01 268 }
William12 0:c5d6f214ba01 269
William12 0:c5d6f214ba01 270 void nextRound() {
William12 0:c5d6f214ba01 271 uLCD.filled_rectangle(13, 25, 115, 120, LRED);
William12 0:c5d6f214ba01 272 // header
William12 0:c5d6f214ba01 273 uLCD.color(BLACK);
William12 0:c5d6f214ba01 274 uLCD.text_height(2);
William12 0:c5d6f214ba01 275 uLCD.text_width(2);
William12 0:c5d6f214ba01 276 uLCD.textbackground_color(LRED);
William12 0:c5d6f214ba01 277 uLCD.locate(2,2);
William12 0:c5d6f214ba01 278 uLCD.printf("ROUND%1d", curRound);
William12 0:c5d6f214ba01 279 uLCD.locate(1,3);
William12 0:c5d6f214ba01 280 uLCD.color(DGOLD);
William12 0:c5d6f214ba01 281 uLCD.printf("Winner:");
William12 0:c5d6f214ba01 282 uLCD.filled_rectangle(13, 47, 115, 48, RED);
William12 0:c5d6f214ba01 283 uLCD.text_height(3);
William12 0:c5d6f214ba01 284 uLCD.text_width(3);
William12 0:c5d6f214ba01 285 if (score1 > score2) {
William12 0:c5d6f214ba01 286 uLCD.color(BLUE);
William12 0:c5d6f214ba01 287 uLCD.locate(2,3);
William12 0:c5d6f214ba01 288 uLCD.printf("P1");
William12 0:c5d6f214ba01 289 uLCD.locate(1,4);
William12 0:c5d6f214ba01 290 uLCD.printf("%4d", score1);
William12 0:c5d6f214ba01 291 wonRnds1++;
William12 0:c5d6f214ba01 292 } else if (score2 > score1) {
William12 0:c5d6f214ba01 293 uLCD.color(PURPLE);
William12 0:c5d6f214ba01 294 uLCD.locate(2,3);
William12 0:c5d6f214ba01 295 uLCD.printf("P2");
William12 0:c5d6f214ba01 296 uLCD.locate(1,4);
William12 0:c5d6f214ba01 297 uLCD.printf("%4d", score2);
William12 0:c5d6f214ba01 298 wonRnds2++;
William12 0:c5d6f214ba01 299 } else {
William12 0:c5d6f214ba01 300 uLCD.locate(2,4);
William12 0:c5d6f214ba01 301 uLCD.printf("Tie");
William12 0:c5d6f214ba01 302 }
William12 0:c5d6f214ba01 303 scores1[curRound-1] = score1;
William12 0:c5d6f214ba01 304 scores2[curRound-1] = score2;
William12 0:c5d6f214ba01 305 wait(3.0);
William12 0:c5d6f214ba01 306 curRound++;
William12 0:c5d6f214ba01 307 curTime = 0;
William12 0:c5d6f214ba01 308 score1 = 0;
William12 0:c5d6f214ba01 309 score2 = 0;
William12 0:c5d6f214ba01 310 if (curRound > rounds) {
William12 0:c5d6f214ba01 311 gameOver();
William12 0:c5d6f214ba01 312 }
William12 0:c5d6f214ba01 313 play();
William12 0:c5d6f214ba01 314 }
William12 0:c5d6f214ba01 315
William12 0:c5d6f214ba01 316 void pause() {
William12 0:c5d6f214ba01 317 uLCD.filled_rectangle(13, 25, 115, 120, LRED);
William12 0:c5d6f214ba01 318 uLCD.filled_rectangle(13, 48, 115, 50, RED);
William12 0:c5d6f214ba01 319 // header
William12 0:c5d6f214ba01 320 uLCD.color(BLACK);
William12 0:c5d6f214ba01 321 uLCD.text_height(2);
William12 0:c5d6f214ba01 322 uLCD.text_width(2);
William12 0:c5d6f214ba01 323 uLCD.textbackground_color(LRED);
William12 0:c5d6f214ba01 324 uLCD.locate(2,2);
William12 0:c5d6f214ba01 325 uLCD.printf("PAUSED");
William12 0:c5d6f214ba01 326 // Choices
William12 0:c5d6f214ba01 327 uLCD.text_height(1);
William12 0:c5d6f214ba01 328 uLCD.text_width(1);
William12 0:c5d6f214ba01 329 uLCD.locate(5,8);
William12 0:c5d6f214ba01 330 uLCD.printf("Continue");
William12 0:c5d6f214ba01 331 uLCD.locate(7,11);
William12 0:c5d6f214ba01 332 uLCD.printf("Quit");
William12 0:c5d6f214ba01 333 // Selector dots
William12 0:c5d6f214ba01 334 int xPos[2] = {30, 44};
William12 0:c5d6f214ba01 335 int yPos[2] = {67, 91};
William12 0:c5d6f214ba01 336 int ticker = 0;
William12 0:c5d6f214ba01 337 int oldTicker = 1;
William12 0:c5d6f214ba01 338 for (int i=0; i<sizeof(yPos)/4; i++) {
William12 0:c5d6f214ba01 339 uLCD.filled_circle(xPos[i], yPos[i], 1+s, RED);
William12 0:c5d6f214ba01 340 }
William12 0:c5d6f214ba01 341 while (1) {
William12 0:c5d6f214ba01 342 // Fill selector circle and if necessary, clear old
William12 0:c5d6f214ba01 343 if (oldTicker != ticker) {
William12 0:c5d6f214ba01 344 uLCD.filled_circle(xPos[oldTicker], yPos[oldTicker], 3+s, LRED);
William12 0:c5d6f214ba01 345 uLCD.filled_circle(xPos[oldTicker], yPos[oldTicker], 1+s, RED);
William12 0:c5d6f214ba01 346 }
William12 0:c5d6f214ba01 347 uLCD.filled_circle(xPos[ticker], yPos[ticker], 3+s, RED);
William12 0:c5d6f214ba01 348 // save oldTicker spot
William12 0:c5d6f214ba01 349 oldTicker = ticker;
William12 0:c5d6f214ba01 350 // get new ticker position
William12 0:c5d6f214ba01 351 timer = 0;
William12 0:c5d6f214ba01 352 while (timer<100) {
William12 0:c5d6f214ba01 353 if (timer == 0) {
William12 0:c5d6f214ba01 354 uLCD.filled_circle(xPos[ticker], yPos[ticker], 3+s, RED);
William12 0:c5d6f214ba01 355 } else if (timer == 70) {
William12 0:c5d6f214ba01 356 uLCD.filled_circle(xPos[ticker], yPos[ticker], 3+s, LRED);
William12 0:c5d6f214ba01 357 }
William12 0:c5d6f214ba01 358 if (myNav.fire()) {
William12 0:c5d6f214ba01 359 uLCD.filled_circle(xPos[ticker], yPos[ticker], 2+s, GREEN);
William12 0:c5d6f214ba01 360 switch(ticker) {
William12 0:c5d6f214ba01 361 case 0:
William12 0:c5d6f214ba01 362 play();
William12 0:c5d6f214ba01 363 break;
William12 0:c5d6f214ba01 364 case 1:
William12 0:c5d6f214ba01 365 clearVals();
William12 0:c5d6f214ba01 366 main();
William12 0:c5d6f214ba01 367 }
William12 0:c5d6f214ba01 368 } else if (myNav.up() || myNav.left()) {
William12 0:c5d6f214ba01 369 wait(.2);
William12 0:c5d6f214ba01 370 ticker = ticker - 1;
William12 0:c5d6f214ba01 371 if (ticker < 0) {
William12 0:c5d6f214ba01 372 ticker = sizeof(xPos)/4 - 1;
William12 0:c5d6f214ba01 373 }
William12 0:c5d6f214ba01 374 } else if (myNav.down() || myNav.right()) {
William12 0:c5d6f214ba01 375 wait(.2);
William12 0:c5d6f214ba01 376 ticker = (ticker + 1) % (sizeof(xPos)/4);
William12 0:c5d6f214ba01 377 }
William12 0:c5d6f214ba01 378 wait(.01);
William12 0:c5d6f214ba01 379 timer++;
William12 0:c5d6f214ba01 380 }
William12 0:c5d6f214ba01 381 }
William12 0:c5d6f214ba01 382 }
William12 0:c5d6f214ba01 383
William12 3:927028389e55 384 int getScore1() {
William12 5:1e8b48d6682b 385 myled3 = (int)(((float) micScore) / 1000.0);
William12 5:1e8b48d6682b 386 return micScore; //int(mymic1*1000.0);
William12 3:927028389e55 387
William12 3:927028389e55 388
William12 3:927028389e55 389 // gameType==0 for mic
William12 3:927028389e55 390 //if (gameType == 0) {
William12 3:927028389e55 391 //
William12 3:927028389e55 392 // } else {
William12 3:927028389e55 393 //
William12 3:927028389e55 394 // }
William12 3:927028389e55 395 }
William12 3:927028389e55 396 int getScore2() {
William12 5:1e8b48d6682b 397 return 10; //int(mymic1*1000.0);
William12 3:927028389e55 398 }
William12 3:927028389e55 399
William12 0:c5d6f214ba01 400 void play() {
bfarmer 7:1c87d89b74f1 401 countdown();
William12 0:c5d6f214ba01 402 uLCD.background_color(GREEN);
William12 0:c5d6f214ba01 403 uLCD.cls();
William12 0:c5d6f214ba01 404 uLCD.filled_rectangle(0, 0, 200, 15, RED);
William12 0:c5d6f214ba01 405 // header
William12 0:c5d6f214ba01 406 uLCD.color(BLACK);
William12 0:c5d6f214ba01 407 uLCD.locate(5,0);
William12 0:c5d6f214ba01 408 uLCD.text_height(2);
William12 0:c5d6f214ba01 409 uLCD.text_width(2);
William12 0:c5d6f214ba01 410 uLCD.textbackground_color(RED);
William12 0:c5d6f214ba01 411 uLCD.printf("PLAY");
William12 0:c5d6f214ba01 412 uLCD.text_height(1);
William12 0:c5d6f214ba01 413 uLCD.text_width(1);
William12 0:c5d6f214ba01 414 uLCD.locate(14,1);
William12 0:c5d6f214ba01 415 uLCD.printf("Rnd%1d", curRound);
William12 0:c5d6f214ba01 416 // Scores headers
William12 0:c5d6f214ba01 417 uLCD.textbackground_color(GREEN);
William12 0:c5d6f214ba01 418 uLCD.color(BLUE);
William12 0:c5d6f214ba01 419 uLCD.locate(5,3);
William12 0:c5d6f214ba01 420 uLCD.printf("Player 1:");
William12 0:c5d6f214ba01 421 uLCD.color(PURPLE);
William12 0:c5d6f214ba01 422 uLCD.locate(5,11);
William12 0:c5d6f214ba01 423 uLCD.printf("Player 2:");
William12 0:c5d6f214ba01 424 // Scores
William12 0:c5d6f214ba01 425 uLCD.text_height(4);
William12 0:c5d6f214ba01 426 uLCD.text_width(4);
William12 0:c5d6f214ba01 427 while (1) {
William12 0:c5d6f214ba01 428 timer = 0;
William12 0:c5d6f214ba01 429 // Blinking pause button
William12 0:c5d6f214ba01 430 while (timer<25) {
William12 0:c5d6f214ba01 431 if (myNav.fire()) {
William12 0:c5d6f214ba01 432 uLCD.filled_rectangle(60, 68, 65, 82, GREEN);
William12 0:c5d6f214ba01 433 uLCD.filled_rectangle(70, 68, 75, 82, GREEN);
William12 0:c5d6f214ba01 434 wait(.1);
William12 0:c5d6f214ba01 435 pause();
William12 0:c5d6f214ba01 436 }
William12 0:c5d6f214ba01 437 if (timer % 25 == 0) {
William12 3:927028389e55 438 score1 = getScore1(); //(int) (pot*100.0); //curTime+1000; // int(mymic1*1000.0);
William12 3:927028389e55 439 score2 = getScore2(); //curTime+2000;
William12 0:c5d6f214ba01 440 uLCD.color(BLUE);
William12 0:c5d6f214ba01 441 uLCD.locate(0,1);
William12 0:c5d6f214ba01 442 uLCD.printf("%4d", score1);
William12 0:c5d6f214ba01 443 uLCD.color(PURPLE);
William12 0:c5d6f214ba01 444 uLCD.locate(0,3);
William12 0:c5d6f214ba01 445 uLCD.printf("%4d", score2);
William12 0:c5d6f214ba01 446 // Time bar
William12 0:c5d6f214ba01 447 double roundTime = 15.0; // in secs
William12 0:c5d6f214ba01 448 int length = (int) ( (double)curTime / roundTime * 127.0);
William12 0:c5d6f214ba01 449 uLCD.filled_rectangle(0, 65, length, 85, DGREEN);
William12 0:c5d6f214ba01 450 if (length >= 127) {
William12 0:c5d6f214ba01 451 nextRound();
William12 0:c5d6f214ba01 452 }
William12 0:c5d6f214ba01 453 curTime++;
William12 0:c5d6f214ba01 454 }
William12 0:c5d6f214ba01 455 if (timer < 20){
William12 0:c5d6f214ba01 456 uLCD.filled_rectangle(60, 68, 65, 82, LGREY);
William12 0:c5d6f214ba01 457 uLCD.filled_rectangle(70, 68, 75, 82, LGREY);
William12 0:c5d6f214ba01 458 } else if (timer >= 20) {
William12 0:c5d6f214ba01 459 uLCD.filled_rectangle(60, 68, 65, 82, BLACK);
William12 0:c5d6f214ba01 460 uLCD.filled_rectangle(70, 68, 75, 82, BLACK);
William12 0:c5d6f214ba01 461 }
William12 0:c5d6f214ba01 462 wait(.01);
William12 0:c5d6f214ba01 463 timer++;
William12 0:c5d6f214ba01 464 }
William12 0:c5d6f214ba01 465 }
William12 0:c5d6f214ba01 466 }
William12 0:c5d6f214ba01 467
William12 0:c5d6f214ba01 468 void highScores() {
William12 0:c5d6f214ba01 469 uLCD.background_color(ORANGE);
William12 0:c5d6f214ba01 470 uLCD.cls();
William12 0:c5d6f214ba01 471 uLCD.filled_rectangle(0, 0, 200, 14, RED);
William12 0:c5d6f214ba01 472 uLCD.color(BLACK);
William12 0:c5d6f214ba01 473 uLCD.locate(0,0);
William12 0:c5d6f214ba01 474 uLCD.text_height(2);
William12 0:c5d6f214ba01 475 uLCD.text_width(2);
William12 0:c5d6f214ba01 476 uLCD.textbackground_color(RED);
William12 0:c5d6f214ba01 477 uLCD.printf("HighScore");
William12 0:c5d6f214ba01 478 uLCD.line(0, 14, 200, 14, RED);
William12 0:c5d6f214ba01 479 uLCD.line(0, 15, 200, 15, RED);
William12 0:c5d6f214ba01 480 uLCD.text_height(1);
William12 0:c5d6f214ba01 481 uLCD.text_width(1);
William12 0:c5d6f214ba01 482 uLCD.locate(7,14);
William12 0:c5d6f214ba01 483 uLCD.color(BLACK);
William12 0:c5d6f214ba01 484 uLCD.textbackground_color(ORANGE);
William12 0:c5d6f214ba01 485 uLCD.printf("Back");
William12 0:c5d6f214ba01 486 uLCD.color(BLUE);
William12 0:c5d6f214ba01 487 int rank[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
William12 0:c5d6f214ba01 488 for (int i=0; i<sizeof(rank)/4; i++) {
William12 0:c5d6f214ba01 489 uLCD.locate(1,i+2);
William12 0:c5d6f214ba01 490 uLCD.printf("Position %2d: %4d", rank[i], highScoresArr[i]);
William12 0:c5d6f214ba01 491 }
William12 0:c5d6f214ba01 492 while (1) {
William12 0:c5d6f214ba01 493 timer = 0;
William12 0:c5d6f214ba01 494 while (timer<50) {
William12 0:c5d6f214ba01 495 if (timer < 30){
William12 0:c5d6f214ba01 496 uLCD.filled_circle(45, 115, 3+s, RED);
William12 0:c5d6f214ba01 497 } else {
William12 0:c5d6f214ba01 498 uLCD.filled_circle(45, 115, 3+s, ORANGE);
William12 0:c5d6f214ba01 499 }
William12 0:c5d6f214ba01 500 if (myNav.fire()) {
William12 0:c5d6f214ba01 501 uLCD.filled_circle(45, 115, 2+s, GREEN);
William12 0:c5d6f214ba01 502 wait(.1);
William12 0:c5d6f214ba01 503 main();
William12 0:c5d6f214ba01 504 }
William12 0:c5d6f214ba01 505 wait(.01);
William12 0:c5d6f214ba01 506 timer++;
William12 0:c5d6f214ba01 507 }
William12 0:c5d6f214ba01 508 }
William12 0:c5d6f214ba01 509 }
William12 0:c5d6f214ba01 510
William12 0:c5d6f214ba01 511 void settings() {
William12 0:c5d6f214ba01 512 uLCD.background_color(LGREY);
William12 0:c5d6f214ba01 513 uLCD.cls();
William12 0:c5d6f214ba01 514 uLCD.filled_rectangle(0, 0, 200, 15, RED);
William12 0:c5d6f214ba01 515 uLCD.color(BLACK);
William12 0:c5d6f214ba01 516 uLCD.locate(1,0);
William12 0:c5d6f214ba01 517 uLCD.text_height(2);
William12 0:c5d6f214ba01 518 uLCD.text_width(2);
William12 0:c5d6f214ba01 519 uLCD.textbackground_color(RED);
William12 0:c5d6f214ba01 520 uLCD.printf("Settings");
William12 0:c5d6f214ba01 521 uLCD.text_height(1);
William12 0:c5d6f214ba01 522 uLCD.text_width(1);
William12 0:c5d6f214ba01 523 uLCD.locate(0,2);
William12 0:c5d6f214ba01 524 uLCD.color(BLUE);
William12 0:c5d6f214ba01 525 uLCD.textbackground_color(LGREY);
William12 0:c5d6f214ba01 526 uLCD.printf("Choose how many rounds to play:");
William12 0:c5d6f214ba01 527 uLCD.locate(9,4);
William12 0:c5d6f214ba01 528 uLCD.color(BLUE);
William12 0:c5d6f214ba01 529 uLCD.printf("3");
William12 0:c5d6f214ba01 530 uLCD.locate(9,5);
William12 0:c5d6f214ba01 531 uLCD.printf("5");
William12 0:c5d6f214ba01 532 uLCD.locate(9,6);
William12 0:c5d6f214ba01 533 uLCD.printf("7");
William12 0:c5d6f214ba01 534 uLCD.line(0, 32, 200, 32, BLUE);
William12 0:c5d6f214ba01 535 uLCD.locate(4,7);
William12 0:c5d6f214ba01 536 uLCD.printf("Rounds = %1d", rounds);
William12 0:c5d6f214ba01 537 uLCD.locate(7,14);
William12 0:c5d6f214ba01 538 uLCD.color(BLACK);
William12 0:c5d6f214ba01 539 uLCD.printf("Back");
William12 0:c5d6f214ba01 540 uLCD.baudrate(BAUD_3000000); //jack up baud rate to max for fast display
William12 0:c5d6f214ba01 541 int xPos[4] = {57, 57, 57, 45};
William12 0:c5d6f214ba01 542 int yPos[4] = {36, 42, 50, 115};
William12 0:c5d6f214ba01 543 int ticker = 0;
William12 0:c5d6f214ba01 544 int oldTicker = 1;
William12 0:c5d6f214ba01 545 for (int i=0; i<sizeof(yPos)/4; i++) {
William12 0:c5d6f214ba01 546 uLCD.filled_circle(xPos[i], yPos[i], 1+s, RED);
William12 0:c5d6f214ba01 547 }
William12 0:c5d6f214ba01 548 while (1) {
William12 0:c5d6f214ba01 549 // Fill selector circle and if necessary, clear old
William12 0:c5d6f214ba01 550 if (oldTicker != ticker) {
William12 0:c5d6f214ba01 551 uLCD.filled_circle(xPos[oldTicker], yPos[oldTicker], 3+s, LGREY);
William12 0:c5d6f214ba01 552 uLCD.filled_circle(xPos[oldTicker], yPos[oldTicker], 1+s, RED);
William12 0:c5d6f214ba01 553 }
William12 0:c5d6f214ba01 554 uLCD.filled_circle(xPos[ticker], yPos[ticker], 3+s, RED);
William12 0:c5d6f214ba01 555 // save oldTicker spot
William12 0:c5d6f214ba01 556 oldTicker = ticker;
William12 0:c5d6f214ba01 557 // get new ticker position
William12 0:c5d6f214ba01 558 timer = 0;
William12 0:c5d6f214ba01 559 while (timer<100) {
William12 0:c5d6f214ba01 560 if (timer == 0) {
William12 0:c5d6f214ba01 561 uLCD.filled_circle(xPos[ticker], yPos[ticker], 3+s, RED);
William12 0:c5d6f214ba01 562 } else if (timer == 70) {
William12 0:c5d6f214ba01 563 uLCD.filled_circle(xPos[ticker], yPos[ticker], 3+s, LGREY);
William12 0:c5d6f214ba01 564 }
William12 0:c5d6f214ba01 565 if (myNav.fire()) {
William12 0:c5d6f214ba01 566 uLCD.filled_circle(xPos[ticker], yPos[ticker], 3+s, GREEN);
William12 0:c5d6f214ba01 567 switch(ticker) {
William12 0:c5d6f214ba01 568 case 0:
William12 0:c5d6f214ba01 569 rounds = 3;
William12 0:c5d6f214ba01 570 break;
William12 0:c5d6f214ba01 571 case 1:
William12 0:c5d6f214ba01 572 rounds = 5;
William12 0:c5d6f214ba01 573 break;
William12 0:c5d6f214ba01 574 case 2:
William12 0:c5d6f214ba01 575 rounds = 7;
William12 0:c5d6f214ba01 576 break;
William12 0:c5d6f214ba01 577 case 3:
William12 0:c5d6f214ba01 578 main();
William12 0:c5d6f214ba01 579 }
William12 0:c5d6f214ba01 580 uLCD.color(BLUE);
William12 0:c5d6f214ba01 581 uLCD.locate(4,7);
William12 0:c5d6f214ba01 582 uLCD.printf("Rounds = %1d", rounds);
William12 0:c5d6f214ba01 583 } else if (myNav.up() || myNav.left()) {
William12 0:c5d6f214ba01 584 wait(.2);
William12 0:c5d6f214ba01 585 ticker = ticker - 1;
William12 0:c5d6f214ba01 586 if (ticker < 0) {
William12 0:c5d6f214ba01 587 ticker = sizeof(xPos)/4 - 1;
William12 0:c5d6f214ba01 588 }
William12 0:c5d6f214ba01 589 } else if (myNav.down() || myNav.right()) {
William12 0:c5d6f214ba01 590 wait(.2);
William12 0:c5d6f214ba01 591 ticker = (ticker + 1) % (sizeof(xPos)/4);
William12 0:c5d6f214ba01 592 }
William12 0:c5d6f214ba01 593 wait(.01);
William12 0:c5d6f214ba01 594 timer++;
William12 0:c5d6f214ba01 595 }
William12 0:c5d6f214ba01 596 }
William12 0:c5d6f214ba01 597 }
William12 0:c5d6f214ba01 598
William12 0:c5d6f214ba01 599 int main() {
William12 0:c5d6f214ba01 600 // read in highScoresArr from SD card
William12 5:1e8b48d6682b 601 FILE *fp = fopen("/sd/finalProj/highscores.txt", "r");
William12 3:927028389e55 602 if(fp == NULL) {
William12 3:927028389e55 603 uLCD.printf("Error Open \n");
William12 3:927028389e55 604 }
William12 3:927028389e55 605 for (int i=0; i<sizeof(highScoresArr)/4; i++) {
William12 3:927028389e55 606 fscanf(fp, "%4d", &highScoresArr[i]);
William12 3:927028389e55 607 }
William12 5:1e8b48d6682b 608 fclose(fp);
William12 0:c5d6f214ba01 609 // create menu interface
William12 0:c5d6f214ba01 610 uLCD.background_color(LBLUE);
William12 0:c5d6f214ba01 611 uLCD.cls();
William12 0:c5d6f214ba01 612 uLCD.filled_rectangle(0, 0, 200, 14, RED);
William12 0:c5d6f214ba01 613 uLCD.color(BLACK);
William12 0:c5d6f214ba01 614 uLCD.locate(1,0);
William12 0:c5d6f214ba01 615 uLCD.text_height(2);
William12 0:c5d6f214ba01 616 uLCD.text_width(2);
William12 0:c5d6f214ba01 617 uLCD.textbackground_color(RED);
William12 0:c5d6f214ba01 618 uLCD.printf("Screamer");
William12 0:c5d6f214ba01 619 uLCD.line(0, 14, 200, 14, RED);
William12 0:c5d6f214ba01 620 uLCD.line(0, 15, 200, 15, RED);
William12 0:c5d6f214ba01 621 uLCD.text_height(1);
William12 0:c5d6f214ba01 622 uLCD.text_width(1);
William12 0:c5d6f214ba01 623 uLCD.textbackground_color(LBLUE);
William12 0:c5d6f214ba01 624 uLCD.locate(7,4);
William12 0:c5d6f214ba01 625 uLCD.color(GREEN);
William12 0:c5d6f214ba01 626 uLCD.printf("PLAY");
William12 0:c5d6f214ba01 627 uLCD.locate(4,8);
William12 0:c5d6f214ba01 628 uLCD.color(ORANGE);
William12 0:c5d6f214ba01 629 uLCD.printf("HIGH SCORES");
William12 0:c5d6f214ba01 630 uLCD.locate(5,13);
William12 0:c5d6f214ba01 631 uLCD.color(LGREY);
William12 0:c5d6f214ba01 632 uLCD.printf("SETTINGS");
William12 0:c5d6f214ba01 633 uLCD.baudrate(BAUD_3000000); //jack up baud rate to max for fast display
William12 0:c5d6f214ba01 634 int xPos[3] = {40, 21, 28};
William12 0:c5d6f214ba01 635 int yPos[3] = {35, 67, 107};
William12 0:c5d6f214ba01 636 int ticker = 0;
William12 0:c5d6f214ba01 637 int oldTicker = 1;
William12 0:c5d6f214ba01 638 for (int i=0; i<sizeof(yPos)/4; i++) {
William12 0:c5d6f214ba01 639 uLCD.filled_circle(xPos[i], yPos[i], 2, RED);
William12 0:c5d6f214ba01 640 }
William12 0:c5d6f214ba01 641 thread1.start(pot_thread);
William12 5:1e8b48d6682b 642 thread2.start(mic_thread);
William12 3:927028389e55 643 nextsample.attach(&playMenuMusic, 1.0/8000.0);
William12 0:c5d6f214ba01 644 while (1) {
William12 3:927028389e55 645 // play music
William12 3:927028389e55 646 playMusic = 1;
William12 0:c5d6f214ba01 647 // Fill selector circle and if necessary, clear old
William12 0:c5d6f214ba01 648 if (oldTicker != ticker) {
William12 0:c5d6f214ba01 649 uLCD.filled_circle(xPos[oldTicker], yPos[oldTicker], 5+s, LBLUE);
William12 0:c5d6f214ba01 650 uLCD.filled_circle(xPos[oldTicker], yPos[oldTicker], 2+s, RED);
William12 0:c5d6f214ba01 651 }
William12 0:c5d6f214ba01 652 uLCD.filled_circle(xPos[ticker], yPos[ticker], 5+s, RED);
William12 0:c5d6f214ba01 653 // save oldTicker spot
William12 0:c5d6f214ba01 654 oldTicker = ticker;
William12 0:c5d6f214ba01 655 // get new ticker position
William12 0:c5d6f214ba01 656 timer = 0;
William12 0:c5d6f214ba01 657 while (timer<100) {
William12 0:c5d6f214ba01 658 if (timer == 0) {
William12 0:c5d6f214ba01 659 uLCD.filled_circle(xPos[ticker], yPos[ticker], 5+s, RED);
William12 0:c5d6f214ba01 660 } else if (timer == 70) {
William12 0:c5d6f214ba01 661 uLCD.filled_circle(xPos[ticker], yPos[ticker], 5+s, LBLUE);
William12 0:c5d6f214ba01 662 }
William12 0:c5d6f214ba01 663 if (myNav.fire()) {
William12 0:c5d6f214ba01 664 uLCD.filled_circle(xPos[ticker], yPos[ticker], 3+s, GREEN);
William12 0:c5d6f214ba01 665 wait(.1);
William12 0:c5d6f214ba01 666 switch(ticker) {
William12 0:c5d6f214ba01 667 case 0:
William12 0:c5d6f214ba01 668 curTime = 0;
William12 0:c5d6f214ba01 669 score1 = 0;
William12 0:c5d6f214ba01 670 score2 = 0;
William12 3:927028389e55 671 playMusic = 0;
William12 0:c5d6f214ba01 672 play();
William12 0:c5d6f214ba01 673 break;
William12 0:c5d6f214ba01 674 case 1:
William12 0:c5d6f214ba01 675 highScores();
William12 0:c5d6f214ba01 676 break;
William12 0:c5d6f214ba01 677 case 2:
William12 0:c5d6f214ba01 678 settings();
William12 0:c5d6f214ba01 679 break;
William12 0:c5d6f214ba01 680 }
William12 0:c5d6f214ba01 681 } else if (myNav.up() || myNav.left()) {
William12 0:c5d6f214ba01 682 wait(.2);
William12 0:c5d6f214ba01 683 ticker = ticker - 1;
William12 0:c5d6f214ba01 684 if (ticker < 0) {
William12 0:c5d6f214ba01 685 ticker = sizeof(xPos)/4 - 1;
William12 0:c5d6f214ba01 686 }
William12 0:c5d6f214ba01 687 } else if (myNav.down() || myNav.right()) {
William12 0:c5d6f214ba01 688 wait(.2);
William12 0:c5d6f214ba01 689 ticker = (ticker + 1) % (sizeof(xPos)/4);
William12 0:c5d6f214ba01 690 }
William12 0:c5d6f214ba01 691 wait(.01);
William12 0:c5d6f214ba01 692 timer++;
William12 0:c5d6f214ba01 693 }
William12 0:c5d6f214ba01 694 }
William12 0:c5d6f214ba01 695 }