Implement basic functions

Dependencies:   mbed N5110

Files at this revision

API Documentation at this revision

Comitter:
Wuuu
Date:
Fri May 03 13:05:24 2019 +0000
Commit message:
Flappy Bird, which with header programme

Changed in this revision

Begin/Begin.cpp Show annotated file Show diff for this revision Revisions of this file
Begin/Begin.h Show annotated file Show diff for this revision Revisions of this file
Bird/Bird.cpp Show annotated file Show diff for this revision Revisions of this file
Bird/Bird.h Show annotated file Show diff for this revision Revisions of this file
Gamepad/Gamepad.cpp Show annotated file Show diff for this revision Revisions of this file
Gamepad/Gamepad.h Show annotated file Show diff for this revision Revisions of this file
N5110.lib Show annotated file Show diff for this revision Revisions of this file
Wall/Wall.cpp Show annotated file Show diff for this revision Revisions of this file
Wall/Wall.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 64bd9f996099 Begin/Begin.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Begin/Begin.cpp	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,69 @@
+#include "Begin.h"
+
+Begin::Begin()
+{
+    
+}
+
+Begin::~Begin()
+{
+    
+}
+
+void Begin::init()
+{
+    _m = 0;
+    _s = 0;
+    _a1 = 0;
+    _b1 = 0;
+    _a2 = 0;
+    _b2 = 0;
+    _a3 = 0;
+    _b3 = 0;
+    _h = 0;
+    _Bird.init();
+    _Wall.init();
+}
+
+int Begin::draw(N5110 &lcd, Gamepad &pad)
+{
+    lcd.drawRect(0,8,84,40,FILL_TRANSPARENT);
+    int* _ab = new int[7];
+    _ab = _Wall.draw(lcd);
+    _a1 = _ab[0];
+    _b1 = _ab[1];
+    _a2 = _ab[2];
+    _b2 = _ab[3];
+    _a3 = _ab[4];
+    _b3 = _ab[5];
+    _s = _ab[6];
+    _h = _Bird.draw(lcd, pad);
+    char buffer1[14];
+    sprintf(buffer1,"score: %2d ",_s);
+    lcd.printString(buffer1,0,0);
+    if(_a1 == 0){
+        if(_h+2 <= _b1+1 | _h+8 >= _b1+15){
+            _m = 1;
+        }else{
+            _m = 0;
+        }
+    }
+    if(_a2 == 0){
+        if(_h+2 <= _b2+1 | _h+8 >= _b2+15){
+            _m = 1;
+        }else{
+            _m = 0;
+        }
+    }
+    if(_a3 == 0){
+        if(_h+2 <= _b3+1 | _h+8 >= _b3+15){
+            _m = 1;
+        }else{
+            _m = 0;
+        }
+    }
+    if(_h+2 <= 0 | _h+8 >= 48){
+        _m = 1;
+    }
+    return _m;
+}
diff -r 000000000000 -r 64bd9f996099 Begin/Begin.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Begin/Begin.h	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,33 @@
+#ifndef BEGIN_H
+#define BEGIN_H
+
+#include "mbed.h"
+#include "N5110.h"
+#include "Gamepad.h"
+#include "Wall.h"
+#include "Bird.h"
+
+class Begin
+{
+public:
+    Begin();
+    ~Begin();
+    void init();
+    int draw(N5110 &lcd, Gamepad &pad);
+
+private:
+    
+    int _m;
+    int _s;
+    int _a1;
+    int _b1;
+    int _a2;
+    int _b2;
+    int _a3;
+    int _b3;
+    int _h;
+    Bird _Bird;
+    Wall _Wall;
+};
+
+#endif
diff -r 000000000000 -r 64bd9f996099 Bird/Bird.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Bird/Bird.cpp	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,54 @@
+#include "Bird.h"
+
+Bird::Bird()
+{
+    
+}
+
+Bird::~Bird()
+{
+    
+}
+
+void Bird::init()
+{
+    _h = 16;
+}
+
+int Bird::draw(N5110 &lcd,Gamepad &pad)
+{
+    int sprite_data1[] = {
+    0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,
+    0,0,0,1,0,0,0,0,
+    0,0,0,1,1,0,0,0,
+    0,0,0,1,1,1,0,0,
+    0,0,0,1,1,1,0,0,
+    1,1,1,1,1,1,1,1,
+    1,1,1,1,1,1,1,0,
+    0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,
+    };
+    int sprite_data2[] = {
+    0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,
+    1,1,1,1,1,1,1,0,
+    1,1,1,1,1,1,1,1,
+    0,0,0,1,1,1,0,0,
+    0,0,0,1,1,1,0,0,
+    0,0,0,1,1,0,0,0,
+    0,0,0,1,0,0,0,0,
+    0,0,0,0,0,0,0,0,
+    0,0,0,0,0,0,0,0,
+        };
+    if(pad.check_event(Gamepad::A_PRESSED) == true){
+        _h = _h - 7;
+        Bitmap sprite(sprite_data1, 10, 8);
+        sprite.render(lcd,1,_h);
+    }else{
+        _h = _h + 3;
+        Bitmap sprite(sprite_data2, 10, 8);
+        sprite.render(lcd,1,_h);
+    }
+    return _h;
+}
\ No newline at end of file
diff -r 000000000000 -r 64bd9f996099 Bird/Bird.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Bird/Bird.h	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,23 @@
+#ifndef BIRD_H
+#define BIRD_H
+
+#include "mbed.h"
+#include "N5110.h"
+#include "Gamepad.h"
+#include "Bitmap.h"
+
+class Bird
+{
+public:
+    
+    Bird();
+    ~Bird();
+    void init();
+    int draw(N5110 &lcd,Gamepad &pad);
+
+private:
+
+    int _h;
+};
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 64bd9f996099 Gamepad/Gamepad.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Gamepad/Gamepad.cpp	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,341 @@
+#include "Gamepad.h"
+
+#include "mbed.h"
+
+//////////// constructor/destructor ////////////
+Gamepad::Gamepad()
+    :
+    _led1(new PwmOut(PTA1)),
+    _led2(new PwmOut(PTA2)),
+    _led3(new PwmOut(PTC2)),
+    _led4(new PwmOut(PTC3)),
+    _led5(new PwmOut(PTC4)),
+    _led6(new PwmOut(PTD3)),
+
+    _button_A(new InterruptIn(PTB9)),
+    _button_B(new InterruptIn(PTD0)),
+    _button_X(new InterruptIn(PTC17)),
+    _button_Y(new InterruptIn(PTC12)),
+    _button_L(new InterruptIn(PTB18)),
+    _button_R(new InterruptIn(PTB3)),
+    _button_back(new InterruptIn(PTB19)),
+    _button_start(new InterruptIn(PTC5)),
+    _button_joystick(new InterruptIn(PTC16)),
+
+    _vert(new AnalogIn(PTB10)),
+    _horiz(new AnalogIn(PTB11)),
+
+    _buzzer(new PwmOut(PTC10)),
+    _pot(new AnalogIn(PTB2)),
+
+    _timeout(new Timeout()),
+
+    _event_state(0),
+
+    _x0(0),
+    _y0(0)
+{}
+
+Gamepad::~Gamepad()
+{
+    delete _led1,_led2,_led3,_led4,_led5,_led6;
+    delete _button_A,_button_B,_button_joystick,_vert,_horiz;
+    delete _button_X,_button_Y,_button_back,_button_start;
+    delete _button_L,_button_R, _buzzer, _pot, _timeout;
+}
+
+///////////////// public methods /////////////////
+
+void Gamepad::init()
+{
+    leds_off();
+    init_buttons();
+
+    // read centred values of joystick
+    _x0 = _horiz->read();
+    _y0 = _vert->read();
+
+    // clear all flags
+    _event_state = 0;
+}
+
+void Gamepad::leds_off()
+{
+    leds(0.0);
+}
+
+void Gamepad::leds_on()
+{
+    leds(1.0);
+}
+
+void Gamepad::leds(float val) const
+{
+    if (val < 0.0f) {
+        val = 0.0f;
+    }
+    if (val > 1.0f) {
+        val = 1.0f;
+    }
+
+    // leds are active-low, so subtract from 1.0
+    // 0.0 corresponds to fully-off, 1.0 to fully-on
+    val = 1.0f - val;
+
+    _led1->write(val);
+    _led2->write(val);
+    _led3->write(val);
+    _led4->write(val);
+    _led5->write(val);
+    _led6->write(val);
+}
+
+void Gamepad::led(int n,float val) const
+{
+    // ensure they are within vlaid range
+    if (val < 0.0f) {
+        val = 0.0f;
+    }
+    if (val > 1.0f) {
+        val = 1.0f;
+    }
+    
+    switch (n) {
+        
+        // check for valid LED number and set value
+
+        case 1:
+            _led1->write(1.0f-val);   // active-low so subtract from 1
+            break;
+        case 2:
+            _led2->write(1.0f-val);   // active-low so subtract from 1
+            break;
+        case 3:
+            _led3->write(1.0f-val);   // active-low so subtract from 1
+            break;
+        case 4:
+            _led4->write(1.0f-val);   // active-low so subtract from 1
+            break;
+        case 5:
+            _led5->write(1.0f-val);   // active-low so subtract from 1
+            break;
+        case 6:
+            _led6->write(1.0f-val);   // active-low so subtract from 1
+            break;
+
+    }
+}
+
+float Gamepad::read_pot() const
+{
+    return _pot->read();
+}
+
+void Gamepad::tone(float frequency, float duration)
+{
+    _buzzer->period(1.0f/frequency);
+    _buzzer->write(0.5);  // 50% duty cycle - square wave
+    _timeout->attach(callback(this, &Gamepad::tone_off), duration );
+}
+
+bool Gamepad::check_event(GamepadEvent const id)
+{
+    // Check whether event flag is set
+    if (_event_state[id]) {
+        _event_state.reset(id);  // clear flag
+        return true;
+    } else {
+        return false;
+    }
+}
+
+// this method gets the magnitude of the joystick movement
+float Gamepad::get_mag()
+{
+    Polar p = get_polar();
+    return p.mag;
+}
+
+// this method gets the angle of joystick movement (0 to 360, 0 North)
+float Gamepad::get_angle()
+{
+    Polar p = get_polar();
+    return p.angle;
+}
+
+Direction Gamepad::get_direction()
+{
+    float angle = get_angle();  // 0 to 360, -1 for centred
+
+    Direction d;
+    // partition 360 into segments and check which segment the angle is in
+    if (angle < 0.0f) {
+        d = CENTRE;   // check for -1.0 angle
+    } else if (angle < 22.5f) {  // then keep going in 45 degree increments
+        d = N;
+    } else if (angle < 67.5f) {
+        d = NE;
+    } else if (angle < 112.5f) {
+        d = E;
+    } else if (angle < 157.5f) {
+        d = SE;
+    } else if (angle < 202.5f) {
+        d = S;
+    } else if (angle < 247.5f) {
+        d = SW;
+    } else if (angle < 292.5f) {
+        d = W;
+    } else if (angle < 337.5f) {
+        d = NW;
+    } else {
+        d = N;
+    }
+
+    return d;
+}
+
+///////////////////// private methods ////////////////////////
+
+void Gamepad::tone_off()
+{
+    // called after timeout
+    _buzzer->write(0.0);
+}
+
+void Gamepad::init_buttons()
+{
+    // turn on pull-downs as other side of button is connected to 3V3
+    // button is 0 when not pressed and 1 when pressed
+    _button_A->mode(PullDown);
+    _button_B->mode(PullDown);
+    _button_X->mode(PullDown);
+    _button_Y->mode(PullDown);
+    _button_back->mode(PullDown);
+    _button_start->mode(PullDown);
+    _button_L->mode(PullDown);
+    _button_R->mode(PullDown);
+    _button_joystick->mode(PullDown);
+    // therefore setup rising edge interrupts
+    _button_A->rise(callback(this,&Gamepad::a_isr));
+    _button_B->rise(callback(this,&Gamepad::b_isr));
+    _button_X->rise(callback(this,&Gamepad::x_isr));
+    _button_Y->rise(callback(this,&Gamepad::y_isr));
+    _button_L->rise(callback(this,&Gamepad::l_isr));
+    _button_R->rise(callback(this,&Gamepad::r_isr));
+    _button_start->rise(callback(this,&Gamepad::start_isr));
+    _button_back->rise(callback(this,&Gamepad::back_isr));
+    _button_joystick->rise(callback(this,&Gamepad::joy_isr));
+}
+
+// button interrupts ISRs
+// Each of these simply sets the appropriate event bit in the _event_state
+// variable
+void Gamepad::a_isr()
+{
+    _event_state.set(A_PRESSED);
+}
+void Gamepad::b_isr()
+{
+    _event_state.set(B_PRESSED);
+}
+void Gamepad::x_isr()
+{
+    _event_state.set(X_PRESSED);
+}
+void Gamepad::y_isr()
+{
+    _event_state.set(Y_PRESSED);
+}
+void Gamepad::l_isr()
+{
+    _event_state.set(L_PRESSED);
+}
+void Gamepad::r_isr()
+{
+    _event_state.set(R_PRESSED);
+}
+void Gamepad::back_isr()
+{
+    _event_state.set(BACK_PRESSED);
+}
+void Gamepad::start_isr()
+{
+    _event_state.set(START_PRESSED);
+}
+void Gamepad::joy_isr()
+{
+    _event_state.set(JOY_PRESSED);
+}
+
+// get raw joystick coordinate in range -1 to 1
+// Direction (x,y)
+// North     (0,1)
+// East      (1,0)
+// South     (0,-1)
+// West      (-1,0)
+Vector2D Gamepad::get_coord()
+{
+    // read() returns value in range 0.0 to 1.0 so is scaled and centre value
+    // substracted to get values in the range -1.0 to 1.0
+    float x = 2.0f*( _horiz->read() - _x0 );
+    float y = 2.0f*( _vert->read()  - _y0 );
+
+    // Note: the x value here is inverted to ensure the positive x is to the
+    // right. This is simply due to how the potentiometer on the joystick
+    // I was using was connected up. It could have been corrected in hardware
+    // by swapping the power supply pins. Instead it is done in software so may
+    // need to be changed depending on your wiring setup
+
+    Vector2D coord = {-x,y};
+    return coord;
+}
+
+// This maps the raw x,y coord onto a circular grid.
+// See:  http://mathproofs.blogspot.co.uk/2005/07/mapping-square-to-circle.html
+Vector2D Gamepad::get_mapped_coord()
+{
+    Vector2D coord = get_coord();
+
+    // do the transformation
+    float x = coord.x*sqrt(1.0f-pow(coord.y,2.0f)/2.0f);
+    float y = coord.y*sqrt(1.0f-pow(coord.x,2.0f)/2.0f);
+
+    Vector2D mapped_coord = {x,y};
+    return mapped_coord;
+}
+
+// this function converts the mapped coordinates into polar form
+Polar Gamepad::get_polar()
+{
+    // get the mapped coordinate
+    Vector2D coord = get_mapped_coord();
+
+    // at this point, 0 degrees (i.e. x-axis) will be defined to the East.
+    // We want 0 degrees to correspond to North and increase clockwise to 359
+    // like a compass heading, so we need to swap the axis and invert y
+    float x = coord.y;
+    float y = coord.x;
+
+    float mag = sqrt(x*x+y*y);  // pythagoras
+    float angle = RAD2DEG*atan2(y,x);
+    // angle will be in range -180 to 180, so add 360 to negative angles to
+    // move to 0 to 360 range
+    if (angle < 0.0f) {
+        angle+=360.0f;
+    }
+
+    // the noise on the ADC causes the values of x and y to fluctuate slightly
+    // around the centred values. This causes the random angle values to get
+    // calculated when the joystick is centred and untouched. This is also when
+    // the magnitude is very small, so we can check for a small magnitude and then
+    // set the angle to -1. This will inform us when the angle is invalid and the
+    // joystick is centred
+
+    if (mag < TOL) {
+        mag = 0.0f;
+        angle = -1.0f;
+    }
+
+    Polar p = {mag,angle};
+    return p;
+}
\ No newline at end of file
diff -r 000000000000 -r 64bd9f996099 Gamepad/Gamepad.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Gamepad/Gamepad.h	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,193 @@
+#ifndef GAMEPAD_H
+#define GAMEPAD_H
+
+#include <bitset>
+
+// Forward declaration of the classes that we use from the mbed library
+// This avoids the need for us to include the huge mbed.h header inside our
+// own library API
+namespace mbed
+{
+class AnalogIn;
+class InterruptIn;
+class PwmOut;
+class Timeout;
+}
+
+#define TOL 0.1f
+#define RAD2DEG 57.2957795131f
+
+/** Enum for direction */
+enum Direction {
+    CENTRE,  /**< joystick centred */
+    N,       /**< pushed North (0)*/
+    NE,      /**< pushed North-East (45) */
+    E,       /**< pushed East (90) */
+    SE,      /**< pushed South-East (135) */
+    S,       /**< pushed South (180) */
+    SW,      /**< pushed South-West (225) */
+    W,       /**< pushed West (270) */
+    NW       /**< pushed North-West (315) */
+};
+
+/** Vector 2D struct */
+struct Vector2D {
+    float x; /**< float for x value */
+    float y; /**< float for y value */
+};
+
+/** Polar coordinate struct */
+struct Polar {
+    float mag;  /**< float for magnitude */
+    float angle; /**< float for angle (in degrees) */
+};
+
+/** Gamepad Class
+@brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds
+@author Dr Craig A. Evans
+@author Dr Alex Valanvanis
+@date Febraury 2017
+*/
+class Gamepad
+{
+    public:
+    /** Gamepad events 
+ * @brief List of events that can be registered on the gamepad
+ */
+enum GamepadEvent {
+    A_PRESSED,     ///< Button A has been pressed
+    B_PRESSED,     ///< Button B has been pressed
+    X_PRESSED,     ///< Button X has been pressed
+    Y_PRESSED,     ///< Button Y has been pressed
+    L_PRESSED,     ///< Button L has been pressed
+    R_PRESSED,     ///< Button R has been pressed
+    BACK_PRESSED,  ///< Button "Back" has been pressed
+    START_PRESSED, ///< Button "Start" has been pressed
+    JOY_PRESSED,   ///< Joystick button has been pressed
+    N_EVENTS       ///< A dummy flag that marks the end of the list
+};
+private:
+    mbed::PwmOut *_led1;
+    mbed::PwmOut *_led2;
+    mbed::PwmOut *_led3;
+    mbed::PwmOut *_led4;
+    mbed::PwmOut *_led5;
+    mbed::PwmOut *_led6;
+
+    mbed::InterruptIn *_button_A;
+    mbed::InterruptIn *_button_B;
+    mbed::InterruptIn *_button_X;
+    mbed::InterruptIn *_button_Y;
+    mbed::InterruptIn *_button_L;
+    mbed::InterruptIn *_button_R;
+    mbed::InterruptIn *_button_back;
+    mbed::InterruptIn *_button_start;
+    mbed::InterruptIn *_button_joystick;
+
+    mbed::AnalogIn *_vert;
+    mbed::AnalogIn *_horiz;
+
+    mbed::PwmOut   *_buzzer;
+    mbed::AnalogIn *_pot;
+
+    mbed::Timeout *_timeout;
+
+    std::bitset<N_EVENTS> _event_state; ///< A binary list of buttons that has been pressed
+
+    // centred x,y values
+    float _x0;
+    float _y0;
+
+public:
+
+    /** Constructor */
+    Gamepad();
+
+    /** Destructor */
+    ~Gamepad();
+
+    /** Initialise all peripherals and configure interrupts */
+    void init();
+
+    /** Turn all LEDs on */
+    void leds_on();
+
+    /** Turn all LEDs off */
+    void leds_off();
+
+    /** Set all LEDs to duty-cycle
+    *@param value in range 0.0 to 1.0
+    */
+    void leds(float val) const;
+
+    /** Set LED to duty-cycle
+    *@param led number (0 to 5)
+    *@param value in range 0.0 to 1.0
+    */
+    void led(int n,float val) const;
+
+    /** Read potentiometer
+    *@returns potentiometer value in range 0.0 to 1.0
+    */
+    float read_pot() const;
+
+    /** Play tone on piezo
+    * @param frequency in Hz
+    * @param duration of tone in seconds
+    */
+    void tone(float frequency, float duration);
+
+    /**
+     * @brief Check whether an event flag has been set and clear it
+     * @param id[in] The ID of the event to test
+     * @return true if the event occurred
+     */
+    bool check_event(GamepadEvent const id);
+
+    /** Get magnitude of joystick movement
+    * @returns value in range 0.0 to 1.0
+    */
+
+    float get_mag();
+
+    /** Get angle of joystick movement
+    * @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central
+    */
+    float get_angle();
+
+    /** Gets joystick direction
+    * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
+    */
+    Direction get_direction();    // N,NE,E,SE etc.
+
+    /** Gets raw cartesian co-ordinates of joystick
+    * @returns a struct with x,y members, each in the range 0.0 to 1.0
+    */
+    Vector2D get_coord();         // cartesian co-ordinates x,y
+
+    /** Gets cartesian coordinates mapped to circular grid
+    * @returns a struct with x,y members, each in the range 0.0 to 1.0
+    */
+    Vector2D get_mapped_coord();  // x,y mapped to circle
+
+    /** Gets polar coordinates of the joystick
+    * @returns a struct contains mag and angle
+    */
+    Polar get_polar();            // mag and angle in struct form
+
+private:
+    void init_buttons();
+    void tone_off();
+
+    void a_isr();
+    void b_isr();
+    void x_isr();
+    void y_isr();
+    void l_isr();
+    void r_isr();
+    void back_isr();
+    void start_isr();
+    void joy_isr();
+};
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 64bd9f996099 N5110.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/N5110.lib	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/eencae/code/N5110/#93355c01e261
diff -r 000000000000 -r 64bd9f996099 Wall/Wall.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wall/Wall.cpp	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,72 @@
+#include "Wall.h"
+
+Wall::Wall()
+{
+
+}
+
+Wall::~Wall()
+{
+
+}
+
+void Wall::init() 
+{
+    _a1 = 84;
+    _a2 = 28;
+    _a3 = 56;
+    _b1 = 0;
+    _b2 = 15;
+    _b3 = 18;
+    _score = 0;
+    _ab = new int[7];
+    _ab[0] = 0;
+    _ab[1] = 0;
+    _ab[2] = 0;
+    _ab[3] = 0;
+    _ab[4] = 0;
+    _ab[5] = 0;
+    _ab[6] = 0;
+}
+
+int* Wall::draw(N5110 &lcd)
+{
+    if(_a1 == 84){
+        _b1 = rand() % 8 + 21;
+    }
+    if(_a2 == 84){
+        _b2 = rand() % 8 + 21;
+    }
+    if(_a3 == 84){
+        _b3 = rand() % 8 + 21;
+    }
+    _a1 = _a1 - 7;
+    _a2 = _a2 - 7;
+    _a3 = _a3 - 7;
+    lcd.drawRect(_a1,8,7,_b1-7,FILL_BLACK);
+    lcd.drawRect(_a1,_b1 + 15,7,33-_b1,FILL_BLACK);
+    lcd.drawRect(_a2,8,7,_b2-7,FILL_BLACK);
+    lcd.drawRect(_a2,_b2 + 15,7,33-_b2,FILL_BLACK);
+    lcd.drawRect(_a3,8,7,_b3-7,FILL_BLACK);
+    lcd.drawRect(_a3,_b3 + 15,7,33-_b3,FILL_BLACK);
+    _ab[0] = _a1;
+    _ab[1] = _b1;
+    _ab[2] = _a2;
+    _ab[3] = _b2;
+    _ab[4] = _a3;
+    _ab[5] = _b3;
+    _ab[6] = _score;
+    if(_a1 == 0){
+        _a1 = 84;
+        _score = _score + 10;
+    }
+    if(_a2 == 0){
+        _a2 = 84;
+        _score = _score + 10;
+    }
+    if(_a3 == 0){
+        _a3 = 84;
+        _score = _score + 10;
+    }
+    return _ab;
+}
\ No newline at end of file
diff -r 000000000000 -r 64bd9f996099 Wall/Wall.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Wall/Wall.h	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,29 @@
+#ifndef WALL_H
+#define WALL_H
+
+#include "mbed.h"
+#include "N5110.h"
+#include "Gamepad.h"
+
+class Wall
+{
+public:
+    
+    Wall();
+    ~Wall();
+    void init();
+    int* draw(N5110 &lcd);
+    int* _ab;
+
+private:
+
+    int _a1;
+    int _a2;
+    int _a3;
+    int _b1;
+    int _b2;
+    int _b3;
+    int _score;
+};
+
+#endif
\ No newline at end of file
diff -r 000000000000 -r 64bd9f996099 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,87 @@
+#include "mbed.h"
+#include "N5110.h"
+#include "Gamepad.h"
+#include "Begin.h"
+
+N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
+Gamepad pad;
+Begin beg;
+
+void init();
+void welcome();
+void loading();
+void game();
+
+int main() {
+    while(1){
+        init();
+        welcome();
+        loading();
+        while(pad.check_event(Gamepad::BACK_PRESSED) == false)  {
+            game();
+        }
+    }
+}
+
+void init() {
+    lcd.init();
+    pad.init();
+    beg.init();
+    }
+    
+void welcome() {
+    lcd.clear();
+    lcd.printString("  FlappyBird! ",0,1);  
+    lcd.printString("  Press Start ",0,4);
+    lcd.refresh();
+     
+    // wait flashing LEDs until start button is pressed 
+    while ( pad.check_event(Gamepad::START_PRESSED) == false) {
+        pad.leds_on();
+        wait(0.1);
+        pad.leds_off();
+        wait(0.1);
+    }
+ 
+}
+
+void loading(){
+    lcd.clear();
+    lcd.printString("   READY!!!     ",0,3);
+    lcd.refresh();
+    wait_ms(500);
+    lcd.clear();
+    lcd.printString("     3     ",0,3);
+    lcd.refresh();
+    wait_ms(500);
+    lcd.clear();
+    lcd.printString("     2     ",0,3);
+    lcd.refresh();
+    wait_ms(500);
+    lcd.clear();
+    lcd.printString("     1     ",0,3);
+    lcd.refresh();
+    wait_ms(500);
+    lcd.clear();
+    lcd.printString("     GO!!!     ",0,3);
+    lcd.refresh();
+    wait_ms(500);
+}
+
+void game()
+{
+    lcd.clear();
+    int d = beg.draw(lcd, pad);
+    if(d == 1) {
+        while(1) {
+            init();
+            welcome();
+            loading();
+            while(pad.check_event(Gamepad::BACK_PRESSED) == false)  {
+                game();
+            }
+        }
+    }
+    lcd.refresh();
+    wait(0.5);
+}
\ No newline at end of file
diff -r 000000000000 -r 64bd9f996099 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri May 03 13:05:24 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/994bdf8177cb
\ No newline at end of file