Final Commit

Dependencies:   mbed

Committer:
JRM1986
Date:
Tue May 08 12:32:46 2018 +0000
Revision:
27:bd0f69a75d8b
Parent:
0:53ee0f689634
Final Commit

Who changed what in which revision?

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