ELEC2645 (2018/19) / Mbed 2 deprecated el17kz

Dependencies:   mbed

Committer:
kamtas
Date:
Tue May 07 19:09:03 2019 +0000
Revision:
0:1e61ade20a23
Child:
2:1900a4144537
initial commit

Who changed what in which revision?

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