Albert Tan-Mulligan / Mbed 2 deprecated ELEC2645_Project_el18ajst

Dependencies:   mbed

Committer:
Albutt
Date:
Fri May 22 14:58:55 2020 +0000
Revision:
6:546eba371942
Parent:
1:a52187d01a78
Enemies spawn with B button;

Who changed what in which revision?

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