Zeyu Feng 201377605

Dependencies:   mbed

On Minerva

Committer:
el19zf
Date:
Fri May 22 16:07:02 2020 +0000
Revision:
22:cded0cd8e1c9
Parent:
1:b133934e0d45
Final Submission. I have read and agreed with Statement of Academic Integrity.

Who changed what in which revision?

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