ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Sun Mar 10 14:20:56 2019 +0000
Revision:
0:d74302f8f847
initial commit

Who changed what in which revision?

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