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

Files at this revision

API Documentation at this revision

Comitter:
swilliams346
Date:
Mon Oct 31 19:52:09 2016 +0000
Parent:
0:9f1095365b9a
Commit message:
Splash doesn't work

Changed in this revision

Robot.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Robot.h	Sat Oct 29 22:15:03 2016 +0000
+++ b/Robot.h	Mon Oct 31 19:52:09 2016 +0000
@@ -2,11 +2,17 @@
 class Robot
 {
     Mutex stdio_mutex;
+    int FrogX;
+    int FrogY;
 public:
     void drawFrog() {
     uLCD.filled_rectangle(XPosition-5,YPosition-5,XPosition+5,YPosition+5,RED);
     }
     
+    void drawDeadFrog() {
+    uLCD.filled_rectangle(XPosition-5,YPosition-5,XPosition+5,YPosition+5,WHITE);
+    }
+    
     void drawOutline() {
     uLCD.line(0, 0 , 0, 127, BLACK);
     uLCD.line(0, 0 , 127, 0, BLACK);
@@ -27,10 +33,16 @@
     uLCD.filled_rectangle(Xp-2,Yp-1,Xp+2,Yp+1,WHITE);
     }
     
-    void drawCar1(int Position1) {
-    stdio_mutex.lock();
-    uLCD.filled_rectangle(Position1-10,95-4,Position1+10,95+4,BLUE);
-    stdio_mutex.unlock();
+    void drawCar1(int Position1, int CarWidth) {
+    //stdio_mutex.lock();
+    uLCD.filled_rectangle(Position1-CarWidth,95-4,Position1+CarWidth,95+4,BLUE);
+    //stdio_mutex.unlock();
+    }
+    
+    void drawCar2(int Position2, int CarWidth) {
+    //stdio_mutex.lock();
+    uLCD.filled_rectangle(Position2-CarWidth,52-4,Position2+CarWidth,52+4,RED);
+    //stdio_mutex.unlock();
     }
     
     void drawWater(int Xp,int Yp) {
@@ -90,16 +102,33 @@
     }
     
     void moveForward() {
-    setYPosition(getYPosition() - 21);
+        drawHelper(XPosition,YPosition);
+        setYPosition(getYPosition() - 21);
+        drawFrog();
     }
     void moveBackward() {
-    setYPosition(getYPosition() + 21);
+    FrogY = getYPosition();
+        if(FrogY > 11){
+        drawHelper(XPosition,YPosition);
+        setYPosition(FrogY + 21);
+        drawFrog();
+        }
     }
     void moveLeft() {
-    setXPosition(getXPosition() - 21);
+    FrogX = getXPosition();
+        if(FrogX > 11){
+        drawHelper(XPosition,YPosition);
+        setXPosition(FrogX - 21);
+        drawFrog();
+        }
     }
     void moveRight() {
-    setXPosition(getXPosition() + 21);
+    FrogX = getXPosition();
+        if(FrogX < 116){
+        drawHelper(XPosition,YPosition);
+        setXPosition(FrogX + 21);
+        drawFrog();
+        }
     }
     
     int getXPosition() {
@@ -118,7 +147,7 @@
     
     Robot() 
     {
-    XPosition = 74;
+    XPosition = 53;
     YPosition = 116;
     }
 private:
--- a/main.cpp	Sat Oct 29 22:15:03 2016 +0000
+++ b/main.cpp	Mon Oct 31 19:52:09 2016 +0000
@@ -1,5 +1,6 @@
 #include "mbed.h"
 #include "rtos.h"
+#include "PinDetect.h"
 #include "uLCD_4DGL.h"
 uLCD_4DGL uLCD(p28, p27, p30);
 #include "Robot.h"
@@ -9,18 +10,20 @@
 #include "SDFileSystem.h"
 BusOut mbedleds(LED1,LED2,LED3,LED4);
 Robot myRobot;
-Nav_Switch myNav( p21, p22, p23, p24, p25);
+Nav_Switch myNav( p25, p22, p23, p21, p24);
 Mutex stdio_mutex;
 AnalogOut DACout(p18); // used to play sound on speaker
 wave_player waver(&DACout);
 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card setup
+//PinDetect pb1(p25);
 //Wiring Set-up:
 //Speaker: p18
 //SD Card: DO=p6,SCK=p7,DI=p5,CS=p8,VCC=Vout,GND=GND
 //Thumb-Stick: U=p25,C=p24,L=p23,D=p22,R=p21,+=pVout,-=GND
 bool Alive = 1;
 bool Drown = 0;
-bool Car = 0;
+bool Splat = 0;
+double CarWidth = 10;
 int i = 11;
 int j = 11;
 int C1 = 11;
@@ -29,25 +32,36 @@
 int C4 = 74;
 int C5 = 95;
 int C6 = 116;
-int Position1 = 90;
-int Position2 = 90;
+double Position1 = 90;
+double Position2 = 90;
+double Column1;
+double Column2;
 int Rate1 = 3;
+int FrogX;
+int FrogY;
     
-void AutoPilot_thread(void const *argument)
+/*void pb1_hit_callback (void)
+{
+    stdio_mutex.lock();
+    myRobot.moveForward();
+    stdio_mutex.unlock();   
+}*/
+  
+void DeathCheck_thread(void const *argument)
 {
     while(Alive) {
-    //Auto-pilot Testing
-    Thread::wait(500);
-    stdio_mutex.lock();
-    myRobot.drawEraser();
-    myRobot.moveForward();
-    myRobot.drawFrog();
-    stdio_mutex.unlock();
+        FrogX = myRobot.getXPosition();
+        FrogY = myRobot.getYPosition(); 
     
-    if(myRobot.getYPosition() == 53){   //Check dangers on Traffic 2 Row 3
-            }
-        if(myRobot.getYPosition() == 74){   //Check dangers on water Row 4
-            if(myRobot.getXPosition() == 53 || myRobot.getXPosition() == 74 || myRobot.getXPosition() == 116){
+        if(FrogY == 32){   //Check win-condition on landing on Row 2
+            Alive = 0;
+            stdio_mutex.lock();
+            uLCD.locate(1,1);
+            uLCD.printf("VICTORY!");
+            stdio_mutex.unlock();
+            }//End 53
+        if(FrogY == 74){   //Check dangers on water Row 4
+            if(FrogX == 32 || FrogX == 74 || FrogX == 116){
                 Alive = 0;
                 Drown = 1;
                 
@@ -71,42 +85,80 @@
                 myRobot.drawDrown5();
                 stdio_mutex.unlock();
                 }
-            }
-        if(myRobot.getYPosition() == 95){   //Check dangers on Traffic 1 Row 5
-            }
-            
+        }//End 74
+    Thread::wait(10);
+    }//End While    
+}//End Thread
+
+void AutoPilot_thread(void const *argument)
+{
+    while(Alive) {
+    //Auto-pilot Testing
+       
+    //stdio_mutex.lock();
+    //myRobot.drawEraser();
+    //myRobot.moveForward();
+    //myRobot.drawFrog();
+    //stdio_mutex.unlock();
+    //Thread::wait(50);
+    
+    break;
     }
 }
 
 void Traffic1_thread(void const *argument) //Blue Car
 {
-    while(1) {
+    while(Alive) {
         Position1 = Position1 + Rate1;
         if(Position1 > 140 ){
             Position1 = -10;
             }
+            
+        if(FrogY == 95){   //Check dangers on Traffic 1 Row 5                
+            if(((Position1 + CarWidth)>(FrogX - 5)) && ((Position1 - CarWidth)<(FrogX + 5))){                        
+                Alive = 0;
+                stdio_mutex.lock();
+                myRobot.drawDeadFrog();
+                stdio_mutex.unlock();
+            }    
+        }    
+        Column1 = (ceil((Position1 - CarWidth)/21))*21;
+        
         /*stdio_mutex.lock();
-        uLCD.locate(3,3);
-        uLCD.printf("%5.0d", Position1);
+        uLCD.locate(10,1);
+        uLCD.printf("%3.0f", Column1);
         stdio_mutex.unlock();
         */
-        
         stdio_mutex.lock();
-        uLCD.filled_rectangle(Position1-10,95-4,Position1+10,95+4,BLUE);
+        myRobot.drawRoad(Column1-10,95);
+        myRobot.drawRoad(Column1-31,95);
+        myRobot.drawCar1(Position1,CarWidth);
         stdio_mutex.unlock();
-        Thread::wait(30);
+        Thread::wait(10);
     }
 }
 
 void Traffic2_thread(void const *argument)  //Red Car
 {
-    while(1) {
+    while(Alive) {
         Position2 = Position2 - Rate1;
         if(Position2 < 0 ){
             Position2 = 140;
             }
+        
+        if(FrogY == 53){   //Check dangers on Traffic 2 Row 3               
+            if(((Position2 + CarWidth)>(FrogX - 5)) && ((Position2 - CarWidth)<(FrogX + 5))){                               
+                Alive = 0;
+                stdio_mutex.lock();
+                myRobot.drawDeadFrog();
+                stdio_mutex.unlock();
+            }    
+        }  
+        Column2 = (ceil((Position2 - CarWidth)/21))*21;
         stdio_mutex.lock();
-        uLCD.filled_rectangle(Position2-10,52-4,Position2+10,52+4,RED);
+        myRobot.drawRoad(Column2+10,53);
+        myRobot.drawRoad(Column2+31,53);
+        myRobot.drawCar2(Position2,CarWidth);
         stdio_mutex.unlock();
         Thread::wait(35);
     }
@@ -114,23 +166,38 @@
 
 void SFX_thread(void const *argument)
 {
-    while(Alive){
-    stdio_mutex.lock();
-    uLCD.locate(1,1);
-    uLCD.printf("DRY");
-    stdio_mutex.unlock();
-        //Thread::wait(100);
+    while(1){
+    if(Alive == 1){
+        //stdio_mutex.lock();
+        //uLCD.locate(1,1);
+        //uLCD.printf("DRY");
+        //stdio_mutex.unlock();
+        }
+    
+    if(Drown == 1){
+        stdio_mutex.lock();
+        uLCD.locate(1,1);
+        uLCD.printf("SPLASH!");
+        stdio_mutex.unlock();
+        
+        FILE *wave_file;
+        wave_file=fopen("/sd/Splash.wav","r");
+        waver.play(wave_file);
+        fclose(wave_file);
+        }
+    if(Splat == 1){
+        stdio_mutex.lock();
+        uLCD.locate(1,1);
+        uLCD.printf("SPLAT!");
+        stdio_mutex.unlock();
+        
+        //FILE *wave_file;
+        //wave_file=fopen("/sd/Splat.wav","r");
+        //waver.play(wave_file);
+        //fclose(wave_file);
+        }
+    Thread::wait(10);
     }
-    stdio_mutex.lock();
-    uLCD.locate(1,1);
-    uLCD.printf("SPLASH!");
-    stdio_mutex.unlock();
-        
-    FILE *wave_file;
-    wave_file=fopen("/sd/Splash.wav","r");
-    waver.play(wave_file);
-    fclose(wave_file);
-    Thread::wait(100);
 }
 
 void Location_thread(void const *argument)
@@ -145,18 +212,53 @@
     Thread::wait(10);
     }
 }
+
 void ThumbStick_thread(void const *argument)
 {
     while(1) {
-        mbedleds = ~(myNav & 0x0F); //update leds with nav switch direction inputs
-        if(myNav.fire()) mbedleds = 0x0F; 
-        Thread::wait(50);
+            // Player Movement checked with navigation switch
+            if (myNav.left() ) 
+            {            
+                stdio_mutex.lock();
+                myRobot.moveLeft();
+                stdio_mutex.unlock();   
+            } 
+            
+            if (myNav.right()) 
+            {             
+                stdio_mutex.lock(); 
+                myRobot.moveRight();  
+                stdio_mutex.unlock();             
+            }
+            
+            if (myNav.up()) 
+            {                
+                stdio_mutex.lock();
+                myRobot.moveForward();
+                stdio_mutex.unlock();              
+            }
+            
+            if (myNav.down()) 
+            {
+                stdio_mutex.lock();
+                myRobot.moveBackward();
+                stdio_mutex.unlock(); 
+            }
+        Thread::wait(150);
     }
 }
 
 int main()
 {
+    //pb1.mode(PullUp);
+    // Delay for initial pullup to take effect
+    //Thread::wait(1000*.01);
+    // Setup Interrupt callback functions for a pb hit
+    //pb1.attach_deasserted(&pb1_hit_callback);
+    // Start sampling pb inputs using interrupts
+    //pb1.setSampleFrequency();
     //Initialize Background
+    uLCD.baudrate(500000);
     uLCD.filled_rectangle(0, 0 , 127, 127, RED); 
     myRobot.drawOutline();
     while(i <= 116){  
@@ -175,6 +277,7 @@
     Thread thread4(SFX_thread);
     Thread thread5(Traffic1_thread);
     Thread thread6(Traffic2_thread);
+    Thread thread7(DeathCheck_thread);
     
     while (1) {