Frogger for mbed

Dependencies:   4DGL-uLCD-SE Motor PinDetect SDFileSystem mbed-rtos mbed wave_player

Fork of 4180_Lab4_v6 by Erick Cardenas

Committer:
swilliams346
Date:
Wed Nov 02 17:17:03 2016 +0000
Revision:
3:427c365950d7
Parent:
2:68c4e1539da5
Beta Version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
swilliams346 0:9f1095365b9a 1 #include "mbed.h"
swilliams346 0:9f1095365b9a 2 #include "rtos.h"
swilliams346 1:abd7e0631db8 3 #include "PinDetect.h"
swilliams346 0:9f1095365b9a 4 #include "uLCD_4DGL.h"
swilliams346 0:9f1095365b9a 5 uLCD_4DGL uLCD(p28, p27, p30);
swilliams346 0:9f1095365b9a 6 #include "Robot.h"
swilliams346 0:9f1095365b9a 7 #include "Nav_Switch.h"
swilliams346 0:9f1095365b9a 8 #include "Speaker.h"
swilliams346 0:9f1095365b9a 9 #include "wave_player.h"
swilliams346 0:9f1095365b9a 10 #include "SDFileSystem.h"
swilliams346 0:9f1095365b9a 11 BusOut mbedleds(LED1,LED2,LED3,LED4);
swilliams346 0:9f1095365b9a 12 Robot myRobot;
swilliams346 1:abd7e0631db8 13 Nav_Switch myNav( p25, p22, p23, p21, p24);
swilliams346 0:9f1095365b9a 14 Mutex stdio_mutex;
swilliams346 0:9f1095365b9a 15 AnalogOut DACout(p18); // used to play sound on speaker
swilliams346 0:9f1095365b9a 16 wave_player waver(&DACout);
swilliams346 0:9f1095365b9a 17 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card setup
swilliams346 1:abd7e0631db8 18 //PinDetect pb1(p25);
swilliams346 0:9f1095365b9a 19 //Wiring Set-up:
swilliams346 0:9f1095365b9a 20 //Speaker: p18
swilliams346 0:9f1095365b9a 21 //SD Card: DO=p6,SCK=p7,DI=p5,CS=p8,VCC=Vout,GND=GND
swilliams346 0:9f1095365b9a 22 //Thumb-Stick: U=p25,C=p24,L=p23,D=p22,R=p21,+=pVout,-=GND
swilliams346 0:9f1095365b9a 23 bool Alive = 1;
swilliams346 0:9f1095365b9a 24 bool Drown = 0;
swilliams346 1:abd7e0631db8 25 bool Splat = 0;
ecardenas8 2:68c4e1539da5 26 bool Victory = 0;
swilliams346 1:abd7e0631db8 27 double CarWidth = 10;
swilliams346 0:9f1095365b9a 28 int i = 11;
swilliams346 0:9f1095365b9a 29 int j = 11;
swilliams346 0:9f1095365b9a 30 int C1 = 11;
swilliams346 0:9f1095365b9a 31 int C2 = 32;
swilliams346 0:9f1095365b9a 32 int C3 = 53;
swilliams346 0:9f1095365b9a 33 int C4 = 74;
swilliams346 0:9f1095365b9a 34 int C5 = 95;
swilliams346 0:9f1095365b9a 35 int C6 = 116;
swilliams346 1:abd7e0631db8 36 double Position1 = 90;
swilliams346 1:abd7e0631db8 37 double Position2 = 90;
swilliams346 1:abd7e0631db8 38 double Column1;
swilliams346 1:abd7e0631db8 39 double Column2;
swilliams346 0:9f1095365b9a 40 int Rate1 = 3;
swilliams346 1:abd7e0631db8 41 int FrogX;
swilliams346 1:abd7e0631db8 42 int FrogY;
swilliams346 0:9f1095365b9a 43
swilliams346 1:abd7e0631db8 44 /*void pb1_hit_callback (void)
swilliams346 1:abd7e0631db8 45 {
swilliams346 1:abd7e0631db8 46 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 47 myRobot.moveForward();
swilliams346 1:abd7e0631db8 48 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 49 }*/
swilliams346 1:abd7e0631db8 50
swilliams346 1:abd7e0631db8 51 void DeathCheck_thread(void const *argument)
swilliams346 0:9f1095365b9a 52 {
swilliams346 0:9f1095365b9a 53 while(Alive) {
swilliams346 1:abd7e0631db8 54 FrogX = myRobot.getXPosition();
swilliams346 1:abd7e0631db8 55 FrogY = myRobot.getYPosition();
swilliams346 0:9f1095365b9a 56
swilliams346 1:abd7e0631db8 57 if(FrogY == 32){ //Check win-condition on landing on Row 2
swilliams346 1:abd7e0631db8 58 Alive = 0;
swilliams346 1:abd7e0631db8 59 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 60 uLCD.locate(1,1);
swilliams346 1:abd7e0631db8 61 uLCD.printf("VICTORY!");
swilliams346 1:abd7e0631db8 62 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 63 }//End 53
swilliams346 1:abd7e0631db8 64 if(FrogY == 74){ //Check dangers on water Row 4
swilliams346 1:abd7e0631db8 65 if(FrogX == 32 || FrogX == 74 || FrogX == 116){
swilliams346 0:9f1095365b9a 66 Alive = 0;
swilliams346 0:9f1095365b9a 67 Drown = 1;
swilliams346 0:9f1095365b9a 68
swilliams346 0:9f1095365b9a 69 stdio_mutex.lock();
swilliams346 0:9f1095365b9a 70 myRobot.drawDrown1();
swilliams346 0:9f1095365b9a 71 stdio_mutex.unlock();
swilliams346 3:427c365950d7 72 Thread::wait(150);
swilliams346 0:9f1095365b9a 73 stdio_mutex.lock();
swilliams346 0:9f1095365b9a 74 myRobot.drawDrown2();
swilliams346 0:9f1095365b9a 75 stdio_mutex.unlock();
swilliams346 3:427c365950d7 76 Thread::wait(150);
swilliams346 0:9f1095365b9a 77 stdio_mutex.lock();
swilliams346 0:9f1095365b9a 78 myRobot.drawDrown3();
swilliams346 0:9f1095365b9a 79 stdio_mutex.unlock();
swilliams346 3:427c365950d7 80 Thread::wait(150);
swilliams346 0:9f1095365b9a 81 stdio_mutex.lock();
swilliams346 0:9f1095365b9a 82 myRobot.drawDrown4();
swilliams346 0:9f1095365b9a 83 stdio_mutex.unlock();
swilliams346 3:427c365950d7 84 Thread::wait(150);
swilliams346 0:9f1095365b9a 85 stdio_mutex.lock();
swilliams346 0:9f1095365b9a 86 myRobot.drawDrown5();
swilliams346 0:9f1095365b9a 87 stdio_mutex.unlock();
swilliams346 0:9f1095365b9a 88 }
swilliams346 1:abd7e0631db8 89 }//End 74
swilliams346 1:abd7e0631db8 90 Thread::wait(10);
swilliams346 1:abd7e0631db8 91 }//End While
swilliams346 1:abd7e0631db8 92 }//End Thread
swilliams346 1:abd7e0631db8 93
swilliams346 1:abd7e0631db8 94 void AutoPilot_thread(void const *argument)
swilliams346 1:abd7e0631db8 95 {
swilliams346 1:abd7e0631db8 96 while(Alive) {
swilliams346 1:abd7e0631db8 97 //Auto-pilot Testing
swilliams346 1:abd7e0631db8 98
swilliams346 1:abd7e0631db8 99 //stdio_mutex.lock();
swilliams346 1:abd7e0631db8 100 //myRobot.drawEraser();
swilliams346 1:abd7e0631db8 101 //myRobot.moveForward();
swilliams346 1:abd7e0631db8 102 //myRobot.drawFrog();
swilliams346 1:abd7e0631db8 103 //stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 104 //Thread::wait(50);
swilliams346 1:abd7e0631db8 105
swilliams346 1:abd7e0631db8 106 break;
swilliams346 0:9f1095365b9a 107 }
swilliams346 0:9f1095365b9a 108 }
swilliams346 0:9f1095365b9a 109
swilliams346 0:9f1095365b9a 110 void Traffic1_thread(void const *argument) //Blue Car
swilliams346 0:9f1095365b9a 111 {
swilliams346 1:abd7e0631db8 112 while(Alive) {
swilliams346 0:9f1095365b9a 113 Position1 = Position1 + Rate1;
swilliams346 0:9f1095365b9a 114 if(Position1 > 140 ){
swilliams346 0:9f1095365b9a 115 Position1 = -10;
swilliams346 0:9f1095365b9a 116 }
swilliams346 1:abd7e0631db8 117
swilliams346 1:abd7e0631db8 118 if(FrogY == 95){ //Check dangers on Traffic 1 Row 5
swilliams346 1:abd7e0631db8 119 if(((Position1 + CarWidth)>(FrogX - 5)) && ((Position1 - CarWidth)<(FrogX + 5))){
swilliams346 1:abd7e0631db8 120 Alive = 0;
swilliams346 1:abd7e0631db8 121 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 122 myRobot.drawDeadFrog();
swilliams346 1:abd7e0631db8 123 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 124 }
swilliams346 1:abd7e0631db8 125 }
swilliams346 1:abd7e0631db8 126 Column1 = (ceil((Position1 - CarWidth)/21))*21;
swilliams346 1:abd7e0631db8 127
swilliams346 0:9f1095365b9a 128 /*stdio_mutex.lock();
swilliams346 1:abd7e0631db8 129 uLCD.locate(10,1);
swilliams346 1:abd7e0631db8 130 uLCD.printf("%3.0f", Column1);
swilliams346 0:9f1095365b9a 131 stdio_mutex.unlock();
swilliams346 0:9f1095365b9a 132 */
swilliams346 0:9f1095365b9a 133 stdio_mutex.lock();
swilliams346 3:427c365950d7 134 //myRobot.drawRoad(Column1-10,95);
swilliams346 3:427c365950d7 135 //myRobot.drawRoad(Column1-31,95);
swilliams346 1:abd7e0631db8 136 myRobot.drawCar1(Position1,CarWidth);
swilliams346 0:9f1095365b9a 137 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 138 Thread::wait(10);
swilliams346 0:9f1095365b9a 139 }
swilliams346 0:9f1095365b9a 140 }
swilliams346 0:9f1095365b9a 141
swilliams346 0:9f1095365b9a 142 void Traffic2_thread(void const *argument) //Red Car
swilliams346 0:9f1095365b9a 143 {
swilliams346 1:abd7e0631db8 144 while(Alive) {
swilliams346 0:9f1095365b9a 145 Position2 = Position2 - Rate1;
swilliams346 3:427c365950d7 146 if(Position2 < -12 ){
swilliams346 0:9f1095365b9a 147 Position2 = 140;
swilliams346 0:9f1095365b9a 148 }
swilliams346 1:abd7e0631db8 149
swilliams346 1:abd7e0631db8 150 if(FrogY == 53){ //Check dangers on Traffic 2 Row 3
swilliams346 1:abd7e0631db8 151 if(((Position2 + CarWidth)>(FrogX - 5)) && ((Position2 - CarWidth)<(FrogX + 5))){
swilliams346 1:abd7e0631db8 152 Alive = 0;
swilliams346 1:abd7e0631db8 153 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 154 myRobot.drawDeadFrog();
swilliams346 1:abd7e0631db8 155 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 156 }
swilliams346 1:abd7e0631db8 157 }
swilliams346 1:abd7e0631db8 158 Column2 = (ceil((Position2 - CarWidth)/21))*21;
swilliams346 0:9f1095365b9a 159 stdio_mutex.lock();
swilliams346 3:427c365950d7 160 //myRobot.drawRoad(Column2+10,53);
swilliams346 3:427c365950d7 161 //myRobot.drawRoad(Column2+31,53);
swilliams346 1:abd7e0631db8 162 myRobot.drawCar2(Position2,CarWidth);
swilliams346 0:9f1095365b9a 163 stdio_mutex.unlock();
swilliams346 3:427c365950d7 164 Thread::wait(30);
swilliams346 0:9f1095365b9a 165 }
swilliams346 0:9f1095365b9a 166 }
swilliams346 0:9f1095365b9a 167
swilliams346 0:9f1095365b9a 168 void SFX_thread(void const *argument)
swilliams346 0:9f1095365b9a 169 {
swilliams346 1:abd7e0631db8 170 while(1){
swilliams346 1:abd7e0631db8 171 if(Alive == 1){
swilliams346 1:abd7e0631db8 172 //stdio_mutex.lock();
swilliams346 1:abd7e0631db8 173 //uLCD.locate(1,1);
swilliams346 1:abd7e0631db8 174 //uLCD.printf("DRY");
swilliams346 1:abd7e0631db8 175 //stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 176 }
swilliams346 1:abd7e0631db8 177
swilliams346 1:abd7e0631db8 178 if(Drown == 1){
swilliams346 3:427c365950d7 179 //stdio_mutex.lock();
swilliams346 3:427c365950d7 180 //uLCD.locate(1,1);
swilliams346 3:427c365950d7 181 //uLCD.printf("SPLASH!");
swilliams346 3:427c365950d7 182 //stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 183
swilliams346 1:abd7e0631db8 184 FILE *wave_file;
swilliams346 1:abd7e0631db8 185 wave_file=fopen("/sd/Splash.wav","r");
swilliams346 1:abd7e0631db8 186 waver.play(wave_file);
swilliams346 1:abd7e0631db8 187 fclose(wave_file);
swilliams346 1:abd7e0631db8 188 }
swilliams346 1:abd7e0631db8 189 if(Splat == 1){
swilliams346 1:abd7e0631db8 190 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 191 uLCD.locate(1,1);
swilliams346 1:abd7e0631db8 192 uLCD.printf("SPLAT!");
swilliams346 1:abd7e0631db8 193 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 194
ecardenas8 2:68c4e1539da5 195 FILE *wave_file;
ecardenas8 2:68c4e1539da5 196 wave_file=fopen("/sd/Splat.wav","r");
ecardenas8 2:68c4e1539da5 197 waver.play(wave_file);
ecardenas8 2:68c4e1539da5 198 fclose(wave_file);
ecardenas8 2:68c4e1539da5 199 }
ecardenas8 2:68c4e1539da5 200 if(Victory == 1){
ecardenas8 2:68c4e1539da5 201 stdio_mutex.lock();
ecardenas8 2:68c4e1539da5 202 uLCD.locate(1,1);
ecardenas8 2:68c4e1539da5 203 uLCD.printf("Victory!");
ecardenas8 2:68c4e1539da5 204 stdio_mutex.unlock();
ecardenas8 2:68c4e1539da5 205
ecardenas8 2:68c4e1539da5 206 FILE *wave_file;
ecardenas8 2:68c4e1539da5 207 wave_file=fopen("/sd/Victory.wav","r");
ecardenas8 2:68c4e1539da5 208 waver.play(wave_file);
ecardenas8 2:68c4e1539da5 209 fclose(wave_file);
swilliams346 1:abd7e0631db8 210 }
swilliams346 1:abd7e0631db8 211 Thread::wait(10);
swilliams346 0:9f1095365b9a 212 }
swilliams346 0:9f1095365b9a 213 }
swilliams346 0:9f1095365b9a 214
swilliams346 0:9f1095365b9a 215 void Location_thread(void const *argument)
swilliams346 0:9f1095365b9a 216 {
swilliams346 0:9f1095365b9a 217 while(1){
swilliams346 0:9f1095365b9a 218 //stdio_mutex.lock();
swilliams346 0:9f1095365b9a 219 //uLCD.locate(1,1);
swilliams346 0:9f1095365b9a 220 //uLCD.printf("%5.0d", myRobot.getXPosition());
swilliams346 0:9f1095365b9a 221 //uLCD.locate(8,1);
swilliams346 0:9f1095365b9a 222 //uLCD.printf("%5.0d", myRobot.getYPosition());
swilliams346 0:9f1095365b9a 223 //stdio_mutex.unlock();
swilliams346 0:9f1095365b9a 224 Thread::wait(10);
swilliams346 0:9f1095365b9a 225 }
swilliams346 0:9f1095365b9a 226 }
swilliams346 1:abd7e0631db8 227
swilliams346 0:9f1095365b9a 228 void ThumbStick_thread(void const *argument)
swilliams346 0:9f1095365b9a 229 {
swilliams346 0:9f1095365b9a 230 while(1) {
swilliams346 1:abd7e0631db8 231 // Player Movement checked with navigation switch
swilliams346 1:abd7e0631db8 232 if (myNav.left() )
swilliams346 1:abd7e0631db8 233 {
swilliams346 1:abd7e0631db8 234 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 235 myRobot.moveLeft();
swilliams346 1:abd7e0631db8 236 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 237 }
swilliams346 1:abd7e0631db8 238
swilliams346 1:abd7e0631db8 239 if (myNav.right())
swilliams346 1:abd7e0631db8 240 {
swilliams346 1:abd7e0631db8 241 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 242 myRobot.moveRight();
swilliams346 1:abd7e0631db8 243 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 244 }
swilliams346 1:abd7e0631db8 245
swilliams346 1:abd7e0631db8 246 if (myNav.up())
swilliams346 1:abd7e0631db8 247 {
swilliams346 1:abd7e0631db8 248 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 249 myRobot.moveForward();
swilliams346 1:abd7e0631db8 250 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 251 }
swilliams346 1:abd7e0631db8 252
swilliams346 1:abd7e0631db8 253 if (myNav.down())
swilliams346 1:abd7e0631db8 254 {
swilliams346 1:abd7e0631db8 255 stdio_mutex.lock();
swilliams346 1:abd7e0631db8 256 myRobot.moveBackward();
swilliams346 1:abd7e0631db8 257 stdio_mutex.unlock();
swilliams346 1:abd7e0631db8 258 }
swilliams346 1:abd7e0631db8 259 Thread::wait(150);
swilliams346 0:9f1095365b9a 260 }
swilliams346 0:9f1095365b9a 261 }
swilliams346 0:9f1095365b9a 262
swilliams346 0:9f1095365b9a 263 int main()
swilliams346 0:9f1095365b9a 264 {
swilliams346 1:abd7e0631db8 265 //pb1.mode(PullUp);
swilliams346 1:abd7e0631db8 266 // Delay for initial pullup to take effect
swilliams346 1:abd7e0631db8 267 //Thread::wait(1000*.01);
swilliams346 1:abd7e0631db8 268 // Setup Interrupt callback functions for a pb hit
swilliams346 1:abd7e0631db8 269 //pb1.attach_deasserted(&pb1_hit_callback);
swilliams346 1:abd7e0631db8 270 // Start sampling pb inputs using interrupts
swilliams346 1:abd7e0631db8 271 //pb1.setSampleFrequency();
swilliams346 0:9f1095365b9a 272 //Initialize Background
swilliams346 1:abd7e0631db8 273 uLCD.baudrate(500000);
swilliams346 0:9f1095365b9a 274 uLCD.filled_rectangle(0, 0 , 127, 127, RED);
swilliams346 0:9f1095365b9a 275 myRobot.drawOutline();
swilliams346 0:9f1095365b9a 276 while(i <= 116){
swilliams346 0:9f1095365b9a 277 while(j <= 116){
swilliams346 0:9f1095365b9a 278 myRobot.drawHelper(i,j);
swilliams346 0:9f1095365b9a 279 j = j + 21;
swilliams346 0:9f1095365b9a 280 }
swilliams346 0:9f1095365b9a 281 j = 11;
swilliams346 0:9f1095365b9a 282 i = i + 21;
swilliams346 0:9f1095365b9a 283 }
swilliams346 0:9f1095365b9a 284 myRobot.drawFrog();
swilliams346 0:9f1095365b9a 285
swilliams346 0:9f1095365b9a 286 Thread thread1(AutoPilot_thread);
swilliams346 0:9f1095365b9a 287 Thread thread2(Location_thread);
swilliams346 0:9f1095365b9a 288 Thread thread3(ThumbStick_thread);
swilliams346 0:9f1095365b9a 289 Thread thread4(SFX_thread);
swilliams346 0:9f1095365b9a 290 Thread thread5(Traffic1_thread);
swilliams346 0:9f1095365b9a 291 Thread thread6(Traffic2_thread);
swilliams346 1:abd7e0631db8 292 Thread thread7(DeathCheck_thread);
swilliams346 0:9f1095365b9a 293
swilliams346 0:9f1095365b9a 294 while (1) {
swilliams346 0:9f1095365b9a 295
swilliams346 0:9f1095365b9a 296 Thread::wait(500);
swilliams346 0:9f1095365b9a 297 }
swilliams346 0:9f1095365b9a 298 }