Class used to interface with the handheld gamepad.

Fork of Gamepad by Craig Evans

Committer:
valavanisalex
Date:
Fri Mar 03 13:12:03 2017 +0000
Revision:
15:c582b3326d44
Parent:
13:ef5fc9f58805
Child:
16:3ea3d9714b0c
Added docs

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 15:c582b3326d44 46 /** Gamepad events
valavanisalex 15:c582b3326d44 47 * @brief 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