Class used to interface with the handheld gamepad.

Fork of Gamepad by Craig Evans

Committer:
valavanisalex
Date:
Thu Mar 02 18:34:42 2017 +0000
Revision:
11:ff86b2ffce01
Parent:
10:a13d2f9d8a14
Child:
12:1b0b6355da4f
Const safety and private member formatting

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