N5110

Dependencies:   mbed

Committer:
aileen
Date:
Tue Apr 28 01:39:30 2020 +0000
Revision:
0:90b7f20b3a8d
N5110

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aileen 0:90b7f20b3a8d 1 #ifndef GAMEPAD_H
aileen 0:90b7f20b3a8d 2 #define GAMEPAD_H
aileen 0:90b7f20b3a8d 3
aileen 0:90b7f20b3a8d 4 #include <bitset>
aileen 0:90b7f20b3a8d 5
aileen 0:90b7f20b3a8d 6 // Forward declaration of the classes that we use from the mbed library
aileen 0:90b7f20b3a8d 7 // This avoids the need for us to include the huge mbed.h header inside our
aileen 0:90b7f20b3a8d 8 // own library API
aileen 0:90b7f20b3a8d 9 namespace mbed
aileen 0:90b7f20b3a8d 10 {
aileen 0:90b7f20b3a8d 11 class AnalogIn;
aileen 0:90b7f20b3a8d 12 class InterruptIn;
aileen 0:90b7f20b3a8d 13 class PwmOut;
aileen 0:90b7f20b3a8d 14 class Timeout;
aileen 0:90b7f20b3a8d 15 }
aileen 0:90b7f20b3a8d 16
aileen 0:90b7f20b3a8d 17 #define TOL 0.1f
aileen 0:90b7f20b3a8d 18 #define RAD2DEG 57.2957795131f
aileen 0:90b7f20b3a8d 19
aileen 0:90b7f20b3a8d 20 /** Enum for direction */
aileen 0:90b7f20b3a8d 21 enum Direction {
aileen 0:90b7f20b3a8d 22 CENTRE, /**< joystick centred */
aileen 0:90b7f20b3a8d 23 N, /**< pushed North (0)*/
aileen 0:90b7f20b3a8d 24 NE, /**< pushed North-East (45) */
aileen 0:90b7f20b3a8d 25 E, /**< pushed East (90) */
aileen 0:90b7f20b3a8d 26 SE, /**< pushed South-East (135) */
aileen 0:90b7f20b3a8d 27 S, /**< pushed South (180) */
aileen 0:90b7f20b3a8d 28 SW, /**< pushed South-West (225) */
aileen 0:90b7f20b3a8d 29 W, /**< pushed West (270) */
aileen 0:90b7f20b3a8d 30 NW /**< pushed North-West (315) */
aileen 0:90b7f20b3a8d 31 };
aileen 0:90b7f20b3a8d 32
aileen 0:90b7f20b3a8d 33 /** Vector 2D struct */
aileen 0:90b7f20b3a8d 34 struct Vector2D {
aileen 0:90b7f20b3a8d 35 float x; /**< float for x value */
aileen 0:90b7f20b3a8d 36 float y; /**< float for y value */
aileen 0:90b7f20b3a8d 37 };
aileen 0:90b7f20b3a8d 38
aileen 0:90b7f20b3a8d 39 /** Polar coordinate struct */
aileen 0:90b7f20b3a8d 40 struct Polar {
aileen 0:90b7f20b3a8d 41 float mag; /**< float for magnitude */
aileen 0:90b7f20b3a8d 42 float angle; /**< float for angle (in degrees) */
aileen 0:90b7f20b3a8d 43 };
aileen 0:90b7f20b3a8d 44
aileen 0:90b7f20b3a8d 45 /** Gamepad Class
aileen 0:90b7f20b3a8d 46 @brief Library for interfacing with ELEC2645 Gamepad PCB, University of Leeds
aileen 0:90b7f20b3a8d 47 @author Dr Craig A. Evans
aileen 0:90b7f20b3a8d 48 @author Dr Alex Valanvanis
aileen 0:90b7f20b3a8d 49 @date Febraury 2017
aileen 0:90b7f20b3a8d 50 */
aileen 0:90b7f20b3a8d 51 class Gamepad
aileen 0:90b7f20b3a8d 52 {
aileen 0:90b7f20b3a8d 53 public:
aileen 0:90b7f20b3a8d 54 /** Gamepad events
aileen 0:90b7f20b3a8d 55 * @brief List of events that can be registered on the gamepad
aileen 0:90b7f20b3a8d 56 */
aileen 0:90b7f20b3a8d 57 enum GamepadEvent {
aileen 0:90b7f20b3a8d 58 A_PRESSED, ///< Button A has been pressed
aileen 0:90b7f20b3a8d 59 B_PRESSED, ///< Button B has been pressed
aileen 0:90b7f20b3a8d 60 X_PRESSED, ///< Button X has been pressed
aileen 0:90b7f20b3a8d 61 Y_PRESSED, ///< Button Y has been pressed
aileen 0:90b7f20b3a8d 62 L_PRESSED, ///< Button L has been pressed
aileen 0:90b7f20b3a8d 63 R_PRESSED, ///< Button R has been pressed
aileen 0:90b7f20b3a8d 64 BACK_PRESSED, ///< Button "Back" has been pressed
aileen 0:90b7f20b3a8d 65 START_PRESSED, ///< Button "Start" has been pressed
aileen 0:90b7f20b3a8d 66 JOY_PRESSED, ///< Joystick button has been pressed
aileen 0:90b7f20b3a8d 67 N_EVENTS ///< A dummy flag that marks the end of the list
aileen 0:90b7f20b3a8d 68 };
aileen 0:90b7f20b3a8d 69 private:
aileen 0:90b7f20b3a8d 70 mbed::PwmOut *_led1;
aileen 0:90b7f20b3a8d 71 mbed::PwmOut *_led2;
aileen 0:90b7f20b3a8d 72 mbed::PwmOut *_led3;
aileen 0:90b7f20b3a8d 73 mbed::PwmOut *_led4;
aileen 0:90b7f20b3a8d 74 mbed::PwmOut *_led5;
aileen 0:90b7f20b3a8d 75 mbed::PwmOut *_led6;
aileen 0:90b7f20b3a8d 76
aileen 0:90b7f20b3a8d 77 mbed::InterruptIn *_button_A;
aileen 0:90b7f20b3a8d 78 mbed::InterruptIn *_button_B;
aileen 0:90b7f20b3a8d 79 mbed::InterruptIn *_button_X;
aileen 0:90b7f20b3a8d 80 mbed::InterruptIn *_button_Y;
aileen 0:90b7f20b3a8d 81 mbed::InterruptIn *_button_L;
aileen 0:90b7f20b3a8d 82 mbed::InterruptIn *_button_R;
aileen 0:90b7f20b3a8d 83 mbed::InterruptIn *_button_back;
aileen 0:90b7f20b3a8d 84 mbed::InterruptIn *_button_start;
aileen 0:90b7f20b3a8d 85 mbed::InterruptIn *_button_joystick;
aileen 0:90b7f20b3a8d 86
aileen 0:90b7f20b3a8d 87 mbed::AnalogIn *_vert;
aileen 0:90b7f20b3a8d 88 mbed::AnalogIn *_horiz;
aileen 0:90b7f20b3a8d 89
aileen 0:90b7f20b3a8d 90 mbed::PwmOut *_buzzer;
aileen 0:90b7f20b3a8d 91 mbed::AnalogIn *_pot;
aileen 0:90b7f20b3a8d 92
aileen 0:90b7f20b3a8d 93 mbed::Timeout *_timeout;
aileen 0:90b7f20b3a8d 94
aileen 0:90b7f20b3a8d 95 std::bitset<N_EVENTS> _event_state; ///< A binary list of buttons that has been pressed
aileen 0:90b7f20b3a8d 96
aileen 0:90b7f20b3a8d 97 // centred x,y values
aileen 0:90b7f20b3a8d 98 float _x0;
aileen 0:90b7f20b3a8d 99 float _y0;
aileen 0:90b7f20b3a8d 100
aileen 0:90b7f20b3a8d 101 public:
aileen 0:90b7f20b3a8d 102
aileen 0:90b7f20b3a8d 103 /** Constructor */
aileen 0:90b7f20b3a8d 104 Gamepad();
aileen 0:90b7f20b3a8d 105
aileen 0:90b7f20b3a8d 106 /** Destructor */
aileen 0:90b7f20b3a8d 107 ~Gamepad();
aileen 0:90b7f20b3a8d 108
aileen 0:90b7f20b3a8d 109 /** Initialise all peripherals and configure interrupts */
aileen 0:90b7f20b3a8d 110 void init();
aileen 0:90b7f20b3a8d 111
aileen 0:90b7f20b3a8d 112 /** Turn all LEDs on */
aileen 0:90b7f20b3a8d 113 void leds_on();
aileen 0:90b7f20b3a8d 114
aileen 0:90b7f20b3a8d 115 /** Turn all LEDs off */
aileen 0:90b7f20b3a8d 116 void leds_off();
aileen 0:90b7f20b3a8d 117
aileen 0:90b7f20b3a8d 118 /** Set all LEDs to duty-cycle
aileen 0:90b7f20b3a8d 119 *@param value in range 0.0 to 1.0
aileen 0:90b7f20b3a8d 120 */
aileen 0:90b7f20b3a8d 121 void leds(float val) const;
aileen 0:90b7f20b3a8d 122
aileen 0:90b7f20b3a8d 123 /** Set LED to duty-cycle
aileen 0:90b7f20b3a8d 124 *@param led number (0 to 5)
aileen 0:90b7f20b3a8d 125 *@param value in range 0.0 to 1.0
aileen 0:90b7f20b3a8d 126 */
aileen 0:90b7f20b3a8d 127 void led(int n,float val) const;
aileen 0:90b7f20b3a8d 128
aileen 0:90b7f20b3a8d 129 /** Read potentiometer
aileen 0:90b7f20b3a8d 130 *@returns potentiometer value in range 0.0 to 1.0
aileen 0:90b7f20b3a8d 131 */
aileen 0:90b7f20b3a8d 132 float read_pot() const;
aileen 0:90b7f20b3a8d 133
aileen 0:90b7f20b3a8d 134 /** Play tone on piezo
aileen 0:90b7f20b3a8d 135 * @param frequency in Hz
aileen 0:90b7f20b3a8d 136 * @param duration of tone in seconds
aileen 0:90b7f20b3a8d 137 */
aileen 0:90b7f20b3a8d 138 void tone(float frequency, float duration);
aileen 0:90b7f20b3a8d 139
aileen 0:90b7f20b3a8d 140 /**
aileen 0:90b7f20b3a8d 141 * @brief Check whether an event flag has been set and clear it
aileen 0:90b7f20b3a8d 142 * @param id[in] The ID of the event to test
aileen 0:90b7f20b3a8d 143 * @return true if the event occurred
aileen 0:90b7f20b3a8d 144 */
aileen 0:90b7f20b3a8d 145 bool check_event(GamepadEvent const id);
aileen 0:90b7f20b3a8d 146
aileen 0:90b7f20b3a8d 147 /** Get magnitude of joystick movement
aileen 0:90b7f20b3a8d 148 * @returns value in range 0.0 to 1.0
aileen 0:90b7f20b3a8d 149 */
aileen 0:90b7f20b3a8d 150
aileen 0:90b7f20b3a8d 151 float get_mag();
aileen 0:90b7f20b3a8d 152
aileen 0:90b7f20b3a8d 153 /** Get angle of joystick movement
aileen 0:90b7f20b3a8d 154 * @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central
aileen 0:90b7f20b3a8d 155 */
aileen 0:90b7f20b3a8d 156 float get_angle();
aileen 0:90b7f20b3a8d 157
aileen 0:90b7f20b3a8d 158 /** Gets joystick direction
aileen 0:90b7f20b3a8d 159 * @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
aileen 0:90b7f20b3a8d 160 */
aileen 0:90b7f20b3a8d 161 Direction get_direction(); // N,NE,E,SE etc.
aileen 0:90b7f20b3a8d 162
aileen 0:90b7f20b3a8d 163 /** Gets raw cartesian co-ordinates of joystick
aileen 0:90b7f20b3a8d 164 * @returns a struct with x,y members, each in the range 0.0 to 1.0
aileen 0:90b7f20b3a8d 165 */
aileen 0:90b7f20b3a8d 166 Vector2D get_coord(); // cartesian co-ordinates x,y
aileen 0:90b7f20b3a8d 167
aileen 0:90b7f20b3a8d 168 /** Gets cartesian coordinates mapped to circular grid
aileen 0:90b7f20b3a8d 169 * @returns a struct with x,y members, each in the range 0.0 to 1.0
aileen 0:90b7f20b3a8d 170 */
aileen 0:90b7f20b3a8d 171 Vector2D get_mapped_coord(); // x,y mapped to circle
aileen 0:90b7f20b3a8d 172
aileen 0:90b7f20b3a8d 173 /** Gets polar coordinates of the joystick
aileen 0:90b7f20b3a8d 174 * @returns a struct contains mag and angle
aileen 0:90b7f20b3a8d 175 */
aileen 0:90b7f20b3a8d 176 Polar get_polar(); // mag and angle in struct form
aileen 0:90b7f20b3a8d 177
aileen 0:90b7f20b3a8d 178 private:
aileen 0:90b7f20b3a8d 179 void init_buttons();
aileen 0:90b7f20b3a8d 180 void tone_off();
aileen 0:90b7f20b3a8d 181
aileen 0:90b7f20b3a8d 182 void a_isr();
aileen 0:90b7f20b3a8d 183 void b_isr();
aileen 0:90b7f20b3a8d 184 void x_isr();
aileen 0:90b7f20b3a8d 185 void y_isr();
aileen 0:90b7f20b3a8d 186 void l_isr();
aileen 0:90b7f20b3a8d 187 void r_isr();
aileen 0:90b7f20b3a8d 188 void back_isr();
aileen 0:90b7f20b3a8d 189 void start_isr();
aileen 0:90b7f20b3a8d 190 void joy_isr();
aileen 0:90b7f20b3a8d 191 };
aileen 0:90b7f20b3a8d 192
aileen 0:90b7f20b3a8d 193 #endif