Class used to interface with the handheld gamepad.

Fork of Gamepad by Craig Evans

Committer:
valavanisalex
Date:
Fri Mar 03 12:35:43 2017 +0000
Revision:
12:1b0b6355da4f
Parent:
11:ff86b2ffce01
Child:
13:ef5fc9f58805
Handle event flags using a single _event_state bitset and ID flags

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