4180 Final - Sender

Dependencies:   4DGL-uLCD-SE SparkfunAnalogJoystick mbed

main.cpp

Committer:
yscho529
Date:
2016-12-13
Revision:
0:c6dc0b624686

File content as of revision 0:c6dc0b624686:

#include "mbed.h"
#include "uLCD_4DGL.h"
#include "SparkfunAnalogJoystick.h"

DigitalOut myled(LED1);
Serial pc(USBTX, USBRX);
Serial xbee(p9,p10);
DigitalOut reset(p22);
uLCD_4DGL uLCD(p28,p27,p21); // serial tx, serial rx, reset pin;
SparkfunAnalogJoystick JOYSTICK(p15,p16,p17);
DigitalIn pb(p8);

int getFirstOpenTile(int[]);
void highlightCurrentTile(int,int);
int getJoystickDirection(void);
int getNewTile(int,int);
int checkGameOver(int[]);
void handleGameOver(int);
int read_num(bool);
int convert_to_int(char[],int);
void draw_x(int);
void background_color(int);
void line(int,int,int,int,int);
void circle(int,int,int,int);
void filled_circle(int,int,int,int);
void triangle(int,int,int,int,int,int,int);
void rectangle(int,int,int,int,int);
void filled_rectangle(int,int,int,int,int);
void pixel(int,int,int);
void cls(void);
void locate(int,int);
void putc(char);
void textbackground_color(int);

int main() {
    reset=0;
    wait_ms(1);
    reset=1;
    wait_ms(1);
//    uLCD.baudrate(3000000);
    pc.printf("Starting sender.\r\n");
    char c;
    
    // Initial connection
    while(1){
        if(xbee.writeable()){
            xbee.putc('o');
            wait(0.5);
        }
        if(xbee.readable()){
            c = xbee.getc();
            if(c == 'o'){
                uLCD.cls();
                uLCD.printf("Connected!");
                break;
            }
            else{
                uLCD.cls();
                uLCD.printf("Received but not right");  
            }
        }
        else{
            uLCD.cls();
            uLCD.printf("Connecting with receiver...");
        }
    }
    wait(3);
    
    // Start game and initialize variables
    // 'O' = 1
    // 'X' = 10
    int board[9] = {};
    int currentPlayer = 1;
    int currentTile = 0;
    int p1jd = 0;
    int p2jd = 0;
    int p1b = 0;
    int p2b = 0;
    int gameOver = 0;
    cls();
    line(0, 42 , 127, 42 , 0xFF0000);
    line(0, 84 , 127, 84 , 0xFF0000);
    line(42, 0 , 42, 127, 0xFF0000);
    line(84, 0, 84, 127, 0xFF0000);
    pb.mode(PullUp);
    
    while(1) {
        // Player 1's turn
        currentTile = getFirstOpenTile(board);
        highlightCurrentTile(currentTile, BLUE);
        while(currentPlayer == 1) {
            p1jd  = getJoystickDirection();
            if(pb){
                p1b = 0;
            }
            else{
                p1b = 1;
            }
            if(p1b == 1) {
                if(board[currentTile] == 0){
                    board[currentTile] = 1;
                    int i = currentTile/3;
                    int j = currentTile%3;
                    highlightCurrentTile(currentTile, BLACK);
                    circle(42*j+21, 42*i+21, 19, BLUE);
                    currentPlayer = 2;
                    xbee.printf("m,");  
                    break;  
                }
                else {
                    //error sound?    
                }
            }
            if( p1jd != 0) {
                highlightCurrentTile(currentTile, BLACK);
                currentTile = getNewTile(p1jd, currentTile);
                highlightCurrentTile(currentTile, BLUE);
                wait(0.25);
            }
        }
        gameOver = checkGameOver(board);
        if(gameOver > 0) {
            handleGameOver(gameOver);
            break;
        }
        // Player 2's turn
        currentTile = getFirstOpenTile(board);
        highlightCurrentTile(currentTile, GREEN);
        while(currentPlayer == 2){
            if(xbee.readable()){
                p2jd = read_num(true);
                p2b = read_num(true);
                if(p2b == 1) {
                    if(board[currentTile] == 0){
                        board[currentTile] = 10;
                        int i = currentTile/3;
                        int j = currentTile%3;
                        highlightCurrentTile(currentTile, BLACK);
                        draw_x(currentTile);
                        currentPlayer = 1;
                        xbee.printf("m");
                        break;   
                    }
                    else {
                        //error sound?    
                    }
                }
                if( p2jd != 0) {
                    highlightCurrentTile(currentTile, BLACK);
                    currentTile = getNewTile(p2jd, currentTile);
                    highlightCurrentTile(currentTile, GREEN);
                    wait(0.25);
                }
            }
        }
        gameOver = checkGameOver(board);
        if(gameOver > 0) {
            handleGameOver(gameOver);
            break;
        }
    }
}

int getFirstOpenTile(int board[]) {
    for(int i = 0; i < 9; i++){
        if(board[i] == 0){
            return i;
        }       
    }
    return -1;
}
void highlightCurrentTile(int tile, int color){ 
        int i = tile/3;
        int j = tile%3;
        filled_circle(42*j+21, 42*i+21 - 5, 2, color);  
}
int getJoystickDirection(){
    bool down = JOYSTICK.yAxis() > 0.9;
    bool up = JOYSTICK.yAxis() < -0.9;
    bool left = JOYSTICK.xAxis() > 0.9;
    bool right = JOYSTICK.xAxis() < -0.9;
    // up = 1
    // down = 2
    // left = 3
    // right = 4
    if(up){
        return 1;
    }
    else if(down){
        return 2;
    }
    else if(left){
        return 3;
    }
    else if(right){
        return 4;
    }
    return 0;
}
int getNewTile(int p1jd, int currentTile){
       // up
       if(p1jd==1){
            if(currentTile > 2){
                currentTile -= 3;   
            }   
       }
       // down
       else if(p1jd==2){
            if(currentTile < 6){
                currentTile += 3;   
            }   
       }
       // left
       else if(p1jd==3){
            if(currentTile!=0 && currentTile!=3 && currentTile!=6){
                currentTile -= 1;   
            }   
       }
       // right
       else if(p1jd==4){
           if(currentTile!=2 && currentTile!=5 && currentTile!=8){
               currentTile += 1;
           }
       }
       return currentTile;
}
int checkGameOver(int board[]) {
        // 1 if player 1 won
        // 2 if player 2 won
        // 3 if draw
        int checkSum1 = 0;
        int checkSum2 = 0;
        for(int i = 0; i < 3; i++ ) {
            checkSum1 = board[i] + board[i+3] + board[i+6];
            checkSum2 = board[i*3] + board[i*3+1]+board[i*3+2];
            if(checkSum1 == 3 || checkSum2 == 3) {
                return 1;
            } else if(checkSum1 == 30 || checkSum2 == 30) {
                return 2;
            }
        }
        checkSum1 = board[0]+board[4]+board[8];
        checkSum2 = board[2]+board[4]+board[6];
        if(checkSum1 == 3 || checkSum2 == 3) {
                return 1;
        }
        else if(checkSum1 == 30 || checkSum2 == 30) {
                return 2;
        }
        if(getFirstOpenTile(board) == -1){
            return 3;
        }
        return 0;
}
void handleGameOver(int gameOver){
    if(gameOver == 1){
        // player 1 won
        wait(3);
        uLCD.cls();
        uLCD.printf("You Won!");
        xbee.printf("n,%d,",gameOver);
    }
    else if(gameOver == 2){
        // player 2 won
        wait(3);
        uLCD.cls();
        uLCD.printf("You Lost!");
        xbee.printf("n,%d,",gameOver);
    }
    else if(gameOver == 3){
        // draw
        wait(3);
        uLCD.cls();
        uLCD.printf("Draw!");
        xbee.printf("n,%d,",gameOver);
    }   
}
int read_num(bool num){
    char data[200];
    int count = 0;
    int x = 0;
    while(1){
        data[count] = xbee.getc();
        if(data[count] == ','){
            if(num){
                x = convert_to_int(data,count);
            }
            break;
        }
        else{
            count++;
        }
    }
    return x;
}
int convert_to_int(char data[], int count){
    int current=0;
    for(int i=0; i<count; i++){
        current = current*10;
        current = current + (data[i] - '0');
    }
    return current;
}
void draw_x(int currentTile){
    int j = currentTile/3;
    int i = currentTile%3;
    line(42*i,42*j,42*i+42,42*j+42,GREEN);
    line(42*i+42,42*j,42*i,42*j+42,GREEN);
    
}
void background_color(int color){
    uLCD.background_color(color);
    xbee.printf("a,%d,",color);
    wait_ms(100);
}
void line(int x1,int y1,int x2,int y2,int color) {
    uLCD.line(x1,y1,x2,y2,color);
    xbee.printf("b,%d,%d,%d,%d,%x,",x1,y1,x2,y2,color);
    wait_ms(100);
}
void circle(int x,int y,int radius,int color) { 
    uLCD.circle(x, y, radius, color);
    xbee.printf("c,%d,%d,%d,%x,",x,y,radius,color);
    wait_ms(100);
}
void filled_circle(int x,int y,int radius,int color) { 
    uLCD.filled_circle(x, y, radius, color);
    xbee.printf("d,%d,%d,%d,%x,",x,y,radius,color);
    wait_ms(100);
}
void triangle(int x1,int y1,int x2,int y2,int x3,int y3,int color) {
    uLCD.triangle(x1,y1,x2,y2,x3,y3,color);
    xbee.printf("e,%d,%d,%d,%d,%d,%d,%x,",x1,y1,x2,y2,x3,y3,color);
    wait_ms(100);
}
void rectangle(int x1,int y1,int x2,int y2,int color) {
    uLCD.rectangle(x1,y1,x2,y2,color);
    xbee.printf("f,%d,%d,%d,%d,%x,",x1,y1,x2,y2,color);
    wait_ms(100);
}
void filled_rectangle(int x1,int y1,int x2,int y2,int color) {
    uLCD.filled_rectangle(x1,y1,x2,y2,color);
    xbee.printf("g,%d,%d,%d,%d,%x,",x1,y1,x2,y2,color);
    wait_ms(100);
}
void pixel(int x,int y,int color) { 
    uLCD.pixel(x,y,color);
    xbee.printf("h,%d,%d,%x,",x,y,color);
    wait_ms(100);
}
void cls() { 
    uLCD.cls();
    xbee.printf("i,");
    wait_ms(100);
}
void locate(int x,int y) {
    uLCD.locate(x, y);
    xbee.printf("j,%d,%d,",x,y);
    wait_ms(100);
}
void putc(char a) {
    uLCD.putc(a);
    xbee.printf("k,%c,",a);
    wait_ms(100);
}
void textbackground_color(int color) { 
    uLCD.textbackground_color(color);
    xbee.printf("l,%d,",color);
    wait_ms(100);
}