Class used to interface with the handheld gamepad.

Fork of Gamepad by Craig Evans

Committer:
valavanisalex
Date:
Fri Mar 03 12:51:13 2017 +0000
Revision:
13:ef5fc9f58805
Parent:
12:1b0b6355da4f
Child:
15:c582b3326d44
Use forward declaration of mbed classes so that we can avoid pulling the whole of the mbed header into our own API

Who changed what in which revision?

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