My ELEC2645 Project Zhou Jingyuan 200986046

Dependencies:   ZhouJingyuan mbed

Revision:
0:c5868f162227
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu May 05 12:39:59 2016 +0000
@@ -0,0 +1,544 @@
+#include "main.h" //headfile
+
+
+//    VCC,SCE,RST,D/C,MOSI,SCLK,LED
+N5110 lcd (PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3); // connected the LED to the K64F board
+DigitalIn button(PTB18);                // pin of the button connection
+DigitalIn joystickbutton(PTB11);        // pin of the joystickbutton connection
+AnalogIn xPot(PTB2);                    //pin of the joystick x point connection
+AnalogIn yPot(PTB3);                    //pin of the joystick y point connection
+
+// timer to regularly read the joystick
+Ticker pollJoystick;
+
+// Serial for debug
+Serial pc(USBTX,USBRX);
+// create enumerated type (0,1,2,3 etc. for direction)
+// could be extended for diagonals etc.
+enum DirectionName {
+    UP,
+    DOWN,
+    LEFT,
+    RIGHT,
+    CENTRE,
+    UNKNOWN
+};
+// struct for Joystick
+typedef struct JoyStick Joystick;
+struct JoyStick {
+    float x;    // current x value
+    float x0;   // 'centred' x value
+    float y;    // current y value
+    float y0;   // 'centred' y value
+    int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
+    DirectionName direction;  // current direction
+};
+// create struct variable
+Joystick joystick;
+
+int main()
+{
+    button.mode(PullDown);           //let the button pressed equal to one
+    joystickbutton.mode(PullDown);   //let the joystickbutton pressed equal to one
+    lcd.init();
+    // these are default settings so not strictly needed
+    lcd.normalMode();      // normal colour mode
+    lcd.setBrightness(0.5); // put LED backlight on 50%
+    lcd.printString("get the ball",0,0); //write the string on the screen
+    lcd.refresh();              //Refresh display        
+    wait(1.0);                  //set the disappear time is 1s
+    lcd.clear();            // clear display
+    lcd.setBrightness(1.0);   // put LED backlight on 50%
+    illustration ();       // function call
+    int t=3;            //initial constant to quit the loop
+    do
+    {
+        lcd.drawRect(0,0,84,48,2);  //draw rectangle picture
+        lcd.drawRect(0,0,10,48,1);
+        lcd.refresh();
+        wait(0.5);              //0.5s to disappear
+        lcd.clear();        
+        if(button)              //check the button is pressed or not
+        {
+            lcd.clear();
+            lcd.printString("Skip",0,0);  //write the string which will lose in 1s
+            lcd.refresh();   
+            wait(1.0);  
+            lcd.clear();
+            break;       //get out of the loop
+        }
+        moving ();    //function call
+        t--;            //t=t-1
+    }while(t>=0);       //when t=-1 jump outof the loop
+    //write string lost in 1s
+    lcd.printString("Warning:",0,0);      
+    lcd.printString("The practice",0,0);
+    lcd.printString("is finished",0,2);
+    lcd.refresh();
+    wait(1.0);
+    lcd.clear();
+    while (1)
+    {
+        srand(time(NULL));   //let the value achieved changes each time
+        int u = rand()%(2-1+1)+1;     //get random value between 1 and 2
+        //draw the picture disappears in 0.5s
+        lcd.drawRect(0,0,84,48,2);
+        lcd.drawRect(0,0,10,48,1);
+        lcd.refresh();
+        wait(0.5);
+        lcd.clear();
+        moving2();   //function call
+        if(r==0)  //get global constant r
+        {
+        if (q>=10)    //use the if statement to judge the statement
+        {   
+            if(u==1)
+            {
+                lcd.clear();
+                lcd.printString("Hold joystick",0,2);
+                wait(2.0);
+                lcd.clear();
+                if (joystickbutton)  // check the joystickbutton is pressed or not
+                    q=q-5;     //if it is ture, the global constant will reduce five each time
+            }
+        }
+        else if (q<10)                //check the value of q
+        {
+            lcd.clear(); 
+            lcd.printString("Congratulation",0,2);    //write string   
+            lcd.refresh();
+            break;                   //jump out of the loop
+        }
+        }
+        else
+        {
+            lcd.clear();       
+            lcd.printString("lose the game",0,2);   //write string  
+            lcd.refresh();
+            break;                      //jump out of the loop
+        }
+    } 
+}
+// the function to show the basic information of the game
+void  illustration ()
+{
+    //show how to control the people
+    lcd.printString("joystick to",0,0);
+    lcd.printString("control people",0,1);
+    //draw circle and draw line to built a people
+    lcd.drawCircle(x,y,2,1);
+    lcd.drawLine(x,y+2,x,y+7,1);
+    lcd.drawLine(x,y+4,x+3,y+4,1);
+    lcd.drawLine(x,y+7,x-2,y+9,1);
+    lcd.drawLine(x,y+7,x+2,y+9,1);
+    lcd.refresh();
+    wait(3.0);
+    lcd.clear();
+    //show the way to win
+    lcd.printString("Use hand to",0,0);
+    lcd.printString("get the ball",0,1);
+    lcd.drawCircle(20,23,2,1);
+    lcd.drawCircle(25,27,1,1);
+    lcd.drawCircle(40,27,1,1);
+    lcd.drawLine(20,25,20,30,1);
+    lcd.drawLine(20,27,23,27,1);
+    lcd.drawLine(20,30,18,32,1);
+    lcd.drawLine(20,30,22,32,1);
+    lcd.refresh();
+    wait(3.0);
+    lcd.clear();
+    //show the condition of the failure
+    lcd.printString("if the ball",0,0);
+    lcd.printString("touch the wall",0,1);
+    lcd.printString("will lose",0,2);
+    lcd.drawRect(0,30,10,20,1);
+    lcd.drawCircle(15,40,1,1);
+    lcd.refresh();
+    wait(3.0);
+    lcd.clear();
+    //get into the game
+    lcd.printString("practice",0,0);
+    lcd.printString("Hold button",0,1);
+    lcd.printString("to skip",0,3);
+    lcd.refresh();
+    wait(2.0);
+    lcd.clear();
+}
+// use function to find the randon value of the ball x coordinate from 70 to 80
+int setpointx (int x1)
+{
+    srand(time(NULL));   
+    x1 = rand()%(80-70+1)+70;
+    return x1;                  //return an integer to transfer the value to the other function
+}
+// use function to find the randon value of the enemy y coordinate from 15 to 30
+int setpointy (int y1)
+{
+    srand(time(NULL));
+    y1 = rand()%(30-15+1)+15;
+    return y1;                  //return an integer to transfer the value to the other function
+}
+
+void moving ()
+{
+    //get the value of the x coordinate and y coordinate of the ball point
+    int a,b;
+    int a1=setpointx(a);
+    int b1=setpointy(b);
+    calibrateJoystick();  // get centred values of joystick
+    pollJoystick.attach(&updateJoystick,0.5);  // read joystick 10 times per second
+    while(1){
+        //draw picture                   
+        lcd.drawRect(0,0,84,48,2);
+        lcd.drawRect(0,0,10,48,1);
+        lcd.drawCircle(a1,b1,1,1);
+        if (printFlag) {  // if flag set, clear flag and print joystick values to serial port
+            printFlag = 0;
+            pc.printf("x = %f y = %f button = %d ",joystick.x,joystick.y,joystick.button);
+            // check joystick direction
+            if (joystick.direction == UP) 
+            {
+                if(y>10)                         //use the if statement to make the border of the people moving
+                {
+                    //delete the old picture
+                    lcd.drawCircle(x,y,2,2);       
+                    lcd.drawLine(x,y+2,x,y+7,2);
+                    lcd.drawLine(x,y+4,x+3,y+4,2);
+                    lcd.drawLine(x,y+7,x-2,y+9,2);
+                    lcd.drawLine(x,y+7,x+2,y+9,2);
+                    // get the new picture
+                    y=y-1;                       //change he value of the y coordinate
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+                else
+                {
+                    // out of the border, just stay
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+            }
+            if (joystick.direction == DOWN) 
+            {
+                //the same use of the first one:joystick.direction == UP
+                if(y<40)
+                {                                   
+                lcd.drawCircle(x,y,2,2);
+                lcd.drawLine(x,y+2,x,y+7,2);
+                lcd.drawLine(x,y+4,x+3,y+4,2);
+                lcd.drawLine(x,y+7,x-2,y+9,2);
+                lcd.drawLine(x,y+7,x+2,y+9,2);
+                y=y+1;
+                lcd.drawCircle(x,y,2,1);
+                lcd.drawLine(x,y+2,x,y+7,1);
+                lcd.drawLine(x,y+4,x+3,y+4,1);
+                lcd.drawLine(x,y+7,x-2,y+9,1);
+                lcd.drawLine(x,y+7,x+2,y+9,1);
+                lcd.refresh();
+                }
+                else
+                {
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+                    
+            }
+            if (joystick.direction == LEFT) {//the same use of the first one:joystick.direction == UP
+                if(x<60)
+                {
+                    lcd.drawCircle(x,y,2,2);
+                    lcd.drawLine(x,y+2,x,y+7,2);
+                    lcd.drawLine(x,y+4,x+3,y+4,2);
+                    lcd.drawLine(x,y+7,x-2,y+9,2);
+                    lcd.drawLine(x,y+7,x+2,y+9,2);
+                    x=x+1;
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+                else
+                {
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+            }
+            if (joystick.direction == RIGHT) {//the same use of the first one:joystick.direction == UP
+               if(x>q+5)
+                {
+                    lcd.drawCircle(x,y,2,2);
+                    lcd.drawLine(x,y+2,x,y+7,2);
+                    lcd.drawLine(x,y+4,x+3,y+4,2);
+                    lcd.drawLine(x,y+7,x-2,y+9,2);
+                    lcd.drawLine(x,y+7,x+2,y+9,2);
+                    x=x-1;
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+                else
+                {
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+            }
+            if (joystick.direction == CENTRE) {//no changing while the direction in centre, so just stay
+                lcd.drawCircle(x,y,2,1);
+                lcd.drawLine(x,y+2,x,y+7,1);
+                lcd.drawLine(x,y+4,x+3,y+4,1);
+                lcd.drawLine(x,y+7,x-2,y+9,1);
+                lcd.drawLine(x,y+7,x+2,y+9,1);
+                lcd.refresh();
+            }
+            if (joystick.direction == UNKNOWN) {//no changing while the direction unknown, so just stay
+                lcd.drawCircle(x,y,2,1);
+                lcd.drawLine(x,y+2,x,y+7,1);
+                lcd.drawLine(x,y+4,x+3,y+4,1);
+                lcd.drawLine(x,y+7,x-2,y+9,1);
+                lcd.drawLine(x,y+7,x+2,y+9,1);
+                lcd.refresh();
+            }
+        }
+        //use if-else if statement to recognise the different situation
+        if ((a1>=10)&&((a1!=x+3)||(b1!=y+4))) {//if the ball don't touch, then keep moving
+            lcd.drawCircle(a1,b1,1,2);
+            a1--;
+        } else if ((a1==x+3) && (b1==y+4) && (a1>=10)) { // if the ball touch the people hand,stop moving and  
+            lcd.clear();                                   // get out of the loop, and get a new ball
+            break;
+        } else if (a1<=10) {                        // if the ball touch the block, then show sentence to tell the player and 
+            lcd.clear();                                // get out of the loop, and get a new ball
+            lcd.printString("lose the game",0,0);
+            lcd.refresh();
+            wait(2.0);
+            break;
+        }
+    wait(0.5);
+    } 
+}
+
+void moving2 ()
+{
+    //same use of the function moving
+    int a,b;
+    int a1=setpointx(a);
+    int b1=setpointy(b);
+    calibrateJoystick();  // get centred values of joystick
+    pollJoystick.attach(&updateJoystick,0.5);  // read joystick 10 times per second
+    while(1) 
+    {
+        lcd.drawRect(0,0,84,48,2);
+        lcd.drawRect(0,0,q,48,1);
+        lcd.drawLine(50,0,50,48,1);
+        lcd.drawCircle(a1,b1,1,1);
+        lcd.refresh();
+        if (printFlag) {  // if flag set, clear flag and print joystick values to serial port
+            printFlag = 0;
+            pc.printf("x = %f y = %f button = %d ",joystick.x,joystick.y,joystick.button);
+            // check joystick direction
+            if (joystick.direction == UP) // the same way to draw the prople and the principle of the people moving
+            {
+                if(y>10)
+                {
+                    lcd.drawCircle(x,y,2,2);
+                    lcd.drawLine(x,y+2,x,y+7,2);
+                    lcd.drawLine(x,y+4,x+3,y+4,2);
+                    lcd.drawLine(x,y+7,x-2,y+9,2);
+                    lcd.drawLine(x,y+7,x+2,y+9,2);
+                    y=y-1;
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+                else
+                {
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+            }
+            if (joystick.direction == DOWN) 
+            {                         // same as the function moving
+                if(y<40)
+                {
+                lcd.drawCircle(x,y,2,2);
+                lcd.drawLine(x,y+2,x,y+7,2);
+                lcd.drawLine(x,y+4,x+3,y+4,2);
+                lcd.drawLine(x,y+7,x-2,y+9,2);
+                lcd.drawLine(x,y+7,x+2,y+9,2);
+                y=y+1;
+                lcd.drawCircle(x,y,2,1);
+                lcd.drawLine(x,y+2,x,y+7,1);
+                lcd.drawLine(x,y+4,x+3,y+4,1);
+                lcd.drawLine(x,y+7,x-2,y+9,1);
+                lcd.drawLine(x,y+7,x+2,y+9,1);
+                lcd.refresh();
+                }
+                else
+                {
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+                    
+            }
+            if (joystick.direction == LEFT) {
+                if(x<75)
+                {                       // same as the function moving
+                    lcd.drawCircle(x,y,2,2);
+                    lcd.drawLine(x,y+2,x,y+7,2);
+                    lcd.drawLine(x,y+4,x+3,y+4,2);
+                    lcd.drawLine(x,y+7,x-2,y+9,2);
+                    lcd.drawLine(x,y+7,x+2,y+9,2);
+                    x=x+1;
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+                else
+                {
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+            }
+            if (joystick.direction == RIGHT) {
+               if(x>50)
+                {                       // same as the function moving
+                    lcd.drawCircle(x,y,2,2);
+                    lcd.drawLine(x,y+2,x,y+7,2);
+                    lcd.drawLine(x,y+4,x+3,y+4,2);
+                    lcd.drawLine(x,y+7,x-2,y+9,2);
+                    lcd.drawLine(x,y+7,x+2,y+9,2);
+                    x=x-1;
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+                else
+                {   
+                    lcd.drawCircle(x,y,2,1);
+                    lcd.drawLine(x,y+2,x,y+7,1);
+                    lcd.drawLine(x,y+4,x+3,y+4,1);
+                    lcd.drawLine(x,y+7,x-2,y+9,1);
+                    lcd.drawLine(x,y+7,x+2,y+9,1);
+                    lcd.refresh();
+                }
+            }
+            if (joystick.direction == CENTRE) 
+            {                           // same as the function moving
+                lcd.drawCircle(x,y,2,1);
+                lcd.drawLine(x,y+2,x,y+7,1);
+                lcd.drawLine(x,y+4,x+3,y+4,1);
+                lcd.drawLine(x,y+7,x-2,y+9,1);
+                lcd.drawLine(x,y+7,x+2,y+9,1);
+                lcd.refresh();
+            }
+            if (joystick.direction == UNKNOWN) 
+            {                               // same as the function moving
+                lcd.drawCircle(x,y,2,1);
+                lcd.drawLine(x,y+2,x,y+7,1);
+                lcd.drawLine(x,y+4,x+3,y+4,1);
+                lcd.drawLine(x,y+7,x-2,y+9,1);
+                lcd.drawLine(x,y+7,x+2,y+9,1);
+                lcd.refresh();
+            }
+        }
+        if ((a1>50)&&((a1!=x+3)||(b1!=y+4))) {// same as the function moving
+            lcd.drawCircle(a1,b1,1,2);
+            a1--;
+        } else if ((a1==x+3) && (b1==y+4) && (a1>=10)) { // same as the function moving
+            lcd.clear();
+            break;
+        } else if (a1<=50) {
+            lcd.clear();
+            r=1;                       // set global constant r=1 to jump the while(1) loop in the int main function
+            wait(2.0);
+            break;
+        }
+    wait(0.5);
+    } 
+}
+// read default positions of the joystick to calibrate later readings
+void calibrateJoystick()
+{
+    
+    // must not move during calibration
+    joystick.x0 = xPot;  // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
+    joystick.y0 = yPot;
+}
+void updateJoystick()
+{
+    // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
+    joystick.x = xPot - joystick.x0;
+    joystick.y = yPot - joystick.y0;
+    // read button state
+    joystick.button = button;
+
+    // calculate direction depending on x,y values
+    // tolerance allows a little lee-way in case joystick not exactly in the stated direction
+    if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
+        joystick.direction = CENTRE;
+    } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
+        joystick.direction = UP;
+    } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
+        joystick.direction = DOWN;
+    } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
+        joystick.direction = RIGHT;
+    } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
+        joystick.direction = LEFT;
+    } else {
+        joystick.direction = UNKNOWN;
+    }
+
+    // set flag for printing
+    printFlag = 1;
+}
+
+
+
+
+