ELEC2645 (2018/19) / Mbed 2 deprecated 2645_Project_SiutingWong201186503

Dependencies:   mbed

Committer:
davidwst421
Date:
Wed May 08 18:50:21 2019 +0000
Revision:
0:fd8eda608206
12

Who changed what in which revision?

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