W R / Mbed 2 deprecated 4180_Final_Project

Dependencies:   mbed wave_player mbed-rtos 4180Final SDFileSystem

Committer:
bfarmer
Date:
Wed Apr 29 10:23:28 2020 +0000
Revision:
14:c21ffddc6e13
Parent:
13:aff3ad7d5afc
Child:
15:490eba282a68
Child:
16:e3c304456b15
added threads for updating scores on lcd and readiing microphoone data

Who changed what in which revision?

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