Class used to interface with the handheld gamepad.

Fork of Gamepad by Craig Evans

Committer:
eencae
Date:
Tue Feb 07 10:53:46 2017 +0000
Revision:
8:7eaf26f4b5f2
Parent:
6:b1c3dfe67f7d
Child:
9:893189072e89
Added documentation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 8:7eaf26f4b5f2 1 /**
eencae 8:7eaf26f4b5f2 2 @file Gamepad.h
eencae 8:7eaf26f4b5f2 3
eencae 8:7eaf26f4b5f2 4 @brief Library for interfacing with ELEC2645 Gamepad PCB
eencae 8:7eaf26f4b5f2 5 @brief University of Leeds
eencae 8:7eaf26f4b5f2 6
eencae 8:7eaf26f4b5f2 7 @author Dr Craig A. Evans
eencae 8:7eaf26f4b5f2 8 @date Febraury 2017
eencae 8:7eaf26f4b5f2 9
eencae 8:7eaf26f4b5f2 10 */
eencae 8:7eaf26f4b5f2 11
eencae 0:a6288c29b936 12 #ifndef GAMEPAD_H
eencae 0:a6288c29b936 13 #define GAMEPAD_H
eencae 0:a6288c29b936 14
eencae 0:a6288c29b936 15 #include "mbed.h"
eencae 3:964a6d95acdd 16
eencae 3:964a6d95acdd 17 #define TOL 0.1f
eencae 3:964a6d95acdd 18 #define RAD2DEG 57.2957795131f
eencae 3:964a6d95acdd 19
eencae 3:964a6d95acdd 20 enum Direction {
eencae 3:964a6d95acdd 21 CENTRE, // 0
eencae 3:964a6d95acdd 22 N, // 1
eencae 3:964a6d95acdd 23 NE, // 2
eencae 3:964a6d95acdd 24 E, // 3
eencae 3:964a6d95acdd 25 SE, // 4
eencae 3:964a6d95acdd 26 S, // 5
eencae 3:964a6d95acdd 27 SW, // 6
eencae 3:964a6d95acdd 28 W, // 7
eencae 3:964a6d95acdd 29 NW // 8
eencae 3:964a6d95acdd 30 };
eencae 3:964a6d95acdd 31
eencae 3:964a6d95acdd 32 struct Vector2D {
eencae 3:964a6d95acdd 33 float x;
eencae 3:964a6d95acdd 34 float y;
eencae 3:964a6d95acdd 35 };
eencae 3:964a6d95acdd 36
eencae 3:964a6d95acdd 37 struct Polar {
eencae 3:964a6d95acdd 38 float mag;
eencae 3:964a6d95acdd 39 float angle;
eencae 3:964a6d95acdd 40 };
eencae 0:a6288c29b936 41
eencae 0:a6288c29b936 42 class Gamepad
eencae 0:a6288c29b936 43 {
eencae 0:a6288c29b936 44
eencae 0:a6288c29b936 45 public:
eencae 0:a6288c29b936 46
eencae 8:7eaf26f4b5f2 47 /** Constructor
eencae 8:7eaf26f4b5f2 48 */
eencae 0:a6288c29b936 49 Gamepad();
eencae 8:7eaf26f4b5f2 50
eencae 8:7eaf26f4b5f2 51 /** Destructor
eencae 8:7eaf26f4b5f2 52 */
eencae 1:6d25cd49059b 53 ~Gamepad();
eencae 0:a6288c29b936 54
eencae 8:7eaf26f4b5f2 55 /** Initialise all peripherals and configure interrupts
eencae 8:7eaf26f4b5f2 56 */
eencae 0:a6288c29b936 57 void init();
eencae 8:7eaf26f4b5f2 58
eencae 8:7eaf26f4b5f2 59 /** Turn all LEDs on
eencae 8:7eaf26f4b5f2 60 */
eencae 0:a6288c29b936 61 void leds_on();
eencae 8:7eaf26f4b5f2 62
eencae 8:7eaf26f4b5f2 63 /** Turn all LEDs off
eencae 8:7eaf26f4b5f2 64 */
eencae 0:a6288c29b936 65 void leds_off();
eencae 8:7eaf26f4b5f2 66
eencae 8:7eaf26f4b5f2 67 /** Fade all to set duty-cycle
eencae 8:7eaf26f4b5f2 68 @param value in range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 69 */
eencae 1:6d25cd49059b 70 void fade_leds(float val);
eencae 1:6d25cd49059b 71
eencae 8:7eaf26f4b5f2 72 /** Read potentiometer
eencae 8:7eaf26f4b5f2 73 @returns potentiometer value in range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 74 */
eencae 1:6d25cd49059b 75 float read_pot();
eencae 8:7eaf26f4b5f2 76
eencae 8:7eaf26f4b5f2 77 /** Play tone on piezo
eencae 8:7eaf26f4b5f2 78 @param frequency in Hz
eencae 8:7eaf26f4b5f2 79 @param duration of tone in seconds
eencae 8:7eaf26f4b5f2 80 */
eencae 1:6d25cd49059b 81 void tone(float frequency, float duration);
eencae 1:6d25cd49059b 82
eencae 8:7eaf26f4b5f2 83 /** Check if A button pressed
eencae 8:7eaf26f4b5f2 84 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 85 */
eencae 1:6d25cd49059b 86 bool a_pressed();
eencae 8:7eaf26f4b5f2 87
eencae 8:7eaf26f4b5f2 88 /** Check if B button pressed
eencae 8:7eaf26f4b5f2 89 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 90 */
eencae 1:6d25cd49059b 91 bool b_pressed();
eencae 8:7eaf26f4b5f2 92
eencae 8:7eaf26f4b5f2 93 /** Check if X button pressed
eencae 8:7eaf26f4b5f2 94 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 95 */
eencae 1:6d25cd49059b 96 bool x_pressed();
eencae 8:7eaf26f4b5f2 97
eencae 8:7eaf26f4b5f2 98 /** Check if Y button pressed
eencae 8:7eaf26f4b5f2 99 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 100 */
eencae 1:6d25cd49059b 101 bool y_pressed();
eencae 8:7eaf26f4b5f2 102
eencae 8:7eaf26f4b5f2 103 /** Check if L button pressed
eencae 8:7eaf26f4b5f2 104 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 105 */
eencae 1:6d25cd49059b 106 bool l_pressed();
eencae 8:7eaf26f4b5f2 107
eencae 8:7eaf26f4b5f2 108 /** Check if R button pressed
eencae 8:7eaf26f4b5f2 109 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 110 */
eencae 1:6d25cd49059b 111 bool r_pressed();
eencae 8:7eaf26f4b5f2 112
eencae 8:7eaf26f4b5f2 113 /** Check if Back button pressed
eencae 8:7eaf26f4b5f2 114 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 115 */
eencae 1:6d25cd49059b 116 bool back_pressed();
eencae 8:7eaf26f4b5f2 117
eencae 8:7eaf26f4b5f2 118 /** Check if Start button pressed
eencae 8:7eaf26f4b5f2 119 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 120 */
eencae 1:6d25cd49059b 121 bool start_pressed();
eencae 8:7eaf26f4b5f2 122
eencae 8:7eaf26f4b5f2 123 /** Check if Joystick button pressed
eencae 8:7eaf26f4b5f2 124 @returns true if yes, false if no
eencae 8:7eaf26f4b5f2 125 */
eencae 3:964a6d95acdd 126 bool joystick_pressed();
eencae 8:7eaf26f4b5f2 127
eencae 8:7eaf26f4b5f2 128 /** Get magnitude of joystick movement
eencae 8:7eaf26f4b5f2 129 @returns value in range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 130 */
eencae 8:7eaf26f4b5f2 131
eencae 8:7eaf26f4b5f2 132 float get_mag();
eencae 5:ce5eae9ee934 133
eencae 8:7eaf26f4b5f2 134 /** Get angle of joystick movement
eencae 8:7eaf26f4b5f2 135 @returns value in range 0.0 to 359.9. 0.0 corresponds to N, 180.0 to S. -1.0 is central
eencae 8:7eaf26f4b5f2 136 */
eencae 3:964a6d95acdd 137 float get_angle();
eencae 8:7eaf26f4b5f2 138
eencae 8:7eaf26f4b5f2 139 /** Gets joystick direction
eencae 8:7eaf26f4b5f2 140 @returns an enum: CENTRE, N, NE, E, SE, S, SW, W, NW,
eencae 8:7eaf26f4b5f2 141 */
eencae 3:964a6d95acdd 142 Direction get_direction(); // N,NE,E,SE etc.
eencae 8:7eaf26f4b5f2 143
eencae 8:7eaf26f4b5f2 144 /** Gets raw cartesian co-ordinates of joystick
eencae 8:7eaf26f4b5f2 145 @returns a struct with x,y members, each in the range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 146 */
eencae 5:ce5eae9ee934 147 Vector2D get_coord(); // cartesian co-ordinates x,y
eencae 8:7eaf26f4b5f2 148
eencae 8:7eaf26f4b5f2 149 /** Gets cartesian coordinates mapped to circular grid
eencae 8:7eaf26f4b5f2 150 @returns a struct with x,y members, each in the range 0.0 to 1.0
eencae 8:7eaf26f4b5f2 151 */
eencae 5:ce5eae9ee934 152 Vector2D get_mapped_coord(); // x,y mapped to circle
eencae 8:7eaf26f4b5f2 153
eencae 8:7eaf26f4b5f2 154 /** Gets polar coordinates of the joystick
eencae 8:7eaf26f4b5f2 155 @returns a struct contains mag and angle
eencae 8:7eaf26f4b5f2 156 */
eencae 5:ce5eae9ee934 157 Polar get_polar(); // mag and angle in struct form
eencae 3:964a6d95acdd 158
eencae 0:a6288c29b936 159 private:
eencae 0:a6288c29b936 160
eencae 0:a6288c29b936 161 PwmOut *led_1;
eencae 0:a6288c29b936 162 PwmOut *led_2;
eencae 0:a6288c29b936 163 PwmOut *led_3;
eencae 0:a6288c29b936 164 PwmOut *led_4;
eencae 0:a6288c29b936 165 PwmOut *led_5;
eencae 0:a6288c29b936 166 PwmOut *led_6;
eencae 0:a6288c29b936 167
eencae 1:6d25cd49059b 168 InterruptIn *button_A;
eencae 1:6d25cd49059b 169 InterruptIn *button_B;
eencae 1:6d25cd49059b 170 InterruptIn *button_X;
eencae 3:964a6d95acdd 171 InterruptIn *button_Y;
eencae 1:6d25cd49059b 172 InterruptIn *button_back;
eencae 1:6d25cd49059b 173 InterruptIn *button_start;
eencae 1:6d25cd49059b 174 InterruptIn *button_L;
eencae 1:6d25cd49059b 175 InterruptIn *button_R;
eencae 3:964a6d95acdd 176 InterruptIn *button_joystick;
eencae 3:964a6d95acdd 177
eencae 3:964a6d95acdd 178 AnalogIn *vert;
eencae 3:964a6d95acdd 179 AnalogIn *horiz;
eencae 1:6d25cd49059b 180
eencae 1:6d25cd49059b 181 PwmOut *buzzer;
eencae 1:6d25cd49059b 182 AnalogIn *pot;
eencae 1:6d25cd49059b 183
eencae 1:6d25cd49059b 184 Timeout *timeout;
eencae 1:6d25cd49059b 185
eencae 1:6d25cd49059b 186 void init_buttons();
eencae 1:6d25cd49059b 187 void tone_off();
eencae 3:964a6d95acdd 188
eencae 1:6d25cd49059b 189 void a_isr();
eencae 1:6d25cd49059b 190 void b_isr();
eencae 1:6d25cd49059b 191 void x_isr();
eencae 1:6d25cd49059b 192 void y_isr();
eencae 1:6d25cd49059b 193 void l_isr();
eencae 1:6d25cd49059b 194 void r_isr();
eencae 1:6d25cd49059b 195 void back_isr();
eencae 1:6d25cd49059b 196 void start_isr();
eencae 3:964a6d95acdd 197 void joy_isr();
eencae 8:7eaf26f4b5f2 198
eencae 3:964a6d95acdd 199 bool a_flag,b_flag,x_flag,y_flag,l_flag,r_flag,back_flag,start_flag,joy_flag;
eencae 8:7eaf26f4b5f2 200
eencae 8:7eaf26f4b5f2 201 // centred x,y values
eencae 3:964a6d95acdd 202 float _x0;
eencae 3:964a6d95acdd 203 float _y0;
eencae 0:a6288c29b936 204 };
eencae 0:a6288c29b936 205
eencae 0:a6288c29b936 206 #endif