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
Revision 1:abd7e0631db8, committed 2016-10-31
- 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) {