ELEC2645 (2017/18) / Mbed OS el16ajm
Committer:
Andrew_M
Date:
Mon Apr 16 08:42:04 2018 +0000
Revision:
0:66e5b37c127e
Initial commit

Who changed what in which revision?

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