Example Pong game for mbed.

Dependencies:   mbed

Committer:
valavanisalex
Date:
Tue Apr 17 08:00:08 2018 +0000
Revision:
11:1447cb7dce3c
Parent:
5:3c9407e2fe55
Correct type error and add documentation

Who changed what in which revision?

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