My ELEC2645 project. Nikollao Sulollari. 200804685
Dependencies: N5110 SoftPWM mbed
Diff: main.cpp
- Revision:
- 0:2d0f77943105
- Child:
- 1:12803d645d32
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Mar 07 09:38:00 2016 +0000 @@ -0,0 +1,392 @@ +#include "mbed.h" +#include "N5110.h" +#include "stdlib.h" + +N5110 lcd(PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3); +Serial pc(USBTX,USBRX); + +#define DIRECTION_TOLERANCE 0.05 + +DigitalIn button(PTB2); +AnalogIn xPot(PTB3); +AnalogIn yPot(PTB10); + +Ticker ticker; +Ticker game_timer; + +DigitalOut r_led(LED_RED); +DigitalOut g_led(LED_GREEN); +DigitalOut b_led(LED_BLUE); +// K64F on-board switches +InterruptIn sw2(SW2); +InterruptIn sw3(SW3); +PwmOut speaker(PTC11); + +enum DirectionName { + UP, + DOWN, + LEFT, + RIGHT, + CENTRE, + UNKNOWN +}; + +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; + +// error function hangs flashing an LED + +volatile int rectY; +volatile int rectX ; +volatile int circleX; +volatile int circleY; +volatile int heroX; +volatile int heroY; + +volatile int level = 0; +volatile int count = 0; +volatile int reset = 0; +volatile int g_timer_flag = 0; +volatile int g_game_timer_flag = 0; +volatile int g_sw2_flag = 0; + +void error(); +// setup serial port +void init_serial(); +// set-up the on-board LEDs and switches +void init_K64F(); +void init_game(); +void timer_isr(); +void game_timer_isr(); +void sw2_isr(); +void calibrateJoystick(); +void updateJoystick(); + +void enemyRect(); +void enemyCircle(); +void hero(); +void guidance(); +void obstacles(); +int menu(); + +int main() +{ + + + lcd.init(); + init_K64F(); + init_serial(); + sw2.fall(&sw2_isr); + init_game(); + calibrateJoystick(); + + ticker.attach(&timer_isr,0.1); + reset = level; + + while (1) { + + if (g_timer_flag) { + + g_timer_flag = 0; + lcd.clear(); + guidance(); + hero(); + if (level == 0) { + + enemyRect(); + enemyCircle(); + } else if (level == 1) { + + enemyRect(); + enemyCircle(); + enemyRect(); + } else if (level == 2) { + + } else if (level == 3) { + + } + obstacles(); + count++; + //heroX++; + heroY--; + + if (heroY < -45) { + heroY = 0; + level++; + } + + if (reset < level) { + + reset = level; + count = 0; + rectX = rand() % 84; + rectY = 0; + circleX = 0; + circleY = rand() % 47; + } + + pc.printf("x = %f y = %f button = %d ",joystick.x,joystick.y,joystick.button); + + // check joystick direction + if (joystick.direction == UP) + pc.printf(" UP\n"); + if (joystick.direction == DOWN) + pc.printf(" DOWN\n"); + if (joystick.direction == LEFT) + pc.printf(" LEFT\n"); + if (joystick.direction == RIGHT) + pc.printf(" RIGHT\n"); + if (joystick.direction == CENTRE) + pc.printf(" CENTRE\n"); + if (joystick.direction == UNKNOWN) + pc.printf(" Unsupported direction\n"); + } + updateJoystick(); + lcd.refresh(); + sleep(); + } +} + +void init_serial() +{ + // set to highest baud - ensure terminal software matches + pc.baud(115200); +} + +void init_K64F() +{ + // on-board LEDs are active-low, so set pin high to turn them off. + r_led = 1; + g_led = 1; + b_led = 1; + + // since the on-board switches have external pull-ups, we should disable the internal pull-down + // resistors that are enabled by default using InterruptIn + sw2.mode(PullNone); + sw3.mode(PullNone); +} + +void timer_isr () +{ + + g_timer_flag = 1; + // lcd.refresh(); +} + +void game_timer_isr() +{ + + g_game_timer_flag = 1; +} + +void sw2_isr() +{ + + g_sw2_flag = 1; +} + +void enemyRect() +{ + + lcd.drawRect(rectX,rectY,5,4,1); + rectX = rectX + rand()%4 - 2; + //rectY = rand()%4-2; + //rectX++; + rectY++; +} + +void hero() +{ + + lcd.drawLine(40,47+heroY,48,43+heroY,1); + lcd.drawLine(40,43+heroY,48,47+heroY,1); + lcd.drawLine(44,45+heroY,44,41+heroY,1); + lcd.drawCircle(44,39+heroY,2,0); +} + +void enemyCircle() +{ + if (count > 10) { + lcd.drawCircle(circleX,circleY,4,1); + circleY = circleY + rand() %4 - 2; + + circleX++; + } +} + +void init_game() +{ + + srand(time(NULL)); + rectY = 0; + rectX = rand() %84 + 1; + circleY = rand() %48 + 1; + circleX = 0; + lcd.setBrightness(0.5); // put LED backlight on 50% + + lcd.printString("Welcome to",11,1); + lcd.printString("Treasure Hunt!",1,3); + lcd.refresh(); + wait(1); + lcd.clear(); + + while (1) { + + if (g_game_timer_flag) { + + g_game_timer_flag = 0; + updateJoystick(); + lcd.clear(); + int option = menu(); + + if (option == 0) { + + lcd.printString("Start Game <",0,0); + lcd.printString("Settings",0,2); + lcd.printString("Exit",0,4); + } else if (option == 1) { + + lcd.printString("Start Game",0,0); + lcd.printString("Settings <",0,2); + lcd.printString("Exit",0,4); + } else { + + lcd.printString("Start Game",0,0); + lcd.printString("Settings",0,2); + lcd.printString("Exit <",0,4); + } + } + if (g_sw2_flag) { + break; + } + + sleep(); + } +} +void guidance() +{ + + if (level < 7) { + + lcd.drawLine(42,0,42,4,1); + lcd.drawLine(42,0,40,2,1); + lcd.drawLine(42,0,44,2,1); + } else if (level == 7) { + + lcd.drawLine(42,0,42,6,1); + lcd.drawLine(40,3,44,3,1); + lcd.drawLine(40,0,44,6,1); + lcd.drawLine(40,6,44,0,1); + } else if (level == 8) { + + ticker.detach(); + lcd.clear(); + lcd.printString("Well done!",0,0); + lcd.refresh(); + wait(2); + lcd.clear(); + lcd.printString("Play again",0,0); + lcd.refresh(); + } +} + +void obstacles() +{ + + if (level == 1) { + + lcd.drawRect(10,15,2,2,1); + lcd.drawRect(74,15,2,2,1); + } else if (level == 2) { + + lcd.drawRect(10,15,2,2,1); + lcd.drawRect(74,15,2,2,1); + lcd.drawRect(10,28,2,2,1); + lcd.drawRect(74,28,2,2,1); + } else if (level == 3) { + + lcd.drawRect(10,15,2,2,1); + lcd.drawRect(74,15,2,2,1); + lcd.drawRect(10,28,2,2,1); + lcd.drawRect(74,28,2,2,1); + lcd.drawRect(30,15,2,2,1); + lcd.drawRect(54,15,2,2,1); + lcd.drawRect(30,28,2,2,1); + lcd.drawRect(54,28,2,2,1); + } else if (level == 4) { + + lcd.drawRect(10 + rand() %4 - 2,15 + rand() &4 -2,2,2,1); + lcd.drawRect(74,15,2,2,1); + lcd.drawRect(10,28,2,2,1); + lcd.drawRect(74,28,2,2,1); + } +} + +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; + } +} + +int menu() +{ + + int option; + + if (joystick.y <= 0.33) { + option = 0; + } else if (joystick.y <= 0.66) { + option = 1; + } else { + option = 2; + } + return option; +} +void error() +{ + + while (1) { + + lcd.printString("Error!",0,0); + + r_led = 0; + wait(0.2); + r_led = 1; + wait(0.2); + } +}