Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Tue May 07 15:22:35 2019 +0000
Revision:
40:e3bbda7444fa
Parent:
2:ec89189860e0
The Final, Submission Version. I have read and agreed to the academic integrity. SID:201160286

Who changed what in which revision?

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