W R / Mbed 2 deprecated 4180_Final_Project

Dependencies:   mbed wave_player mbed-rtos 4180Final SDFileSystem

Committer:
bfarmer
Date:
Wed Apr 29 20:48:07 2020 +0000
Revision:
15:490eba282a68
Parent:
14:c21ffddc6e13
Child:
17:b9ecfb5c11ef
added spi functionailty for led strip and another thread for it

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