Mbed project for a FRDM-K64F microcontroller. Game made out of five sub-games including flappy birds, snake, stack, trivia and space invaders.

Dependencies:   mbed

Fork of The_Children_of_Cronos_el15mggr by ELEC2645 (2016/17)

Committer:
matirc
Date:
Tue Jul 18 09:55:49 2017 +0000
Revision:
5:4111d3255f24
Parent:
4:466cda7cae42
Final version

Who changed what in which revision?

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