ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el18nw

Dependencies:   mbed

Committer:
Nicholas75179
Date:
Fri May 22 09:42:51 2020 +0000
Revision:
0:fde420d18f42
final commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nicholas75179 0:fde420d18f42 1 #ifndef GAMEPAD_H
Nicholas75179 0:fde420d18f42 2 #define GAMEPAD_H
Nicholas75179 0:fde420d18f42 3
Nicholas75179 0:fde420d18f42 4 #include <bitset>
Nicholas75179 0:fde420d18f42 5
Nicholas75179 0:fde420d18f42 6 // Forward declaration of the classes that we use from the mbed library
Nicholas75179 0:fde420d18f42 7 // This avoids the need for us to include the huge mbed_os.h header inside our
Nicholas75179 0:fde420d18f42 8 // own library API
Nicholas75179 0:fde420d18f42 9 namespace mbed
Nicholas75179 0:fde420d18f42 10 {
Nicholas75179 0:fde420d18f42 11 class AnalogIn;
Nicholas75179 0:fde420d18f42 12 class InterruptIn;
Nicholas75179 0:fde420d18f42 13 class PwmOut;
Nicholas75179 0:fde420d18f42 14 class Timeout;
Nicholas75179 0:fde420d18f42 15 class AnalogOut;
Nicholas75179 0:fde420d18f42 16 class Ticker;
Nicholas75179 0:fde420d18f42 17 }
Nicholas75179 0:fde420d18f42 18
Nicholas75179 0:fde420d18f42 19 #define TOL 0.1f
Nicholas75179 0:fde420d18f42 20 #define RAD2DEG 57.2957795131f
Nicholas75179 0:fde420d18f42 21
Nicholas75179 0:fde420d18f42 22 /** Enum for direction */
Nicholas75179 0:fde420d18f42 23 enum Direction {
Nicholas75179 0:fde420d18f42 24 CENTRE, /**< joystick centred */
Nicholas75179 0:fde420d18f42 25 N, /**< pushed North (0)*/
Nicholas75179 0:fde420d18f42 26 NE, /**< pushed North-East (45) */
Nicholas75179 0:fde420d18f42 27 E, /**< pushed East (90) */
Nicholas75179 0:fde420d18f42 28 SE, /**< pushed South-East (135) */
Nicholas75179 0:fde420d18f42 29 S, /**< pushed South (180) */
Nicholas75179 0:fde420d18f42 30 SW, /**< pushed South-West (225) */
Nicholas75179 0:fde420d18f42 31 W, /**< pushed West (270) */
Nicholas75179 0:fde420d18f42 32 NW /**< pushed North-West (315) */
Nicholas75179 0:fde420d18f42 33 };
Nicholas75179 0:fde420d18f42 34
Nicholas75179 0:fde420d18f42 35 /** Vector 2D struct */
Nicholas75179 0:fde420d18f42 36 struct Vector2D {
Nicholas75179 0:fde420d18f42 37 float x; /**< float for x value */
Nicholas75179 0:fde420d18f42 38 float y; /**< float for y value */
Nicholas75179 0:fde420d18f42 39 };
Nicholas75179 0:fde420d18f42 40
Nicholas75179 0:fde420d18f42 41 /** Polar coordinate struct */
Nicholas75179 0:fde420d18f42 42 struct Polar {
Nicholas75179 0:fde420d18f42 43 float mag; /**< float for magnitude */
Nicholas75179 0:fde420d18f42 44 float angle; /**< float for angle (in degrees) */
Nicholas75179 0:fde420d18f42 45 };
Nicholas75179 0:fde420d18f42 46
Nicholas75179 0:fde420d18f42 47 /** Gamepad Class
Nicholas75179 0:fde420d18f42 48 * @brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds
Nicholas75179 0:fde420d18f42 49 * @author Dr Craig A. Evans
Nicholas75179 0:fde420d18f42 50 * @author Dr Alex Valavanis
Nicholas75179 0:fde420d18f42 51 */
Nicholas75179 0:fde420d18f42 52 class Gamepad
Nicholas75179 0:fde420d18f42 53 {
Nicholas75179 0:fde420d18f42 54
Nicholas75179 0:fde420d18f42 55 private:
Nicholas75179 0:fde420d18f42 56 mbed::PwmOut *_led1;
Nicholas75179 0:fde420d18f42 57 mbed::PwmOut *_led2;
Nicholas75179 0:fde420d18f42 58 mbed::PwmOut *_led3;
Nicholas75179 0:fde420d18f42 59 mbed::PwmOut *_led4;
Nicholas75179 0:fde420d18f42 60 mbed::PwmOut *_led5;
Nicholas75179 0:fde420d18f42 61 mbed::PwmOut *_led6;
Nicholas75179 0:fde420d18f42 62
Nicholas75179 0:fde420d18f42 63 mbed::InterruptIn *_button_A;
Nicholas75179 0:fde420d18f42 64 mbed::InterruptIn *_button_B;
Nicholas75179 0:fde420d18f42 65 mbed::InterruptIn *_button_X;
Nicholas75179 0:fde420d18f42 66 mbed::InterruptIn *_button_Y;
Nicholas75179 0:fde420d18f42 67 mbed::InterruptIn *_button_start;
Nicholas75179 0:fde420d18f42 68
Nicholas75179 0:fde420d18f42 69 mbed::AnalogIn *_vert;
Nicholas75179 0:fde420d18f42 70 mbed::AnalogIn *_horiz;
Nicholas75179 0:fde420d18f42 71
Nicholas75179 0:fde420d18f42 72 mbed::AnalogOut *_speaker;
Nicholas75179 0:fde420d18f42 73 mbed::AnalogIn *_pot1;
Nicholas75179 0:fde420d18f42 74 mbed::AnalogIn *_pot2;
Nicholas75179 0:fde420d18f42 75
Nicholas75179 0:fde420d18f42 76 mbed::Timeout *_timeout;
Nicholas75179 0:fde420d18f42 77 mbed::Ticker *_ticker;
Nicholas75179 0:fde420d18f42 78
Nicholas75179 0:fde420d18f42 79
Nicholas75179 0:fde420d18f42 80
Nicholas75179 0:fde420d18f42 81 // centred x,y values
Nicholas75179 0:fde420d18f42 82 float _x0;
Nicholas75179 0:fde420d18f42 83 float _y0;
Nicholas75179 0:fde420d18f42 84
Nicholas75179 0:fde420d18f42 85 public:
Nicholas75179 0:fde420d18f42 86 /** Constructor */
Nicholas75179 0:fde420d18f42 87 Gamepad();
Nicholas75179 0:fde420d18f42 88
Nicholas75179 0:fde420d18f42 89 /** Initialise all peripherals and configure interrupts */
Nicholas75179 0:fde420d18f42 90 void init();
Nicholas75179 0:fde420d18f42 91
Nicholas75179 0:fde420d18f42 92 /** Turn all LEDs on */
Nicholas75179 0:fde420d18f42 93 void leds_on();
Nicholas75179 0:fde420d18f42 94
Nicholas75179 0:fde420d18f42 95 /** Turn all LEDs off */
Nicholas75179 0:fde420d18f42 96 void leds_off();
Nicholas75179 0:fde420d18f42 97
Nicholas75179 0:fde420d18f42 98 /** Set all LEDs to duty-cycle
Nicholas75179 0:fde420d18f42 99 *@param value in range 0.0 to 1.0
Nicholas75179 0:fde420d18f42 100 */
Nicholas75179 0:fde420d18f42 101 void leds(float val) const;
Nicholas75179 0:fde420d18f42 102
Nicholas75179 0:fde420d18f42 103 /** Set LED to duty-cycle
Nicholas75179 0:fde420d18f42 104 *@param led number (0 to 5)
Nicholas75179 0:fde420d18f42 105 *@param value in range 0.0 to 1.0
Nicholas75179 0:fde420d18f42 106 */
Nicholas75179 0:fde420d18f42 107 void led(int n,float val) const;
Nicholas75179 0:fde420d18f42 108
Nicholas75179 0:fde420d18f42 109 /** Read potentiometer 1 value
Nicholas75179 0:fde420d18f42 110 *@returns potentiometer value in range 0.0 to 1.0
Nicholas75179 0:fde420d18f42 111 */
Nicholas75179 0:fde420d18f42 112 float read_pot1() const;
Nicholas75179 0:fde420d18f42 113
Nicholas75179 0:fde420d18f42 114 /** Read potentiometer 2 value
Nicholas75179 0:fde420d18f42 115 *@returns potentiometer value in range 0.0 to 1.0
Nicholas75179 0:fde420d18f42 116 */
Nicholas75179 0:fde420d18f42 117 float read_pot2() const;
Nicholas75179 0:fde420d18f42 118
Nicholas75179 0:fde420d18f42 119 /** Play tone on piezo (NOTE: Frequencys below 1kHz can damage the speaker)
Nicholas75179 0:fde420d18f42 120 * @param frequency in Hz
Nicholas75179 0:fde420d18f42 121 * @param duration of tone in seconds
Nicholas75179 0:fde420d18f42 122 */
Nicholas75179 0:fde420d18f42 123 void tone(float frequency, float duration);
Nicholas75179 0:fde420d18f42 124
Nicholas75179 0:fde420d18f42 125
Nicholas75179 0:fde420d18f42 126
Nicholas75179 0:fde420d18f42 127
Nicholas75179 0:fde420d18f42 128 /** Get magnitude of joystick movement
Nicholas75179 0:fde420d18f42 129 * @returns value in range 0.0 to 1.0
Nicholas75179 0:fde420d18f42 130 */
Nicholas75179 0:fde420d18f42 131 float get_mag();
Nicholas75179 0:fde420d18f42 132
Nicholas75179 0:fde420d18f42 133 /** Get angle of joystick movement
Nicholas75179 0:fde420d18f42 134 * @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central
Nicholas75179 0:fde420d18f42 135 */
Nicholas75179 0:fde420d18f42 136 float get_angle();
Nicholas75179 0:fde420d18f42 137
Nicholas75179 0:fde420d18f42 138 /** Gets joystick direction
Nicholas75179 0:fde420d18f42 139 * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
Nicholas75179 0:fde420d18f42 140 */
Nicholas75179 0:fde420d18f42 141 Direction get_direction(); // N,NE,E,SE etc.
Nicholas75179 0:fde420d18f42 142
Nicholas75179 0:fde420d18f42 143 /** Gets raw cartesian co-ordinates of joystick
Nicholas75179 0:fde420d18f42 144 * @returns a struct with x,y members, each in the range 0.0 to 1.0
Nicholas75179 0:fde420d18f42 145 */
Nicholas75179 0:fde420d18f42 146 Vector2D get_coord(); // cartesian co-ordinates x,y
Nicholas75179 0:fde420d18f42 147
Nicholas75179 0:fde420d18f42 148 /** Gets cartesian coordinates mapped to circular grid
Nicholas75179 0:fde420d18f42 149 * @returns a struct with x,y members, each in the range 0.0 to 1.0
Nicholas75179 0:fde420d18f42 150 */
Nicholas75179 0:fde420d18f42 151 Vector2D get_mapped_coord(); // x,y mapped to circle
Nicholas75179 0:fde420d18f42 152
Nicholas75179 0:fde420d18f42 153 /** Gets polar coordinates of the joystick
Nicholas75179 0:fde420d18f42 154 * @returns a struct contains mag and angle
Nicholas75179 0:fde420d18f42 155 */
Nicholas75179 0:fde420d18f42 156 Polar get_polar(); // mag and angle in struct form
Nicholas75179 0:fde420d18f42 157
Nicholas75179 0:fde420d18f42 158
Nicholas75179 0:fde420d18f42 159 /** Resets all button states. Useful for calling inbetween scenes
Nicholas75179 0:fde420d18f42 160 * where you do not want button presses from the previous scene effecting
Nicholas75179 0:fde420d18f42 161 * the current scene
Nicholas75179 0:fde420d18f42 162 */
Nicholas75179 0:fde420d18f42 163 void reset_buttons();
Nicholas75179 0:fde420d18f42 164
Nicholas75179 0:fde420d18f42 165 /** Returns true if A has been pressed
Nicholas75179 0:fde420d18f42 166 * @returns a bool corresponding to A being pressed
Nicholas75179 0:fde420d18f42 167 */
Nicholas75179 0:fde420d18f42 168
Nicholas75179 0:fde420d18f42 169 bool A_pressed();
Nicholas75179 0:fde420d18f42 170
Nicholas75179 0:fde420d18f42 171 /** Returns true if A is held
Nicholas75179 0:fde420d18f42 172 * @returns a bool corresponding to A being held
Nicholas75179 0:fde420d18f42 173 *
Nicholas75179 0:fde420d18f42 174 */
Nicholas75179 0:fde420d18f42 175 bool A_held();
Nicholas75179 0:fde420d18f42 176
Nicholas75179 0:fde420d18f42 177
Nicholas75179 0:fde420d18f42 178 /** Returns true if B has been pressed
Nicholas75179 0:fde420d18f42 179 * @returns a bool corresponding to B being pressed
Nicholas75179 0:fde420d18f42 180 */
Nicholas75179 0:fde420d18f42 181 bool B_pressed();
Nicholas75179 0:fde420d18f42 182
Nicholas75179 0:fde420d18f42 183 /** Returns true if B is held
Nicholas75179 0:fde420d18f42 184 * @returns a bool corresponding to B being held
Nicholas75179 0:fde420d18f42 185 *
Nicholas75179 0:fde420d18f42 186 */
Nicholas75179 0:fde420d18f42 187 bool B_held();
Nicholas75179 0:fde420d18f42 188
Nicholas75179 0:fde420d18f42 189 /** Returns true if B has been pressed
Nicholas75179 0:fde420d18f42 190 * @returns a bool corresponding to B being pressed
Nicholas75179 0:fde420d18f42 191 */
Nicholas75179 0:fde420d18f42 192 bool X_pressed();
Nicholas75179 0:fde420d18f42 193
Nicholas75179 0:fde420d18f42 194 /** Returns true if X is held
Nicholas75179 0:fde420d18f42 195 * @returns a bool corresponding to X being held
Nicholas75179 0:fde420d18f42 196 *
Nicholas75179 0:fde420d18f42 197 */
Nicholas75179 0:fde420d18f42 198 bool X_held();
Nicholas75179 0:fde420d18f42 199
Nicholas75179 0:fde420d18f42 200 /** Returns true if Y has been pressed
Nicholas75179 0:fde420d18f42 201 * @returns a bool corresponding to Y being pressed
Nicholas75179 0:fde420d18f42 202 */
Nicholas75179 0:fde420d18f42 203 bool Y_pressed();
Nicholas75179 0:fde420d18f42 204
Nicholas75179 0:fde420d18f42 205 /** Returns true if Y is held
Nicholas75179 0:fde420d18f42 206 * @returns a bool corresponding to Y being held
Nicholas75179 0:fde420d18f42 207 *
Nicholas75179 0:fde420d18f42 208 */
Nicholas75179 0:fde420d18f42 209 bool Y_held();
Nicholas75179 0:fde420d18f42 210
Nicholas75179 0:fde420d18f42 211
Nicholas75179 0:fde420d18f42 212 /** Returns true if start has been pressed
Nicholas75179 0:fde420d18f42 213 * @returns a bool corresponding to start being pressed
Nicholas75179 0:fde420d18f42 214 */
Nicholas75179 0:fde420d18f42 215 bool start_pressed();
Nicholas75179 0:fde420d18f42 216
Nicholas75179 0:fde420d18f42 217 /** Returns true if start is held
Nicholas75179 0:fde420d18f42 218 * @returns a bool corresponding to start being held
Nicholas75179 0:fde420d18f42 219 *
Nicholas75179 0:fde420d18f42 220 */
Nicholas75179 0:fde420d18f42 221 bool start_held();
Nicholas75179 0:fde420d18f42 222
Nicholas75179 0:fde420d18f42 223
Nicholas75179 0:fde420d18f42 224
Nicholas75179 0:fde420d18f42 225
Nicholas75179 0:fde420d18f42 226 private:
Nicholas75179 0:fde420d18f42 227
Nicholas75179 0:fde420d18f42 228 void tone_off();
Nicholas75179 0:fde420d18f42 229 void flip_DAC();
Nicholas75179 0:fde420d18f42 230
Nicholas75179 0:fde420d18f42 231 volatile bool A_fall;
Nicholas75179 0:fde420d18f42 232 void A_fall_interrupt();
Nicholas75179 0:fde420d18f42 233
Nicholas75179 0:fde420d18f42 234 volatile bool B_fall;
Nicholas75179 0:fde420d18f42 235 void B_fall_interrupt();
Nicholas75179 0:fde420d18f42 236
Nicholas75179 0:fde420d18f42 237 volatile bool X_fall;
Nicholas75179 0:fde420d18f42 238 void X_fall_interrupt();
Nicholas75179 0:fde420d18f42 239
Nicholas75179 0:fde420d18f42 240 volatile bool Y_fall;
Nicholas75179 0:fde420d18f42 241 void Y_fall_interrupt();
Nicholas75179 0:fde420d18f42 242
Nicholas75179 0:fde420d18f42 243 volatile bool start_fall;
Nicholas75179 0:fde420d18f42 244 void start_fall_interrupt();
Nicholas75179 0:fde420d18f42 245
Nicholas75179 0:fde420d18f42 246
Nicholas75179 0:fde420d18f42 247
Nicholas75179 0:fde420d18f42 248
Nicholas75179 0:fde420d18f42 249 };
Nicholas75179 0:fde420d18f42 250
Nicholas75179 0:fde420d18f42 251 #endif