![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Owen Cavender 201159294
Dependencies: mbed
Diff: Gamepad2/Gamepad.h
- Revision:
- 1:897160a1a3ae
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Gamepad2/Gamepad.h Tue May 26 12:17:59 2020 +0000 @@ -0,0 +1,374 @@ +#ifndef GAMEPAD_H +#define GAMEPAD_H + +#include <bitset> + +// Forward declaration of the classes that we use from the mbed library +// This avoids the need for us to include the huge mbed.h header inside our +// own library API +namespace mbed +{ +class AnalogIn; +class InterruptIn; +class PwmOut; +class AnalogOut; +class Ticker; +class Timeout; +} + +#define TOL 0.1f +#define RAD2DEG 57.2957795131f +#define PI 3.14159265359 + + +/** Enum for direction */ +enum Direction { + CENTRE, /**< joystick centred */ + N, /**< pushed North (0)*/ + NE, /**< pushed North-East (45) */ + E, /**< pushed East (90) */ + SE, /**< pushed South-East (135) */ + S, /**< pushed South (180) */ + SW, /**< pushed South-West (225) */ + W, /**< pushed West (270) */ + NW /**< pushed North-West (315) */ +}; + +/** Vector 2D struct */ +struct Vector2D { + float x; /**< float for x value */ + float y; /**< float for y value */ +}; + +/** Polar coordinate struct */ +struct Polar { + float mag; /**< float for magnitude */ + float angle; /**< float for angle (in degrees) */ +}; + +/** Gamepad Class + * @brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds + * @author Dr Craig A. Evans + * @author Dr Alex Valavanis + * @author Joshua Davy + */ +class Gamepad +{ + +private: + mbed::PwmOut *_led1; + mbed::PwmOut *_led2; + mbed::PwmOut *_led3; + mbed::PwmOut *_led4; + mbed::PwmOut *_led5; + mbed::PwmOut *_led6; + + mbed::InterruptIn *_button_A; + mbed::InterruptIn *_button_B; + mbed::InterruptIn *_button_X; + mbed::InterruptIn *_button_Y; + mbed::InterruptIn *_button_start; + + mbed::AnalogIn *_vert; + mbed::AnalogIn *_horiz; + + mbed::AnalogIn *_pot1; + mbed::AnalogIn *_pot2; + + mbed::AnalogOut *dac; + mbed::Ticker *ticker; + mbed::Timeout *timeout; + mbed::Timeout *note_timeout; + + // centred x,y values + float _x0; + float _y0; + + float *_sample_array; + const int *_notes; + const int *_durations; + + int _n; + int _melody_length; + volatile unsigned int _sample; + volatile unsigned int _note; + float _bpm; + bool _repeat; + + +public: + /** Constructor */ + Gamepad(); + + /** Initialise all peripherals and configure interrupts */ + void init(); + + /** Turn all LEDs on */ + void leds_on(); + + /** Turn all LEDs off */ + void leds_off(); + + /** Set all LEDs to duty-cycle + *@param value in range 0.0 to 1.0 + */ + void leds(float val) const; + + /** Set LED to duty-cycle + *@param led number (0 to 5) + *@param value in range 0.0 to 1.0 + */ + void led(int n,float val) const; + + /** Read potentiometer 1 value + *@returns potentiometer value in range 0.0 to 1.0 + */ + float read_pot1() const; + + /** Read potentiometer 2 value + *@returns potentiometer value in range 0.0 to 1.0 + */ + float read_pot2() const; + + /** Get magnitude of joystick movement + * @returns value in range 0.0 to 1.0 + */ + float get_mag(); + + /** Get angle of joystick movement + * @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central + */ + float get_angle(); + + /** Gets joystick direction + * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW, + */ + Direction get_direction(); // N,NE,E,SE etc. + + /** Gets raw cartesian co-ordinates of joystick + * @returns a struct with x,y members, each in the range 0.0 to 1.0 + */ + Vector2D get_coord(); // cartesian co-ordinates x,y + + /** Gets cartesian coordinates mapped to circular grid + * @returns a struct with x,y members, each in the range 0.0 to 1.0 + */ + Vector2D get_mapped_coord(); // x,y mapped to circle + + /** Gets polar coordinates of the joystick + * @returns a struct contains mag and angle + */ + Polar get_polar(); // mag and angle in struct form + + + /** Resets all button states. Useful for calling inbetween scenes + * where you do not want button presses from the previous scene effecting + * the current scene + */ + void reset_buttons(); + + /** Returns true if A has been pressed + * @returns a bool corresponding to A being pressed + */ + + bool A_pressed(); + + /** Returns true if A is held + * @returns a bool corresponding to A being held + * + */ + bool A_held(); + + + /** Returns true if B has been pressed + * @returns a bool corresponding to B being pressed + */ + bool B_pressed(); + + /** Returns true if B is held + * @returns a bool corresponding to B being held + * + */ + bool B_held(); + + /** Returns true if B has been pressed + * @returns a bool corresponding to B being pressed + */ + bool X_pressed(); + + /** Returns true if X is held + * @returns a bool corresponding to X being held + * + */ + bool X_held(); + + /** Returns true if Y has been pressed + * @returns a bool corresponding to Y being pressed + */ + bool Y_pressed(); + + /** Returns true if Y is held + * @returns a bool corresponding to Y being held + * + */ + bool Y_held(); + + + /** Returns true if start has been pressed + * @returns a bool corresponding to start being pressed + */ + bool start_pressed(); + + /** Returns true if start is held + * @returns a bool corresponding to start being held + * + */ + bool start_held(); + + /** Play a single tone for the specifed duration + *@param note frequency (in Hz) + *@param duration (in s) + */ + void tone(const float frequency,const float duration); + + /** Play a melody + *@param length of note array + *@param array of note frequencies (in Hz) - 0 treated as a rest + *@param array of note durations (4 corresponds to 1/4, 8 is 1/8 etc.) + *@param beats per minute + *@param whether to repeat or play just once + */ + void play_melody(int length,const int *notes,const int *durations,float bpm,bool repeat); + + /** Set the BPM of the melody + *@param beats per minute + */ + void set_bpm(float bpm); + + /** Write an analog voltage to the speaker + *@param voltage in range 0.0 to 1.0 (corresponds 0.0 to 3.3 V) + */ + void write_dac(float val); + + + + +private: + + volatile bool A_fall; + void A_fall_interrupt(); + + volatile bool B_fall; + void B_fall_interrupt(); + + volatile bool X_fall; + void X_fall_interrupt(); + + volatile bool Y_fall; + void Y_fall_interrupt(); + + volatile bool start_fall; + void start_fall_interrupt(); + + // Tone functions + void ticker_isr(); + void timeout_isr(); + void note_timeout_isr(); + void play_next_note(); + + + +}; + +// Note definitions from Arduino.cc +#define NOTE_B0 31 +#define NOTE_C1 33 +#define NOTE_CS1 35 +#define NOTE_D1 37 +#define NOTE_DS1 39 +#define NOTE_E1 41 +#define NOTE_F1 44 +#define NOTE_FS1 46 +#define NOTE_G1 49 +#define NOTE_GS1 52 +#define NOTE_A1 55 +#define NOTE_AS1 58 +#define NOTE_B1 62 +#define NOTE_C2 65 +#define NOTE_CS2 69 +#define NOTE_D2 73 +#define NOTE_DS2 78 +#define NOTE_E2 82 +#define NOTE_F2 87 +#define NOTE_FS2 93 +#define NOTE_G2 98 +#define NOTE_GS2 104 +#define NOTE_A2 110 +#define NOTE_AS2 117 +#define NOTE_B2 123 +#define NOTE_C3 131 +#define NOTE_CS3 139 +#define NOTE_D3 147 +#define NOTE_DS3 156 +#define NOTE_E3 165 +#define NOTE_F3 175 +#define NOTE_FS3 185 +#define NOTE_G3 196 +#define NOTE_GS3 208 +#define NOTE_A3 220 +#define NOTE_AS3 233 +#define NOTE_B3 247 +#define NOTE_C4 262 +#define NOTE_CS4 277 +#define NOTE_D4 294 +#define NOTE_DS4 311 +#define NOTE_E4 330 +#define NOTE_F4 349 +#define NOTE_FS4 370 +#define NOTE_G4 392 +#define NOTE_GS4 415 +#define NOTE_A4 440 +#define NOTE_AS4 466 +#define NOTE_B4 494 +#define NOTE_C5 523 +#define NOTE_CS5 554 +#define NOTE_D5 587 +#define NOTE_DS5 622 +#define NOTE_E5 659 +#define NOTE_F5 698 +#define NOTE_FS5 740 +#define NOTE_G5 784 +#define NOTE_GS5 831 +#define NOTE_A5 880 +#define NOTE_AS5 932 +#define NOTE_B5 988 +#define NOTE_C6 1047 +#define NOTE_CS6 1109 +#define NOTE_D6 1175 +#define NOTE_DS6 1245 +#define NOTE_E6 1319 +#define NOTE_F6 1397 +#define NOTE_FS6 1480 +#define NOTE_G6 1568 +#define NOTE_GS6 1661 +#define NOTE_A6 1760 +#define NOTE_AS6 1865 +#define NOTE_B6 1976 +#define NOTE_C7 2093 +#define NOTE_CS7 2217 +#define NOTE_D7 2349 +#define NOTE_DS7 2489 +#define NOTE_E7 2637 +#define NOTE_F7 2794 +#define NOTE_FS7 2960 +#define NOTE_G7 3136 +#define NOTE_GS7 3322 +#define NOTE_A7 3520 +#define NOTE_AS7 3729 +#define NOTE_B7 3951 +#define NOTE_C8 4186 +#define NOTE_CS8 4435 +#define NOTE_D8 4699 +#define NOTE_DS8 4978 + +#endif \ No newline at end of file