Project Submission (late)

Dependencies:   mbed

Committer:
el17tc
Date:
Fri May 10 14:52:28 2019 +0000
Revision:
3:83e79d31930c
Parent:
0:72f372170a73
final commit, API is added.; I'm not sure if there is a specific statement of academic integrity wanted but- I declare that this work is 100% my own, I have not plagiarised any work or attempted to fabricate any part of it for extra marks.

Who changed what in which revision?

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