ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el18nw

Dependencies:   mbed

Committer:
Nicholas75179
Date:
Fri May 22 09:42:51 2020 +0000
Revision:
0:fde420d18f42
final commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nicholas75179 0:fde420d18f42 1 #include "Gamepad.h"
Nicholas75179 0:fde420d18f42 2
Nicholas75179 0:fde420d18f42 3 #include "mbed.h"
Nicholas75179 0:fde420d18f42 4
Nicholas75179 0:fde420d18f42 5 //////////// constructor/destructor ////////////
Nicholas75179 0:fde420d18f42 6 Gamepad::Gamepad()
Nicholas75179 0:fde420d18f42 7 :
Nicholas75179 0:fde420d18f42 8 _led1(new PwmOut(PTA2)),
Nicholas75179 0:fde420d18f42 9 _led2(new PwmOut(PTC2)),
Nicholas75179 0:fde420d18f42 10 _led3(new PwmOut(PTC3)),
Nicholas75179 0:fde420d18f42 11 _led4(new PwmOut(PTA1)),
Nicholas75179 0:fde420d18f42 12 _led5(new PwmOut(PTC10)),
Nicholas75179 0:fde420d18f42 13 _led6(new PwmOut(PTC11)),
Nicholas75179 0:fde420d18f42 14
Nicholas75179 0:fde420d18f42 15 _button_A(new InterruptIn(PTC7)),
Nicholas75179 0:fde420d18f42 16 _button_B(new InterruptIn(PTC9)),
Nicholas75179 0:fde420d18f42 17 _button_X(new InterruptIn(PTC5)),
Nicholas75179 0:fde420d18f42 18 _button_Y(new InterruptIn(PTC0)),
Nicholas75179 0:fde420d18f42 19 _button_start(new InterruptIn(PTC8)),
Nicholas75179 0:fde420d18f42 20
Nicholas75179 0:fde420d18f42 21
Nicholas75179 0:fde420d18f42 22 _vert(new AnalogIn(PTB11)),
Nicholas75179 0:fde420d18f42 23 _horiz(new AnalogIn(PTB10)),
Nicholas75179 0:fde420d18f42 24
Nicholas75179 0:fde420d18f42 25
Nicholas75179 0:fde420d18f42 26 _speaker(new AnalogOut(DAC0_OUT)),
Nicholas75179 0:fde420d18f42 27
Nicholas75179 0:fde420d18f42 28 /*
Nicholas75179 0:fde420d18f42 29 _pot1(new AnalogIn(PTB2)),
Nicholas75179 0:fde420d18f42 30 _pot2(new AnalogIn(PTB3)),
Nicholas75179 0:fde420d18f42 31
Nicholas75179 0:fde420d18f42 32 _speaker(new AnalogOut(DAC0_OUT)),
Nicholas75179 0:fde420d18f42 33 _ticker(new Ticker()),
Nicholas75179 0:fde420d18f42 34 _timeout(new Timeout()),
Nicholas75179 0:fde420d18f42 35 */
Nicholas75179 0:fde420d18f42 36 _timeout(new Timeout()),
Nicholas75179 0:fde420d18f42 37 _ticker(new Ticker()),
Nicholas75179 0:fde420d18f42 38
Nicholas75179 0:fde420d18f42 39
Nicholas75179 0:fde420d18f42 40 _x0(0),
Nicholas75179 0:fde420d18f42 41 _y0(0)
Nicholas75179 0:fde420d18f42 42 {}
Nicholas75179 0:fde420d18f42 43
Nicholas75179 0:fde420d18f42 44
Nicholas75179 0:fde420d18f42 45 ///////////////// public methods /////////////////
Nicholas75179 0:fde420d18f42 46
Nicholas75179 0:fde420d18f42 47 void Gamepad::init()
Nicholas75179 0:fde420d18f42 48 {
Nicholas75179 0:fde420d18f42 49 leds_off();
Nicholas75179 0:fde420d18f42 50
Nicholas75179 0:fde420d18f42 51 // read centred values of joystick
Nicholas75179 0:fde420d18f42 52 _x0 = _horiz->read();
Nicholas75179 0:fde420d18f42 53 _y0 = _vert->read();
Nicholas75179 0:fde420d18f42 54
Nicholas75179 0:fde420d18f42 55 // Set all buttons to PullUp
Nicholas75179 0:fde420d18f42 56 _button_A->mode(PullUp);
Nicholas75179 0:fde420d18f42 57 _button_B->mode(PullUp);
Nicholas75179 0:fde420d18f42 58 _button_X->mode(PullUp);
Nicholas75179 0:fde420d18f42 59 _button_Y->mode(PullUp);
Nicholas75179 0:fde420d18f42 60 _button_start->mode(PullUp);
Nicholas75179 0:fde420d18f42 61
Nicholas75179 0:fde420d18f42 62 // Set up interrupts for the fall of buttons
Nicholas75179 0:fde420d18f42 63 _button_A->fall(callback(this,&Gamepad::A_fall_interrupt));
Nicholas75179 0:fde420d18f42 64 _button_B->fall(callback(this,&Gamepad::B_fall_interrupt));
Nicholas75179 0:fde420d18f42 65 _button_X->fall(callback(this,&Gamepad::X_fall_interrupt));
Nicholas75179 0:fde420d18f42 66 _button_Y->fall(callback(this,&Gamepad::Y_fall_interrupt));
Nicholas75179 0:fde420d18f42 67 _button_start->fall(callback(this,&Gamepad::start_fall_interrupt));
Nicholas75179 0:fde420d18f42 68
Nicholas75179 0:fde420d18f42 69 // initalise button flags
Nicholas75179 0:fde420d18f42 70 reset_buttons();
Nicholas75179 0:fde420d18f42 71
Nicholas75179 0:fde420d18f42 72 // Initalise speaker as low
Nicholas75179 0:fde420d18f42 73 _speaker->write(0);
Nicholas75179 0:fde420d18f42 74 }
Nicholas75179 0:fde420d18f42 75
Nicholas75179 0:fde420d18f42 76 void Gamepad::leds_off()
Nicholas75179 0:fde420d18f42 77 {
Nicholas75179 0:fde420d18f42 78 leds(0.0);
Nicholas75179 0:fde420d18f42 79 }
Nicholas75179 0:fde420d18f42 80
Nicholas75179 0:fde420d18f42 81 void Gamepad::leds_on()
Nicholas75179 0:fde420d18f42 82 {
Nicholas75179 0:fde420d18f42 83 leds(1.0);
Nicholas75179 0:fde420d18f42 84 }
Nicholas75179 0:fde420d18f42 85
Nicholas75179 0:fde420d18f42 86 void Gamepad::leds(float val) const
Nicholas75179 0:fde420d18f42 87 {
Nicholas75179 0:fde420d18f42 88 if (val < 0.0f) {
Nicholas75179 0:fde420d18f42 89 val = 0.0f;
Nicholas75179 0:fde420d18f42 90 }
Nicholas75179 0:fde420d18f42 91 if (val > 1.0f) {
Nicholas75179 0:fde420d18f42 92 val = 1.0f;
Nicholas75179 0:fde420d18f42 93 }
Nicholas75179 0:fde420d18f42 94
Nicholas75179 0:fde420d18f42 95 // leds are active-low, so subtract from 1.0
Nicholas75179 0:fde420d18f42 96 // 0.0 corresponds to fully-off, 1.0 to fully-on
Nicholas75179 0:fde420d18f42 97 val = 1.0f - val;
Nicholas75179 0:fde420d18f42 98
Nicholas75179 0:fde420d18f42 99 _led1->write(val);
Nicholas75179 0:fde420d18f42 100 _led2->write(val);
Nicholas75179 0:fde420d18f42 101 _led3->write(val);
Nicholas75179 0:fde420d18f42 102 _led4->write(val);
Nicholas75179 0:fde420d18f42 103 _led5->write(val);
Nicholas75179 0:fde420d18f42 104 _led6->write(val);
Nicholas75179 0:fde420d18f42 105 }
Nicholas75179 0:fde420d18f42 106
Nicholas75179 0:fde420d18f42 107 void Gamepad::led(int n,float val) const
Nicholas75179 0:fde420d18f42 108 {
Nicholas75179 0:fde420d18f42 109 // ensure they are within valid range
Nicholas75179 0:fde420d18f42 110 if (val < 0.0f) {
Nicholas75179 0:fde420d18f42 111 val = 0.0f;
Nicholas75179 0:fde420d18f42 112 }
Nicholas75179 0:fde420d18f42 113 if (val > 1.0f) {
Nicholas75179 0:fde420d18f42 114 val = 1.0f;
Nicholas75179 0:fde420d18f42 115 }
Nicholas75179 0:fde420d18f42 116
Nicholas75179 0:fde420d18f42 117 switch (n) {
Nicholas75179 0:fde420d18f42 118
Nicholas75179 0:fde420d18f42 119 // check for valid LED number and set value
Nicholas75179 0:fde420d18f42 120
Nicholas75179 0:fde420d18f42 121 case 1:
Nicholas75179 0:fde420d18f42 122 _led1->write(1.0f-val); // active-low so subtract from 1
Nicholas75179 0:fde420d18f42 123 break;
Nicholas75179 0:fde420d18f42 124 case 2:
Nicholas75179 0:fde420d18f42 125 _led2->write(1.0f-val); // active-low so subtract from 1
Nicholas75179 0:fde420d18f42 126 break;
Nicholas75179 0:fde420d18f42 127 case 3:
Nicholas75179 0:fde420d18f42 128 _led3->write(1.0f-val); // active-low so subtract from 1
Nicholas75179 0:fde420d18f42 129 break;
Nicholas75179 0:fde420d18f42 130 case 4:
Nicholas75179 0:fde420d18f42 131 _led4->write(1.0f-val); // active-low so subtract from 1
Nicholas75179 0:fde420d18f42 132 break;
Nicholas75179 0:fde420d18f42 133 case 5:
Nicholas75179 0:fde420d18f42 134 _led5->write(1.0f-val); // active-low so subtract from 1
Nicholas75179 0:fde420d18f42 135 break;
Nicholas75179 0:fde420d18f42 136 case 6:
Nicholas75179 0:fde420d18f42 137 _led6->write(1.0f-val); // active-low so subtract from 1
Nicholas75179 0:fde420d18f42 138 break;
Nicholas75179 0:fde420d18f42 139
Nicholas75179 0:fde420d18f42 140 }
Nicholas75179 0:fde420d18f42 141 }
Nicholas75179 0:fde420d18f42 142
Nicholas75179 0:fde420d18f42 143 float Gamepad::read_pot1() const
Nicholas75179 0:fde420d18f42 144 {
Nicholas75179 0:fde420d18f42 145 return _pot1->read();
Nicholas75179 0:fde420d18f42 146 }
Nicholas75179 0:fde420d18f42 147
Nicholas75179 0:fde420d18f42 148 float Gamepad::read_pot2() const
Nicholas75179 0:fde420d18f42 149 {
Nicholas75179 0:fde420d18f42 150 return _pot2->read();
Nicholas75179 0:fde420d18f42 151 }
Nicholas75179 0:fde420d18f42 152
Nicholas75179 0:fde420d18f42 153 void Gamepad::tone(float frequency, float duration)
Nicholas75179 0:fde420d18f42 154 {
Nicholas75179 0:fde420d18f42 155 // Too low frequencys can damage the speaker
Nicholas75179 0:fde420d18f42 156 if (frequency < 1000) {
Nicholas75179 0:fde420d18f42 157 return;
Nicholas75179 0:fde420d18f42 158 }
Nicholas75179 0:fde420d18f42 159 // Generates a square wave by flipping the dac from 1 to 0
Nicholas75179 0:fde420d18f42 160 // and vice versa at half the time period
Nicholas75179 0:fde420d18f42 161 _ticker->attach(callback(this,&Gamepad::flip_DAC),(1.0f/frequency)*0.5f);
Nicholas75179 0:fde420d18f42 162
Nicholas75179 0:fde420d18f42 163 // After the duration the ticker is detached.
Nicholas75179 0:fde420d18f42 164 _timeout->attach(callback(this, &Gamepad::tone_off), duration );
Nicholas75179 0:fde420d18f42 165 }
Nicholas75179 0:fde420d18f42 166
Nicholas75179 0:fde420d18f42 167
Nicholas75179 0:fde420d18f42 168
Nicholas75179 0:fde420d18f42 169 // this method gets the magnitude of the joystick movement
Nicholas75179 0:fde420d18f42 170 float Gamepad::get_mag()
Nicholas75179 0:fde420d18f42 171 {
Nicholas75179 0:fde420d18f42 172 Polar p = get_polar();
Nicholas75179 0:fde420d18f42 173 return p.mag;
Nicholas75179 0:fde420d18f42 174 }
Nicholas75179 0:fde420d18f42 175
Nicholas75179 0:fde420d18f42 176 // this method gets the angle of joystick movement (0 to 360, 0 North)
Nicholas75179 0:fde420d18f42 177 float Gamepad::get_angle()
Nicholas75179 0:fde420d18f42 178 {
Nicholas75179 0:fde420d18f42 179 Polar p = get_polar();
Nicholas75179 0:fde420d18f42 180 return p.angle;
Nicholas75179 0:fde420d18f42 181 }
Nicholas75179 0:fde420d18f42 182
Nicholas75179 0:fde420d18f42 183 Direction Gamepad::get_direction()
Nicholas75179 0:fde420d18f42 184 {
Nicholas75179 0:fde420d18f42 185 float angle = get_angle(); // 0 to 360, -1 for centred
Nicholas75179 0:fde420d18f42 186
Nicholas75179 0:fde420d18f42 187 Direction d;
Nicholas75179 0:fde420d18f42 188 // partition 360 into segments and check which segment the angle is in
Nicholas75179 0:fde420d18f42 189 if (angle < 0.0f) {
Nicholas75179 0:fde420d18f42 190 d = CENTRE; // check for -1.0 angle
Nicholas75179 0:fde420d18f42 191 } else if (angle < 22.5f) { // then keep going in 45 degree increments
Nicholas75179 0:fde420d18f42 192 d = N;
Nicholas75179 0:fde420d18f42 193 } else if (angle < 67.5f) {
Nicholas75179 0:fde420d18f42 194 d = NE;
Nicholas75179 0:fde420d18f42 195 } else if (angle < 112.5f) {
Nicholas75179 0:fde420d18f42 196 d = E;
Nicholas75179 0:fde420d18f42 197 } else if (angle < 157.5f) {
Nicholas75179 0:fde420d18f42 198 d = SE;
Nicholas75179 0:fde420d18f42 199 } else if (angle < 202.5f) {
Nicholas75179 0:fde420d18f42 200 d = S;
Nicholas75179 0:fde420d18f42 201 } else if (angle < 247.5f) {
Nicholas75179 0:fde420d18f42 202 d = SW;
Nicholas75179 0:fde420d18f42 203 } else if (angle < 292.5f) {
Nicholas75179 0:fde420d18f42 204 d = W;
Nicholas75179 0:fde420d18f42 205 } else if (angle < 337.5f) {
Nicholas75179 0:fde420d18f42 206 d = NW;
Nicholas75179 0:fde420d18f42 207 } else {
Nicholas75179 0:fde420d18f42 208 d = N;
Nicholas75179 0:fde420d18f42 209 }
Nicholas75179 0:fde420d18f42 210
Nicholas75179 0:fde420d18f42 211 return d;
Nicholas75179 0:fde420d18f42 212 }
Nicholas75179 0:fde420d18f42 213
Nicholas75179 0:fde420d18f42 214 void Gamepad::reset_buttons() {
Nicholas75179 0:fde420d18f42 215 A_fall = B_fall = X_fall = Y_fall = start_fall = false;
Nicholas75179 0:fde420d18f42 216 }
Nicholas75179 0:fde420d18f42 217
Nicholas75179 0:fde420d18f42 218 bool Gamepad::A_pressed() {
Nicholas75179 0:fde420d18f42 219 if (A_fall) {
Nicholas75179 0:fde420d18f42 220 A_fall = false;
Nicholas75179 0:fde420d18f42 221 return true;
Nicholas75179 0:fde420d18f42 222 } else {
Nicholas75179 0:fde420d18f42 223 return false;
Nicholas75179 0:fde420d18f42 224 }
Nicholas75179 0:fde420d18f42 225 }
Nicholas75179 0:fde420d18f42 226
Nicholas75179 0:fde420d18f42 227 bool Gamepad::B_pressed() {
Nicholas75179 0:fde420d18f42 228 if (B_fall) {
Nicholas75179 0:fde420d18f42 229 B_fall = false;
Nicholas75179 0:fde420d18f42 230 return true;
Nicholas75179 0:fde420d18f42 231 } else {
Nicholas75179 0:fde420d18f42 232 return false;
Nicholas75179 0:fde420d18f42 233 }
Nicholas75179 0:fde420d18f42 234 }
Nicholas75179 0:fde420d18f42 235
Nicholas75179 0:fde420d18f42 236 bool Gamepad::X_pressed() {
Nicholas75179 0:fde420d18f42 237 if (X_fall) {
Nicholas75179 0:fde420d18f42 238 X_fall = false;
Nicholas75179 0:fde420d18f42 239 return true;
Nicholas75179 0:fde420d18f42 240 } else {
Nicholas75179 0:fde420d18f42 241 return false;
Nicholas75179 0:fde420d18f42 242 }
Nicholas75179 0:fde420d18f42 243 }
Nicholas75179 0:fde420d18f42 244
Nicholas75179 0:fde420d18f42 245 bool Gamepad::Y_pressed() {
Nicholas75179 0:fde420d18f42 246 if (Y_fall) {
Nicholas75179 0:fde420d18f42 247 Y_fall = false;
Nicholas75179 0:fde420d18f42 248 return true;
Nicholas75179 0:fde420d18f42 249 } else {
Nicholas75179 0:fde420d18f42 250 return false;
Nicholas75179 0:fde420d18f42 251 }
Nicholas75179 0:fde420d18f42 252 }
Nicholas75179 0:fde420d18f42 253
Nicholas75179 0:fde420d18f42 254 bool Gamepad::start_pressed() {
Nicholas75179 0:fde420d18f42 255 if (start_fall) {
Nicholas75179 0:fde420d18f42 256 start_fall = false;
Nicholas75179 0:fde420d18f42 257 return true;
Nicholas75179 0:fde420d18f42 258 } else {
Nicholas75179 0:fde420d18f42 259 return false;
Nicholas75179 0:fde420d18f42 260 }
Nicholas75179 0:fde420d18f42 261 }
Nicholas75179 0:fde420d18f42 262
Nicholas75179 0:fde420d18f42 263 bool Gamepad::A_held() {
Nicholas75179 0:fde420d18f42 264 // Buttons are configured as PullUp hence the not
Nicholas75179 0:fde420d18f42 265 return !_button_A->read();
Nicholas75179 0:fde420d18f42 266 }
Nicholas75179 0:fde420d18f42 267
Nicholas75179 0:fde420d18f42 268 bool Gamepad::B_held() {
Nicholas75179 0:fde420d18f42 269 return !_button_B->read();
Nicholas75179 0:fde420d18f42 270 }
Nicholas75179 0:fde420d18f42 271
Nicholas75179 0:fde420d18f42 272 bool Gamepad::X_held() {
Nicholas75179 0:fde420d18f42 273 return !_button_X->read();
Nicholas75179 0:fde420d18f42 274 }
Nicholas75179 0:fde420d18f42 275
Nicholas75179 0:fde420d18f42 276 bool Gamepad::Y_held() {
Nicholas75179 0:fde420d18f42 277 return !_button_Y->read();
Nicholas75179 0:fde420d18f42 278 }
Nicholas75179 0:fde420d18f42 279
Nicholas75179 0:fde420d18f42 280 bool Gamepad::start_held() {
Nicholas75179 0:fde420d18f42 281 return !_button_start->read();
Nicholas75179 0:fde420d18f42 282 }
Nicholas75179 0:fde420d18f42 283
Nicholas75179 0:fde420d18f42 284 ///////////////////// private methods ////////////////////////
Nicholas75179 0:fde420d18f42 285
Nicholas75179 0:fde420d18f42 286 void Gamepad::tone_off()
Nicholas75179 0:fde420d18f42 287 {
Nicholas75179 0:fde420d18f42 288 _ticker->detach();
Nicholas75179 0:fde420d18f42 289 }
Nicholas75179 0:fde420d18f42 290
Nicholas75179 0:fde420d18f42 291 void Gamepad::flip_DAC()
Nicholas75179 0:fde420d18f42 292 {
Nicholas75179 0:fde420d18f42 293 if (_speaker->read() == 1) {
Nicholas75179 0:fde420d18f42 294 _speaker->write(0);
Nicholas75179 0:fde420d18f42 295 } else {
Nicholas75179 0:fde420d18f42 296 _speaker->write(1);
Nicholas75179 0:fde420d18f42 297 }
Nicholas75179 0:fde420d18f42 298 }
Nicholas75179 0:fde420d18f42 299
Nicholas75179 0:fde420d18f42 300
Nicholas75179 0:fde420d18f42 301
Nicholas75179 0:fde420d18f42 302 // get raw joystick coordinate in range -1 to 1
Nicholas75179 0:fde420d18f42 303 // Direction (x,y)
Nicholas75179 0:fde420d18f42 304 // North (0,1)
Nicholas75179 0:fde420d18f42 305 // East (1,0)
Nicholas75179 0:fde420d18f42 306 // South (0,-1)
Nicholas75179 0:fde420d18f42 307 // West (-1,0)
Nicholas75179 0:fde420d18f42 308 Vector2D Gamepad::get_coord()
Nicholas75179 0:fde420d18f42 309 {
Nicholas75179 0:fde420d18f42 310 // read() returns value in range 0.0 to 1.0 so is scaled and centre value
Nicholas75179 0:fde420d18f42 311 // substracted to get values in the range -1.0 to 1.0
Nicholas75179 0:fde420d18f42 312 float x = 2.0f*( _horiz->read() - _x0 );
Nicholas75179 0:fde420d18f42 313 float y = 2.0f*( _vert->read() - _y0 );
Nicholas75179 0:fde420d18f42 314
Nicholas75179 0:fde420d18f42 315 // Note: the x value here is inverted to ensure the positive x is to the
Nicholas75179 0:fde420d18f42 316 // right. This is simply due to how the potentiometer on the joystick
Nicholas75179 0:fde420d18f42 317 // I was using was connected up. It could have been corrected in hardware
Nicholas75179 0:fde420d18f42 318 // by swapping the power supply pins. Instead it is done in software so may
Nicholas75179 0:fde420d18f42 319 // need to be changed depending on your wiring setup
Nicholas75179 0:fde420d18f42 320
Nicholas75179 0:fde420d18f42 321 Vector2D coord = {-x,y};
Nicholas75179 0:fde420d18f42 322 return coord;
Nicholas75179 0:fde420d18f42 323 }
Nicholas75179 0:fde420d18f42 324
Nicholas75179 0:fde420d18f42 325 // This maps the raw x,y coord onto a circular grid.
Nicholas75179 0:fde420d18f42 326 // See: http://mathproofs.blogspot.co.uk/2005/07/mapping-square-to-circle.html
Nicholas75179 0:fde420d18f42 327 Vector2D Gamepad::get_mapped_coord()
Nicholas75179 0:fde420d18f42 328 {
Nicholas75179 0:fde420d18f42 329 Vector2D coord = get_coord();
Nicholas75179 0:fde420d18f42 330
Nicholas75179 0:fde420d18f42 331 // do the transformation
Nicholas75179 0:fde420d18f42 332 float x = coord.x*sqrt(1.0f-pow(coord.y,2.0f)/2.0f);
Nicholas75179 0:fde420d18f42 333 float y = coord.y*sqrt(1.0f-pow(coord.x,2.0f)/2.0f);
Nicholas75179 0:fde420d18f42 334
Nicholas75179 0:fde420d18f42 335 Vector2D mapped_coord = {-x,-y};
Nicholas75179 0:fde420d18f42 336 return mapped_coord;
Nicholas75179 0:fde420d18f42 337 }
Nicholas75179 0:fde420d18f42 338
Nicholas75179 0:fde420d18f42 339 // this function converts the mapped coordinates into polar form
Nicholas75179 0:fde420d18f42 340 Polar Gamepad::get_polar()
Nicholas75179 0:fde420d18f42 341 {
Nicholas75179 0:fde420d18f42 342 // get the mapped coordinate
Nicholas75179 0:fde420d18f42 343 Vector2D coord = get_mapped_coord();
Nicholas75179 0:fde420d18f42 344
Nicholas75179 0:fde420d18f42 345 // at this point, 0 degrees (i.e. x-axis) will be defined to the East.
Nicholas75179 0:fde420d18f42 346 // We want 0 degrees to correspond to North and increase clockwise to 359
Nicholas75179 0:fde420d18f42 347 // like a compass heading, so we need to swap the axis and invert y
Nicholas75179 0:fde420d18f42 348 float x = coord.y;
Nicholas75179 0:fde420d18f42 349 float y = coord.x;
Nicholas75179 0:fde420d18f42 350
Nicholas75179 0:fde420d18f42 351 float mag = sqrt(x*x+y*y); // pythagoras
Nicholas75179 0:fde420d18f42 352 float angle = RAD2DEG*atan2(y,x);
Nicholas75179 0:fde420d18f42 353 // angle will be in range -180 to 180, so add 360 to negative angles to
Nicholas75179 0:fde420d18f42 354 // move to 0 to 360 range
Nicholas75179 0:fde420d18f42 355 if (angle < 0.0f) {
Nicholas75179 0:fde420d18f42 356 angle+=360.0f;
Nicholas75179 0:fde420d18f42 357 }
Nicholas75179 0:fde420d18f42 358
Nicholas75179 0:fde420d18f42 359 // the noise on the ADC causes the values of x and y to fluctuate slightly
Nicholas75179 0:fde420d18f42 360 // around the centred values. This causes the random angle values to get
Nicholas75179 0:fde420d18f42 361 // calculated when the joystick is centred and untouched. This is also when
Nicholas75179 0:fde420d18f42 362 // the magnitude is very small, so we can check for a small magnitude and then
Nicholas75179 0:fde420d18f42 363 // set the angle to -1. This will inform us when the angle is invalid and the
Nicholas75179 0:fde420d18f42 364 // joystick is centred
Nicholas75179 0:fde420d18f42 365
Nicholas75179 0:fde420d18f42 366 if (mag < TOL) {
Nicholas75179 0:fde420d18f42 367 mag = 0.0f;
Nicholas75179 0:fde420d18f42 368 angle = -1.0f;
Nicholas75179 0:fde420d18f42 369 }
Nicholas75179 0:fde420d18f42 370
Nicholas75179 0:fde420d18f42 371 Polar p = {mag,angle};
Nicholas75179 0:fde420d18f42 372 return p;
Nicholas75179 0:fde420d18f42 373 }
Nicholas75179 0:fde420d18f42 374
Nicholas75179 0:fde420d18f42 375 // ISRs for buttons
Nicholas75179 0:fde420d18f42 376 void Gamepad::A_fall_interrupt() {
Nicholas75179 0:fde420d18f42 377 A_fall = true;
Nicholas75179 0:fde420d18f42 378 }
Nicholas75179 0:fde420d18f42 379 void Gamepad::B_fall_interrupt() {
Nicholas75179 0:fde420d18f42 380 B_fall = true;
Nicholas75179 0:fde420d18f42 381 }
Nicholas75179 0:fde420d18f42 382 void Gamepad::X_fall_interrupt() {
Nicholas75179 0:fde420d18f42 383 X_fall = true;
Nicholas75179 0:fde420d18f42 384 }
Nicholas75179 0:fde420d18f42 385 void Gamepad::Y_fall_interrupt() {
Nicholas75179 0:fde420d18f42 386 Y_fall = true;
Nicholas75179 0:fde420d18f42 387 }
Nicholas75179 0:fde420d18f42 388 void Gamepad::start_fall_interrupt() {
Nicholas75179 0:fde420d18f42 389 start_fall = true;
Nicholas75179 0:fde420d18f42 390 }