Kern Fowler / Mbed 2 deprecated Donkey_Kong_Game

Dependencies:   mbed

Committer:
Kern_EL17KJTF
Date:
Tue Apr 23 17:10:14 2019 +0000
Revision:
1:7a0917df015a
Parent:
Gamepad/Gamepad.h@0:0130fd5738f7
Child:
2:6baf849b0270
Menu edited to contain Donkey Kong face sprite popup and slightly cleaned up.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kern_EL17KJTF 0:0130fd5738f7 1 #ifndef GAMEPAD_H
Kern_EL17KJTF 0:0130fd5738f7 2 #define GAMEPAD_H
Kern_EL17KJTF 0:0130fd5738f7 3
Kern_EL17KJTF 0:0130fd5738f7 4 #include <bitset>
Kern_EL17KJTF 0:0130fd5738f7 5
Kern_EL17KJTF 0:0130fd5738f7 6 // Forward declaration of the classes that we use from the mbed library
Kern_EL17KJTF 0:0130fd5738f7 7 // This avoids the need for us to include the huge mbed.h header inside our
Kern_EL17KJTF 0:0130fd5738f7 8 // own library API
Kern_EL17KJTF 0:0130fd5738f7 9 namespace mbed
Kern_EL17KJTF 0:0130fd5738f7 10 {
Kern_EL17KJTF 0:0130fd5738f7 11 class AnalogIn;
Kern_EL17KJTF 0:0130fd5738f7 12 class InterruptIn;
Kern_EL17KJTF 0:0130fd5738f7 13 class PwmOut;
Kern_EL17KJTF 0:0130fd5738f7 14 class Timeout;
Kern_EL17KJTF 0:0130fd5738f7 15 }
Kern_EL17KJTF 0:0130fd5738f7 16
Kern_EL17KJTF 0:0130fd5738f7 17 #define TOL 0.1f
Kern_EL17KJTF 0:0130fd5738f7 18 #define RAD2DEG 57.2957795131f
Kern_EL17KJTF 0:0130fd5738f7 19
Kern_EL17KJTF 0:0130fd5738f7 20 /** Enum for direction */
Kern_EL17KJTF 0:0130fd5738f7 21 enum Direction {
Kern_EL17KJTF 0:0130fd5738f7 22 CENTRE, /**< joystick centred */
Kern_EL17KJTF 0:0130fd5738f7 23 N, /**< pushed North (0)*/
Kern_EL17KJTF 0:0130fd5738f7 24 NE, /**< pushed North-East (45) */
Kern_EL17KJTF 0:0130fd5738f7 25 E, /**< pushed East (90) */
Kern_EL17KJTF 0:0130fd5738f7 26 SE, /**< pushed South-East (135) */
Kern_EL17KJTF 0:0130fd5738f7 27 S, /**< pushed South (180) */
Kern_EL17KJTF 0:0130fd5738f7 28 SW, /**< pushed South-West (225) */
Kern_EL17KJTF 0:0130fd5738f7 29 W, /**< pushed West (270) */
Kern_EL17KJTF 0:0130fd5738f7 30 NW /**< pushed North-West (315) */
Kern_EL17KJTF 0:0130fd5738f7 31 };
Kern_EL17KJTF 0:0130fd5738f7 32
Kern_EL17KJTF 0:0130fd5738f7 33 /** Vector 2D struct */
Kern_EL17KJTF 0:0130fd5738f7 34 struct Vector2D {
Kern_EL17KJTF 0:0130fd5738f7 35 float x; /**< float for x value */
Kern_EL17KJTF 0:0130fd5738f7 36 float y; /**< float for y value */
Kern_EL17KJTF 0:0130fd5738f7 37 };
Kern_EL17KJTF 0:0130fd5738f7 38
Kern_EL17KJTF 0:0130fd5738f7 39 /** Polar coordinate struct */
Kern_EL17KJTF 0:0130fd5738f7 40 struct Polar {
Kern_EL17KJTF 0:0130fd5738f7 41 float mag; /**< float for magnitude */
Kern_EL17KJTF 0:0130fd5738f7 42 float angle; /**< float for angle (in degrees) */
Kern_EL17KJTF 0:0130fd5738f7 43 };
Kern_EL17KJTF 0:0130fd5738f7 44
Kern_EL17KJTF 0:0130fd5738f7 45 /** Gamepad Class
Kern_EL17KJTF 0:0130fd5738f7 46 * @brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds
Kern_EL17KJTF 0:0130fd5738f7 47 * @author Dr Craig A. Evans
Kern_EL17KJTF 0:0130fd5738f7 48 * @author Dr Alex Valavanis
Kern_EL17KJTF 0:0130fd5738f7 49 */
Kern_EL17KJTF 0:0130fd5738f7 50 class Gamepad
Kern_EL17KJTF 0:0130fd5738f7 51 {
Kern_EL17KJTF 0:0130fd5738f7 52 public:
Kern_EL17KJTF 0:0130fd5738f7 53 /** Gamepad events
Kern_EL17KJTF 0:0130fd5738f7 54 * @brief List of events that can be registered on the gamepad
Kern_EL17KJTF 0:0130fd5738f7 55 */
Kern_EL17KJTF 0:0130fd5738f7 56 enum GamepadEvent {
Kern_EL17KJTF 0:0130fd5738f7 57 A_PRESSED, ///< Button A has been pressed
Kern_EL17KJTF 0:0130fd5738f7 58 B_PRESSED, ///< Button B has been pressed
Kern_EL17KJTF 0:0130fd5738f7 59 X_PRESSED, ///< Button X has been pressed
Kern_EL17KJTF 0:0130fd5738f7 60 Y_PRESSED, ///< Button Y has been pressed
Kern_EL17KJTF 0:0130fd5738f7 61 L_PRESSED, ///< Button L has been pressed
Kern_EL17KJTF 0:0130fd5738f7 62 R_PRESSED, ///< Button R has been pressed
Kern_EL17KJTF 0:0130fd5738f7 63 BACK_PRESSED, ///< Button "Back" has been pressed
Kern_EL17KJTF 0:0130fd5738f7 64 START_PRESSED, ///< Button "Start" has been pressed
Kern_EL17KJTF 0:0130fd5738f7 65 JOY_PRESSED, ///< Joystick button has been pressed
Kern_EL17KJTF 0:0130fd5738f7 66 N_EVENTS ///< A dummy flag that marks the end of the list
Kern_EL17KJTF 0:0130fd5738f7 67 };
Kern_EL17KJTF 0:0130fd5738f7 68
Kern_EL17KJTF 0:0130fd5738f7 69 private:
Kern_EL17KJTF 0:0130fd5738f7 70 mbed::PwmOut *_led1;
Kern_EL17KJTF 0:0130fd5738f7 71 mbed::PwmOut *_led2;
Kern_EL17KJTF 0:0130fd5738f7 72 mbed::PwmOut *_led3;
Kern_EL17KJTF 0:0130fd5738f7 73 mbed::PwmOut *_led4;
Kern_EL17KJTF 0:0130fd5738f7 74 mbed::PwmOut *_led5;
Kern_EL17KJTF 0:0130fd5738f7 75 mbed::PwmOut *_led6;
Kern_EL17KJTF 0:0130fd5738f7 76
Kern_EL17KJTF 0:0130fd5738f7 77 mbed::InterruptIn *_button_A;
Kern_EL17KJTF 0:0130fd5738f7 78 mbed::InterruptIn *_button_B;
Kern_EL17KJTF 0:0130fd5738f7 79 mbed::InterruptIn *_button_X;
Kern_EL17KJTF 0:0130fd5738f7 80 mbed::InterruptIn *_button_Y;
Kern_EL17KJTF 0:0130fd5738f7 81 mbed::InterruptIn *_button_L;
Kern_EL17KJTF 0:0130fd5738f7 82 mbed::InterruptIn *_button_R;
Kern_EL17KJTF 0:0130fd5738f7 83 mbed::InterruptIn *_button_back;
Kern_EL17KJTF 0:0130fd5738f7 84 mbed::InterruptIn *_button_start;
Kern_EL17KJTF 0:0130fd5738f7 85 mbed::InterruptIn *_button_joystick;
Kern_EL17KJTF 0:0130fd5738f7 86
Kern_EL17KJTF 0:0130fd5738f7 87 mbed::AnalogIn *_vert;
Kern_EL17KJTF 0:0130fd5738f7 88 mbed::AnalogIn *_horiz;
Kern_EL17KJTF 0:0130fd5738f7 89
Kern_EL17KJTF 0:0130fd5738f7 90 mbed::PwmOut *_buzzer;
Kern_EL17KJTF 0:0130fd5738f7 91 mbed::AnalogIn *_pot;
Kern_EL17KJTF 0:0130fd5738f7 92
Kern_EL17KJTF 0:0130fd5738f7 93 mbed::Timeout *_timeout;
Kern_EL17KJTF 0:0130fd5738f7 94
Kern_EL17KJTF 0:0130fd5738f7 95 std::bitset<N_EVENTS> _event_state; ///< A binary list of buttons that has been pressed
Kern_EL17KJTF 0:0130fd5738f7 96
Kern_EL17KJTF 0:0130fd5738f7 97 // centred x,y values
Kern_EL17KJTF 0:0130fd5738f7 98 float _x0;
Kern_EL17KJTF 0:0130fd5738f7 99 float _y0;
Kern_EL17KJTF 0:0130fd5738f7 100
Kern_EL17KJTF 0:0130fd5738f7 101 public:
Kern_EL17KJTF 0:0130fd5738f7 102 /** Constructor */
Kern_EL17KJTF 0:0130fd5738f7 103 Gamepad();
Kern_EL17KJTF 0:0130fd5738f7 104
Kern_EL17KJTF 0:0130fd5738f7 105 /** Destructor */
Kern_EL17KJTF 0:0130fd5738f7 106 ~Gamepad();
Kern_EL17KJTF 0:0130fd5738f7 107
Kern_EL17KJTF 0:0130fd5738f7 108 /** Initialise all peripherals and configure interrupts */
Kern_EL17KJTF 0:0130fd5738f7 109 void init();
Kern_EL17KJTF 0:0130fd5738f7 110
Kern_EL17KJTF 0:0130fd5738f7 111 /** Turn all LEDs on */
Kern_EL17KJTF 0:0130fd5738f7 112 void leds_on();
Kern_EL17KJTF 0:0130fd5738f7 113
Kern_EL17KJTF 0:0130fd5738f7 114 /** Turn all LEDs off */
Kern_EL17KJTF 0:0130fd5738f7 115 void leds_off();
Kern_EL17KJTF 0:0130fd5738f7 116
Kern_EL17KJTF 0:0130fd5738f7 117 /** Set all LEDs to duty-cycle
Kern_EL17KJTF 0:0130fd5738f7 118 *@param value in range 0.0 to 1.0
Kern_EL17KJTF 0:0130fd5738f7 119 */
Kern_EL17KJTF 0:0130fd5738f7 120 void leds(float val) const;
Kern_EL17KJTF 0:0130fd5738f7 121
Kern_EL17KJTF 0:0130fd5738f7 122 /** Set LED to duty-cycle
Kern_EL17KJTF 0:0130fd5738f7 123 *@param led number (0 to 5)
Kern_EL17KJTF 0:0130fd5738f7 124 *@param value in range 0.0 to 1.0
Kern_EL17KJTF 0:0130fd5738f7 125 */
Kern_EL17KJTF 0:0130fd5738f7 126 void led(int n,float val) const;
Kern_EL17KJTF 0:0130fd5738f7 127
Kern_EL17KJTF 0:0130fd5738f7 128 /** Read potentiometer
Kern_EL17KJTF 0:0130fd5738f7 129 *@returns potentiometer value in range 0.0 to 1.0
Kern_EL17KJTF 0:0130fd5738f7 130 */
Kern_EL17KJTF 0:0130fd5738f7 131 float read_pot() const;
Kern_EL17KJTF 0:0130fd5738f7 132
Kern_EL17KJTF 0:0130fd5738f7 133 /** Play tone on piezo
Kern_EL17KJTF 0:0130fd5738f7 134 * @param frequency in Hz
Kern_EL17KJTF 0:0130fd5738f7 135 * @param duration of tone in seconds
Kern_EL17KJTF 0:0130fd5738f7 136 */
Kern_EL17KJTF 0:0130fd5738f7 137 void tone(float frequency, float duration);
Kern_EL17KJTF 0:0130fd5738f7 138
Kern_EL17KJTF 0:0130fd5738f7 139 /**
Kern_EL17KJTF 0:0130fd5738f7 140 * @brief Check whether an event flag has been set and clear it
Kern_EL17KJTF 0:0130fd5738f7 141 * @param id[in] The ID of the event to test
Kern_EL17KJTF 0:0130fd5738f7 142 * @return true if the event occurred
Kern_EL17KJTF 0:0130fd5738f7 143 */
Kern_EL17KJTF 0:0130fd5738f7 144 bool check_event(GamepadEvent const id);
Kern_EL17KJTF 0:0130fd5738f7 145
Kern_EL17KJTF 0:0130fd5738f7 146 /**
Kern_EL17KJTF 0:0130fd5738f7 147 * @brief Get the raw binary event state
Kern_EL17KJTF 0:0130fd5738f7 148 * @return The event state as a binary code
Kern_EL17KJTF 0:0130fd5738f7 149 * @details The check_event() function is likely to be more useful than
Kern_EL17KJTF 0:0130fd5738f7 150 * this, for testing whether a given event has occurred. It can be
Kern_EL17KJTF 0:0130fd5738f7 151 * useful for debugging via the terminal, however, for example:
Kern_EL17KJTF 0:0130fd5738f7 152 * @code
Kern_EL17KJTF 0:0130fd5738f7 153 * std::cout << gamepad.get_raw_event_state() << std::endl;
Kern_EL17KJTF 0:0130fd5738f7 154 * @endcode
Kern_EL17KJTF 0:0130fd5738f7 155 */
Kern_EL17KJTF 0:0130fd5738f7 156 inline std::bitset<N_EVENTS> get_raw_event_state() const {
Kern_EL17KJTF 0:0130fd5738f7 157 return _event_state;
Kern_EL17KJTF 0:0130fd5738f7 158 }
Kern_EL17KJTF 0:0130fd5738f7 159
Kern_EL17KJTF 0:0130fd5738f7 160 /** Get magnitude of joystick movement
Kern_EL17KJTF 0:0130fd5738f7 161 * @returns value in range 0.0 to 1.0
Kern_EL17KJTF 0:0130fd5738f7 162 */
Kern_EL17KJTF 0:0130fd5738f7 163 float get_mag();
Kern_EL17KJTF 0:0130fd5738f7 164
Kern_EL17KJTF 0:0130fd5738f7 165 /** Get angle of joystick movement
Kern_EL17KJTF 0:0130fd5738f7 166 * @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central
Kern_EL17KJTF 0:0130fd5738f7 167 */
Kern_EL17KJTF 0:0130fd5738f7 168 float get_angle();
Kern_EL17KJTF 0:0130fd5738f7 169
Kern_EL17KJTF 0:0130fd5738f7 170 /** Gets joystick direction
Kern_EL17KJTF 0:0130fd5738f7 171 * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
Kern_EL17KJTF 0:0130fd5738f7 172 */
Kern_EL17KJTF 0:0130fd5738f7 173 Direction get_direction(); // N,NE,E,SE etc.
Kern_EL17KJTF 0:0130fd5738f7 174
Kern_EL17KJTF 0:0130fd5738f7 175 /** Gets raw cartesian co-ordinates of joystick
Kern_EL17KJTF 0:0130fd5738f7 176 * @returns a struct with x,y members, each in the range 0.0 to 1.0
Kern_EL17KJTF 0:0130fd5738f7 177 */
Kern_EL17KJTF 0:0130fd5738f7 178 Vector2D get_coord(); // cartesian co-ordinates x,y
Kern_EL17KJTF 0:0130fd5738f7 179
Kern_EL17KJTF 0:0130fd5738f7 180 /** Gets cartesian coordinates mapped to circular grid
Kern_EL17KJTF 0:0130fd5738f7 181 * @returns a struct with x,y members, each in the range 0.0 to 1.0
Kern_EL17KJTF 0:0130fd5738f7 182 */
Kern_EL17KJTF 0:0130fd5738f7 183 Vector2D get_mapped_coord(); // x,y mapped to circle
Kern_EL17KJTF 0:0130fd5738f7 184
Kern_EL17KJTF 0:0130fd5738f7 185 /** Gets polar coordinates of the joystick
Kern_EL17KJTF 0:0130fd5738f7 186 * @returns a struct contains mag and angle
Kern_EL17KJTF 0:0130fd5738f7 187 */
Kern_EL17KJTF 0:0130fd5738f7 188 Polar get_polar(); // mag and angle in struct form
Kern_EL17KJTF 0:0130fd5738f7 189
Kern_EL17KJTF 0:0130fd5738f7 190 private:
Kern_EL17KJTF 0:0130fd5738f7 191 void init_buttons();
Kern_EL17KJTF 0:0130fd5738f7 192 void tone_off();
Kern_EL17KJTF 0:0130fd5738f7 193
Kern_EL17KJTF 0:0130fd5738f7 194 void a_isr();
Kern_EL17KJTF 0:0130fd5738f7 195 void b_isr();
Kern_EL17KJTF 0:0130fd5738f7 196 void x_isr();
Kern_EL17KJTF 0:0130fd5738f7 197 void y_isr();
Kern_EL17KJTF 0:0130fd5738f7 198 void l_isr();
Kern_EL17KJTF 0:0130fd5738f7 199 void r_isr();
Kern_EL17KJTF 0:0130fd5738f7 200 void back_isr();
Kern_EL17KJTF 0:0130fd5738f7 201 void start_isr();
Kern_EL17KJTF 0:0130fd5738f7 202 void joy_isr();
Kern_EL17KJTF 0:0130fd5738f7 203 };
Kern_EL17KJTF 0:0130fd5738f7 204
Kern_EL17KJTF 0:0130fd5738f7 205 #endif