v1 Stable

Dependencies:   F401RE-USBHost USBHostXpad mbed

Committer:
Ownasaurus
Date:
Mon Dec 12 01:07:48 2016 +0000
Revision:
5:32c8b316582a
Parent:
3:52b2a7514406
Child:
6:21365f733399
Added XBoxOne wired controller support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ownasaurus 1:3c21da72660d 1 //TODO: save controller layout to sram
Ownasaurus 1:3c21da72660d 2
Ownasaurus 0:eb2258e8c4b5 3 #include "mbed.h"
Ownasaurus 2:c20d8438f206 4 #include "USBHostXpad.h"
Ownasaurus 3:52b2a7514406 5 #include "stm32f4xx_flash.h"
Ownasaurus 2:c20d8438f206 6
Ownasaurus 2:c20d8438f206 7 DigitalOut myled(LED1);
Ownasaurus 2:c20d8438f206 8 Serial pc(USBTX, USBRX); // tx, rx
Ownasaurus 2:c20d8438f206 9 DigitalInOut data(PA_8);
Ownasaurus 5:32c8b316582a 10 DigitalIn button(PC_13); // eventually code to set controls
Ownasaurus 2:c20d8438f206 11
Ownasaurus 2:c20d8438f206 12 /**
Ownasaurus 2:c20d8438f206 13 @namespace AXYB
Ownasaurus 2:c20d8438f206 14 @brief Integer for storing the hex of the A X Y B buttons
Ownasaurus 2:c20d8438f206 15 @brief XPad returns a 4 digit hex for all buttons- AXYB buttons are stored in first value
Ownasaurus 2:c20d8438f206 16 @param A - given as a 1
Ownasaurus 2:c20d8438f206 17 @param B - given as a 2
Ownasaurus 2:c20d8438f206 18 @param X - given as a 4
Ownasaurus 2:c20d8438f206 19 @param Y - given as a 8
Ownasaurus 2:c20d8438f206 20 */
Ownasaurus 2:c20d8438f206 21 uint8_t AXYB=0x0;
Ownasaurus 2:c20d8438f206 22 /**
Ownasaurus 2:c20d8438f206 23 @namespace XLBRB
Ownasaurus 2:c20d8438f206 24 @brief Integer for storing the hex of the LB,RB and center X buttons
Ownasaurus 3:52b2a7514406 25 @brief XPad returns a 4 digit hex for all buttons- XLBRB buttons are stored in second value
Ownasaurus 2:c20d8438f206 26 @param LB - given as a 1
Ownasaurus 2:c20d8438f206 27 @param R - given as a 2
Ownasaurus 2:c20d8438f206 28 @param X - given as a 4
Ownasaurus 2:c20d8438f206 29
Ownasaurus 2:c20d8438f206 30 */
Ownasaurus 2:c20d8438f206 31 uint8_t XLBRB=0x0;
Ownasaurus 2:c20d8438f206 32
Ownasaurus 2:c20d8438f206 33 /**
Ownasaurus 2:c20d8438f206 34 @namespace bkStrtLCRC
Ownasaurus 2:c20d8438f206 35 @brief Integer for storing the hex of the Left analog button,Right analog button,back and start buttons
Ownasaurus 3:52b2a7514406 36 @brief XPad returns a 4 digit hex for all buttons- bkStrtLCRC buttons are stored in third value
Ownasaurus 2:c20d8438f206 37 @param start - given as a 1
Ownasaurus 2:c20d8438f206 38 @param back - given as a 2
Ownasaurus 2:c20d8438f206 39 @param LC - given as a 4
Ownasaurus 2:c20d8438f206 40 @param RC - given as a 8
Ownasaurus 2:c20d8438f206 41 */
Ownasaurus 2:c20d8438f206 42 uint8_t bkStrtLCRC=0x0;
Ownasaurus 2:c20d8438f206 43 /**
Ownasaurus 2:c20d8438f206 44 @namespace DPad
Ownasaurus 2:c20d8438f206 45 @brief Integer for storing the hex of the Directional buttons
Ownasaurus 3:52b2a7514406 46 @brief XPad returns a 4 digit hex for all buttons- DPad buttons are stored in fourth value
Ownasaurus 2:c20d8438f206 47 @param Up - given as a 1
Ownasaurus 2:c20d8438f206 48 @param Down - given as a 2
Ownasaurus 2:c20d8438f206 49 @param Left - given as a 4
Ownasaurus 2:c20d8438f206 50 @param Right - given as a 8
Ownasaurus 2:c20d8438f206 51 */
Ownasaurus 2:c20d8438f206 52 uint8_t DPad=0x0;
Ownasaurus 2:c20d8438f206 53 /**
Ownasaurus 2:c20d8438f206 54 @namespace LSY
Ownasaurus 2:c20d8438f206 55 @brief float for storing the value of the Left Analogue Stick's Y axis
Ownasaurus 2:c20d8438f206 56 @brief XPad returns a value between -32768(down) and 32767(up)
Ownasaurus 2:c20d8438f206 57 @there is a deadzone between around -4000 and 4000 where the value returned is not consistent when in the fixed position(assummed 0,0 point)
Ownasaurus 2:c20d8438f206 58 */
Ownasaurus 2:c20d8438f206 59 char LSY=0x0;
Ownasaurus 2:c20d8438f206 60 /**
Ownasaurus 2:c20d8438f206 61 @namespace LSX
Ownasaurus 2:c20d8438f206 62 @brief float for storing the value of the Left Analogue Stick's X axis
Ownasaurus 2:c20d8438f206 63 @brief XPad returns a value between -32768(left) and 32767(right)
Ownasaurus 2:c20d8438f206 64 @there is a deadzone between around -4000 and 4000 where the value returned is not consistent when in the fixed position(assummed 0,0 point)
Ownasaurus 2:c20d8438f206 65 */
Ownasaurus 2:c20d8438f206 66 char LSX=0x0;
Ownasaurus 2:c20d8438f206 67 /**
Ownasaurus 2:c20d8438f206 68 @namespace RSY
Ownasaurus 2:c20d8438f206 69 @brief float for storing the value of the Right Analogue Stick's Y axis
Ownasaurus 2:c20d8438f206 70 @brief XPad returns a value between -32768() and 32767(up)
Ownasaurus 2:c20d8438f206 71 @there is a deadzone between around -4000 and 4000 where the value returned is not consistent when in the fixed position(assummed 0,0 point)
Ownasaurus 2:c20d8438f206 72 */
Ownasaurus 2:c20d8438f206 73 float RSY=0x0;
Ownasaurus 2:c20d8438f206 74 /**
Ownasaurus 2:c20d8438f206 75 @namespace RSX
Ownasaurus 2:c20d8438f206 76 @brief float for storing the value of the Right Analogue Stick's X axis
Ownasaurus 2:c20d8438f206 77 @brief XPad returns a value between -32768(left) and 32767(right)
Ownasaurus 2:c20d8438f206 78 @there is a deadzone between around -4000 and 4000 where the value returned is not consistent when in the fixed position(assummed 0,0 point)
Ownasaurus 2:c20d8438f206 79 */
Ownasaurus 2:c20d8438f206 80 float RSX=0x0;
Ownasaurus 2:c20d8438f206 81 /**
Ownasaurus 2:c20d8438f206 82 @namespace sN
Ownasaurus 2:c20d8438f206 83 @brief float for storing the stick Normalising value
Ownasaurus 2:c20d8438f206 84 @brief makes the range of the sticks -80 to 80
Ownasaurus 2:c20d8438f206 85 */
Ownasaurus 2:c20d8438f206 86 const float sN=0.00244140625;//(80/32768)
Ownasaurus 2:c20d8438f206 87 /**
Ownasaurus 2:c20d8438f206 88 @namespace Lt
Ownasaurus 2:c20d8438f206 89 @brief float for storing the value of the Left trigger
Ownasaurus 2:c20d8438f206 90 @brief XPad returns a value between 0(not pressed) and 255(fully pressed)
Ownasaurus 2:c20d8438f206 91 @
Ownasaurus 2:c20d8438f206 92 */
Ownasaurus 2:c20d8438f206 93 float Lt=0x0;
Ownasaurus 2:c20d8438f206 94 /**
Ownasaurus 2:c20d8438f206 95 @namespace Rt
Ownasaurus 2:c20d8438f206 96 @brief float for storing the value of the Left trigger
Ownasaurus 2:c20d8438f206 97 @brief XPad returns a value between 0(not pressed) and 255(fully pressed)
Ownasaurus 2:c20d8438f206 98 @
Ownasaurus 2:c20d8438f206 99 */
Ownasaurus 2:c20d8438f206 100 float Rt=0x0;
Ownasaurus 2:c20d8438f206 101 /**
Ownasaurus 2:c20d8438f206 102 @namespace tN
Ownasaurus 2:c20d8438f206 103 @brief float for storing the trigger Normalising value
Ownasaurus 2:c20d8438f206 104 @brief makes the range of the triggers 0 to 10
Ownasaurus 2:c20d8438f206 105 */
Ownasaurus 2:c20d8438f206 106 const float tN=0.03921568627;//(10/255)
Ownasaurus 5:32c8b316582a 107 const int DEADZONE = 3;
Ownasaurus 2:c20d8438f206 108
Ownasaurus 2:c20d8438f206 109 char reverse(char b)
Ownasaurus 2:c20d8438f206 110 {
Ownasaurus 2:c20d8438f206 111 b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
Ownasaurus 2:c20d8438f206 112 b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
Ownasaurus 2:c20d8438f206 113 b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
Ownasaurus 2:c20d8438f206 114 return b;
Ownasaurus 2:c20d8438f206 115 }
Ownasaurus 0:eb2258e8c4b5 116
Ownasaurus 0:eb2258e8c4b5 117 extern "C" void my_wait_us_asm (int n);
Ownasaurus 0:eb2258e8c4b5 118
Ownasaurus 5:32c8b316582a 119 struct __attribute__((packed)) N64ControllerData // all bits are in the correct order... except for the analog
Ownasaurus 1:3c21da72660d 120 {
Ownasaurus 1:3c21da72660d 121 unsigned int a : 1; // 1 bit wide
Ownasaurus 1:3c21da72660d 122 unsigned int b : 1;
Ownasaurus 1:3c21da72660d 123 unsigned int z : 1;
Ownasaurus 1:3c21da72660d 124 unsigned int start : 1;
Ownasaurus 1:3c21da72660d 125 unsigned int up : 1;
Ownasaurus 1:3c21da72660d 126 unsigned int down : 1;
Ownasaurus 1:3c21da72660d 127 unsigned int left : 1;
Ownasaurus 1:3c21da72660d 128 unsigned int right : 1;
Ownasaurus 1:3c21da72660d 129
Ownasaurus 1:3c21da72660d 130 unsigned int dummy1 : 1;
Ownasaurus 1:3c21da72660d 131 unsigned int dummy2 : 1;
Ownasaurus 1:3c21da72660d 132 unsigned int l :1 ;
Ownasaurus 1:3c21da72660d 133 unsigned int r : 1;
Ownasaurus 1:3c21da72660d 134 unsigned int c_up : 1;
Ownasaurus 1:3c21da72660d 135 unsigned int c_down : 1;
Ownasaurus 1:3c21da72660d 136 unsigned int c_left : 1;
Ownasaurus 1:3c21da72660d 137 unsigned int c_right : 1;
Ownasaurus 1:3c21da72660d 138
Ownasaurus 1:3c21da72660d 139 char x_axis;
Ownasaurus 1:3c21da72660d 140
Ownasaurus 1:3c21da72660d 141 char y_axis;
Ownasaurus 1:3c21da72660d 142
Ownasaurus 1:3c21da72660d 143 } n64_data;
Ownasaurus 1:3c21da72660d 144
Ownasaurus 3:52b2a7514406 145 void onXpadEvent (int buttons, int stick_lx, int stick_ly, int stick_rx, int stick_ry, int trigger_l, int trigger_r)
Ownasaurus 2:c20d8438f206 146 {
Ownasaurus 3:52b2a7514406 147 AXYB=buttons>>12;
Ownasaurus 3:52b2a7514406 148 XLBRB=(buttons&0x0f00)>>8;
Ownasaurus 3:52b2a7514406 149 bkStrtLCRC=(buttons&0x00f0)>>4;
Ownasaurus 3:52b2a7514406 150 DPad=buttons&0x000f;
Ownasaurus 2:c20d8438f206 151
Ownasaurus 5:32c8b316582a 152 //pc.printf("AXYB: %u, XLBRB, %u, bkStrtLCRC %u, DPad, %u\r\n",AXYB,XLBRB,bkStrtLCRC,DPad);
Ownasaurus 5:32c8b316582a 153
Ownasaurus 5:32c8b316582a 154 // normalize the analog stick values to be 80 max
Ownasaurus 3:52b2a7514406 155 LSY=(char)((int)(stick_ly*sN));
Ownasaurus 3:52b2a7514406 156 LSX=(char)((int)(stick_lx*sN));
Ownasaurus 3:52b2a7514406 157 RSY=stick_ry*sN;
Ownasaurus 3:52b2a7514406 158 RSX=stick_rx*sN;
Ownasaurus 2:c20d8438f206 159
Ownasaurus 5:32c8b316582a 160 // normalize the trigger values to be 10 max
Ownasaurus 3:52b2a7514406 161 Lt=trigger_l*tN;
Ownasaurus 3:52b2a7514406 162 Rt=trigger_r*tN;
Ownasaurus 2:c20d8438f206 163
Ownasaurus 2:c20d8438f206 164 memset(&n64_data,0,4); // clear controller state
Ownasaurus 2:c20d8438f206 165
Ownasaurus 3:52b2a7514406 166 // Owna's Controls
Ownasaurus 5:32c8b316582a 167 if(AXYB & 0x01) // a
Ownasaurus 2:c20d8438f206 168 {
Ownasaurus 2:c20d8438f206 169 n64_data.a = 1;
Ownasaurus 2:c20d8438f206 170 }
Ownasaurus 2:c20d8438f206 171 if((AXYB >> 2) & 0x01) // x
Ownasaurus 2:c20d8438f206 172 {
Ownasaurus 2:c20d8438f206 173 n64_data.b = 1;
Ownasaurus 2:c20d8438f206 174 }
Ownasaurus 2:c20d8438f206 175 if((AXYB >> 1) & 0x01) // b
Ownasaurus 2:c20d8438f206 176 {
Ownasaurus 2:c20d8438f206 177 n64_data.z = 1;
Ownasaurus 2:c20d8438f206 178 }
Ownasaurus 2:c20d8438f206 179 if((AXYB >> 3) & 0x01) // y
Ownasaurus 2:c20d8438f206 180 {
Ownasaurus 2:c20d8438f206 181 n64_data.c_up = 1;
Ownasaurus 2:c20d8438f206 182 }
Ownasaurus 2:c20d8438f206 183 if(bkStrtLCRC & 0x01) // start
Ownasaurus 2:c20d8438f206 184 {
Ownasaurus 2:c20d8438f206 185 n64_data.start = 1;
Ownasaurus 2:c20d8438f206 186 }
Ownasaurus 2:c20d8438f206 187 if((XLBRB >> 1) & 0x01) // right bumper
Ownasaurus 2:c20d8438f206 188 {
Ownasaurus 2:c20d8438f206 189 n64_data.r = 1;
Ownasaurus 2:c20d8438f206 190 }
Ownasaurus 2:c20d8438f206 191 if(XLBRB & 0x01) // left bumper
Ownasaurus 2:c20d8438f206 192 {
Ownasaurus 2:c20d8438f206 193 n64_data.l = 1;
Ownasaurus 5:32c8b316582a 194 }
Ownasaurus 3:52b2a7514406 195
Ownasaurus 3:52b2a7514406 196 // Supa's Controls
Ownasaurus 3:52b2a7514406 197 /*if(AXYB & 0x01) // a
Ownasaurus 3:52b2a7514406 198 {
Ownasaurus 3:52b2a7514406 199 n64_data.a = 1;
Ownasaurus 2:c20d8438f206 200 }
Ownasaurus 3:52b2a7514406 201 if((AXYB >> 2) & 0x01) // x
Ownasaurus 3:52b2a7514406 202 {
Ownasaurus 3:52b2a7514406 203 n64_data.b = 1;
Ownasaurus 3:52b2a7514406 204 }
Ownasaurus 3:52b2a7514406 205 if((AXYB >> 1) & 0x01) // b
Ownasaurus 3:52b2a7514406 206 {
Ownasaurus 3:52b2a7514406 207 n64_data.c_down = 1;
Ownasaurus 3:52b2a7514406 208 }
Ownasaurus 3:52b2a7514406 209 if((AXYB >> 3) & 0x01) // y
Ownasaurus 3:52b2a7514406 210 {
Ownasaurus 3:52b2a7514406 211 n64_data.z = 1;
Ownasaurus 3:52b2a7514406 212 }
Ownasaurus 3:52b2a7514406 213 if(bkStrtLCRC & 0x01) // start
Ownasaurus 3:52b2a7514406 214 {
Ownasaurus 3:52b2a7514406 215 n64_data.start = 1;
Ownasaurus 3:52b2a7514406 216 }
Ownasaurus 3:52b2a7514406 217 if((XLBRB >> 1) & 0x01) // right bumper
Ownasaurus 3:52b2a7514406 218 {
Ownasaurus 3:52b2a7514406 219 n64_data.r = 1;
Ownasaurus 3:52b2a7514406 220 }
Ownasaurus 3:52b2a7514406 221 if(XLBRB & 0x01) // left bumper
Ownasaurus 3:52b2a7514406 222 {
Ownasaurus 3:52b2a7514406 223 n64_data.l = 1;
Ownasaurus 3:52b2a7514406 224 }
Ownasaurus 3:52b2a7514406 225 if(DPad & 0x01) // DPad Up
Ownasaurus 3:52b2a7514406 226 {
Ownasaurus 3:52b2a7514406 227 n64_data.c_up = 1;
Ownasaurus 3:52b2a7514406 228 }
Ownasaurus 3:52b2a7514406 229 if(DPad & 0x02) // DPad Down
Ownasaurus 3:52b2a7514406 230 {
Ownasaurus 3:52b2a7514406 231 n64_data.c_down = 1;
Ownasaurus 3:52b2a7514406 232 }
Ownasaurus 3:52b2a7514406 233 if(DPad & 0x04) // DPad Left
Ownasaurus 3:52b2a7514406 234 {
Ownasaurus 3:52b2a7514406 235 n64_data.c_left = 1;
Ownasaurus 3:52b2a7514406 236 }
Ownasaurus 3:52b2a7514406 237 if(DPad & 0x08) // DPad Right
Ownasaurus 3:52b2a7514406 238 {
Ownasaurus 3:52b2a7514406 239 n64_data.c_right = 1;
Ownasaurus 3:52b2a7514406 240 }*/
Ownasaurus 3:52b2a7514406 241
Ownasaurus 3:52b2a7514406 242 // LD's Controls
Ownasaurus 5:32c8b316582a 243 /*if(AXYB & 0x01) // a
Ownasaurus 3:52b2a7514406 244 {
Ownasaurus 3:52b2a7514406 245 n64_data.a = 1;
Ownasaurus 3:52b2a7514406 246 }
Ownasaurus 3:52b2a7514406 247 if((AXYB >> 2) & 0x01) // x
Ownasaurus 3:52b2a7514406 248 {
Ownasaurus 3:52b2a7514406 249 n64_data.b = 1;
Ownasaurus 3:52b2a7514406 250 }
Ownasaurus 3:52b2a7514406 251 if((AXYB >> 3) & 0x01) // y
Ownasaurus 3:52b2a7514406 252 {
Ownasaurus 3:52b2a7514406 253 n64_data.c_up = 1;
Ownasaurus 3:52b2a7514406 254 }
Ownasaurus 3:52b2a7514406 255 if(bkStrtLCRC & 0x01) // start
Ownasaurus 3:52b2a7514406 256 {
Ownasaurus 3:52b2a7514406 257 n64_data.start = 1;
Ownasaurus 3:52b2a7514406 258 }
Ownasaurus 3:52b2a7514406 259 if((XLBRB >> 1) & 0x01) // right bumper
Ownasaurus 3:52b2a7514406 260 {
Ownasaurus 3:52b2a7514406 261 n64_data.r = 1;
Ownasaurus 3:52b2a7514406 262 }
Ownasaurus 3:52b2a7514406 263 if(XLBRB & 0x01) // left bumper
Ownasaurus 3:52b2a7514406 264 {
Ownasaurus 3:52b2a7514406 265 n64_data.l = 1;
Ownasaurus 3:52b2a7514406 266 }
Ownasaurus 3:52b2a7514406 267 if(DPad & 0x01) // DPad Up
Ownasaurus 3:52b2a7514406 268 {
Ownasaurus 3:52b2a7514406 269 n64_data.c_up = 1;
Ownasaurus 3:52b2a7514406 270 }
Ownasaurus 3:52b2a7514406 271 if(DPad & 0x02) // DPad Down
Ownasaurus 3:52b2a7514406 272 {
Ownasaurus 3:52b2a7514406 273 n64_data.c_down = 1;
Ownasaurus 3:52b2a7514406 274 }
Ownasaurus 3:52b2a7514406 275 if(DPad & 0x04) // DPad Left
Ownasaurus 3:52b2a7514406 276 {
Ownasaurus 3:52b2a7514406 277 n64_data.c_left = 1;
Ownasaurus 3:52b2a7514406 278 }
Ownasaurus 3:52b2a7514406 279 if(DPad & 0x08) // DPad Right
Ownasaurus 3:52b2a7514406 280 {
Ownasaurus 3:52b2a7514406 281 n64_data.c_right = 1;
Ownasaurus 3:52b2a7514406 282 }
Ownasaurus 5:32c8b316582a 283 if(Rt > 5) // Right trigger greater than threshold
Ownasaurus 5:32c8b316582a 284 {
Ownasaurus 5:32c8b316582a 285 n64_data.z = 1;
Ownasaurus 5:32c8b316582a 286 }*/
Ownasaurus 5:32c8b316582a 287
Ownasaurus 5:32c8b316582a 288 // JJ's Controls
Ownasaurus 5:32c8b316582a 289 /*if(AXYB & 0x01) // a
Ownasaurus 5:32c8b316582a 290 {
Ownasaurus 5:32c8b316582a 291 n64_data.a = 1;
Ownasaurus 5:32c8b316582a 292 }
Ownasaurus 5:32c8b316582a 293 if((AXYB >> 2) & 0x01) // x
Ownasaurus 5:32c8b316582a 294 {
Ownasaurus 5:32c8b316582a 295 n64_data.b = 1;
Ownasaurus 5:32c8b316582a 296 }
Ownasaurus 5:32c8b316582a 297 if((AXYB >> 3) & 0x01) // y
Ownasaurus 5:32c8b316582a 298 {
Ownasaurus 5:32c8b316582a 299 n64_data.c_left = 1;
Ownasaurus 5:32c8b316582a 300 }
Ownasaurus 5:32c8b316582a 301 if((AXYB >> 1) & 0x01) // b
Ownasaurus 5:32c8b316582a 302 {
Ownasaurus 5:32c8b316582a 303 n64_data.c_right = 1;
Ownasaurus 5:32c8b316582a 304 }
Ownasaurus 5:32c8b316582a 305 if(bkStrtLCRC & 0x01) // start
Ownasaurus 5:32c8b316582a 306 {
Ownasaurus 5:32c8b316582a 307 n64_data.start = 1;
Ownasaurus 5:32c8b316582a 308 }
Ownasaurus 5:32c8b316582a 309 if((XLBRB >> 1) & 0x01) // right bumper
Ownasaurus 5:32c8b316582a 310 {
Ownasaurus 5:32c8b316582a 311 n64_data.r = 1;
Ownasaurus 5:32c8b316582a 312 }
Ownasaurus 5:32c8b316582a 313 if(XLBRB & 0x01) // left bumper
Ownasaurus 3:52b2a7514406 314 {
Ownasaurus 3:52b2a7514406 315 n64_data.z = 1;
Ownasaurus 3:52b2a7514406 316 }
Ownasaurus 5:32c8b316582a 317 if(DPad & 0x01) // DPad Up
Ownasaurus 5:32c8b316582a 318 {
Ownasaurus 5:32c8b316582a 319 n64_data.up = 1;
Ownasaurus 5:32c8b316582a 320 }
Ownasaurus 5:32c8b316582a 321 if(DPad & 0x02) // DPad Down
Ownasaurus 5:32c8b316582a 322 {
Ownasaurus 5:32c8b316582a 323 n64_data.down = 1;
Ownasaurus 5:32c8b316582a 324 }
Ownasaurus 5:32c8b316582a 325 if(DPad & 0x04) // DPad Left
Ownasaurus 5:32c8b316582a 326 {
Ownasaurus 5:32c8b316582a 327 n64_data.left = 1;
Ownasaurus 5:32c8b316582a 328 }
Ownasaurus 5:32c8b316582a 329 if(DPad & 0x08) // DPad Right
Ownasaurus 5:32c8b316582a 330 {
Ownasaurus 5:32c8b316582a 331 n64_data.right = 1;
Ownasaurus 5:32c8b316582a 332 }
Ownasaurus 5:32c8b316582a 333 if(Lt > 2 || Rt > 2) // Triggers greater than threshold
Ownasaurus 5:32c8b316582a 334 {
Ownasaurus 5:32c8b316582a 335 n64_data.z = 1;
Ownasaurus 5:32c8b316582a 336 }*/
Ownasaurus 3:52b2a7514406 337
Ownasaurus 3:52b2a7514406 338 // Generic analog stick
Ownasaurus 2:c20d8438f206 339 if(LSX > DEADZONE)
Ownasaurus 2:c20d8438f206 340 {
Ownasaurus 2:c20d8438f206 341 n64_data.x_axis = reverse(LSX);
Ownasaurus 2:c20d8438f206 342 }
Ownasaurus 2:c20d8438f206 343 if(LSY > DEADZONE)
Ownasaurus 2:c20d8438f206 344 {
Ownasaurus 2:c20d8438f206 345 n64_data.y_axis = reverse(LSY);
Ownasaurus 2:c20d8438f206 346 }
Ownasaurus 2:c20d8438f206 347 }
Ownasaurus 0:eb2258e8c4b5 348
Ownasaurus 0:eb2258e8c4b5 349 // 0 is 3 microseconds low followed by 1 microsecond high
Ownasaurus 0:eb2258e8c4b5 350 // 1 is 1 microsecond low followed by 3 microseconds high
Ownasaurus 0:eb2258e8c4b5 351 unsigned int GetMiddleOfPulse()
Ownasaurus 0:eb2258e8c4b5 352 {
Ownasaurus 0:eb2258e8c4b5 353 // wait for line to go high
Ownasaurus 0:eb2258e8c4b5 354 while(1)
Ownasaurus 0:eb2258e8c4b5 355 {
Ownasaurus 0:eb2258e8c4b5 356 if(data.read() == 1) break;
Ownasaurus 0:eb2258e8c4b5 357 }
Ownasaurus 0:eb2258e8c4b5 358
Ownasaurus 0:eb2258e8c4b5 359 // wait for line to go low
Ownasaurus 0:eb2258e8c4b5 360 while(1)
Ownasaurus 0:eb2258e8c4b5 361 {
Ownasaurus 0:eb2258e8c4b5 362 if(data.read() == 0) break;
Ownasaurus 0:eb2258e8c4b5 363 }
Ownasaurus 0:eb2258e8c4b5 364
Ownasaurus 0:eb2258e8c4b5 365 // now we have the falling edge
Ownasaurus 0:eb2258e8c4b5 366 // wait 2 microseconds to be in the middle of the pulse, and read. high --> 1. low --> 0.
Ownasaurus 0:eb2258e8c4b5 367 my_wait_us_asm(2);
Ownasaurus 0:eb2258e8c4b5 368 return (unsigned int) data.read();
Ownasaurus 0:eb2258e8c4b5 369 }
Ownasaurus 0:eb2258e8c4b5 370
Ownasaurus 0:eb2258e8c4b5 371 // continuously read bits until at least 9 are read, confirm valid command, return without stop bit
Ownasaurus 0:eb2258e8c4b5 372 unsigned int readCommand()
Ownasaurus 0:eb2258e8c4b5 373 {
Ownasaurus 0:eb2258e8c4b5 374 unsigned int command = GetMiddleOfPulse(), bits_read = 1;
Ownasaurus 0:eb2258e8c4b5 375
Ownasaurus 0:eb2258e8c4b5 376 while(1) // read at least 9 bits (2 bytes + stop bit)
Ownasaurus 0:eb2258e8c4b5 377 {
Ownasaurus 0:eb2258e8c4b5 378 //my_wait_us_asm(4);
Ownasaurus 0:eb2258e8c4b5 379 command = command << 1; // make room for the new bit
Ownasaurus 0:eb2258e8c4b5 380 //command += data.read(); // place the new bit into the command
Ownasaurus 0:eb2258e8c4b5 381 command += GetMiddleOfPulse();
Ownasaurus 0:eb2258e8c4b5 382 command &= 0x1FF; // remove all except the last 9 bits
Ownasaurus 0:eb2258e8c4b5 383
Ownasaurus 0:eb2258e8c4b5 384 bits_read++;
Ownasaurus 0:eb2258e8c4b5 385
Ownasaurus 0:eb2258e8c4b5 386 if(bits_read >= 9) // only consider when at least a whole command's length has been read
Ownasaurus 0:eb2258e8c4b5 387 {
Ownasaurus 1:3c21da72660d 388 if(command == 0x3 || command == 0x1 || command == 0x1FF || command == 0x5 || command == 0x7)
Ownasaurus 0:eb2258e8c4b5 389 {
Ownasaurus 0:eb2258e8c4b5 390 // 0x3 = 0x1 + stop bit --> get controller state
Ownasaurus 0:eb2258e8c4b5 391 // 0x1 = 0x0 + stop bit --> who are you?
Ownasaurus 0:eb2258e8c4b5 392 // 0x1FF = 0xFF + stop bit --> reset signal
Ownasaurus 1:3c21da72660d 393 // 0x5 = 0x10 + stop bit --> read
Ownasaurus 1:3c21da72660d 394 // 0x7 = 0x11 + stop bit --> write
Ownasaurus 0:eb2258e8c4b5 395 command = command >> 1; // get rid of the stop bit
Ownasaurus 0:eb2258e8c4b5 396 return command;
Ownasaurus 0:eb2258e8c4b5 397 }
Ownasaurus 0:eb2258e8c4b5 398 }
Ownasaurus 0:eb2258e8c4b5 399 }
Ownasaurus 0:eb2258e8c4b5 400 }
Ownasaurus 0:eb2258e8c4b5 401
Ownasaurus 0:eb2258e8c4b5 402 void write_1()
Ownasaurus 0:eb2258e8c4b5 403 {
Ownasaurus 0:eb2258e8c4b5 404 data = 0;
Ownasaurus 0:eb2258e8c4b5 405 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 406 data = 1;
Ownasaurus 0:eb2258e8c4b5 407 my_wait_us_asm(3);
Ownasaurus 0:eb2258e8c4b5 408 //pc.printf("1");
Ownasaurus 0:eb2258e8c4b5 409 }
Ownasaurus 0:eb2258e8c4b5 410
Ownasaurus 0:eb2258e8c4b5 411 void write_0()
Ownasaurus 0:eb2258e8c4b5 412 {
Ownasaurus 0:eb2258e8c4b5 413 data = 0;
Ownasaurus 0:eb2258e8c4b5 414 my_wait_us_asm(3);
Ownasaurus 0:eb2258e8c4b5 415 data = 1;
Ownasaurus 0:eb2258e8c4b5 416 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 417 //pc.printf("0");
Ownasaurus 0:eb2258e8c4b5 418 }
Ownasaurus 0:eb2258e8c4b5 419
Ownasaurus 0:eb2258e8c4b5 420
Ownasaurus 1:3c21da72660d 421 void SendStop()
Ownasaurus 0:eb2258e8c4b5 422 {
Ownasaurus 0:eb2258e8c4b5 423 data = 0;
Ownasaurus 0:eb2258e8c4b5 424 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 425 data = 1;
Ownasaurus 0:eb2258e8c4b5 426 }
Ownasaurus 0:eb2258e8c4b5 427
Ownasaurus 1:3c21da72660d 428 // send a byte from LSB to MSB (proper serialization)
Ownasaurus 1:3c21da72660d 429 void SendByte(unsigned char b)
Ownasaurus 0:eb2258e8c4b5 430 {
Ownasaurus 0:eb2258e8c4b5 431 for(int i = 0;i < 8;i++) // send all 8 bits, one at a time
Ownasaurus 0:eb2258e8c4b5 432 {
Ownasaurus 0:eb2258e8c4b5 433 if((b >> i) & 1)
Ownasaurus 0:eb2258e8c4b5 434 {
Ownasaurus 0:eb2258e8c4b5 435 write_1();
Ownasaurus 0:eb2258e8c4b5 436 }
Ownasaurus 0:eb2258e8c4b5 437 else
Ownasaurus 0:eb2258e8c4b5 438 {
Ownasaurus 0:eb2258e8c4b5 439 write_0();
Ownasaurus 0:eb2258e8c4b5 440 }
Ownasaurus 0:eb2258e8c4b5 441 }
Ownasaurus 0:eb2258e8c4b5 442 }
Ownasaurus 0:eb2258e8c4b5 443
Ownasaurus 1:3c21da72660d 444 void SendIdentity()
Ownasaurus 1:3c21da72660d 445 {
Ownasaurus 1:3c21da72660d 446 // reply 0x05, 0x00, 0x02
Ownasaurus 1:3c21da72660d 447 SendByte(0x05);
Ownasaurus 1:3c21da72660d 448 SendByte(0x00);
Ownasaurus 1:3c21da72660d 449 SendByte(0x02);
Ownasaurus 1:3c21da72660d 450 SendStop();
Ownasaurus 1:3c21da72660d 451 }
Ownasaurus 1:3c21da72660d 452
Ownasaurus 1:3c21da72660d 453 void SendControllerData()
Ownasaurus 1:3c21da72660d 454 {
Ownasaurus 1:3c21da72660d 455 unsigned long data = *(unsigned long*)&n64_data;
Ownasaurus 1:3c21da72660d 456 unsigned int size = sizeof(data) * 8; // should be 4 bytes * 8 = 32 bits
Ownasaurus 1:3c21da72660d 457
Ownasaurus 1:3c21da72660d 458 for(unsigned int i = 0;i < size;i++)
Ownasaurus 1:3c21da72660d 459 {
Ownasaurus 1:3c21da72660d 460 if((data >> i) & 1)
Ownasaurus 1:3c21da72660d 461 {
Ownasaurus 1:3c21da72660d 462 write_1();
Ownasaurus 1:3c21da72660d 463 }
Ownasaurus 1:3c21da72660d 464 else
Ownasaurus 1:3c21da72660d 465 {
Ownasaurus 1:3c21da72660d 466 write_0();
Ownasaurus 1:3c21da72660d 467 }
Ownasaurus 1:3c21da72660d 468 }
Ownasaurus 1:3c21da72660d 469
Ownasaurus 1:3c21da72660d 470 SendStop();
Ownasaurus 1:3c21da72660d 471 }
Ownasaurus 1:3c21da72660d 472
Ownasaurus 0:eb2258e8c4b5 473 int main()
Ownasaurus 0:eb2258e8c4b5 474 {
Ownasaurus 5:32c8b316582a 475 //Timer t;
Ownasaurus 5:32c8b316582a 476
Ownasaurus 2:c20d8438f206 477 pc.printf("\r\nNow loaded! SystemCoreClock = %d Hz\r\n", SystemCoreClock);
Ownasaurus 1:3c21da72660d 478
Ownasaurus 2:c20d8438f206 479 USBHostXpad xpad;
Ownasaurus 2:c20d8438f206 480 if (!xpad.connect()) {
Ownasaurus 2:c20d8438f206 481 pc.printf("Error: XBox controller not found.\n");
Ownasaurus 1:3c21da72660d 482 }
Ownasaurus 2:c20d8438f206 483
Ownasaurus 2:c20d8438f206 484 xpad.attachEvent(onXpadEvent);
Ownasaurus 2:c20d8438f206 485 xpad.led(USBHostXpad::LED1_ON);
Ownasaurus 0:eb2258e8c4b5 486
Ownasaurus 0:eb2258e8c4b5 487 while(1)
Ownasaurus 0:eb2258e8c4b5 488 {
Ownasaurus 5:32c8b316582a 489 //t.start();
Ownasaurus 0:eb2258e8c4b5 490 // Set pin mode to input
Ownasaurus 0:eb2258e8c4b5 491 data.input();
Ownasaurus 0:eb2258e8c4b5 492
Ownasaurus 1:3c21da72660d 493 USBHost::poll();
Ownasaurus 1:3c21da72660d 494
Ownasaurus 1:3c21da72660d 495 __disable_irq(); // Disable Interrupts
Ownasaurus 1:3c21da72660d 496 // Read 64 command
Ownasaurus 0:eb2258e8c4b5 497 unsigned int cmd = readCommand();
Ownasaurus 0:eb2258e8c4b5 498
Ownasaurus 0:eb2258e8c4b5 499 my_wait_us_asm(2); // wait a small amount of time before replying
Ownasaurus 1:3c21da72660d 500
Ownasaurus 1:3c21da72660d 501 //-------- SEND RESPONSE
Ownasaurus 0:eb2258e8c4b5 502 // Set pin mode to output
Ownasaurus 0:eb2258e8c4b5 503 data.output();
Ownasaurus 0:eb2258e8c4b5 504
Ownasaurus 0:eb2258e8c4b5 505 switch(cmd)
Ownasaurus 0:eb2258e8c4b5 506 {
Ownasaurus 0:eb2258e8c4b5 507 case 0x00: // identity
Ownasaurus 0:eb2258e8c4b5 508 case 0xFF: // reset
Ownasaurus 1:3c21da72660d 509 SendIdentity();
Ownasaurus 0:eb2258e8c4b5 510 break;
Ownasaurus 0:eb2258e8c4b5 511 case 0x01: // poll for state
Ownasaurus 1:3c21da72660d 512 SendControllerData();
Ownasaurus 1:3c21da72660d 513 break;
Ownasaurus 1:3c21da72660d 514 default:
Ownasaurus 1:3c21da72660d 515 // we do not process the read and write commands (memory pack)
Ownasaurus 1:3c21da72660d 516 break;
Ownasaurus 0:eb2258e8c4b5 517 }
Ownasaurus 1:3c21da72660d 518 __enable_irq(); // Enable Interrupts
Ownasaurus 5:32c8b316582a 519 //-------- DONE SENDING RESPOSE
Ownasaurus 5:32c8b316582a 520
Ownasaurus 5:32c8b316582a 521 //t.stop();
Ownasaurus 5:32c8b316582a 522 pc.printf("Time: %d\r\n",t.read_us());
Ownasaurus 5:32c8b316582a 523 //t.reset();
Ownasaurus 0:eb2258e8c4b5 524 }
Ownasaurus 0:eb2258e8c4b5 525 }