Guitar Hero Project on LPC1768 using push buttons, analog joystick. speaker and LCD Display

Dependencies:   mbed wave_player mbed-rtos 4DGL-uLCD-SE SparkfunAnalogJoystick SDFileSystem_OldbutworkswithRTOS PinDetect

Committer:
mkim613
Date:
Sun Nov 29 19:05:37 2020 +0000
Revision:
8:32a0bb14dbd2
Parent:
7:5ac5056cde2c
Child:
9:fbf87719b8b3
removed threads 3 and 4;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rpatel397 3:6f639d41aef3 1
4180_1 1:5b8e223e983d 2
4180_1 1:5b8e223e983d 3 #include "mbed.h"
4180_1 2:c2afd0c426af 4 #include "rtos.h"
4180_1 1:5b8e223e983d 5 #include "SDFileSystem.h"
rpatel397 3:6f639d41aef3 6 #include "uLCD_4DGL.h"
rpatel397 3:6f639d41aef3 7 #include "PinDetect.h"
rpatel397 5:2f09b457f690 8 #include "song1.h"
mkim613 7:5ac5056cde2c 9 #include "SparkfunAnalogJoystick.h"
rpatel397 5:2f09b457f690 10 #define sample_freq 8000.0
rpatel397 4:577404e4d53f 11 //code change
rpatel397 3:6f639d41aef3 12 Mutex lcd_mut;
rpatel397 3:6f639d41aef3 13 //SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
rpatel397 3:6f639d41aef3 14 uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin;
mkim613 7:5ac5056cde2c 15 //AnalogOut DACout(p18);
mkim613 7:5ac5056cde2c 16 //wave_player waver(&DACout);
rpatel397 5:2f09b457f690 17 AnalogOut speaker(p18);
mkim613 7:5ac5056cde2c 18 SparkfunAnalogJoystick joy(p16, p17, p15);
rpatel397 3:6f639d41aef3 19 PinDetect pb_1(p9, PullUp);
rpatel397 3:6f639d41aef3 20 PinDetect pb_2(p10, PullUp);
rpatel397 3:6f639d41aef3 21 PinDetect pb_3(p11, PullUp);
rpatel397 3:6f639d41aef3 22 PinDetect pb_4(p12, PullUp);
rpatel397 3:6f639d41aef3 23
rpatel397 3:6f639d41aef3 24 #define Main_Menu 0 // the first screen being shown
rpatel397 3:6f639d41aef3 25 #define Choose_Difficulty 1 // after hitting start, player chooses difficult
rpatel397 3:6f639d41aef3 26 #define Choose_Song 2 // after choosing difficullyt, choose song
rpatel397 3:6f639d41aef3 27 #define Start_Game 3 // the game has started
rpatel397 3:6f639d41aef3 28 #define Game_Over 4 // the game is done
rpatel397 3:6f639d41aef3 29
rpatel397 3:6f639d41aef3 30
rpatel397 3:6f639d41aef3 31 //colors
rpatel397 3:6f639d41aef3 32 #define YELLOW 16709376
rpatel397 3:6f639d41aef3 33
rpatel397 3:6f639d41aef3 34 //speed based on difficulty
mkim613 7:5ac5056cde2c 35 #define Easy 10
mkim613 7:5ac5056cde2c 36 #define Medium 15
mkim613 7:5ac5056cde2c 37 #define Hard 20
4180_1 1:5b8e223e983d 38
4180_1 1:5b8e223e983d 39
rpatel397 3:6f639d41aef3 40 DigitalOut myled1(LED1);
rpatel397 3:6f639d41aef3 41 DigitalOut myled2(LED2);
rpatel397 3:6f639d41aef3 42 DigitalOut myled3(LED3);
rpatel397 3:6f639d41aef3 43 DigitalOut myled4(LED4);
rpatel397 3:6f639d41aef3 44
rpatel397 5:2f09b457f690 45 Ticker sampletick;
rpatel397 5:2f09b457f690 46
mkim613 7:5ac5056cde2c 47 volatile int Game_State = Main_Menu;
rpatel397 3:6f639d41aef3 48 volatile bool draw_enable = true;
rpatel397 3:6f639d41aef3 49 volatile int Speed = Easy;
rpatel397 3:6f639d41aef3 50
mkim613 7:5ac5056cde2c 51 volatile int y1;
mkim613 7:5ac5056cde2c 52 volatile int y2;
mkim613 7:5ac5056cde2c 53 volatile int y3;
mkim613 7:5ac5056cde2c 54 volatile int y4;
rpatel397 6:4bc137ec1022 55 volatile int score = 0;
mkim613 7:5ac5056cde2c 56 volatile int highScore = 0;
mkim613 7:5ac5056cde2c 57 volatile int easyHigh = 0;
mkim613 7:5ac5056cde2c 58 volatile int medHigh = 0;
mkim613 7:5ac5056cde2c 59 volatile int hardHigh = 0;
mkim613 7:5ac5056cde2c 60 volatile int hit = 0;
mkim613 7:5ac5056cde2c 61 volatile int miss = 0;
mkim613 7:5ac5056cde2c 62 volatile int totalBubbles = 0;
mkim613 7:5ac5056cde2c 63
mkim613 7:5ac5056cde2c 64 volatile bool greenRelease = false;
mkim613 7:5ac5056cde2c 65 volatile bool redRelease = false;
mkim613 7:5ac5056cde2c 66 volatile bool yellowRelease = false;
mkim613 7:5ac5056cde2c 67 volatile bool blueRelease = false;
mkim613 7:5ac5056cde2c 68
mkim613 7:5ac5056cde2c 69 volatile bool greenPress = false;
mkim613 7:5ac5056cde2c 70 volatile bool redPress = false;
mkim613 7:5ac5056cde2c 71 volatile bool yellowPress = false;
mkim613 7:5ac5056cde2c 72 volatile bool bluePress = false;
mkim613 7:5ac5056cde2c 73
rpatel397 5:2f09b457f690 74 int i=0;
mkim613 7:5ac5056cde2c 75
mkim613 7:5ac5056cde2c 76 void otherMode(int speed) {
mkim613 7:5ac5056cde2c 77 int scoreUp;
mkim613 7:5ac5056cde2c 78 if (speed == Medium) {
mkim613 7:5ac5056cde2c 79 y1 = 5;
mkim613 7:5ac5056cde2c 80 y2 = 5;
mkim613 7:5ac5056cde2c 81 y3 = 5;
mkim613 7:5ac5056cde2c 82 y4 = 5;
mkim613 7:5ac5056cde2c 83 scoreUp = 1000;
mkim613 7:5ac5056cde2c 84 } else {
mkim613 7:5ac5056cde2c 85 y1 = 10;
mkim613 7:5ac5056cde2c 86 y2 = 10;
mkim613 7:5ac5056cde2c 87 y3 = 10;
mkim613 7:5ac5056cde2c 88 y4 = 10;
mkim613 7:5ac5056cde2c 89 scoreUp = 1500;
mkim613 7:5ac5056cde2c 90 }
mkim613 7:5ac5056cde2c 91 int pattern = 1;
mkim613 7:5ac5056cde2c 92 score = 0;
mkim613 7:5ac5056cde2c 93 hit = 0;
mkim613 7:5ac5056cde2c 94 totalBubbles = 0;
mkim613 7:5ac5056cde2c 95 Speed = speed;
mkim613 7:5ac5056cde2c 96 //uLCD.cls();
mkim613 7:5ac5056cde2c 97 //uLCD.printf("GameStart");
mkim613 7:5ac5056cde2c 98 uLCD.baudrate(BAUD_3000000); //jack up baud rate to max for fast display
mkim613 7:5ac5056cde2c 99 uLCD.background_color(BLACK);
mkim613 7:5ac5056cde2c 100 Thread::wait(1000);
mkim613 7:5ac5056cde2c 101 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 102 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 103 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 104 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 105 Thread::wait(750);
mkim613 7:5ac5056cde2c 106 switch (pattern) {
mkim613 7:5ac5056cde2c 107 case 1:
mkim613 7:5ac5056cde2c 108 totalBubbles += 4;
mkim613 7:5ac5056cde2c 109 greenPress = false;
mkim613 7:5ac5056cde2c 110 redPress = false;
mkim613 7:5ac5056cde2c 111 yellowPress = false;
mkim613 7:5ac5056cde2c 112 bluePress = false;
mkim613 7:5ac5056cde2c 113 redRelease = false;
mkim613 7:5ac5056cde2c 114 yellowRelease = false;
mkim613 7:5ac5056cde2c 115 greenRelease = false;
mkim613 7:5ac5056cde2c 116 blueRelease = false;
mkim613 7:5ac5056cde2c 117 if (speed == Medium) {
mkim613 7:5ac5056cde2c 118 y1 = 5;
mkim613 7:5ac5056cde2c 119 y2 = 5;
mkim613 7:5ac5056cde2c 120 y3 = 5;
mkim613 7:5ac5056cde2c 121 y4 = 5;
mkim613 7:5ac5056cde2c 122 } else {
mkim613 7:5ac5056cde2c 123 y1 = 30;
mkim613 7:5ac5056cde2c 124 y2 = 30;
mkim613 7:5ac5056cde2c 125 y3 = 30;
mkim613 7:5ac5056cde2c 126 y4 = 30;
mkim613 7:5ac5056cde2c 127 }
mkim613 7:5ac5056cde2c 128 while (y4 <= 130) {
mkim613 7:5ac5056cde2c 129 if(y1 <= 130) {
mkim613 7:5ac5056cde2c 130 y1 += Speed;
mkim613 7:5ac5056cde2c 131 }
mkim613 7:5ac5056cde2c 132 if (redRelease) {
mkim613 7:5ac5056cde2c 133 y2+= Speed;
mkim613 7:5ac5056cde2c 134 }
mkim613 7:5ac5056cde2c 135 if (yellowRelease) {
mkim613 7:5ac5056cde2c 136 y3+= Speed;
mkim613 7:5ac5056cde2c 137 }
mkim613 7:5ac5056cde2c 138 if (blueRelease) {
mkim613 7:5ac5056cde2c 139 y4 += Speed;
mkim613 7:5ac5056cde2c 140 }
mkim613 7:5ac5056cde2c 141
mkim613 7:5ac5056cde2c 142 if(y1 <= 130 && !greenPress) {
mkim613 7:5ac5056cde2c 143 uLCD.filled_circle(10,y1, 8 , GREEN);
mkim613 7:5ac5056cde2c 144 }
mkim613 7:5ac5056cde2c 145 if ((y1 >= 31 && y2 <= 130) && !redPress ) {
mkim613 7:5ac5056cde2c 146 uLCD.filled_circle(45,y2, 8 , RED);
mkim613 7:5ac5056cde2c 147 redRelease = true;
mkim613 7:5ac5056cde2c 148 }
mkim613 7:5ac5056cde2c 149 if ((y2 >= 31 && y3 <= 130) && !yellowPress) {
mkim613 7:5ac5056cde2c 150 uLCD.filled_circle(80,y3, 8 , YELLOW);
mkim613 7:5ac5056cde2c 151 yellowRelease = true;
mkim613 7:5ac5056cde2c 152 }
mkim613 7:5ac5056cde2c 153 if((y3 >= 31 && y4 <= 130) && !bluePress) {
mkim613 7:5ac5056cde2c 154 uLCD.filled_circle(115,y4, 8 , BLUE);
mkim613 7:5ac5056cde2c 155 blueRelease = true;
mkim613 7:5ac5056cde2c 156 }
mkim613 7:5ac5056cde2c 157 Thread::wait(250);
mkim613 7:5ac5056cde2c 158 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 159 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 160 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 161 uLCD.filled_circle(115, y4, 8 , BLACK);
mkim613 7:5ac5056cde2c 162
mkim613 7:5ac5056cde2c 163 if (y1 == 110 && greenPress) {
mkim613 7:5ac5056cde2c 164 //uLCD.filled_circle(10, y1, 8 , WHITE);
mkim613 7:5ac5056cde2c 165 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 166 score += scoreUp;
mkim613 7:5ac5056cde2c 167 hit++;
mkim613 7:5ac5056cde2c 168 } else {
mkim613 7:5ac5056cde2c 169 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 170 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 171 }
mkim613 7:5ac5056cde2c 172 if (y2 == 110 && redPress) {
mkim613 7:5ac5056cde2c 173 //uLCD.filled_circle(45, y2, 8 , WHITE);
mkim613 7:5ac5056cde2c 174 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 175 score += scoreUp;
mkim613 7:5ac5056cde2c 176 hit++;
mkim613 7:5ac5056cde2c 177 } else {
mkim613 7:5ac5056cde2c 178 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 179 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 180 }
mkim613 7:5ac5056cde2c 181 if(y3 == 110 && yellowPress) {
mkim613 7:5ac5056cde2c 182 //uLCD.filled_circle(80, y3, 8 , WHITE);
mkim613 7:5ac5056cde2c 183 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 184 score += scoreUp;
mkim613 7:5ac5056cde2c 185 hit++;
mkim613 7:5ac5056cde2c 186 } else {
mkim613 7:5ac5056cde2c 187 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 188 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 189 }
mkim613 7:5ac5056cde2c 190 if(y4 == 110 && bluePress) {
mkim613 7:5ac5056cde2c 191 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 192 score += scoreUp;
mkim613 7:5ac5056cde2c 193 hit++;
mkim613 7:5ac5056cde2c 194 } else {
mkim613 7:5ac5056cde2c 195 uLCD.filled_circle(115, y4, 8 , BLACK);
mkim613 7:5ac5056cde2c 196 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 197 }
mkim613 7:5ac5056cde2c 198 }
mkim613 7:5ac5056cde2c 199
mkim613 7:5ac5056cde2c 200 case 2: //green and red then yellow and blue
mkim613 7:5ac5056cde2c 201 totalBubbles += 4;
mkim613 7:5ac5056cde2c 202 greenPress = false;
mkim613 7:5ac5056cde2c 203 redPress = false;
mkim613 7:5ac5056cde2c 204 yellowPress = false;
mkim613 7:5ac5056cde2c 205 bluePress = false;
mkim613 7:5ac5056cde2c 206 redRelease = false;
mkim613 7:5ac5056cde2c 207 yellowRelease = false;
mkim613 7:5ac5056cde2c 208 greenRelease = false;
mkim613 7:5ac5056cde2c 209 blueRelease = false;
mkim613 7:5ac5056cde2c 210 if (speed == Medium) {
mkim613 7:5ac5056cde2c 211 y1 = 5;
mkim613 7:5ac5056cde2c 212 y2 = 5;
mkim613 7:5ac5056cde2c 213 y3 = 5;
mkim613 7:5ac5056cde2c 214 y4 = 5;
mkim613 7:5ac5056cde2c 215 } else {
mkim613 7:5ac5056cde2c 216 y1 = 10;
mkim613 7:5ac5056cde2c 217 y2 = 10;
mkim613 7:5ac5056cde2c 218 y3 = 10;
mkim613 7:5ac5056cde2c 219 y4 = 10;
mkim613 7:5ac5056cde2c 220 }
mkim613 7:5ac5056cde2c 221 while (y4 <= 130) {
mkim613 7:5ac5056cde2c 222 if(y1 <= 130) {
mkim613 7:5ac5056cde2c 223 y1 += Speed;
mkim613 7:5ac5056cde2c 224 }
mkim613 7:5ac5056cde2c 225 if (y2 <= 130) {
mkim613 7:5ac5056cde2c 226 y2+= Speed;
mkim613 7:5ac5056cde2c 227 }
mkim613 7:5ac5056cde2c 228 if (yellowRelease) {
mkim613 7:5ac5056cde2c 229 y3+= Speed;
mkim613 7:5ac5056cde2c 230 }
mkim613 7:5ac5056cde2c 231 if (blueRelease) {
mkim613 7:5ac5056cde2c 232 y4 += Speed;
mkim613 7:5ac5056cde2c 233 }
mkim613 7:5ac5056cde2c 234
mkim613 7:5ac5056cde2c 235 if(y1 <= 130 && !greenPress) {
mkim613 7:5ac5056cde2c 236 uLCD.filled_circle(10,y1, 8 , GREEN);
mkim613 7:5ac5056cde2c 237 }
mkim613 7:5ac5056cde2c 238 if (y2 <= 130 && !redPress ) {
mkim613 7:5ac5056cde2c 239 uLCD.filled_circle(45,y2, 8 , RED);
mkim613 7:5ac5056cde2c 240 redRelease = true;
mkim613 7:5ac5056cde2c 241 }
mkim613 7:5ac5056cde2c 242 if ((y2 >= 60 && y3 <= 130) && !yellowPress) {
mkim613 7:5ac5056cde2c 243 uLCD.filled_circle(80,y3, 8 , YELLOW);
mkim613 7:5ac5056cde2c 244 yellowRelease = true;
mkim613 7:5ac5056cde2c 245 }
mkim613 7:5ac5056cde2c 246 if((y2 >= 60 && y4 <= 130) && !bluePress) {
mkim613 7:5ac5056cde2c 247 uLCD.filled_circle(115,y4, 8 , BLUE);
mkim613 7:5ac5056cde2c 248 blueRelease = true;
mkim613 7:5ac5056cde2c 249 }
mkim613 7:5ac5056cde2c 250 Thread::wait(250);
mkim613 7:5ac5056cde2c 251 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 252 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 253 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 254 uLCD.filled_circle(115, y4, 8 , BLACK);
mkim613 7:5ac5056cde2c 255
mkim613 7:5ac5056cde2c 256 if (y1 == 110 && greenPress) {
mkim613 7:5ac5056cde2c 257 //uLCD.filled_circle(10, y1, 8 , WHITE);
mkim613 7:5ac5056cde2c 258 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 259 score += scoreUp;
mkim613 7:5ac5056cde2c 260 hit++;
mkim613 7:5ac5056cde2c 261 } else {
mkim613 7:5ac5056cde2c 262 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 263 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 264 }
mkim613 7:5ac5056cde2c 265 if (y2 == 110 && redPress) {
mkim613 7:5ac5056cde2c 266 //uLCD.filled_circle(45, y2, 8 , WHITE);
mkim613 7:5ac5056cde2c 267 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 268 score += scoreUp;
mkim613 7:5ac5056cde2c 269 hit++;
mkim613 7:5ac5056cde2c 270 } else {
mkim613 7:5ac5056cde2c 271 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 272 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 273 }
mkim613 7:5ac5056cde2c 274 if(y3 == 110 && yellowPress) {
mkim613 7:5ac5056cde2c 275 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 276 score += scoreUp;
mkim613 7:5ac5056cde2c 277 hit++;
mkim613 7:5ac5056cde2c 278 } else {
mkim613 7:5ac5056cde2c 279 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 280 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 281 }
mkim613 7:5ac5056cde2c 282 if(y4 == 110 && bluePress) {
mkim613 7:5ac5056cde2c 283 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 284 score += scoreUp;
mkim613 7:5ac5056cde2c 285 hit++;
mkim613 7:5ac5056cde2c 286 } else {
mkim613 7:5ac5056cde2c 287 uLCD.filled_circle(115, y4, 8 , BLACK);
mkim613 7:5ac5056cde2c 288 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 289 }
mkim613 7:5ac5056cde2c 290 }
mkim613 7:5ac5056cde2c 291
mkim613 7:5ac5056cde2c 292 case 3: //green and yellow then red and blue
mkim613 7:5ac5056cde2c 293 totalBubbles += 4;
mkim613 7:5ac5056cde2c 294 greenPress = false;
mkim613 7:5ac5056cde2c 295 redPress = false;
mkim613 7:5ac5056cde2c 296 yellowPress = false;
mkim613 7:5ac5056cde2c 297 bluePress = false;
mkim613 7:5ac5056cde2c 298 redRelease = false;
mkim613 7:5ac5056cde2c 299 yellowRelease = false;
mkim613 7:5ac5056cde2c 300 greenRelease = false;
mkim613 7:5ac5056cde2c 301 blueRelease = false;
mkim613 7:5ac5056cde2c 302 if (speed == Medium) {
mkim613 7:5ac5056cde2c 303 y1 = 5;
mkim613 7:5ac5056cde2c 304 y2 = 5;
mkim613 7:5ac5056cde2c 305 y3 = 5;
mkim613 7:5ac5056cde2c 306 y4 = 5;
mkim613 7:5ac5056cde2c 307 } else {
mkim613 7:5ac5056cde2c 308 y1 = 10;
mkim613 7:5ac5056cde2c 309 y2 = 10;
mkim613 7:5ac5056cde2c 310 y3 = 10;
mkim613 7:5ac5056cde2c 311 y4 = 10;
mkim613 7:5ac5056cde2c 312 }
mkim613 7:5ac5056cde2c 313 while (y4 <= 130) {
mkim613 7:5ac5056cde2c 314 if(y1 <= 130) {
mkim613 7:5ac5056cde2c 315 y1 += Speed;
mkim613 7:5ac5056cde2c 316 }
mkim613 7:5ac5056cde2c 317 if (redRelease) {
mkim613 7:5ac5056cde2c 318 y2+= Speed;
mkim613 7:5ac5056cde2c 319 }
mkim613 7:5ac5056cde2c 320 if (y3 <= 130) {
mkim613 7:5ac5056cde2c 321 y3+= Speed;
mkim613 7:5ac5056cde2c 322 }
mkim613 7:5ac5056cde2c 323 if (blueRelease) {
mkim613 7:5ac5056cde2c 324 y4 += Speed;
mkim613 7:5ac5056cde2c 325 }
mkim613 7:5ac5056cde2c 326
mkim613 7:5ac5056cde2c 327 if(y1 <= 130 && !greenPress) {
mkim613 7:5ac5056cde2c 328 uLCD.filled_circle(10,y1, 8 , GREEN);
mkim613 7:5ac5056cde2c 329 }
mkim613 7:5ac5056cde2c 330 if ((y1 >= 60 && y2 <= 130) && !redPress ) {
mkim613 7:5ac5056cde2c 331 uLCD.filled_circle(45,y2, 8 , RED);
mkim613 7:5ac5056cde2c 332 redRelease = true;
mkim613 7:5ac5056cde2c 333 }
mkim613 7:5ac5056cde2c 334 if (y3 <= 130 && !yellowPress) {
mkim613 7:5ac5056cde2c 335 uLCD.filled_circle(80,y3, 8 , YELLOW);
mkim613 7:5ac5056cde2c 336 yellowRelease = true;
mkim613 7:5ac5056cde2c 337 }
mkim613 7:5ac5056cde2c 338 if((y1 >= 60 && y4 <= 130) && !bluePress) {
mkim613 7:5ac5056cde2c 339 uLCD.filled_circle(115,y4, 8 , BLUE);
mkim613 7:5ac5056cde2c 340 blueRelease = true;
mkim613 7:5ac5056cde2c 341 }
mkim613 7:5ac5056cde2c 342 Thread::wait(250);
mkim613 7:5ac5056cde2c 343 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 344 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 345 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 346 uLCD.filled_circle(115, y4, 8 , BLACK);
mkim613 7:5ac5056cde2c 347
mkim613 7:5ac5056cde2c 348 if (y1 == 110 && greenPress) {
mkim613 7:5ac5056cde2c 349 //uLCD.filled_circle(10, y1, 8 , WHITE);
mkim613 7:5ac5056cde2c 350 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 351 score += scoreUp;
mkim613 7:5ac5056cde2c 352 hit++;
mkim613 7:5ac5056cde2c 353 } else {
mkim613 7:5ac5056cde2c 354 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 355 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 356 }
mkim613 7:5ac5056cde2c 357 if (y2 == 110 && redPress) {
mkim613 7:5ac5056cde2c 358 //uLCD.filled_circle(45, y2, 8 , WHITE);
mkim613 7:5ac5056cde2c 359 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 360 score += scoreUp;
mkim613 7:5ac5056cde2c 361 hit++;
mkim613 7:5ac5056cde2c 362 } else {
mkim613 7:5ac5056cde2c 363 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 364 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 365 }
mkim613 7:5ac5056cde2c 366 if(y3 == 110 && yellowPress) {
mkim613 7:5ac5056cde2c 367 //uLCD.filled_circle(80, y3, 8 , WHITE);
mkim613 7:5ac5056cde2c 368 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 369 score += scoreUp;
mkim613 7:5ac5056cde2c 370 hit++;
mkim613 7:5ac5056cde2c 371 } else {
mkim613 7:5ac5056cde2c 372 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 373 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 374 }
mkim613 7:5ac5056cde2c 375 if(y4 == 110 && bluePress) {
mkim613 7:5ac5056cde2c 376 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 377 score += scoreUp;
mkim613 7:5ac5056cde2c 378 hit++;
mkim613 7:5ac5056cde2c 379 } else {
mkim613 7:5ac5056cde2c 380 uLCD.filled_circle(115, y4, 8 , BLACK);
mkim613 7:5ac5056cde2c 381 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 382 }
mkim613 7:5ac5056cde2c 383 }
mkim613 7:5ac5056cde2c 384
mkim613 7:5ac5056cde2c 385 case 4:
mkim613 7:5ac5056cde2c 386 totalBubbles += 4;
mkim613 7:5ac5056cde2c 387 greenPress = false;
mkim613 7:5ac5056cde2c 388 redPress = false;
mkim613 7:5ac5056cde2c 389 yellowPress = false;
mkim613 7:5ac5056cde2c 390 bluePress = false;
mkim613 7:5ac5056cde2c 391 redRelease = false;
mkim613 7:5ac5056cde2c 392 yellowRelease = false;
mkim613 7:5ac5056cde2c 393 greenRelease = false;
mkim613 7:5ac5056cde2c 394 blueRelease = false;
mkim613 7:5ac5056cde2c 395 if (speed == Medium) {
mkim613 7:5ac5056cde2c 396 y1 = 5;
mkim613 7:5ac5056cde2c 397 y2 = 5;
mkim613 7:5ac5056cde2c 398 y3 = 5;
mkim613 7:5ac5056cde2c 399 y4 = 5;
mkim613 7:5ac5056cde2c 400 scoreUp = 1000;
mkim613 7:5ac5056cde2c 401 } else {
mkim613 7:5ac5056cde2c 402 y1 = 10;
mkim613 7:5ac5056cde2c 403 y2 = 10;
mkim613 7:5ac5056cde2c 404 y3 = 10;
mkim613 7:5ac5056cde2c 405 y4 = 10;
mkim613 7:5ac5056cde2c 406 scoreUp = 1500;
mkim613 7:5ac5056cde2c 407 }
mkim613 7:5ac5056cde2c 408 while (y1 <= 130) {
mkim613 7:5ac5056cde2c 409 if(y4 <= 130) {
mkim613 7:5ac5056cde2c 410 y4 += Speed;
mkim613 7:5ac5056cde2c 411 }
mkim613 7:5ac5056cde2c 412 if (yellowRelease) {
mkim613 7:5ac5056cde2c 413 y3+= Speed;
mkim613 7:5ac5056cde2c 414 }
mkim613 7:5ac5056cde2c 415 if (redRelease) {
mkim613 7:5ac5056cde2c 416 y2+= Speed;
mkim613 7:5ac5056cde2c 417 }
mkim613 7:5ac5056cde2c 418 if (greenRelease) {
mkim613 7:5ac5056cde2c 419 y1 += Speed;
mkim613 7:5ac5056cde2c 420 }
mkim613 7:5ac5056cde2c 421 if(y4 <= 130 && !bluePress) {
mkim613 7:5ac5056cde2c 422 uLCD.filled_circle(115,y4, 8 , BLUE);
mkim613 7:5ac5056cde2c 423 }
mkim613 7:5ac5056cde2c 424 if ((y4 >= 30 && y3 <= 130) && !yellowPress ) {
mkim613 7:5ac5056cde2c 425 uLCD.filled_circle(80,y3, 8 , YELLOW);
mkim613 7:5ac5056cde2c 426 yellowRelease = true;
mkim613 7:5ac5056cde2c 427 }
mkim613 7:5ac5056cde2c 428 if ((y3 >= 30 && y2 <= 130) && !redPress) {
mkim613 7:5ac5056cde2c 429 uLCD.filled_circle(45,y2, 8 , RED);
mkim613 7:5ac5056cde2c 430 redRelease = true;
mkim613 7:5ac5056cde2c 431 }
mkim613 7:5ac5056cde2c 432 if((y2 >= 30 && y1 <= 130) && !greenPress) {
mkim613 7:5ac5056cde2c 433 uLCD.filled_circle(10,y1, 8 , GREEN);
mkim613 7:5ac5056cde2c 434 greenRelease = true;
mkim613 7:5ac5056cde2c 435 }
mkim613 7:5ac5056cde2c 436 Thread::wait(250);
mkim613 7:5ac5056cde2c 437 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 438 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 439 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 440 uLCD.filled_circle(115, y4, 8 , BLACK);
mkim613 7:5ac5056cde2c 441
mkim613 7:5ac5056cde2c 442 if (y1 == 110 && greenPress) {
mkim613 7:5ac5056cde2c 443 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 444 score += scoreUp;
mkim613 7:5ac5056cde2c 445 hit++;
mkim613 7:5ac5056cde2c 446 } else {
mkim613 7:5ac5056cde2c 447 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 448 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 449 }
mkim613 7:5ac5056cde2c 450 if (y2 == 110 && redPress) {
mkim613 7:5ac5056cde2c 451 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 452 score += scoreUp;
mkim613 7:5ac5056cde2c 453 hit++;
mkim613 7:5ac5056cde2c 454 } else {
mkim613 7:5ac5056cde2c 455 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 456 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 457 }
mkim613 7:5ac5056cde2c 458 if(y3 == 110 && yellowPress) {
mkim613 7:5ac5056cde2c 459 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 460 score += scoreUp;
mkim613 7:5ac5056cde2c 461 hit++;
mkim613 7:5ac5056cde2c 462 } else {
mkim613 7:5ac5056cde2c 463 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 464 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 465 }
mkim613 7:5ac5056cde2c 466 if(y4 == 110 && bluePress) {
mkim613 7:5ac5056cde2c 467 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 468 score += scoreUp;
mkim613 7:5ac5056cde2c 469 hit++;
mkim613 7:5ac5056cde2c 470 } else {
mkim613 7:5ac5056cde2c 471 uLCD.filled_circle(115, y4, 8 , BLACK);
mkim613 7:5ac5056cde2c 472 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 473 }
mkim613 7:5ac5056cde2c 474 }
mkim613 7:5ac5056cde2c 475 sampletick.detach();
mkim613 7:5ac5056cde2c 476 i = 0;
mkim613 7:5ac5056cde2c 477 if (score> highScore) {
mkim613 7:5ac5056cde2c 478 highScore = score;
mkim613 7:5ac5056cde2c 479 }
mkim613 7:5ac5056cde2c 480 miss = totalBubbles - hit;
mkim613 7:5ac5056cde2c 481 Game_State = Game_Over;
mkim613 7:5ac5056cde2c 482 break;
mkim613 7:5ac5056cde2c 483 }
mkim613 7:5ac5056cde2c 484 }
mkim613 7:5ac5056cde2c 485
mkim613 7:5ac5056cde2c 486
mkim613 7:5ac5056cde2c 487 void easyMode()
mkim613 7:5ac5056cde2c 488 {
mkim613 7:5ac5056cde2c 489 int pattern = 1;
mkim613 7:5ac5056cde2c 490 score = 0;
mkim613 7:5ac5056cde2c 491 hit = 0;
mkim613 7:5ac5056cde2c 492 totalBubbles = 0;
mkim613 7:5ac5056cde2c 493 uLCD.baudrate(BAUD_3000000); //jack up baud rate to max for fast display
mkim613 7:5ac5056cde2c 494 uLCD.background_color(BLACK);
mkim613 7:5ac5056cde2c 495 Thread::wait(1000);
mkim613 7:5ac5056cde2c 496 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 497 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 498 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 499 uLCD.circle(115,110, 8, BLUE);
mkim613 7:5ac5056cde2c 500 switch (pattern) {
mkim613 7:5ac5056cde2c 501 case 1:
mkim613 7:5ac5056cde2c 502 totalBubbles += 3;
mkim613 7:5ac5056cde2c 503 greenPress = false;
mkim613 7:5ac5056cde2c 504 redPress = false;
mkim613 7:5ac5056cde2c 505 yellowPress = false;
mkim613 7:5ac5056cde2c 506 redRelease = false;
mkim613 7:5ac5056cde2c 507 yellowRelease = false;
mkim613 7:5ac5056cde2c 508 greenRelease = false;
mkim613 7:5ac5056cde2c 509 y1 = 10;
mkim613 7:5ac5056cde2c 510 y2 = 10;
mkim613 7:5ac5056cde2c 511 y3 = 10;
mkim613 7:5ac5056cde2c 512 while(y3 <= 130) {
mkim613 7:5ac5056cde2c 513 if(y1 <= 130) {
mkim613 7:5ac5056cde2c 514 y1 += Speed;
mkim613 7:5ac5056cde2c 515 }
mkim613 7:5ac5056cde2c 516 if (redRelease) {
mkim613 7:5ac5056cde2c 517 y2+= Speed;
mkim613 7:5ac5056cde2c 518 }
mkim613 7:5ac5056cde2c 519 if (yellowRelease) {
mkim613 7:5ac5056cde2c 520 y3+= Speed;
mkim613 7:5ac5056cde2c 521 }
mkim613 7:5ac5056cde2c 522
mkim613 7:5ac5056cde2c 523 if(y1 <= 130 && !greenPress) {
mkim613 7:5ac5056cde2c 524 uLCD.filled_circle(10,y1, 8 , GREEN);
mkim613 7:5ac5056cde2c 525 }
mkim613 7:5ac5056cde2c 526 if ((y1 >= 40 && y2 <= 130) && !redPress ) {
mkim613 7:5ac5056cde2c 527 uLCD.filled_circle(45,y2, 8 , RED);
mkim613 7:5ac5056cde2c 528 redRelease = true;
mkim613 7:5ac5056cde2c 529 }
mkim613 7:5ac5056cde2c 530 if ((y2 >= 40 && y3 <= 130) && !yellowPress) {
mkim613 7:5ac5056cde2c 531 uLCD.filled_circle(80,y3, 8 , YELLOW);
mkim613 7:5ac5056cde2c 532 yellowRelease = true;
mkim613 7:5ac5056cde2c 533 }
mkim613 7:5ac5056cde2c 534 Thread::wait(250);
mkim613 7:5ac5056cde2c 535 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 536 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 537 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 538
mkim613 7:5ac5056cde2c 539 if (y1 == 110 && greenPress) {
mkim613 7:5ac5056cde2c 540 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 541 score += 500;
mkim613 7:5ac5056cde2c 542 hit++;
mkim613 7:5ac5056cde2c 543 } else {
mkim613 7:5ac5056cde2c 544 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 545 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 546 }
mkim613 7:5ac5056cde2c 547 if (y2 == 110 && redPress) {
mkim613 7:5ac5056cde2c 548 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 549 score += 500;
mkim613 7:5ac5056cde2c 550 hit++;
mkim613 7:5ac5056cde2c 551 } else {
mkim613 7:5ac5056cde2c 552 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 553 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 554 }
mkim613 7:5ac5056cde2c 555 if(y3 == 110 && yellowPress) {
mkim613 7:5ac5056cde2c 556 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 557 score += 500;
mkim613 7:5ac5056cde2c 558 hit++;
mkim613 7:5ac5056cde2c 559 } else {
mkim613 7:5ac5056cde2c 560 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 561 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 562 }
mkim613 7:5ac5056cde2c 563
mkim613 7:5ac5056cde2c 564 }
mkim613 7:5ac5056cde2c 565 pattern = 4;
mkim613 7:5ac5056cde2c 566
mkim613 7:5ac5056cde2c 567 case 4:
mkim613 7:5ac5056cde2c 568 totalBubbles += 3;
mkim613 7:5ac5056cde2c 569 greenPress = false;
mkim613 7:5ac5056cde2c 570 redPress = false;
mkim613 7:5ac5056cde2c 571 yellowPress = false;
mkim613 7:5ac5056cde2c 572 redRelease = false;
mkim613 7:5ac5056cde2c 573 yellowRelease = false;
mkim613 7:5ac5056cde2c 574 greenRelease = false;
mkim613 7:5ac5056cde2c 575 y1 = 10;
mkim613 7:5ac5056cde2c 576 y2 = 10;
mkim613 7:5ac5056cde2c 577 y3 = 10;
mkim613 7:5ac5056cde2c 578 while(y1 <= 130) {
mkim613 7:5ac5056cde2c 579 if(y3 <= 130) {
mkim613 7:5ac5056cde2c 580 y3 += Speed;
mkim613 7:5ac5056cde2c 581 }
mkim613 7:5ac5056cde2c 582 if (redRelease) {
mkim613 7:5ac5056cde2c 583 y2+= Speed;
mkim613 7:5ac5056cde2c 584 }
mkim613 7:5ac5056cde2c 585 if (greenRelease) {
mkim613 7:5ac5056cde2c 586 y1+= Speed;
mkim613 7:5ac5056cde2c 587 }
mkim613 7:5ac5056cde2c 588 if (y3 <= 130 && !yellowPress) {
mkim613 7:5ac5056cde2c 589 uLCD.filled_circle(80,y3, 8 , YELLOW);
mkim613 7:5ac5056cde2c 590 }
mkim613 7:5ac5056cde2c 591 if ((y3 >= 40 && y2 <= 130) && !redPress ) {
mkim613 7:5ac5056cde2c 592 uLCD.filled_circle(45,y2, 8 , RED);
mkim613 7:5ac5056cde2c 593 redRelease = true;
mkim613 7:5ac5056cde2c 594 }
mkim613 7:5ac5056cde2c 595 if ((y2 >= 40 && y1 <= 130) && !greenPress) {
mkim613 7:5ac5056cde2c 596 uLCD.filled_circle(10,y1, 8 , GREEN);
mkim613 7:5ac5056cde2c 597 greenRelease = true;
mkim613 7:5ac5056cde2c 598 }
mkim613 7:5ac5056cde2c 599 Thread::wait(250);
mkim613 7:5ac5056cde2c 600 uLCD.filled_circle(10, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 601 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 602 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 603
mkim613 7:5ac5056cde2c 604 if (y3 == 110 && yellowPress) {
mkim613 7:5ac5056cde2c 605 //uLCD.filled_circle(80, y1, 8 , BLACK);
mkim613 7:5ac5056cde2c 606 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 607 score+=500;
mkim613 7:5ac5056cde2c 608 hit++;
mkim613 7:5ac5056cde2c 609 } else {
mkim613 7:5ac5056cde2c 610 uLCD.filled_circle(80, y3, 8 , BLACK);
mkim613 7:5ac5056cde2c 611 uLCD.circle(80,110, 8, YELLOW);
mkim613 7:5ac5056cde2c 612 }
mkim613 7:5ac5056cde2c 613 if (y2 == 110 && redPress) {
mkim613 7:5ac5056cde2c 614 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 615 score += 500;
mkim613 7:5ac5056cde2c 616 hit++;
mkim613 7:5ac5056cde2c 617 } else {
mkim613 7:5ac5056cde2c 618 uLCD.filled_circle(45, y2, 8 , BLACK);
mkim613 7:5ac5056cde2c 619 uLCD.circle(45,110, 8, RED);
mkim613 7:5ac5056cde2c 620 }
mkim613 7:5ac5056cde2c 621 if(y1 == 110 && greenPress) {
mkim613 7:5ac5056cde2c 622 uLCD.circle(10,110, 8, GREEN);
mkim613 7:5ac5056cde2c 623 score += 500;
mkim613 7:5ac5056cde2c 624 hit++;
mkim613 7:5ac5056cde2c 625 } else {
mkim613 7:5ac5056cde2c 626 uLCD.circle(10,110,8, GREEN);
mkim613 7:5ac5056cde2c 627 }
mkim613 7:5ac5056cde2c 628
mkim613 7:5ac5056cde2c 629 }
mkim613 7:5ac5056cde2c 630 if (score > highScore) {
mkim613 7:5ac5056cde2c 631 highScore = score;
mkim613 7:5ac5056cde2c 632 }
mkim613 7:5ac5056cde2c 633 sampletick.detach();
mkim613 7:5ac5056cde2c 634 i = 0;
mkim613 7:5ac5056cde2c 635 miss = totalBubbles - hit;
mkim613 7:5ac5056cde2c 636 Game_State = Game_Over;
mkim613 7:5ac5056cde2c 637 break;
mkim613 7:5ac5056cde2c 638 }
mkim613 7:5ac5056cde2c 639 }
mkim613 7:5ac5056cde2c 640
rpatel397 5:2f09b457f690 641 void audio_sample ()
rpatel397 5:2f09b457f690 642 {
rpatel397 5:2f09b457f690 643 speaker.write_u16(sound_data[i]);
rpatel397 5:2f09b457f690 644 i++;
rpatel397 5:2f09b457f690 645 if (i>= NUM_ELEMENTS) {
rpatel397 5:2f09b457f690 646 i = 0;
mkim613 7:5ac5056cde2c 647 //sampletick.detach();
mkim613 7:5ac5056cde2c 648 //Game_State = Game_Over;
rpatel397 5:2f09b457f690 649 }
rpatel397 5:2f09b457f690 650 }
4180_1 1:5b8e223e983d 651
rpatel397 3:6f639d41aef3 652 void LCD(void const *args) {
rpatel397 5:2f09b457f690 653
rpatel397 3:6f639d41aef3 654 while(1) {
rpatel397 3:6f639d41aef3 655 switch (Game_State) {
rpatel397 3:6f639d41aef3 656 case Start_Game :
rpatel397 3:6f639d41aef3 657 if (draw_enable) {
rpatel397 3:6f639d41aef3 658 lcd_mut.lock();
rpatel397 3:6f639d41aef3 659 uLCD.cls();
mkim613 7:5ac5056cde2c 660 //uLCD.printf("Start_Game");
mkim613 7:5ac5056cde2c 661 if(Speed == Easy) {
mkim613 7:5ac5056cde2c 662 easyMode();
mkim613 7:5ac5056cde2c 663 } else {
mkim613 7:5ac5056cde2c 664 otherMode(Speed);
mkim613 7:5ac5056cde2c 665 }
rpatel397 3:6f639d41aef3 666 lcd_mut.unlock();
rpatel397 3:6f639d41aef3 667 }
rpatel397 3:6f639d41aef3 668 break;
rpatel397 3:6f639d41aef3 669 case Game_Over :
rpatel397 3:6f639d41aef3 670 if (draw_enable) {
rpatel397 3:6f639d41aef3 671 draw_enable = false;
rpatel397 3:6f639d41aef3 672 lcd_mut.lock();
rpatel397 3:6f639d41aef3 673 uLCD.cls();
rpatel397 3:6f639d41aef3 674 uLCD.line(0, 0, 127, 0, RED);
rpatel397 3:6f639d41aef3 675 uLCD.line(127, 0, 127, 127, BLUE);
rpatel397 3:6f639d41aef3 676 uLCD.line(127, 127, 0, 127, GREEN);
rpatel397 3:6f639d41aef3 677 uLCD.line(0, 127, 0, 0, YELLOW);
rpatel397 3:6f639d41aef3 678 uLCD.text_width(1);
rpatel397 3:6f639d41aef3 679 uLCD.text_height(2);
rpatel397 3:6f639d41aef3 680 uLCD.text_string("Game Over",4,0,FONT_8X8, BLUE);
rpatel397 6:4bc137ec1022 681
rpatel397 3:6f639d41aef3 682 uLCD.text_width(1);
rpatel397 3:6f639d41aef3 683 uLCD.text_height(1);
rpatel397 6:4bc137ec1022 684 uLCD.color(YELLOW);
rpatel397 6:4bc137ec1022 685 uLCD.locate(2,3);
rpatel397 6:4bc137ec1022 686 uLCD.printf("Score:%d", score);
rpatel397 6:4bc137ec1022 687
rpatel397 6:4bc137ec1022 688 uLCD.color(GREEN);
rpatel397 6:4bc137ec1022 689 uLCD.locate(2,5);
mkim613 7:5ac5056cde2c 690 uLCD.printf("Hits:%d", hit);
rpatel397 6:4bc137ec1022 691
rpatel397 6:4bc137ec1022 692 uLCD.color(RED);
rpatel397 6:4bc137ec1022 693 uLCD.locate(2,7);
mkim613 7:5ac5056cde2c 694 uLCD.printf("Misses:%d", miss);
rpatel397 3:6f639d41aef3 695 uLCD.text_height(2);
rpatel397 6:4bc137ec1022 696
rpatel397 6:4bc137ec1022 697 uLCD.color(WHITE);
rpatel397 6:4bc137ec1022 698 uLCD.text_underline(ON);
rpatel397 6:4bc137ec1022 699 uLCD.text_string("High Score",4,5,FONT_8X8, WHITE);
rpatel397 6:4bc137ec1022 700 uLCD.text_underline(OFF);
rpatel397 6:4bc137ec1022 701 uLCD.text_height(1);
rpatel397 6:4bc137ec1022 702 uLCD.locate(4,13);
rpatel397 6:4bc137ec1022 703 uLCD.text_height(2);
mkim613 7:5ac5056cde2c 704 uLCD.printf("%d", highScore);
rpatel397 3:6f639d41aef3 705 uLCD.text_height(1);
rpatel397 3:6f639d41aef3 706
rpatel397 3:6f639d41aef3 707 lcd_mut.unlock();
rpatel397 3:6f639d41aef3 708 }
rpatel397 3:6f639d41aef3 709 break;
rpatel397 3:6f639d41aef3 710 case Choose_Song :
rpatel397 3:6f639d41aef3 711 if (draw_enable) {
rpatel397 3:6f639d41aef3 712 draw_enable = false;
rpatel397 3:6f639d41aef3 713 lcd_mut.lock();
rpatel397 3:6f639d41aef3 714 uLCD.cls();
rpatel397 3:6f639d41aef3 715 uLCD.text_width(1);
rpatel397 3:6f639d41aef3 716 uLCD.text_height(1);
rpatel397 3:6f639d41aef3 717 uLCD.locate(1,1);
rpatel397 3:6f639d41aef3 718 uLCD.color(BLUE);
rpatel397 3:6f639d41aef3 719 uLCD.text_underline(ON);
rpatel397 3:6f639d41aef3 720 uLCD.text_string("Choose Song",4,1,FONT_8X8, BLUE);
rpatel397 3:6f639d41aef3 721 uLCD.text_underline(OFF);
rpatel397 3:6f639d41aef3 722 uLCD.set_font(FONT_7X8);
rpatel397 3:6f639d41aef3 723 uLCD.triangle(64, 32,58, 40, 70, 40, WHITE);
rpatel397 3:6f639d41aef3 724 uLCD.triangle(64, 92 ,58, 84, 70, 84, WHITE);
rpatel397 3:6f639d41aef3 725 uLCD.color(GREEN);
rpatel397 3:6f639d41aef3 726 uLCD.rectangle(10,44,118, 80, LGREY);
rpatel397 3:6f639d41aef3 727 uLCD.text_width(2);
rpatel397 3:6f639d41aef3 728 uLCD.text_height(2);
rpatel397 3:6f639d41aef3 729 uLCD.text_string("Schools\nOut",1,3,FONT_8X8, GREEN);
rpatel397 3:6f639d41aef3 730 uLCD.text_width(1);
rpatel397 3:6f639d41aef3 731 uLCD.text_height(1);
rpatel397 3:6f639d41aef3 732 lcd_mut.unlock();
rpatel397 3:6f639d41aef3 733 }
rpatel397 3:6f639d41aef3 734 break;
rpatel397 3:6f639d41aef3 735 case Choose_Difficulty :
rpatel397 3:6f639d41aef3 736 if (draw_enable) {
rpatel397 3:6f639d41aef3 737 draw_enable = false;
rpatel397 3:6f639d41aef3 738 lcd_mut.lock();
rpatel397 3:6f639d41aef3 739 uLCD.cls();
rpatel397 3:6f639d41aef3 740 uLCD.text_width(1.5);
rpatel397 3:6f639d41aef3 741 uLCD.text_height(1.5);
rpatel397 3:6f639d41aef3 742 uLCD.locate(1,1);
rpatel397 3:6f639d41aef3 743 uLCD.color(BLUE);
rpatel397 3:6f639d41aef3 744 uLCD.text_underline(ON);
rpatel397 3:6f639d41aef3 745 uLCD.text_string("Choose Difficulty",1,1,FONT_8X8, BLUE);
rpatel397 3:6f639d41aef3 746 uLCD.text_underline(OFF);
rpatel397 3:6f639d41aef3 747 uLCD.set_font(FONT_7X8);
rpatel397 3:6f639d41aef3 748 uLCD.text_width(2);
rpatel397 3:6f639d41aef3 749 uLCD.text_height(2);
rpatel397 3:6f639d41aef3 750 uLCD.color(GREEN);
rpatel397 3:6f639d41aef3 751 uLCD.locate(1,2);
rpatel397 3:6f639d41aef3 752 uLCD.printf("1|EASY");
rpatel397 3:6f639d41aef3 753 uLCD.locate(1,4);
rpatel397 3:6f639d41aef3 754 uLCD.color(YELLOW);
rpatel397 3:6f639d41aef3 755
rpatel397 3:6f639d41aef3 756 uLCD.printf("2|MEDIUM");
rpatel397 3:6f639d41aef3 757 uLCD.locate(1,6);
rpatel397 3:6f639d41aef3 758 uLCD.color(RED);
rpatel397 3:6f639d41aef3 759 uLCD.printf("3|HARD");
rpatel397 3:6f639d41aef3 760 uLCD.text_width(1);
rpatel397 3:6f639d41aef3 761 uLCD.text_height(1);
rpatel397 3:6f639d41aef3 762 lcd_mut.unlock();
rpatel397 3:6f639d41aef3 763 }
rpatel397 3:6f639d41aef3 764 break;
rpatel397 3:6f639d41aef3 765 case Main_Menu :
rpatel397 3:6f639d41aef3 766 if (draw_enable) {
rpatel397 3:6f639d41aef3 767 draw_enable = false;
rpatel397 3:6f639d41aef3 768 lcd_mut.lock();
rpatel397 3:6f639d41aef3 769 uLCD.cls();
rpatel397 3:6f639d41aef3 770 uLCD.line(0, 0, 127, 0, RED);
rpatel397 3:6f639d41aef3 771 uLCD.line(127, 0, 127, 127, BLUE);
rpatel397 3:6f639d41aef3 772 uLCD.line(127, 127, 0, 127, GREEN);
rpatel397 3:6f639d41aef3 773 uLCD.line(0, 127, 0, 0, YELLOW);
rpatel397 3:6f639d41aef3 774 uLCD.text_width(2);
rpatel397 3:6f639d41aef3 775 uLCD.text_height(2);
rpatel397 3:6f639d41aef3 776 uLCD.locate(2,2);
rpatel397 3:6f639d41aef3 777 uLCD.color(RED);
rpatel397 3:6f639d41aef3 778 uLCD.printf("Guitar");
rpatel397 3:6f639d41aef3 779 uLCD.color(BLUE);
rpatel397 3:6f639d41aef3 780 uLCD.locate(3,4);
rpatel397 3:6f639d41aef3 781 uLCD.printf("Hero");
rpatel397 3:6f639d41aef3 782
rpatel397 3:6f639d41aef3 783 uLCD.text_width(1);
rpatel397 3:6f639d41aef3 784 uLCD.text_height(1);
rpatel397 3:6f639d41aef3 785 uLCD.locate(3,12);
rpatel397 3:6f639d41aef3 786 uLCD.color(GREEN);
rpatel397 3:6f639d41aef3 787 uLCD.printf("Press to start");
rpatel397 3:6f639d41aef3 788
rpatel397 3:6f639d41aef3 789 lcd_mut.unlock();
rpatel397 3:6f639d41aef3 790 }
rpatel397 3:6f639d41aef3 791 break;
rpatel397 3:6f639d41aef3 792 default:
rpatel397 3:6f639d41aef3 793 break;
rpatel397 3:6f639d41aef3 794 }
rpatel397 3:6f639d41aef3 795 Thread::wait(10);
rpatel397 3:6f639d41aef3 796 }
rpatel397 3:6f639d41aef3 797 }
rpatel397 3:6f639d41aef3 798 void lights(void const *args) {
rpatel397 3:6f639d41aef3 799 while(1) {
rpatel397 3:6f639d41aef3 800 switch (Game_State) {
rpatel397 3:6f639d41aef3 801 case Start_Game :
rpatel397 3:6f639d41aef3 802 myled1 = 0;
rpatel397 3:6f639d41aef3 803 myled2 = 0;
rpatel397 3:6f639d41aef3 804 myled3 = 0;
rpatel397 3:6f639d41aef3 805 myled4 = 1;
rpatel397 3:6f639d41aef3 806 break;
rpatel397 3:6f639d41aef3 807 case Game_Over :
rpatel397 3:6f639d41aef3 808 myled1 = 1;
rpatel397 3:6f639d41aef3 809 myled2 = 1;
rpatel397 3:6f639d41aef3 810 myled3 = 1;
rpatel397 3:6f639d41aef3 811 myled4 = 1;
rpatel397 3:6f639d41aef3 812 break;
rpatel397 3:6f639d41aef3 813 case Choose_Song :
rpatel397 3:6f639d41aef3 814 myled1 = 0;
rpatel397 3:6f639d41aef3 815 myled2 = 0;
rpatel397 3:6f639d41aef3 816 myled3 = 1;
rpatel397 3:6f639d41aef3 817 myled4 = 0;
rpatel397 3:6f639d41aef3 818 break;
rpatel397 3:6f639d41aef3 819 case Choose_Difficulty :
rpatel397 3:6f639d41aef3 820
rpatel397 3:6f639d41aef3 821 myled1 = 0;
rpatel397 3:6f639d41aef3 822 myled2 = 1;
rpatel397 3:6f639d41aef3 823 myled3 = 0;
rpatel397 3:6f639d41aef3 824 myled4 = 0;
rpatel397 3:6f639d41aef3 825
rpatel397 3:6f639d41aef3 826
rpatel397 3:6f639d41aef3 827 break;
rpatel397 3:6f639d41aef3 828 case Main_Menu :
rpatel397 3:6f639d41aef3 829
rpatel397 3:6f639d41aef3 830 myled1 = 1;
rpatel397 3:6f639d41aef3 831 myled2 = 0;
rpatel397 3:6f639d41aef3 832 myled3 = 0;
rpatel397 3:6f639d41aef3 833 myled4 = 0;
rpatel397 3:6f639d41aef3 834
rpatel397 3:6f639d41aef3 835 break;
rpatel397 3:6f639d41aef3 836 default:
rpatel397 3:6f639d41aef3 837 break;
rpatel397 3:6f639d41aef3 838 }
rpatel397 3:6f639d41aef3 839 Thread::wait(500);
rpatel397 3:6f639d41aef3 840 }
rpatel397 3:6f639d41aef3 841 }
4180_1 1:5b8e223e983d 842
rpatel397 5:2f09b457f690 843 void startGame() {
rpatel397 5:2f09b457f690 844 Game_State = Start_Game;
rpatel397 5:2f09b457f690 845 sampletick.attach(&audio_sample, 1.0 / sample_freq);
rpatel397 5:2f09b457f690 846 }
4180_1 1:5b8e223e983d 847
rpatel397 3:6f639d41aef3 848 void pb_1_pressed(void) {
rpatel397 3:6f639d41aef3 849 switch (Game_State) {
rpatel397 3:6f639d41aef3 850 case Start_Game :
rpatel397 3:6f639d41aef3 851 draw_enable = true;
mkim613 7:5ac5056cde2c 852 if(y1 == 110) {
mkim613 7:5ac5056cde2c 853 if (joy.yAxis() > 0.05 || joy.yAxis() < -0.05) {
mkim613 7:5ac5056cde2c 854 greenPress = true; //joy > .55 || joy < .45
mkim613 7:5ac5056cde2c 855 }
mkim613 7:5ac5056cde2c 856 }
rpatel397 3:6f639d41aef3 857 break;
rpatel397 3:6f639d41aef3 858 case Game_Over :
rpatel397 3:6f639d41aef3 859 draw_enable = true;
rpatel397 3:6f639d41aef3 860 Game_State = Main_Menu;
rpatel397 3:6f639d41aef3 861 break;
rpatel397 3:6f639d41aef3 862 case Choose_Song :
rpatel397 3:6f639d41aef3 863 draw_enable = true;
rpatel397 5:2f09b457f690 864 startGame();
rpatel397 3:6f639d41aef3 865 break;
rpatel397 3:6f639d41aef3 866 case Choose_Difficulty :
rpatel397 3:6f639d41aef3 867
rpatel397 3:6f639d41aef3 868 draw_enable = true;
rpatel397 3:6f639d41aef3 869 Game_State = Choose_Song;
rpatel397 3:6f639d41aef3 870 Speed = Easy;
rpatel397 3:6f639d41aef3 871
rpatel397 3:6f639d41aef3 872 break;
rpatel397 3:6f639d41aef3 873 case Main_Menu :
rpatel397 3:6f639d41aef3 874
rpatel397 3:6f639d41aef3 875 draw_enable = true;
rpatel397 3:6f639d41aef3 876 Game_State = Choose_Difficulty;
rpatel397 3:6f639d41aef3 877
rpatel397 3:6f639d41aef3 878 break;
rpatel397 3:6f639d41aef3 879 default:
rpatel397 3:6f639d41aef3 880 break;
rpatel397 3:6f639d41aef3 881 }
rpatel397 3:6f639d41aef3 882 }
rpatel397 3:6f639d41aef3 883 void pb_2_pressed(void) {
rpatel397 3:6f639d41aef3 884 switch (Game_State) {
rpatel397 3:6f639d41aef3 885 case Start_Game :
rpatel397 3:6f639d41aef3 886 draw_enable = true;
mkim613 7:5ac5056cde2c 887 if(y2 == 110) {
mkim613 7:5ac5056cde2c 888 if (joy.yAxis() > 0.05 || joy.yAxis() < -0.05) {
mkim613 7:5ac5056cde2c 889 redPress = true;
mkim613 7:5ac5056cde2c 890 }
mkim613 7:5ac5056cde2c 891 }
rpatel397 3:6f639d41aef3 892 break;
rpatel397 3:6f639d41aef3 893 case Game_Over :
rpatel397 3:6f639d41aef3 894 draw_enable = true;
rpatel397 3:6f639d41aef3 895 Game_State = Main_Menu;
rpatel397 3:6f639d41aef3 896 break;
rpatel397 3:6f639d41aef3 897 case Choose_Song :
rpatel397 3:6f639d41aef3 898 draw_enable = true;
rpatel397 5:2f09b457f690 899 startGame();
rpatel397 3:6f639d41aef3 900 break;
rpatel397 3:6f639d41aef3 901 case Choose_Difficulty :
rpatel397 3:6f639d41aef3 902
rpatel397 3:6f639d41aef3 903 draw_enable = true;
rpatel397 3:6f639d41aef3 904 Game_State = Choose_Song;
rpatel397 3:6f639d41aef3 905 Speed = Medium;
rpatel397 3:6f639d41aef3 906 break;
rpatel397 3:6f639d41aef3 907 case Main_Menu :
rpatel397 3:6f639d41aef3 908
rpatel397 3:6f639d41aef3 909 draw_enable = true;
rpatel397 3:6f639d41aef3 910 Game_State = Choose_Difficulty;
rpatel397 3:6f639d41aef3 911
rpatel397 3:6f639d41aef3 912 break;
rpatel397 3:6f639d41aef3 913 default:
rpatel397 3:6f639d41aef3 914 break;
rpatel397 3:6f639d41aef3 915 }
rpatel397 3:6f639d41aef3 916
rpatel397 3:6f639d41aef3 917 }
rpatel397 3:6f639d41aef3 918 void pb_3_pressed(void) {
rpatel397 3:6f639d41aef3 919 switch (Game_State) {
rpatel397 3:6f639d41aef3 920 case Start_Game :
rpatel397 3:6f639d41aef3 921 draw_enable = true;
mkim613 7:5ac5056cde2c 922 if(y3 == 110) {
mkim613 7:5ac5056cde2c 923 if (joy.yAxis() > 0.05 || joy.yAxis() < -0.05) {
mkim613 7:5ac5056cde2c 924 yellowPress = true;
mkim613 7:5ac5056cde2c 925 }
mkim613 7:5ac5056cde2c 926 }
rpatel397 3:6f639d41aef3 927 break;
rpatel397 3:6f639d41aef3 928 case Game_Over :
rpatel397 3:6f639d41aef3 929 draw_enable = true;
rpatel397 3:6f639d41aef3 930 Game_State = Main_Menu;
rpatel397 3:6f639d41aef3 931 break;
rpatel397 3:6f639d41aef3 932 case Choose_Song :
rpatel397 3:6f639d41aef3 933 draw_enable = true;
rpatel397 5:2f09b457f690 934 startGame();
rpatel397 3:6f639d41aef3 935 break;
rpatel397 3:6f639d41aef3 936 case Choose_Difficulty :
rpatel397 3:6f639d41aef3 937
rpatel397 3:6f639d41aef3 938 draw_enable = true;
rpatel397 3:6f639d41aef3 939 Game_State = Choose_Song;
rpatel397 3:6f639d41aef3 940 Speed = Hard;
rpatel397 3:6f639d41aef3 941
rpatel397 3:6f639d41aef3 942 break;
rpatel397 3:6f639d41aef3 943 case Main_Menu :
rpatel397 3:6f639d41aef3 944
rpatel397 3:6f639d41aef3 945 draw_enable = true;
rpatel397 3:6f639d41aef3 946 Game_State = Choose_Difficulty;
rpatel397 3:6f639d41aef3 947
rpatel397 3:6f639d41aef3 948 break;
rpatel397 3:6f639d41aef3 949 default:
rpatel397 3:6f639d41aef3 950 break;
rpatel397 3:6f639d41aef3 951 }
rpatel397 3:6f639d41aef3 952 }
rpatel397 3:6f639d41aef3 953 void pb_4_pressed(void) {
rpatel397 3:6f639d41aef3 954 switch (Game_State) {
rpatel397 3:6f639d41aef3 955 case Start_Game :
rpatel397 3:6f639d41aef3 956 draw_enable = true;
mkim613 7:5ac5056cde2c 957 if(y4 == 110) {
mkim613 7:5ac5056cde2c 958 if (joy.yAxis() > 0.05 || joy.yAxis() < -0.05) {
mkim613 7:5ac5056cde2c 959 bluePress = true;
mkim613 7:5ac5056cde2c 960 }
mkim613 7:5ac5056cde2c 961 }
rpatel397 3:6f639d41aef3 962 break;
rpatel397 3:6f639d41aef3 963 case Game_Over :
rpatel397 3:6f639d41aef3 964 draw_enable = true;
rpatel397 3:6f639d41aef3 965 Game_State = Main_Menu;
rpatel397 3:6f639d41aef3 966 break;
rpatel397 3:6f639d41aef3 967 case Choose_Song :
rpatel397 3:6f639d41aef3 968 draw_enable = true;
rpatel397 5:2f09b457f690 969 startGame();
rpatel397 3:6f639d41aef3 970 break;
rpatel397 3:6f639d41aef3 971 case Choose_Difficulty :
rpatel397 3:6f639d41aef3 972 //not used
rpatel397 3:6f639d41aef3 973 break;
rpatel397 3:6f639d41aef3 974 case Main_Menu :
rpatel397 3:6f639d41aef3 975
rpatel397 3:6f639d41aef3 976 draw_enable = true;
rpatel397 3:6f639d41aef3 977 Game_State = Choose_Difficulty;
rpatel397 3:6f639d41aef3 978
rpatel397 3:6f639d41aef3 979 break;
rpatel397 3:6f639d41aef3 980 default:
rpatel397 3:6f639d41aef3 981 break;
rpatel397 3:6f639d41aef3 982 }
rpatel397 3:6f639d41aef3 983 }
rpatel397 3:6f639d41aef3 984
4180_1 1:5b8e223e983d 985 int main()
4180_1 1:5b8e223e983d 986 {
rpatel397 5:2f09b457f690 987 speaker.write_u16(0);
rpatel397 3:6f639d41aef3 988 pb_1.attach_deasserted( &pb_1_pressed );
rpatel397 3:6f639d41aef3 989 pb_2.attach_deasserted( &pb_2_pressed );
rpatel397 3:6f639d41aef3 990 pb_3.attach_deasserted( &pb_3_pressed );
rpatel397 3:6f639d41aef3 991 pb_4.attach_deasserted( &pb_4_pressed );
rpatel397 3:6f639d41aef3 992 pb_1.setSampleFrequency();
rpatel397 3:6f639d41aef3 993 pb_2.setSampleFrequency();
rpatel397 3:6f639d41aef3 994 pb_3.setSampleFrequency();
rpatel397 3:6f639d41aef3 995 pb_4.setSampleFrequency();
rpatel397 3:6f639d41aef3 996 lcd_mut.lock();
rpatel397 3:6f639d41aef3 997 uLCD.cls();
rpatel397 3:6f639d41aef3 998 uLCD.printf("starting...");
rpatel397 3:6f639d41aef3 999 uLCD.background_color(BLACK);
rpatel397 3:6f639d41aef3 1000 uLCD.baudrate(3000000);
rpatel397 3:6f639d41aef3 1001 lcd_mut.unlock();
4180_1 2:c2afd0c426af 1002 Thread::wait(1000);
rpatel397 3:6f639d41aef3 1003 Thread Thread1(LCD);
rpatel397 3:6f639d41aef3 1004 Thread Thread2(lights);
rpatel397 3:6f639d41aef3 1005
rpatel397 3:6f639d41aef3 1006
rpatel397 3:6f639d41aef3 1007 while(1) {
rpatel397 3:6f639d41aef3 1008 Thread::wait(1000);
rpatel397 3:6f639d41aef3 1009 }
rpatel397 3:6f639d41aef3 1010
rpatel397 3:6f639d41aef3 1011 }