Class used to interface with the handheld gamepad.

Fork of Gamepad by Craig Evans

Committer:
eencae
Date:
Tue Feb 07 11:50:26 2017 +0000
Revision:
9:893189072e89
Parent:
8:7eaf26f4b5f2
Child:
10:a13d2f9d8a14
Added methods to access individual LEDs.

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 {
eencae 0:a6288c29b936 41
eencae 0:a6288c29b936 42 public:
eencae 0:a6288c29b936 43
eencae 9:893189072e89 44 /** Constructor */
eencae 0:a6288c29b936 45 Gamepad();
eencae 8:7eaf26f4b5f2 46
eencae 9:893189072e89 47 /** Destructor */
eencae 1:6d25cd49059b 48 ~Gamepad();
eencae 0:a6288c29b936 49
eencae 9:893189072e89 50 /** Initialise all peripherals and configure interrupts */
eencae 0:a6288c29b936 51 void init();
eencae 8:7eaf26f4b5f2 52
eencae 9:893189072e89 53 /** Turn all LEDs on */
eencae 0:a6288c29b936 54 void leds_on();
eencae 8:7eaf26f4b5f2 55
eencae 9:893189072e89 56 /** Turn all LEDs off */
eencae 0:a6288c29b936 57 void leds_off();
eencae 8:7eaf26f4b5f2 58
eencae 9:893189072e89 59 /** Set all LEDs to duty-cycle
eencae 9:893189072e89 60 *@param value in range 0.0 to 1.0
eencae 9:893189072e89 61 */
eencae 9:893189072e89 62 void set_leds(float val);
eencae 9:893189072e89 63
eencae 9:893189072e89 64 /** Set LED to duty-cycle
eencae 9:893189072e89 65 *@param value in range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 66 */
eencae 9:893189072e89 67 void set_led1(float val);
eencae 9:893189072e89 68
eencae 9:893189072e89 69 /** Set LED to duty-cycle
eencae 9:893189072e89 70 *@param value in range 0.0 to 1.0
eencae 9:893189072e89 71 */
eencae 9:893189072e89 72 void set_led2(float val);
eencae 9:893189072e89 73
eencae 9:893189072e89 74 /** Set LED to duty-cycle
eencae 9:893189072e89 75 *@param value in range 0.0 to 1.0
eencae 9:893189072e89 76 */
eencae 9:893189072e89 77 void set_led3(float val);
eencae 9:893189072e89 78
eencae 9:893189072e89 79 /** Set LED to duty-cycle
eencae 9:893189072e89 80 *@param value in range 0.0 to 1.0
eencae 9:893189072e89 81 */
eencae 9:893189072e89 82 void set_led4(float val);
eencae 9:893189072e89 83
eencae 9:893189072e89 84 /** Set LED to duty-cycle
eencae 9:893189072e89 85 *@param value in range 0.0 to 1.0
eencae 9:893189072e89 86 */
eencae 9:893189072e89 87 void set_led5(float val);
eencae 9:893189072e89 88
eencae 9:893189072e89 89 /** Set LED to duty-cycle
eencae 9:893189072e89 90 *@param value in range 0.0 to 1.0
eencae 9:893189072e89 91 */
eencae 9:893189072e89 92 void set_led6(float val);
eencae 1:6d25cd49059b 93
eencae 8:7eaf26f4b5f2 94 /** Read potentiometer
eencae 9:893189072e89 95 *@returns potentiometer value in range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 96 */
eencae 1:6d25cd49059b 97 float read_pot();
eencae 8:7eaf26f4b5f2 98
eencae 8:7eaf26f4b5f2 99 /** Play tone on piezo
eencae 9:893189072e89 100 * @param frequency in Hz
eencae 9:893189072e89 101 * @param duration of tone in seconds
eencae 8:7eaf26f4b5f2 102 */
eencae 1:6d25cd49059b 103 void tone(float frequency, float duration);
eencae 1:6d25cd49059b 104
eencae 8:7eaf26f4b5f2 105 /** Check if A button pressed
eencae 9:893189072e89 106 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 107 */
eencae 1:6d25cd49059b 108 bool a_pressed();
eencae 8:7eaf26f4b5f2 109
eencae 8:7eaf26f4b5f2 110 /** Check if B button pressed
eencae 9:893189072e89 111 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 112 */
eencae 1:6d25cd49059b 113 bool b_pressed();
eencae 8:7eaf26f4b5f2 114
eencae 8:7eaf26f4b5f2 115 /** Check if X button pressed
eencae 9:893189072e89 116 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 117 */
eencae 1:6d25cd49059b 118 bool x_pressed();
eencae 8:7eaf26f4b5f2 119
eencae 8:7eaf26f4b5f2 120 /** Check if Y button pressed
eencae 9:893189072e89 121 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 122 */
eencae 1:6d25cd49059b 123 bool y_pressed();
eencae 8:7eaf26f4b5f2 124
eencae 8:7eaf26f4b5f2 125 /** Check if L button pressed
eencae 9:893189072e89 126 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 127 */
eencae 1:6d25cd49059b 128 bool l_pressed();
eencae 8:7eaf26f4b5f2 129
eencae 8:7eaf26f4b5f2 130 /** Check if R button pressed
eencae 9:893189072e89 131 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 132 */
eencae 1:6d25cd49059b 133 bool r_pressed();
eencae 8:7eaf26f4b5f2 134
eencae 8:7eaf26f4b5f2 135 /** Check if Back button pressed
eencae 9:893189072e89 136 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 137 */
eencae 1:6d25cd49059b 138 bool back_pressed();
eencae 8:7eaf26f4b5f2 139
eencae 8:7eaf26f4b5f2 140 /** Check if Start button pressed
eencae 9:893189072e89 141 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 142 */
eencae 1:6d25cd49059b 143 bool start_pressed();
eencae 8:7eaf26f4b5f2 144
eencae 8:7eaf26f4b5f2 145 /** Check if Joystick button pressed
eencae 9:893189072e89 146 * @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 147 */
eencae 3:964a6d95acdd 148 bool joystick_pressed();
eencae 8:7eaf26f4b5f2 149
eencae 8:7eaf26f4b5f2 150 /** Get magnitude of joystick movement
eencae 9:893189072e89 151 * @returns value in range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 152 */
eencae 8:7eaf26f4b5f2 153
eencae 8:7eaf26f4b5f2 154 float get_mag();
eencae 9:893189072e89 155
eencae 8:7eaf26f4b5f2 156 /** Get angle of joystick movement
eencae 9:893189072e89 157 * @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 158 */
eencae 3:964a6d95acdd 159 float get_angle();
eencae 9:893189072e89 160
eencae 8:7eaf26f4b5f2 161 /** Gets joystick direction
eencae 9:893189072e89 162 * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
eencae 8:7eaf26f4b5f2 163 */
eencae 3:964a6d95acdd 164 Direction get_direction(); // N,NE,E,SE etc.
eencae 9:893189072e89 165
eencae 8:7eaf26f4b5f2 166 /** Gets raw cartesian co-ordinates of joystick
eencae 9:893189072e89 167 * @returns a struct with x,y members, each in the range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 168 */
eencae 5:ce5eae9ee934 169 Vector2D get_coord(); // cartesian co-ordinates x,y
eencae 9:893189072e89 170
eencae 8:7eaf26f4b5f2 171 /** Gets cartesian coordinates mapped to circular grid
eencae 9:893189072e89 172 * @returns a struct with x,y members, each in the range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 173 */
eencae 5:ce5eae9ee934 174 Vector2D get_mapped_coord(); // x,y mapped to circle
eencae 9:893189072e89 175
eencae 8:7eaf26f4b5f2 176 /** Gets polar coordinates of the joystick
eencae 9:893189072e89 177 * @returns a struct contains mag and angle
eencae 8:7eaf26f4b5f2 178 */
eencae 5:ce5eae9ee934 179 Polar get_polar(); // mag and angle in struct form
eencae 3:964a6d95acdd 180
eencae 0:a6288c29b936 181 private:
eencae 0:a6288c29b936 182
eencae 9:893189072e89 183 PwmOut *led1;
eencae 9:893189072e89 184 PwmOut *led2;
eencae 9:893189072e89 185 PwmOut *led3;
eencae 9:893189072e89 186 PwmOut *led4;
eencae 9:893189072e89 187 PwmOut *led5;
eencae 9:893189072e89 188 PwmOut *led6;
eencae 0:a6288c29b936 189
eencae 1:6d25cd49059b 190 InterruptIn *button_A;
eencae 1:6d25cd49059b 191 InterruptIn *button_B;
eencae 1:6d25cd49059b 192 InterruptIn *button_X;
eencae 3:964a6d95acdd 193 InterruptIn *button_Y;
eencae 1:6d25cd49059b 194 InterruptIn *button_back;
eencae 1:6d25cd49059b 195 InterruptIn *button_start;
eencae 1:6d25cd49059b 196 InterruptIn *button_L;
eencae 1:6d25cd49059b 197 InterruptIn *button_R;
eencae 3:964a6d95acdd 198 InterruptIn *button_joystick;
eencae 3:964a6d95acdd 199
eencae 3:964a6d95acdd 200 AnalogIn *vert;
eencae 3:964a6d95acdd 201 AnalogIn *horiz;
eencae 1:6d25cd49059b 202
eencae 1:6d25cd49059b 203 PwmOut *buzzer;
eencae 1:6d25cd49059b 204 AnalogIn *pot;
eencae 1:6d25cd49059b 205
eencae 1:6d25cd49059b 206 Timeout *timeout;
eencae 1:6d25cd49059b 207
eencae 1:6d25cd49059b 208 void init_buttons();
eencae 1:6d25cd49059b 209 void tone_off();
eencae 3:964a6d95acdd 210
eencae 1:6d25cd49059b 211 void a_isr();
eencae 1:6d25cd49059b 212 void b_isr();
eencae 1:6d25cd49059b 213 void x_isr();
eencae 1:6d25cd49059b 214 void y_isr();
eencae 1:6d25cd49059b 215 void l_isr();
eencae 1:6d25cd49059b 216 void r_isr();
eencae 1:6d25cd49059b 217 void back_isr();
eencae 1:6d25cd49059b 218 void start_isr();
eencae 3:964a6d95acdd 219 void joy_isr();
eencae 8:7eaf26f4b5f2 220
eencae 3:964a6d95acdd 221 bool a_flag,b_flag,x_flag,y_flag,l_flag,r_flag,back_flag,start_flag,joy_flag;
eencae 8:7eaf26f4b5f2 222
eencae 8:7eaf26f4b5f2 223 // centred x,y values
eencae 3:964a6d95acdd 224 float _x0;
eencae 3:964a6d95acdd 225 float _y0;
eencae 0:a6288c29b936 226 };
eencae 0:a6288c29b936 227
eencae 0:a6288c29b936 228 #endif