My ELEC2645 project. Nikollao Sulollari. 200804685

Dependencies:   N5110 SoftPWM mbed

Fork of Treasure_Hunt by ELEC2645 (2015/16)

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);
+    }
+}