Final Submission. I have read and agreed with Statement of Academic Integrity.

Dependencies:   mbed

Committer:
eencae
Date:
Fri Jan 31 12:32:38 2020 +0000
Revision:
0:7423345f87c5
Pong ported to Gamepad2;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:7423345f87c5 1 #ifndef GAMEPAD_H
eencae 0:7423345f87c5 2 #define GAMEPAD_H
eencae 0:7423345f87c5 3
eencae 0:7423345f87c5 4 #include <bitset>
eencae 0:7423345f87c5 5
eencae 0:7423345f87c5 6 // Forward declaration of the classes that we use from the mbed library
eencae 0:7423345f87c5 7 // This avoids the need for us to include the huge mbed.h header inside our
eencae 0:7423345f87c5 8 // own library API
eencae 0:7423345f87c5 9 namespace mbed
eencae 0:7423345f87c5 10 {
eencae 0:7423345f87c5 11 class AnalogIn;
eencae 0:7423345f87c5 12 class InterruptIn;
eencae 0:7423345f87c5 13 class PwmOut;
eencae 0:7423345f87c5 14 class AnalogOut;
eencae 0:7423345f87c5 15 class Ticker;
eencae 0:7423345f87c5 16 class Timeout;
eencae 0:7423345f87c5 17 }
eencae 0:7423345f87c5 18
eencae 0:7423345f87c5 19 #define TOL 0.1f
eencae 0:7423345f87c5 20 #define RAD2DEG 57.2957795131f
eencae 0:7423345f87c5 21 #define PI 3.14159265359
eencae 0:7423345f87c5 22
eencae 0:7423345f87c5 23
eencae 0:7423345f87c5 24 /** Enum for direction */
eencae 0:7423345f87c5 25 enum Direction {
eencae 0:7423345f87c5 26 CENTRE, /**< joystick centred */
eencae 0:7423345f87c5 27 N, /**< pushed North (0)*/
eencae 0:7423345f87c5 28 NE, /**< pushed North-East (45) */
eencae 0:7423345f87c5 29 E, /**< pushed East (90) */
eencae 0:7423345f87c5 30 SE, /**< pushed South-East (135) */
eencae 0:7423345f87c5 31 S, /**< pushed South (180) */
eencae 0:7423345f87c5 32 SW, /**< pushed South-West (225) */
eencae 0:7423345f87c5 33 W, /**< pushed West (270) */
eencae 0:7423345f87c5 34 NW /**< pushed North-West (315) */
eencae 0:7423345f87c5 35 };
eencae 0:7423345f87c5 36
eencae 0:7423345f87c5 37 /** Vector 2D struct */
eencae 0:7423345f87c5 38 struct Vector2D {
eencae 0:7423345f87c5 39 float x; /**< float for x value */
eencae 0:7423345f87c5 40 float y; /**< float for y value */
eencae 0:7423345f87c5 41 };
eencae 0:7423345f87c5 42
eencae 0:7423345f87c5 43 /** Polar coordinate struct */
eencae 0:7423345f87c5 44 struct Polar {
eencae 0:7423345f87c5 45 float mag; /**< float for magnitude */
eencae 0:7423345f87c5 46 float angle; /**< float for angle (in degrees) */
eencae 0:7423345f87c5 47 };
eencae 0:7423345f87c5 48
eencae 0:7423345f87c5 49 /** Gamepad Class
eencae 0:7423345f87c5 50 * @brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds
eencae 0:7423345f87c5 51 * @author Dr Craig A. Evans
eencae 0:7423345f87c5 52 * @author Dr Alex Valavanis
eencae 0:7423345f87c5 53 * @author Joshua Davy
eencae 0:7423345f87c5 54 */
eencae 0:7423345f87c5 55 class Gamepad
eencae 0:7423345f87c5 56 {
eencae 0:7423345f87c5 57
eencae 0:7423345f87c5 58 private:
eencae 0:7423345f87c5 59 mbed::PwmOut *_led1;
eencae 0:7423345f87c5 60 mbed::PwmOut *_led2;
eencae 0:7423345f87c5 61 mbed::PwmOut *_led3;
eencae 0:7423345f87c5 62 mbed::PwmOut *_led4;
eencae 0:7423345f87c5 63 mbed::PwmOut *_led5;
eencae 0:7423345f87c5 64 mbed::PwmOut *_led6;
eencae 0:7423345f87c5 65
eencae 0:7423345f87c5 66 mbed::InterruptIn *_button_A;
eencae 0:7423345f87c5 67 mbed::InterruptIn *_button_B;
eencae 0:7423345f87c5 68 mbed::InterruptIn *_button_X;
eencae 0:7423345f87c5 69 mbed::InterruptIn *_button_Y;
eencae 0:7423345f87c5 70 mbed::InterruptIn *_button_start;
eencae 0:7423345f87c5 71
eencae 0:7423345f87c5 72 mbed::AnalogIn *_vert;
eencae 0:7423345f87c5 73 mbed::AnalogIn *_horiz;
eencae 0:7423345f87c5 74
eencae 0:7423345f87c5 75 mbed::AnalogIn *_pot1;
eencae 0:7423345f87c5 76 mbed::AnalogIn *_pot2;
eencae 0:7423345f87c5 77
eencae 0:7423345f87c5 78 mbed::AnalogOut *dac;
eencae 0:7423345f87c5 79 mbed::Ticker *ticker;
eencae 0:7423345f87c5 80 mbed::Timeout *timeout;
eencae 0:7423345f87c5 81 mbed::Timeout *note_timeout;
eencae 0:7423345f87c5 82
eencae 0:7423345f87c5 83 // centred x,y values
eencae 0:7423345f87c5 84 float _x0;
eencae 0:7423345f87c5 85 float _y0;
eencae 0:7423345f87c5 86
eencae 0:7423345f87c5 87 float *_sample_array;
eencae 0:7423345f87c5 88 const int *_notes;
eencae 0:7423345f87c5 89 const int *_durations;
eencae 0:7423345f87c5 90
eencae 0:7423345f87c5 91 int _n;
eencae 0:7423345f87c5 92 int _melody_length;
eencae 0:7423345f87c5 93 volatile unsigned int _sample;
eencae 0:7423345f87c5 94 volatile unsigned int _note;
eencae 0:7423345f87c5 95 float _bpm;
eencae 0:7423345f87c5 96 bool _repeat;
eencae 0:7423345f87c5 97
eencae 0:7423345f87c5 98
eencae 0:7423345f87c5 99 public:
eencae 0:7423345f87c5 100 /** Constructor */
eencae 0:7423345f87c5 101 Gamepad();
eencae 0:7423345f87c5 102
eencae 0:7423345f87c5 103 /** Initialise all peripherals and configure interrupts */
eencae 0:7423345f87c5 104 void init();
eencae 0:7423345f87c5 105
eencae 0:7423345f87c5 106 /** Turn all LEDs on */
eencae 0:7423345f87c5 107 void leds_on();
eencae 0:7423345f87c5 108
eencae 0:7423345f87c5 109 /** Turn all LEDs off */
eencae 0:7423345f87c5 110 void leds_off();
eencae 0:7423345f87c5 111
eencae 0:7423345f87c5 112 /** Set all LEDs to duty-cycle
eencae 0:7423345f87c5 113 *@param value in range 0.0 to 1.0
eencae 0:7423345f87c5 114 */
eencae 0:7423345f87c5 115 void leds(float val) const;
eencae 0:7423345f87c5 116
eencae 0:7423345f87c5 117 /** Set LED to duty-cycle
eencae 0:7423345f87c5 118 *@param led number (0 to 5)
eencae 0:7423345f87c5 119 *@param value in range 0.0 to 1.0
eencae 0:7423345f87c5 120 */
eencae 0:7423345f87c5 121 void led(int n,float val) const;
eencae 0:7423345f87c5 122
eencae 0:7423345f87c5 123 /** Read potentiometer 1 value
eencae 0:7423345f87c5 124 *@returns potentiometer value in range 0.0 to 1.0
eencae 0:7423345f87c5 125 */
eencae 0:7423345f87c5 126 float read_pot1() const;
eencae 0:7423345f87c5 127
eencae 0:7423345f87c5 128 /** Read potentiometer 2 value
eencae 0:7423345f87c5 129 *@returns potentiometer value in range 0.0 to 1.0
eencae 0:7423345f87c5 130 */
eencae 0:7423345f87c5 131 float read_pot2() const;
eencae 0:7423345f87c5 132
eencae 0:7423345f87c5 133 /** Get magnitude of joystick movement
eencae 0:7423345f87c5 134 * @returns value in range 0.0 to 1.0
eencae 0:7423345f87c5 135 */
eencae 0:7423345f87c5 136 float get_mag();
eencae 0:7423345f87c5 137
eencae 0:7423345f87c5 138 /** Get angle of joystick movement
eencae 0:7423345f87c5 139 * @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central
eencae 0:7423345f87c5 140 */
eencae 0:7423345f87c5 141 float get_angle();
eencae 0:7423345f87c5 142
eencae 0:7423345f87c5 143 /** Gets joystick direction
eencae 0:7423345f87c5 144 * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
eencae 0:7423345f87c5 145 */
eencae 0:7423345f87c5 146 Direction get_direction(); // N,NE,E,SE etc.
eencae 0:7423345f87c5 147
eencae 0:7423345f87c5 148 /** Gets raw cartesian co-ordinates of joystick
eencae 0:7423345f87c5 149 * @returns a struct with x,y members, each in the range 0.0 to 1.0
eencae 0:7423345f87c5 150 */
eencae 0:7423345f87c5 151 Vector2D get_coord(); // cartesian co-ordinates x,y
eencae 0:7423345f87c5 152
eencae 0:7423345f87c5 153 /** Gets cartesian coordinates mapped to circular grid
eencae 0:7423345f87c5 154 * @returns a struct with x,y members, each in the range 0.0 to 1.0
eencae 0:7423345f87c5 155 */
eencae 0:7423345f87c5 156 Vector2D get_mapped_coord(); // x,y mapped to circle
eencae 0:7423345f87c5 157
eencae 0:7423345f87c5 158 /** Gets polar coordinates of the joystick
eencae 0:7423345f87c5 159 * @returns a struct contains mag and angle
eencae 0:7423345f87c5 160 */
eencae 0:7423345f87c5 161 Polar get_polar(); // mag and angle in struct form
eencae 0:7423345f87c5 162
eencae 0:7423345f87c5 163
eencae 0:7423345f87c5 164 /** Resets all button states. Useful for calling inbetween scenes
eencae 0:7423345f87c5 165 * where you do not want button presses from the previous scene effecting
eencae 0:7423345f87c5 166 * the current scene
eencae 0:7423345f87c5 167 */
eencae 0:7423345f87c5 168 void reset_buttons();
eencae 0:7423345f87c5 169
eencae 0:7423345f87c5 170 /** Returns true if A has been pressed
eencae 0:7423345f87c5 171 * @returns a bool corresponding to A being pressed
eencae 0:7423345f87c5 172 */
eencae 0:7423345f87c5 173
eencae 0:7423345f87c5 174 bool A_pressed();
eencae 0:7423345f87c5 175
eencae 0:7423345f87c5 176 /** Returns true if A is held
eencae 0:7423345f87c5 177 * @returns a bool corresponding to A being held
eencae 0:7423345f87c5 178 *
eencae 0:7423345f87c5 179 */
eencae 0:7423345f87c5 180 bool A_held();
eencae 0:7423345f87c5 181
eencae 0:7423345f87c5 182
eencae 0:7423345f87c5 183 /** Returns true if B has been pressed
eencae 0:7423345f87c5 184 * @returns a bool corresponding to B being pressed
eencae 0:7423345f87c5 185 */
eencae 0:7423345f87c5 186 bool B_pressed();
eencae 0:7423345f87c5 187
eencae 0:7423345f87c5 188 /** Returns true if B is held
eencae 0:7423345f87c5 189 * @returns a bool corresponding to B being held
eencae 0:7423345f87c5 190 *
eencae 0:7423345f87c5 191 */
eencae 0:7423345f87c5 192 bool B_held();
eencae 0:7423345f87c5 193
eencae 0:7423345f87c5 194 /** Returns true if B has been pressed
eencae 0:7423345f87c5 195 * @returns a bool corresponding to B being pressed
eencae 0:7423345f87c5 196 */
eencae 0:7423345f87c5 197 bool X_pressed();
eencae 0:7423345f87c5 198
eencae 0:7423345f87c5 199 /** Returns true if X is held
eencae 0:7423345f87c5 200 * @returns a bool corresponding to X being held
eencae 0:7423345f87c5 201 *
eencae 0:7423345f87c5 202 */
eencae 0:7423345f87c5 203 bool X_held();
eencae 0:7423345f87c5 204
eencae 0:7423345f87c5 205 /** Returns true if Y has been pressed
eencae 0:7423345f87c5 206 * @returns a bool corresponding to Y being pressed
eencae 0:7423345f87c5 207 */
eencae 0:7423345f87c5 208 bool Y_pressed();
eencae 0:7423345f87c5 209
eencae 0:7423345f87c5 210 /** Returns true if Y is held
eencae 0:7423345f87c5 211 * @returns a bool corresponding to Y being held
eencae 0:7423345f87c5 212 *
eencae 0:7423345f87c5 213 */
eencae 0:7423345f87c5 214 bool Y_held();
eencae 0:7423345f87c5 215
eencae 0:7423345f87c5 216
eencae 0:7423345f87c5 217 /** Returns true if start has been pressed
eencae 0:7423345f87c5 218 * @returns a bool corresponding to start being pressed
eencae 0:7423345f87c5 219 */
eencae 0:7423345f87c5 220 bool start_pressed();
eencae 0:7423345f87c5 221
eencae 0:7423345f87c5 222 /** Returns true if start is held
eencae 0:7423345f87c5 223 * @returns a bool corresponding to start being held
eencae 0:7423345f87c5 224 *
eencae 0:7423345f87c5 225 */
eencae 0:7423345f87c5 226 bool start_held();
eencae 0:7423345f87c5 227
eencae 0:7423345f87c5 228 /** Play a single tone for the specifed duration
eencae 0:7423345f87c5 229 *@param note frequency (in Hz)
eencae 0:7423345f87c5 230 *@param duration (in s)
eencae 0:7423345f87c5 231 */
eencae 0:7423345f87c5 232 void tone(const float frequency,const float duration);
eencae 0:7423345f87c5 233
eencae 0:7423345f87c5 234 /** Play a melody
eencae 0:7423345f87c5 235 *@param length of note array
eencae 0:7423345f87c5 236 *@param array of note frequencies (in Hz) - 0 treated as a rest
eencae 0:7423345f87c5 237 *@param array of note durations (4 corresponds to 1/4, 8 is 1/8 etc.)
eencae 0:7423345f87c5 238 *@param beats per minute
eencae 0:7423345f87c5 239 *@param whether to repeat or play just once
eencae 0:7423345f87c5 240 */
eencae 0:7423345f87c5 241 void play_melody(int length,const int *notes,const int *durations,float bpm,bool repeat);
eencae 0:7423345f87c5 242
eencae 0:7423345f87c5 243 /** Set the BPM of the melody
eencae 0:7423345f87c5 244 *@param beats per minute
eencae 0:7423345f87c5 245 */
eencae 0:7423345f87c5 246 void set_bpm(float bpm);
eencae 0:7423345f87c5 247
eencae 0:7423345f87c5 248 /** Write an analog voltage to the speaker
eencae 0:7423345f87c5 249 *@param voltage in range 0.0 to 1.0 (corresponds 0.0 to 3.3 V)
eencae 0:7423345f87c5 250 */
eencae 0:7423345f87c5 251 void write_dac(float val);
eencae 0:7423345f87c5 252
eencae 0:7423345f87c5 253
eencae 0:7423345f87c5 254
eencae 0:7423345f87c5 255
eencae 0:7423345f87c5 256 private:
eencae 0:7423345f87c5 257
eencae 0:7423345f87c5 258 volatile bool A_fall;
eencae 0:7423345f87c5 259 void A_fall_interrupt();
eencae 0:7423345f87c5 260
eencae 0:7423345f87c5 261 volatile bool B_fall;
eencae 0:7423345f87c5 262 void B_fall_interrupt();
eencae 0:7423345f87c5 263
eencae 0:7423345f87c5 264 volatile bool X_fall;
eencae 0:7423345f87c5 265 void X_fall_interrupt();
eencae 0:7423345f87c5 266
eencae 0:7423345f87c5 267 volatile bool Y_fall;
eencae 0:7423345f87c5 268 void Y_fall_interrupt();
eencae 0:7423345f87c5 269
eencae 0:7423345f87c5 270 volatile bool start_fall;
eencae 0:7423345f87c5 271 void start_fall_interrupt();
eencae 0:7423345f87c5 272
eencae 0:7423345f87c5 273 // Tone functions
eencae 0:7423345f87c5 274 void ticker_isr();
eencae 0:7423345f87c5 275 void timeout_isr();
eencae 0:7423345f87c5 276 void note_timeout_isr();
eencae 0:7423345f87c5 277 void play_next_note();
eencae 0:7423345f87c5 278
eencae 0:7423345f87c5 279
eencae 0:7423345f87c5 280
eencae 0:7423345f87c5 281 };
eencae 0:7423345f87c5 282
eencae 0:7423345f87c5 283 // Note definitions from Arduino.cc
eencae 0:7423345f87c5 284 #define NOTE_B0 31
eencae 0:7423345f87c5 285 #define NOTE_C1 33
eencae 0:7423345f87c5 286 #define NOTE_CS1 35
eencae 0:7423345f87c5 287 #define NOTE_D1 37
eencae 0:7423345f87c5 288 #define NOTE_DS1 39
eencae 0:7423345f87c5 289 #define NOTE_E1 41
eencae 0:7423345f87c5 290 #define NOTE_F1 44
eencae 0:7423345f87c5 291 #define NOTE_FS1 46
eencae 0:7423345f87c5 292 #define NOTE_G1 49
eencae 0:7423345f87c5 293 #define NOTE_GS1 52
eencae 0:7423345f87c5 294 #define NOTE_A1 55
eencae 0:7423345f87c5 295 #define NOTE_AS1 58
eencae 0:7423345f87c5 296 #define NOTE_B1 62
eencae 0:7423345f87c5 297 #define NOTE_C2 65
eencae 0:7423345f87c5 298 #define NOTE_CS2 69
eencae 0:7423345f87c5 299 #define NOTE_D2 73
eencae 0:7423345f87c5 300 #define NOTE_DS2 78
eencae 0:7423345f87c5 301 #define NOTE_E2 82
eencae 0:7423345f87c5 302 #define NOTE_F2 87
eencae 0:7423345f87c5 303 #define NOTE_FS2 93
eencae 0:7423345f87c5 304 #define NOTE_G2 98
eencae 0:7423345f87c5 305 #define NOTE_GS2 104
eencae 0:7423345f87c5 306 #define NOTE_A2 110
eencae 0:7423345f87c5 307 #define NOTE_AS2 117
eencae 0:7423345f87c5 308 #define NOTE_B2 123
eencae 0:7423345f87c5 309 #define NOTE_C3 131
eencae 0:7423345f87c5 310 #define NOTE_CS3 139
eencae 0:7423345f87c5 311 #define NOTE_D3 147
eencae 0:7423345f87c5 312 #define NOTE_DS3 156
eencae 0:7423345f87c5 313 #define NOTE_E3 165
eencae 0:7423345f87c5 314 #define NOTE_F3 175
eencae 0:7423345f87c5 315 #define NOTE_FS3 185
eencae 0:7423345f87c5 316 #define NOTE_G3 196
eencae 0:7423345f87c5 317 #define NOTE_GS3 208
eencae 0:7423345f87c5 318 #define NOTE_A3 220
eencae 0:7423345f87c5 319 #define NOTE_AS3 233
eencae 0:7423345f87c5 320 #define NOTE_B3 247
eencae 0:7423345f87c5 321 #define NOTE_C4 262
eencae 0:7423345f87c5 322 #define NOTE_CS4 277
eencae 0:7423345f87c5 323 #define NOTE_D4 294
eencae 0:7423345f87c5 324 #define NOTE_DS4 311
eencae 0:7423345f87c5 325 #define NOTE_E4 330
eencae 0:7423345f87c5 326 #define NOTE_F4 349
eencae 0:7423345f87c5 327 #define NOTE_FS4 370
eencae 0:7423345f87c5 328 #define NOTE_G4 392
eencae 0:7423345f87c5 329 #define NOTE_GS4 415
eencae 0:7423345f87c5 330 #define NOTE_A4 440
eencae 0:7423345f87c5 331 #define NOTE_AS4 466
eencae 0:7423345f87c5 332 #define NOTE_B4 494
eencae 0:7423345f87c5 333 #define NOTE_C5 523
eencae 0:7423345f87c5 334 #define NOTE_CS5 554
eencae 0:7423345f87c5 335 #define NOTE_D5 587
eencae 0:7423345f87c5 336 #define NOTE_DS5 622
eencae 0:7423345f87c5 337 #define NOTE_E5 659
eencae 0:7423345f87c5 338 #define NOTE_F5 698
eencae 0:7423345f87c5 339 #define NOTE_FS5 740
eencae 0:7423345f87c5 340 #define NOTE_G5 784
eencae 0:7423345f87c5 341 #define NOTE_GS5 831
eencae 0:7423345f87c5 342 #define NOTE_A5 880
eencae 0:7423345f87c5 343 #define NOTE_AS5 932
eencae 0:7423345f87c5 344 #define NOTE_B5 988
eencae 0:7423345f87c5 345 #define NOTE_C6 1047
eencae 0:7423345f87c5 346 #define NOTE_CS6 1109
eencae 0:7423345f87c5 347 #define NOTE_D6 1175
eencae 0:7423345f87c5 348 #define NOTE_DS6 1245
eencae 0:7423345f87c5 349 #define NOTE_E6 1319
eencae 0:7423345f87c5 350 #define NOTE_F6 1397
eencae 0:7423345f87c5 351 #define NOTE_FS6 1480
eencae 0:7423345f87c5 352 #define NOTE_G6 1568
eencae 0:7423345f87c5 353 #define NOTE_GS6 1661
eencae 0:7423345f87c5 354 #define NOTE_A6 1760
eencae 0:7423345f87c5 355 #define NOTE_AS6 1865
eencae 0:7423345f87c5 356 #define NOTE_B6 1976
eencae 0:7423345f87c5 357 #define NOTE_C7 2093
eencae 0:7423345f87c5 358 #define NOTE_CS7 2217
eencae 0:7423345f87c5 359 #define NOTE_D7 2349
eencae 0:7423345f87c5 360 #define NOTE_DS7 2489
eencae 0:7423345f87c5 361 #define NOTE_E7 2637
eencae 0:7423345f87c5 362 #define NOTE_F7 2794
eencae 0:7423345f87c5 363 #define NOTE_FS7 2960
eencae 0:7423345f87c5 364 #define NOTE_G7 3136
eencae 0:7423345f87c5 365 #define NOTE_GS7 3322
eencae 0:7423345f87c5 366 #define NOTE_A7 3520
eencae 0:7423345f87c5 367 #define NOTE_AS7 3729
eencae 0:7423345f87c5 368 #define NOTE_B7 3951
eencae 0:7423345f87c5 369 #define NOTE_C8 4186
eencae 0:7423345f87c5 370 #define NOTE_CS8 4435
eencae 0:7423345f87c5 371 #define NOTE_D8 4699
eencae 0:7423345f87c5 372 #define NOTE_DS8 4978
eencae 0:7423345f87c5 373
eencae 0:7423345f87c5 374 #endif