Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed wave_player mbed-rtos 4180Final SDFileSystem
main.cpp@15:490eba282a68, 2020-04-29 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
