ELEC 2645 Embedded System Project Name: Wang Luyu SID: 200985894

Dependencies:   N5110 mbed

main.cpp

Committer:
wangwanglouisa
Date:
2016-05-05
Revision:
0:075d80c9688d

File content as of revision 0:075d80c9688d:

#include "main.h"

volatile int eat_flag = 0;

void PacmanRight(int pacman_x, int pacman_y)    //draw the pacman that the mouth in the right
{
    for (int  m=pacman_x-1; m<=pacman_x+1; m++) 
    {
        lcd.setPixel (m, pacman_y-4);
        lcd.setPixel (m, pacman_y+4);
    }

    for (int n=pacman_x-3; n<=pacman_x+3; n++) 
    {
        lcd.setPixel (n, pacman_y-3);
        lcd.setPixel (n-1, pacman_y-1);
        lcd.setPixel (n-1, pacman_y+1);
        lcd.setPixel (n, pacman_y+3);
    }

    for (int p=pacman_x-3; p<=pacman_x+4; p++) 
    {
        lcd.setPixel (p, pacman_y-2);
        lcd.setPixel (p, pacman_y+2);
    }

    for (int q=pacman_x-4; q<=pacman_x; q++) 
    {
        lcd.setPixel (q, pacman_y);
    }
}

void PacmanLeft (int pacman_x, int pacman_y)    // draw the pacman that the mouth in the left
{
    for (int  m=pacman_x-1; m<=pacman_x+1; m++) 
    {
        lcd.setPixel (m, pacman_y-4);
        lcd.setPixel (m, pacman_y+4);
    }

    for (int n=pacman_x-3; n<=pacman_x+3; n++) 
    {
        lcd.setPixel (n, pacman_y-3);
        lcd.setPixel (n+1, pacman_y-1);
        lcd.setPixel (n+1, pacman_y+1);
        lcd.setPixel (n, pacman_y+3);
    }

    for (int p=pacman_x-4; p<=pacman_x+3; p++) 
    {
        lcd.setPixel (p, pacman_y-2);
        lcd.setPixel (p, pacman_y+2);
    }

    for (int q=pacman_x; q<=pacman_x+4; q++) 
    {
        lcd.setPixel (q, pacman_y);
    }
}

void PacmanDown(int pacman_x, int pacman_y)    //draw the pacman that the mouth in the below
{
    for (int  m=pacman_y-1; m<=pacman_y+1; m++) 
    {
        lcd.setPixel (pacman_x-4, m);
        lcd.setPixel (pacman_x+4, m);
    }

    for (int n=pacman_y-3; n<=pacman_y+3; n++) 
    {
        lcd.setPixel (pacman_x-3, n);
        lcd.setPixel (pacman_x-1, n-1);
        lcd.setPixel (pacman_x+1, n-1);
        lcd.setPixel (pacman_x+3, n);
    }

    for (int p=pacman_y-3; p<=pacman_y+4; p++) 
    {
        lcd.setPixel (pacman_x-2, p);
        lcd.setPixel (pacman_x+2, p);
    }

    for (int q=pacman_y-4; q<=pacman_y; q++) 
    {
        lcd.setPixel (pacman_x, q);
    }
}

void PacmanUp(int pacman_x, int pacman_y)    //draw the pacman that the mouth in the above
{
    for (int  m=pacman_y-1; m<=pacman_y+1; m++) 
    {
        lcd.setPixel (pacman_x-4, m);
        lcd.setPixel (pacman_x+4, m);
    }

    for (int n=pacman_y-3; n<=pacman_y+3; n++) 
    {
        lcd.setPixel (pacman_x-3, n);
        lcd.setPixel (pacman_x-1, n+1);
        lcd.setPixel (pacman_x+1, n+1);
        lcd.setPixel (pacman_x+3, n);
    }

    for (int p=pacman_y-4; p<=pacman_y+3; p++) 
    {
        lcd.setPixel (pacman_x-2, p);
        lcd.setPixel (pacman_x+2, p);
    }

    for (int q=pacman_y; q<=pacman_y+4; q++) 
    {
        lcd.setPixel (pacman_x, q);
    }
}

void Wall(int wall_x, int wall_y)        // draw the wall
{
    for (int k=wall_x; k<=wall_x+83; k++)   // the x direction of the wall
    {      
        lcd.setPixel (k, wall_y);
        lcd.setPixel (k, wall_y+47);

        for (int t=wall_y; t<=wall_y+47; t++)   // the y direction of the wall
        {      
            lcd.setPixel (wall_x, t);
            lcd.setPixel (wall_x+83, t);
        }
    }
}

int main()
{
    // Use the joystick button to see the currently score
    button.fall(&joystickbutton_isr);
    // Set the operation of the button, pull down
    button.mode(PullDown);
    
    // first need to initialise display
    lcd.init();

    // these are default settings so not strictly needed
    lcd.normalMode();           // normal colour mode
    lcd.setBrightness(0.5);     // put LED backlight on 50%

    // can directly print strings at specified co-ordinates
    lcd.printString("FOODIE",24,1);
    lcd.printString("PACMAN",24,3);
    wait(5.0);
    lcd.clear();

    //show the designer's name and student number
    lcd.printString("by Wang Luyu",6,2);
    lcd.printString("200985894",15,4);
    wait(5.0);
    lcd.clear();

    calibrateJoystick();

    // update the location by using Joystick
    // every 0.05 second update the location
    pollJoystick.attach(&updateJoystick,0.05);
    yellow_led = 1;
    
    while(1) {
        if (joystickbutton == true) 
        {
            // present the wall
            Wall(Wall_X, Wall_Y);

            // present the pacman
            PacmanRight(Pacman_X, Pacman_Y);

            // if the pacman touch the wall, game over and shows the score
            if(Pacman_X-5 == 0||Pacman_X+5 == 83||Pacman_Y-5 == 0||Pacman_Y+5 == 47) 
            {
                gameover_flag = 1;
            
                if (gameover_flag == 1) 
                {
                    lcd.clear();
                    lcd.printString("GAME OVER",15,1);
                    char s[14];
                    sprintf(s,"SCORE: %d",score);
                    lcd.printString(s,15,3);
                }
                break;
            }

            if (printFlag)   // if flag set, clear flag and print joystick values to serial port
            {
                printFlag = 0;
                yellow_led=0;
                eat();
                lcd.clear();
                food();

                // check joystick direction
                if (joystick.direction == UP) 
                {
                    Pacman_Y += 1;
                }

                if (joystick.direction == DOWN) 
                {
                    Pacman_Y -= 1;
                }

                if (joystick.direction == LEFT) 
                {
                    Pacman_X += 1;
                }

                if (joystick.direction == RIGHT) 
                {
                    Pacman_X -= 1;
                }

                if (joystick.direction == CENTRE) 
                {
                    //PacmanRight(Pacman_X, Pacman_Y);
                }
            
                if (joystick.direction == UNKNOWN) 
                {
                    //PacmanRight(Pacman_X, Pacman_Y);
                }
            }
            lcd.refresh();   // need to refresh screen
        }
        
        else
        {
            lcd.clear();
            char s[14];
            sprintf(s,"SCORE: %d",score);
            lcd.printString(s,15,2);
            lcd.refresh();
        }
    }
}

// read default positions of the joystick to calibrate later readings
void calibrateJoystick()
{
    button.mode(PullDown);
    
    // 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;
}

void eat()
{
    eat_flag = 0;
    
    // the right of the pacman can eat the point
    // when the point on the right edge touch the point
    // the pacman can 'eat' the 'food'
    if (lcd.getPixel(Pacman_X+5,Pacman_Y-2)||lcd.getPixel(Pacman_X+5,Pacman_Y)||lcd.getPixel(Pacman_X+5,Pacman_Y+2)) {
        eat_flag = 1;
        yellow_led = 1;
        score++;
    }
    
    // the left of the pacman can eat the point
    // when the point on the left edge touch the point
    // the pacman can 'eat' the 'food'
    if (lcd.getPixel(Pacman_X-5,Pacman_Y-2)||lcd.getPixel(Pacman_X-5,Pacman_Y)||lcd.getPixel(Pacman_X-5,Pacman_Y+2)) {
        eat_flag = 1;
        yellow_led = 1;
        score++;
    }
    
    // the top of the pacman can eat the point
    // when the point on the upper edge touch the point
    // the pacman can 'eat' the 'food'
    if (lcd.getPixel(Pacman_X+2,Pacman_Y-5)||lcd.getPixel(Pacman_X,Pacman_Y-5)||lcd.getPixel(Pacman_X-2,Pacman_Y-5)) {
        eat_flag = 1;
        yellow_led = 1;
        score++;
    }
    
    // the bottom of the pacman can eat the point
    // when the point on the bottom edge touch the point
    // the pacman can 'eat' the 'food'
    if (lcd.getPixel(Pacman_X+2,Pacman_Y+5)||lcd.getPixel(Pacman_X,Pacman_Y+5)||lcd.getPixel(Pacman_X-2,Pacman_Y+5)) {
        eat_flag = 1;
        yellow_led = 1;
        score++;
    } 
}

void food()
{
    if (eat_flag) {
        // new food
        x_square = rand()%(82-2)+2;
        y_square = rand()%(46-2)+2;
        lcd.drawRect(x_square,y_square,2,2,1);
    } 
    else if(eat_flag == 0) {
        lcd.drawRect(x_square,y_square,2,2,1);
    }
}

void yellow()
{
    // on-board LEDs are active-low, so set pin high to turn them off.
    yellow_led = ! yellow_led;
}


void joystickbutton_isr()
{
    // use the joystick button to see the currently score
    joystickbutton = !joystickbutton;
}