Simple program using display with KS0108 drivers. School project.

Dependencies:   KS0108 MMA8451Q mbed

main.cpp

Committer:
standabassman
Date:
2015-01-18
Revision:
0:d310c6e0dcee

File content as of revision 0:d310c6e0dcee:

#include "mbed.h"
#include "KS0108.h" 
#include "MMA8451Q.h"
 
#include "SystemFont5x7.h"

#define MMA8451_I2C_ADDRESS (0x1d<<1) 
#define carWidth 6
#define carLength 12
#define obstackleWidth 10
  
KS0108 display(PTC16, PTC17, PTA16, PTD6, PTC13, PTC12, PTC11, PTC10, PTC6, PTC5, PTC4, PTC3, PTC0, PTC7);

DigitalOut K(PTD7);

int carPositionX = 0;
int carPositionY = 0;
int obstacklePosX = 0;
int obstacklePosY = 0;
int startFlag = 0;
int obstackleFlag = 0;

void initRoad()
{
    display.Line(0,0,127,0, BLACK);
    display.Line(0,1,127,1, BLACK);
    display.Line(0,62,127,62, BLACK);
    display.Line(0,63,127,63, BLACK);
}

void initCar()
{
    display.FullRectangle(0,29,11,34, BLACK);
    carPositionX = 0;
    carPositionY = 29;
}

void moveCar(int flag)
{
    int speed = 4;
    switch(flag)
    {
        case 1:
        display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE);
        carPositionY = carPositionY+speed;
        display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK);
        break;
        case 2:
        display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE);
        carPositionY = carPositionY-speed;
        display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK);
        break;
        case 3:
        display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE);
        carPositionX = carPositionX+speed;
        display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK);
        break;
        case 4:
        display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, WHITE);
        carPositionX = carPositionX-speed;
        display.FullRectangle(carPositionX,carPositionY,carPositionX+11,carPositionY+5, BLACK);
        break;
    }
}

void checkColision()
{
    if((carPositionY<obstacklePosY)&&(carPositionX+12>obstacklePosX)||(carPositionY>obstacklePosY+10)&&(carPositionX+12>obstacklePosX))
    {
        startFlag = 3;    
    }
}

void initObstackle()
{
    display.FullRectangle(120,3,127,27, BLACK);
    display.FullRectangle(120,37,127,60, BLACK);
    obstacklePosX = 120;
    obstacklePosY = 27;
    obstackleFlag = 1;
}

void moveObstackle()
{
    int speed = 3;
    display.FullRectangle(obstacklePosX,3,obstacklePosX+8,27, WHITE);
    display.FullRectangle(obstacklePosX,37,obstacklePosX+8,60, WHITE);
    obstacklePosX = obstacklePosX-speed;
    if(obstacklePosX != 0)
    {
        display.FullRectangle(obstacklePosX,3,obstacklePosX+8,27, BLACK);
        display.FullRectangle(obstacklePosX,37,obstacklePosX+8,60, BLACK);
    }
    else
    {
        obstackleFlag = 0;
    }
}

void drawCar(int positionX, int positionY)
{
    display.RoundRectangle(positionX,positionY,64,28,12,BLACK);
    display.RoundRectangle(positionX+35,positionY+3,9,22,3,BLACK);
    display.RoundRectangle(positionX+16,positionY+3,6,22,2,BLACK);  
    display.Line(positionX+18,positionY+3,positionX+37,positionY+3, BLACK);
    display.Line(positionX+18,positionY+25,positionX+37,positionY+25, BLACK);
    display.FullRectangle(positionX-1,positionY+2,positionX+5,positionY+26, WHITE);
    display.EmptyRectangle(positionX-1,positionY+2,positionX+5,positionY+26, BLACK);  
    display.FullRectangle(positionX+7,positionY+8,positionX+14,positionY+12, BLACK);
    display.FullRectangle(positionX+7,positionY+16,positionX+14,positionY+20, BLACK);
    display.FullRectangle(positionX+24,positionY+8,positionX+33,positionY+12, BLACK);
    display.FullRectangle(positionX+24,positionY+16,positionX+33,positionY+20, BLACK); 
    display.FullRectangle(positionX+46,positionY+8,positionX+63,positionY+12, BLACK);
    display.FullRectangle(positionX+46,positionY+16,positionX+63,positionY+20, BLACK);    
}

void InitScreen()
{
    int count = 0;
    int distance = 0;
    int dimensionX = 127;
    int dimensionY = 63;

    display.ClearScreen();
    display.SelectFont(System5x7,BLACK,ReadData); 
    display.GotoXY(0,0);
    display.GotoXY(22,32);
    display.PrintString("RedOut PRESENTS");
    wait(2);
    display.ClearScreen();
    display.GotoXY(0,0);
    display.GotoXY(52,32);
    display.PrintString("GAME");
    
    for(count = 0;count<12;count++)
    {
        distance = count*2;
            
        display.RoundRectangle(distance,distance,dimensionX,dimensionY,3,BLACK);
        dimensionX = dimensionX - 4;
        dimensionY = dimensionY - 4;
    }
    wait(2);
    display.ClearScreen();
    drawCar(32,13);
    wait_ms(500);
    display.GotoXY(0,0);
    display.GotoXY(45,0);
    display.PrintString("DRIVING");
    wait_ms(800);
    display.GotoXY(0,0);
    display.GotoXY(18,48);
    display.PrintString("MOVE TO CONTINUE");
}

int main() 
{
    float moveX = 0;
    float moveY = 0;
    wait_ms(2000);
    K = 0;
    InitScreen();
    MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
    PwmOut rled(LED_RED);
    PwmOut gled(LED_GREEN);
    PwmOut bled(LED_BLUE);
 
    while(1) 
    {
        moveX = acc.getAccX();
        moveY = acc.getAccY();
        
        if(((moveX>0.5)||(moveY>0.5))&&(startFlag==0))
        {
            display.ClearScreen();
            display.GotoXY(0,0);
            display.GotoXY(22,16);
            display.PrintString("ON YOUR SEATS");
            wait(1);
            display.GotoXY(0,0);
            display.GotoXY(22,32);
            display.PrintString("DRIVE STARTING");
            wait(1);
            display.ClearScreen();
            initRoad();
            initCar();
            initObstackle();
            startFlag = 1;
        }
        
        if(startFlag == 1)
        {
            checkColision();
            if(obstackleFlag == 1)
            {
                moveObstackle();
            }
            if(obstackleFlag == 0)
            {
                initObstackle();
            }

            display.GotoXY(0,0);
            if(moveY<(-0.2))
            {
                if(carPositionY < 51)
                {
                    moveCar(1);
                }
            }
            if(moveY>0.2)
            {
                if(carPositionY > 6)
                {
                    moveCar(2);
                }
            }
            if(moveX>0.2)
            {
                if(carPositionX < (127-carLength))
                {
                    moveCar(3);
                }
            }
            if(moveX<(-0.2))
            {
                if(carPositionX > 0)
                {
                    moveCar(4);
                }
            }
        }
        
        if(startFlag==3)
        {
            display.ClearScreen();
            display.GotoXY(0,0);
            display.GotoXY(22,32);
            display.PrintString("GAME OVER");
            wait(10);
            startFlag = 0;
            InitScreen();
            
        }
        rled = 1.0 - abs(acc.getAccX());
        gled = 1.0 - abs(acc.getAccY());
        bled = 1.0 - abs(acc.getAccZ());    
    }
}