This Class allows the joystick, buttons and petiometers to be implemented easily and coherently in other classes

Fork of Gamepad by Craig Evans

Committer:
domkay97
Date:
Wed Apr 12 22:19:48 2017 +0000
Revision:
21:99ec20695524
Child:
23:34da21dfdfd6
Moved methods from display to operator class

Who changed what in which revision?

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