Frogger in progress. Currently the digital input is non-functioning. Cars do not erase path, death-thread not complete.

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

Committer:
swilliams346
Date:
Mon Oct 31 19:52:09 2016 +0000
Revision:
1:abd7e0631db8
Parent:
0:9f1095365b9a
Splash doesn't work

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