Reham Faqehi / Mbed 2 deprecated fy15raf

Dependencies:   mbed

Fork of fy15raf by ELEC2645 (2017/18)

Committer:
RehamFaqehi
Date:
Wed Apr 18 16:21:55 2018 +0000
Revision:
0:f3d96a1a3177
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RehamFaqehi 0:f3d96a1a3177 1 #include "Gamepad.h"
RehamFaqehi 0:f3d96a1a3177 2
RehamFaqehi 0:f3d96a1a3177 3 #include "mbed.h"
RehamFaqehi 0:f3d96a1a3177 4
RehamFaqehi 0:f3d96a1a3177 5 //////////// constructor/destructor ////////////
RehamFaqehi 0:f3d96a1a3177 6 Gamepad::Gamepad()
RehamFaqehi 0:f3d96a1a3177 7 :
RehamFaqehi 0:f3d96a1a3177 8 _led1(new PwmOut(PTA1)),
RehamFaqehi 0:f3d96a1a3177 9 _led2(new PwmOut(PTA2)),
RehamFaqehi 0:f3d96a1a3177 10 _led3(new PwmOut(PTC2)),
RehamFaqehi 0:f3d96a1a3177 11 _led4(new PwmOut(PTC3)),
RehamFaqehi 0:f3d96a1a3177 12 _led5(new PwmOut(PTC4)),
RehamFaqehi 0:f3d96a1a3177 13 _led6(new PwmOut(PTD3)),
RehamFaqehi 0:f3d96a1a3177 14
RehamFaqehi 0:f3d96a1a3177 15 _button_A(new InterruptIn(PTB9)),
RehamFaqehi 0:f3d96a1a3177 16 _button_B(new InterruptIn(PTD0)),
RehamFaqehi 0:f3d96a1a3177 17 _button_X(new InterruptIn(PTC17)),
RehamFaqehi 0:f3d96a1a3177 18 _button_Y(new InterruptIn(PTC12)),
RehamFaqehi 0:f3d96a1a3177 19 _button_L(new InterruptIn(PTB18)),
RehamFaqehi 0:f3d96a1a3177 20 _button_R(new InterruptIn(PTB3)),
RehamFaqehi 0:f3d96a1a3177 21 _button_back(new InterruptIn(PTB19)),
RehamFaqehi 0:f3d96a1a3177 22 _button_start(new InterruptIn(PTC5)),
RehamFaqehi 0:f3d96a1a3177 23 _button_joystick(new InterruptIn(PTC16)),
RehamFaqehi 0:f3d96a1a3177 24
RehamFaqehi 0:f3d96a1a3177 25 _vert(new AnalogIn(PTB10)),
RehamFaqehi 0:f3d96a1a3177 26 _horiz(new AnalogIn(PTB11)),
RehamFaqehi 0:f3d96a1a3177 27
RehamFaqehi 0:f3d96a1a3177 28 _buzzer(new PwmOut(PTC10)),
RehamFaqehi 0:f3d96a1a3177 29 _pot(new AnalogIn(PTB2)),
RehamFaqehi 0:f3d96a1a3177 30
RehamFaqehi 0:f3d96a1a3177 31 _timeout(new Timeout()),
RehamFaqehi 0:f3d96a1a3177 32
RehamFaqehi 0:f3d96a1a3177 33 _event_state(0),
RehamFaqehi 0:f3d96a1a3177 34
RehamFaqehi 0:f3d96a1a3177 35 _x0(0),
RehamFaqehi 0:f3d96a1a3177 36 _y0(0)
RehamFaqehi 0:f3d96a1a3177 37 {}
RehamFaqehi 0:f3d96a1a3177 38
RehamFaqehi 0:f3d96a1a3177 39 Gamepad::~Gamepad()
RehamFaqehi 0:f3d96a1a3177 40 {
RehamFaqehi 0:f3d96a1a3177 41 delete _led1,_led2,_led3,_led4,_led5,_led6;
RehamFaqehi 0:f3d96a1a3177 42 delete _button_A,_button_B,_button_joystick,_vert,_horiz;
RehamFaqehi 0:f3d96a1a3177 43 delete _button_X,_button_Y,_button_back,_button_start;
RehamFaqehi 0:f3d96a1a3177 44 delete _button_L,_button_R, _buzzer, _pot, _timeout;
RehamFaqehi 0:f3d96a1a3177 45 }
RehamFaqehi 0:f3d96a1a3177 46
RehamFaqehi 0:f3d96a1a3177 47 ///////////////// public methods /////////////////
RehamFaqehi 0:f3d96a1a3177 48
RehamFaqehi 0:f3d96a1a3177 49 void Gamepad::init()
RehamFaqehi 0:f3d96a1a3177 50 {
RehamFaqehi 0:f3d96a1a3177 51 leds_off();
RehamFaqehi 0:f3d96a1a3177 52 init_buttons();
RehamFaqehi 0:f3d96a1a3177 53
RehamFaqehi 0:f3d96a1a3177 54 // read centred values of joystick
RehamFaqehi 0:f3d96a1a3177 55 _x0 = _horiz->read();
RehamFaqehi 0:f3d96a1a3177 56 _y0 = _vert->read();
RehamFaqehi 0:f3d96a1a3177 57
RehamFaqehi 0:f3d96a1a3177 58 // clear all flags
RehamFaqehi 0:f3d96a1a3177 59 _event_state = 0;
RehamFaqehi 0:f3d96a1a3177 60 }
RehamFaqehi 0:f3d96a1a3177 61
RehamFaqehi 0:f3d96a1a3177 62 void Gamepad::leds_off()
RehamFaqehi 0:f3d96a1a3177 63 {
RehamFaqehi 0:f3d96a1a3177 64 leds(0.0);
RehamFaqehi 0:f3d96a1a3177 65 }
RehamFaqehi 0:f3d96a1a3177 66
RehamFaqehi 0:f3d96a1a3177 67 void Gamepad::leds_on()
RehamFaqehi 0:f3d96a1a3177 68 {
RehamFaqehi 0:f3d96a1a3177 69 leds(1.0);
RehamFaqehi 0:f3d96a1a3177 70 }
RehamFaqehi 0:f3d96a1a3177 71
RehamFaqehi 0:f3d96a1a3177 72 void Gamepad::leds(float val) const
RehamFaqehi 0:f3d96a1a3177 73 {
RehamFaqehi 0:f3d96a1a3177 74 if (val < 0.0f) {
RehamFaqehi 0:f3d96a1a3177 75 val = 0.0f;
RehamFaqehi 0:f3d96a1a3177 76 }
RehamFaqehi 0:f3d96a1a3177 77 if (val > 1.0f) {
RehamFaqehi 0:f3d96a1a3177 78 val = 1.0f;
RehamFaqehi 0:f3d96a1a3177 79 }
RehamFaqehi 0:f3d96a1a3177 80
RehamFaqehi 0:f3d96a1a3177 81 // leds are active-low, so subtract from 1.0
RehamFaqehi 0:f3d96a1a3177 82 // 0.0 corresponds to fully-off, 1.0 to fully-on
RehamFaqehi 0:f3d96a1a3177 83 val = 1.0f - val;
RehamFaqehi 0:f3d96a1a3177 84
RehamFaqehi 0:f3d96a1a3177 85 _led1->write(val);
RehamFaqehi 0:f3d96a1a3177 86 _led2->write(val);
RehamFaqehi 0:f3d96a1a3177 87 _led3->write(val);
RehamFaqehi 0:f3d96a1a3177 88 _led4->write(val);
RehamFaqehi 0:f3d96a1a3177 89 _led5->write(val);
RehamFaqehi 0:f3d96a1a3177 90 _led6->write(val);
RehamFaqehi 0:f3d96a1a3177 91 }
RehamFaqehi 0:f3d96a1a3177 92
RehamFaqehi 0:f3d96a1a3177 93 void Gamepad::led(int n,float val) const
RehamFaqehi 0:f3d96a1a3177 94 {
RehamFaqehi 0:f3d96a1a3177 95 // ensure they are within vlaid range
RehamFaqehi 0:f3d96a1a3177 96 if (val < 0.0f) {
RehamFaqehi 0:f3d96a1a3177 97 val = 0.0f;
RehamFaqehi 0:f3d96a1a3177 98 }
RehamFaqehi 0:f3d96a1a3177 99 if (val > 1.0f) {
RehamFaqehi 0:f3d96a1a3177 100 val = 1.0f;
RehamFaqehi 0:f3d96a1a3177 101 }
RehamFaqehi 0:f3d96a1a3177 102
RehamFaqehi 0:f3d96a1a3177 103 switch (n) {
RehamFaqehi 0:f3d96a1a3177 104
RehamFaqehi 0:f3d96a1a3177 105 // check for valid LED number and set value
RehamFaqehi 0:f3d96a1a3177 106
RehamFaqehi 0:f3d96a1a3177 107 case 1:
RehamFaqehi 0:f3d96a1a3177 108 _led1->write(1.0f-val); // active-low so subtract from 1
RehamFaqehi 0:f3d96a1a3177 109 break;
RehamFaqehi 0:f3d96a1a3177 110 case 2:
RehamFaqehi 0:f3d96a1a3177 111 _led2->write(1.0f-val); // active-low so subtract from 1
RehamFaqehi 0:f3d96a1a3177 112 break;
RehamFaqehi 0:f3d96a1a3177 113 case 3:
RehamFaqehi 0:f3d96a1a3177 114 _led3->write(1.0f-val); // active-low so subtract from 1
RehamFaqehi 0:f3d96a1a3177 115 break;
RehamFaqehi 0:f3d96a1a3177 116 case 4:
RehamFaqehi 0:f3d96a1a3177 117 _led4->write(1.0f-val); // active-low so subtract from 1
RehamFaqehi 0:f3d96a1a3177 118 break;
RehamFaqehi 0:f3d96a1a3177 119 case 5:
RehamFaqehi 0:f3d96a1a3177 120 _led5->write(1.0f-val); // active-low so subtract from 1
RehamFaqehi 0:f3d96a1a3177 121 break;
RehamFaqehi 0:f3d96a1a3177 122 case 6:
RehamFaqehi 0:f3d96a1a3177 123 _led6->write(1.0f-val); // active-low so subtract from 1
RehamFaqehi 0:f3d96a1a3177 124 break;
RehamFaqehi 0:f3d96a1a3177 125
RehamFaqehi 0:f3d96a1a3177 126 }
RehamFaqehi 0:f3d96a1a3177 127 }
RehamFaqehi 0:f3d96a1a3177 128
RehamFaqehi 0:f3d96a1a3177 129 float Gamepad::read_pot() const
RehamFaqehi 0:f3d96a1a3177 130 {
RehamFaqehi 0:f3d96a1a3177 131 return _pot->read();
RehamFaqehi 0:f3d96a1a3177 132 }
RehamFaqehi 0:f3d96a1a3177 133
RehamFaqehi 0:f3d96a1a3177 134 void Gamepad::tone(float frequency, float duration)
RehamFaqehi 0:f3d96a1a3177 135 {
RehamFaqehi 0:f3d96a1a3177 136 _buzzer->period(1.0f/frequency);
RehamFaqehi 0:f3d96a1a3177 137 _buzzer->write(0.5); // 50% duty cycle - square wave
RehamFaqehi 0:f3d96a1a3177 138 _timeout->attach(callback(this, &Gamepad::tone_off), duration );
RehamFaqehi 0:f3d96a1a3177 139 }
RehamFaqehi 0:f3d96a1a3177 140
RehamFaqehi 0:f3d96a1a3177 141 bool Gamepad::check_event(GamepadEvent const id)
RehamFaqehi 0:f3d96a1a3177 142 {
RehamFaqehi 0:f3d96a1a3177 143 // Check whether event flag is set
RehamFaqehi 0:f3d96a1a3177 144 if (_event_state[id]) {
RehamFaqehi 0:f3d96a1a3177 145 _event_state.reset(id); // clear flag
RehamFaqehi 0:f3d96a1a3177 146 return true;
RehamFaqehi 0:f3d96a1a3177 147 } else {
RehamFaqehi 0:f3d96a1a3177 148 return false;
RehamFaqehi 0:f3d96a1a3177 149 }
RehamFaqehi 0:f3d96a1a3177 150 }
RehamFaqehi 0:f3d96a1a3177 151
RehamFaqehi 0:f3d96a1a3177 152 // this method gets the magnitude of the joystick movement
RehamFaqehi 0:f3d96a1a3177 153 float Gamepad::get_mag()
RehamFaqehi 0:f3d96a1a3177 154 {
RehamFaqehi 0:f3d96a1a3177 155 Polar p = get_polar();
RehamFaqehi 0:f3d96a1a3177 156 return p.mag;
RehamFaqehi 0:f3d96a1a3177 157 }
RehamFaqehi 0:f3d96a1a3177 158
RehamFaqehi 0:f3d96a1a3177 159 // this method gets the angle of joystick movement (0 to 360, 0 North)
RehamFaqehi 0:f3d96a1a3177 160 float Gamepad::get_angle()
RehamFaqehi 0:f3d96a1a3177 161 {
RehamFaqehi 0:f3d96a1a3177 162 Polar p = get_polar();
RehamFaqehi 0:f3d96a1a3177 163 return p.angle;
RehamFaqehi 0:f3d96a1a3177 164 }
RehamFaqehi 0:f3d96a1a3177 165
RehamFaqehi 0:f3d96a1a3177 166 Direction Gamepad::get_direction()
RehamFaqehi 0:f3d96a1a3177 167 {
RehamFaqehi 0:f3d96a1a3177 168 float angle = get_angle(); // 0 to 360, -1 for centred
RehamFaqehi 0:f3d96a1a3177 169
RehamFaqehi 0:f3d96a1a3177 170 Direction d;
RehamFaqehi 0:f3d96a1a3177 171 // partition 360 into segments and check which segment the angle is in
RehamFaqehi 0:f3d96a1a3177 172 if (angle < 0.0f) {
RehamFaqehi 0:f3d96a1a3177 173 d = CENTRE; // check for -1.0 angle
RehamFaqehi 0:f3d96a1a3177 174 } else if (angle < 22.5f) { // then keep going in 45 degree increments
RehamFaqehi 0:f3d96a1a3177 175 d = N;
RehamFaqehi 0:f3d96a1a3177 176 } else if (angle < 67.5f) {
RehamFaqehi 0:f3d96a1a3177 177 d = NE;
RehamFaqehi 0:f3d96a1a3177 178 } else if (angle < 112.5f) {
RehamFaqehi 0:f3d96a1a3177 179 d = E;
RehamFaqehi 0:f3d96a1a3177 180 } else if (angle < 157.5f) {
RehamFaqehi 0:f3d96a1a3177 181 d = SE;
RehamFaqehi 0:f3d96a1a3177 182 } else if (angle < 202.5f) {
RehamFaqehi 0:f3d96a1a3177 183 d = S;
RehamFaqehi 0:f3d96a1a3177 184 } else if (angle < 247.5f) {
RehamFaqehi 0:f3d96a1a3177 185 d = SW;
RehamFaqehi 0:f3d96a1a3177 186 } else if (angle < 292.5f) {
RehamFaqehi 0:f3d96a1a3177 187 d = W;
RehamFaqehi 0:f3d96a1a3177 188 } else if (angle < 337.5f) {
RehamFaqehi 0:f3d96a1a3177 189 d = NW;
RehamFaqehi 0:f3d96a1a3177 190 } else {
RehamFaqehi 0:f3d96a1a3177 191 d = N;
RehamFaqehi 0:f3d96a1a3177 192 }
RehamFaqehi 0:f3d96a1a3177 193
RehamFaqehi 0:f3d96a1a3177 194 return d;
RehamFaqehi 0:f3d96a1a3177 195 }
RehamFaqehi 0:f3d96a1a3177 196
RehamFaqehi 0:f3d96a1a3177 197 ///////////////////// private methods ////////////////////////
RehamFaqehi 0:f3d96a1a3177 198
RehamFaqehi 0:f3d96a1a3177 199 void Gamepad::tone_off()
RehamFaqehi 0:f3d96a1a3177 200 {
RehamFaqehi 0:f3d96a1a3177 201 // called after timeout
RehamFaqehi 0:f3d96a1a3177 202 _buzzer->write(0.0);
RehamFaqehi 0:f3d96a1a3177 203 }
RehamFaqehi 0:f3d96a1a3177 204
RehamFaqehi 0:f3d96a1a3177 205 void Gamepad::init_buttons()
RehamFaqehi 0:f3d96a1a3177 206 {
RehamFaqehi 0:f3d96a1a3177 207 // turn on pull-downs as other side of button is connected to 3V3
RehamFaqehi 0:f3d96a1a3177 208 // button is 0 when not pressed and 1 when pressed
RehamFaqehi 0:f3d96a1a3177 209 _button_A->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 210 _button_B->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 211 _button_X->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 212 _button_Y->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 213 _button_back->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 214 _button_start->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 215 _button_L->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 216 _button_R->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 217 _button_joystick->mode(PullDown);
RehamFaqehi 0:f3d96a1a3177 218 // therefore setup rising edge interrupts
RehamFaqehi 0:f3d96a1a3177 219 _button_A->rise(callback(this,&Gamepad::a_isr));
RehamFaqehi 0:f3d96a1a3177 220 _button_B->rise(callback(this,&Gamepad::b_isr));
RehamFaqehi 0:f3d96a1a3177 221 _button_X->rise(callback(this,&Gamepad::x_isr));
RehamFaqehi 0:f3d96a1a3177 222 _button_Y->rise(callback(this,&Gamepad::y_isr));
RehamFaqehi 0:f3d96a1a3177 223 _button_L->rise(callback(this,&Gamepad::l_isr));
RehamFaqehi 0:f3d96a1a3177 224 _button_R->rise(callback(this,&Gamepad::r_isr));
RehamFaqehi 0:f3d96a1a3177 225 _button_start->rise(callback(this,&Gamepad::start_isr));
RehamFaqehi 0:f3d96a1a3177 226 _button_back->rise(callback(this,&Gamepad::back_isr));
RehamFaqehi 0:f3d96a1a3177 227 _button_joystick->rise(callback(this,&Gamepad::joy_isr));
RehamFaqehi 0:f3d96a1a3177 228 }
RehamFaqehi 0:f3d96a1a3177 229
RehamFaqehi 0:f3d96a1a3177 230 // button interrupts ISRs
RehamFaqehi 0:f3d96a1a3177 231 // Each of these simply sets the appropriate event bit in the _event_state
RehamFaqehi 0:f3d96a1a3177 232 // variable
RehamFaqehi 0:f3d96a1a3177 233 void Gamepad::a_isr()
RehamFaqehi 0:f3d96a1a3177 234 {
RehamFaqehi 0:f3d96a1a3177 235 _event_state.set(A_PRESSED);
RehamFaqehi 0:f3d96a1a3177 236 }
RehamFaqehi 0:f3d96a1a3177 237 void Gamepad::b_isr()
RehamFaqehi 0:f3d96a1a3177 238 {
RehamFaqehi 0:f3d96a1a3177 239 _event_state.set(B_PRESSED);
RehamFaqehi 0:f3d96a1a3177 240 }
RehamFaqehi 0:f3d96a1a3177 241 void Gamepad::x_isr()
RehamFaqehi 0:f3d96a1a3177 242 {
RehamFaqehi 0:f3d96a1a3177 243 _event_state.set(X_PRESSED);
RehamFaqehi 0:f3d96a1a3177 244 }
RehamFaqehi 0:f3d96a1a3177 245 void Gamepad::y_isr()
RehamFaqehi 0:f3d96a1a3177 246 {
RehamFaqehi 0:f3d96a1a3177 247 _event_state.set(Y_PRESSED);
RehamFaqehi 0:f3d96a1a3177 248 }
RehamFaqehi 0:f3d96a1a3177 249 void Gamepad::l_isr()
RehamFaqehi 0:f3d96a1a3177 250 {
RehamFaqehi 0:f3d96a1a3177 251 _event_state.set(L_PRESSED);
RehamFaqehi 0:f3d96a1a3177 252 }
RehamFaqehi 0:f3d96a1a3177 253 void Gamepad::r_isr()
RehamFaqehi 0:f3d96a1a3177 254 {
RehamFaqehi 0:f3d96a1a3177 255 _event_state.set(R_PRESSED);
RehamFaqehi 0:f3d96a1a3177 256 }
RehamFaqehi 0:f3d96a1a3177 257 void Gamepad::back_isr()
RehamFaqehi 0:f3d96a1a3177 258 {
RehamFaqehi 0:f3d96a1a3177 259 _event_state.set(BACK_PRESSED);
RehamFaqehi 0:f3d96a1a3177 260 }
RehamFaqehi 0:f3d96a1a3177 261 void Gamepad::start_isr()
RehamFaqehi 0:f3d96a1a3177 262 {
RehamFaqehi 0:f3d96a1a3177 263 _event_state.set(START_PRESSED);
RehamFaqehi 0:f3d96a1a3177 264 }
RehamFaqehi 0:f3d96a1a3177 265 void Gamepad::joy_isr()
RehamFaqehi 0:f3d96a1a3177 266 {
RehamFaqehi 0:f3d96a1a3177 267 _event_state.set(JOY_PRESSED);
RehamFaqehi 0:f3d96a1a3177 268 }
RehamFaqehi 0:f3d96a1a3177 269
RehamFaqehi 0:f3d96a1a3177 270 // get raw joystick coordinate in range -1 to 1
RehamFaqehi 0:f3d96a1a3177 271 // Direction (x,y)
RehamFaqehi 0:f3d96a1a3177 272 // North (0,1)
RehamFaqehi 0:f3d96a1a3177 273 // East (1,0)
RehamFaqehi 0:f3d96a1a3177 274 // South (0,-1)
RehamFaqehi 0:f3d96a1a3177 275 // West (-1,0)
RehamFaqehi 0:f3d96a1a3177 276 Vector2D Gamepad::get_coord()
RehamFaqehi 0:f3d96a1a3177 277 {
RehamFaqehi 0:f3d96a1a3177 278 // read() returns value in range 0.0 to 1.0 so is scaled and centre value
RehamFaqehi 0:f3d96a1a3177 279 // substracted to get values in the range -1.0 to 1.0
RehamFaqehi 0:f3d96a1a3177 280 float x = 2.0f*( _horiz->read() - _x0 );
RehamFaqehi 0:f3d96a1a3177 281 float y = 2.0f*( _vert->read() - _y0 );
RehamFaqehi 0:f3d96a1a3177 282
RehamFaqehi 0:f3d96a1a3177 283 // Note: the x value here is inverted to ensure the positive x is to the
RehamFaqehi 0:f3d96a1a3177 284 // right. This is simply due to how the potentiometer on the joystick
RehamFaqehi 0:f3d96a1a3177 285 // I was using was connected up. It could have been corrected in hardware
RehamFaqehi 0:f3d96a1a3177 286 // by swapping the power supply pins. Instead it is done in software so may
RehamFaqehi 0:f3d96a1a3177 287 // need to be changed depending on your wiring setup
RehamFaqehi 0:f3d96a1a3177 288
RehamFaqehi 0:f3d96a1a3177 289 Vector2D coord = {-x,y};
RehamFaqehi 0:f3d96a1a3177 290 return coord;
RehamFaqehi 0:f3d96a1a3177 291 }
RehamFaqehi 0:f3d96a1a3177 292
RehamFaqehi 0:f3d96a1a3177 293 // This maps the raw x,y coord onto a circular grid.
RehamFaqehi 0:f3d96a1a3177 294 // See: http://mathproofs.blogspot.co.uk/2005/07/mapping-square-to-circle.html
RehamFaqehi 0:f3d96a1a3177 295 Vector2D Gamepad::get_mapped_coord()
RehamFaqehi 0:f3d96a1a3177 296 {
RehamFaqehi 0:f3d96a1a3177 297 Vector2D coord = get_coord();
RehamFaqehi 0:f3d96a1a3177 298
RehamFaqehi 0:f3d96a1a3177 299 // do the transformation
RehamFaqehi 0:f3d96a1a3177 300 float x = coord.x*sqrt(1.0f-pow(coord.y,2.0f)/2.0f);
RehamFaqehi 0:f3d96a1a3177 301 float y = coord.y*sqrt(1.0f-pow(coord.x,2.0f)/2.0f);
RehamFaqehi 0:f3d96a1a3177 302
RehamFaqehi 0:f3d96a1a3177 303 Vector2D mapped_coord = {x,y};
RehamFaqehi 0:f3d96a1a3177 304 return mapped_coord;
RehamFaqehi 0:f3d96a1a3177 305 }
RehamFaqehi 0:f3d96a1a3177 306
RehamFaqehi 0:f3d96a1a3177 307 // this function converts the mapped coordinates into polar form
RehamFaqehi 0:f3d96a1a3177 308 Polar Gamepad::get_polar()
RehamFaqehi 0:f3d96a1a3177 309 {
RehamFaqehi 0:f3d96a1a3177 310 // get the mapped coordinate
RehamFaqehi 0:f3d96a1a3177 311 Vector2D coord = get_mapped_coord();
RehamFaqehi 0:f3d96a1a3177 312
RehamFaqehi 0:f3d96a1a3177 313 // at this point, 0 degrees (i.e. x-axis) will be defined to the East.
RehamFaqehi 0:f3d96a1a3177 314 // We want 0 degrees to correspond to North and increase clockwise to 359
RehamFaqehi 0:f3d96a1a3177 315 // like a compass heading, so we need to swap the axis and invert y
RehamFaqehi 0:f3d96a1a3177 316 float x = coord.y;
RehamFaqehi 0:f3d96a1a3177 317 float y = coord.x;
RehamFaqehi 0:f3d96a1a3177 318
RehamFaqehi 0:f3d96a1a3177 319 float mag = sqrt(x*x+y*y); // pythagoras
RehamFaqehi 0:f3d96a1a3177 320 float angle = RAD2DEG*atan2(y,x);
RehamFaqehi 0:f3d96a1a3177 321 // angle will be in range -180 to 180, so add 360 to negative angles to
RehamFaqehi 0:f3d96a1a3177 322 // move to 0 to 360 range
RehamFaqehi 0:f3d96a1a3177 323 if (angle < 0.0f) {
RehamFaqehi 0:f3d96a1a3177 324 angle+=360.0f;
RehamFaqehi 0:f3d96a1a3177 325 }
RehamFaqehi 0:f3d96a1a3177 326
RehamFaqehi 0:f3d96a1a3177 327 // the noise on the ADC causes the values of x and y to fluctuate slightly
RehamFaqehi 0:f3d96a1a3177 328 // around the centred values. This causes the random angle values to get
RehamFaqehi 0:f3d96a1a3177 329 // calculated when the joystick is centred and untouched. This is also when
RehamFaqehi 0:f3d96a1a3177 330 // the magnitude is very small, so we can check for a small magnitude and then
RehamFaqehi 0:f3d96a1a3177 331 // set the angle to -1. This will inform us when the angle is invalid and the
RehamFaqehi 0:f3d96a1a3177 332 // joystick is centred
RehamFaqehi 0:f3d96a1a3177 333
RehamFaqehi 0:f3d96a1a3177 334 if (mag < TOL) {
RehamFaqehi 0:f3d96a1a3177 335 mag = 0.0f;
RehamFaqehi 0:f3d96a1a3177 336 angle = -1.0f;
RehamFaqehi 0:f3d96a1a3177 337 }
RehamFaqehi 0:f3d96a1a3177 338
RehamFaqehi 0:f3d96a1a3177 339 Polar p = {mag,angle};
RehamFaqehi 0:f3d96a1a3177 340 return p;
RehamFaqehi 0:f3d96a1a3177 341 }