v1 Stable

Dependencies:   F401RE-USBHost USBHostXpad mbed

Committer:
Ownasaurus
Date:
Mon Dec 05 02:38:24 2016 +0000
Revision:
3:52b2a7514406
Parent:
2:c20d8438f206
Child:
5:32c8b316582a
v1 Stable

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 3:52b2a7514406 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 3:52b2a7514406 107 const int DEADZONE = 8;
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 1:3c21da72660d 119 struct __attribute__((packed)) N64ControllerData // all bits are in the correct order
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 3:52b2a7514406 152 LSY=(char)((int)(stick_ly*sN));
Ownasaurus 3:52b2a7514406 153 LSX=(char)((int)(stick_lx*sN));
Ownasaurus 3:52b2a7514406 154 RSY=stick_ry*sN;
Ownasaurus 3:52b2a7514406 155 RSX=stick_rx*sN;
Ownasaurus 2:c20d8438f206 156
Ownasaurus 3:52b2a7514406 157 Lt=trigger_l*tN;
Ownasaurus 3:52b2a7514406 158 Rt=trigger_r*tN;
Ownasaurus 2:c20d8438f206 159
Ownasaurus 2:c20d8438f206 160 memset(&n64_data,0,4); // clear controller state
Ownasaurus 2:c20d8438f206 161
Ownasaurus 3:52b2a7514406 162 // Owna's Controls
Ownasaurus 3:52b2a7514406 163 /*if(AXYB & 0x01) // a
Ownasaurus 2:c20d8438f206 164 {
Ownasaurus 2:c20d8438f206 165 n64_data.a = 1;
Ownasaurus 2:c20d8438f206 166 }
Ownasaurus 2:c20d8438f206 167 if((AXYB >> 2) & 0x01) // x
Ownasaurus 2:c20d8438f206 168 {
Ownasaurus 2:c20d8438f206 169 n64_data.b = 1;
Ownasaurus 2:c20d8438f206 170 }
Ownasaurus 2:c20d8438f206 171 if((AXYB >> 1) & 0x01) // b
Ownasaurus 2:c20d8438f206 172 {
Ownasaurus 2:c20d8438f206 173 n64_data.z = 1;
Ownasaurus 2:c20d8438f206 174 }
Ownasaurus 2:c20d8438f206 175 if((AXYB >> 3) & 0x01) // y
Ownasaurus 2:c20d8438f206 176 {
Ownasaurus 2:c20d8438f206 177 n64_data.c_up = 1;
Ownasaurus 2:c20d8438f206 178 }
Ownasaurus 2:c20d8438f206 179 if(bkStrtLCRC & 0x01) // start
Ownasaurus 2:c20d8438f206 180 {
Ownasaurus 2:c20d8438f206 181 n64_data.start = 1;
Ownasaurus 2:c20d8438f206 182 }
Ownasaurus 2:c20d8438f206 183 if((XLBRB >> 1) & 0x01) // right bumper
Ownasaurus 2:c20d8438f206 184 {
Ownasaurus 2:c20d8438f206 185 n64_data.r = 1;
Ownasaurus 2:c20d8438f206 186 }
Ownasaurus 2:c20d8438f206 187 if(XLBRB & 0x01) // left bumper
Ownasaurus 2:c20d8438f206 188 {
Ownasaurus 2:c20d8438f206 189 n64_data.l = 1;
Ownasaurus 3:52b2a7514406 190 }*/
Ownasaurus 3:52b2a7514406 191
Ownasaurus 3:52b2a7514406 192 // Supa's Controls
Ownasaurus 3:52b2a7514406 193 /*if(AXYB & 0x01) // a
Ownasaurus 3:52b2a7514406 194 {
Ownasaurus 3:52b2a7514406 195 n64_data.a = 1;
Ownasaurus 2:c20d8438f206 196 }
Ownasaurus 3:52b2a7514406 197 if((AXYB >> 2) & 0x01) // x
Ownasaurus 3:52b2a7514406 198 {
Ownasaurus 3:52b2a7514406 199 n64_data.b = 1;
Ownasaurus 3:52b2a7514406 200 }
Ownasaurus 3:52b2a7514406 201 if((AXYB >> 1) & 0x01) // b
Ownasaurus 3:52b2a7514406 202 {
Ownasaurus 3:52b2a7514406 203 n64_data.c_down = 1;
Ownasaurus 3:52b2a7514406 204 }
Ownasaurus 3:52b2a7514406 205 if((AXYB >> 3) & 0x01) // y
Ownasaurus 3:52b2a7514406 206 {
Ownasaurus 3:52b2a7514406 207 n64_data.z = 1;
Ownasaurus 3:52b2a7514406 208 }
Ownasaurus 3:52b2a7514406 209 if(bkStrtLCRC & 0x01) // start
Ownasaurus 3:52b2a7514406 210 {
Ownasaurus 3:52b2a7514406 211 n64_data.start = 1;
Ownasaurus 3:52b2a7514406 212 }
Ownasaurus 3:52b2a7514406 213 if((XLBRB >> 1) & 0x01) // right bumper
Ownasaurus 3:52b2a7514406 214 {
Ownasaurus 3:52b2a7514406 215 n64_data.r = 1;
Ownasaurus 3:52b2a7514406 216 }
Ownasaurus 3:52b2a7514406 217 if(XLBRB & 0x01) // left bumper
Ownasaurus 3:52b2a7514406 218 {
Ownasaurus 3:52b2a7514406 219 n64_data.l = 1;
Ownasaurus 3:52b2a7514406 220 }
Ownasaurus 3:52b2a7514406 221 if(DPad & 0x01) // DPad Up
Ownasaurus 3:52b2a7514406 222 {
Ownasaurus 3:52b2a7514406 223 n64_data.c_up = 1;
Ownasaurus 3:52b2a7514406 224 }
Ownasaurus 3:52b2a7514406 225 if(DPad & 0x02) // DPad Down
Ownasaurus 3:52b2a7514406 226 {
Ownasaurus 3:52b2a7514406 227 n64_data.c_down = 1;
Ownasaurus 3:52b2a7514406 228 }
Ownasaurus 3:52b2a7514406 229 if(DPad & 0x04) // DPad Left
Ownasaurus 3:52b2a7514406 230 {
Ownasaurus 3:52b2a7514406 231 n64_data.c_left = 1;
Ownasaurus 3:52b2a7514406 232 }
Ownasaurus 3:52b2a7514406 233 if(DPad & 0x08) // DPad Right
Ownasaurus 3:52b2a7514406 234 {
Ownasaurus 3:52b2a7514406 235 n64_data.c_right = 1;
Ownasaurus 3:52b2a7514406 236 }*/
Ownasaurus 3:52b2a7514406 237
Ownasaurus 3:52b2a7514406 238 // LD's Controls
Ownasaurus 3:52b2a7514406 239 if(AXYB & 0x01) // a
Ownasaurus 3:52b2a7514406 240 {
Ownasaurus 3:52b2a7514406 241 n64_data.a = 1;
Ownasaurus 3:52b2a7514406 242 }
Ownasaurus 3:52b2a7514406 243 if((AXYB >> 2) & 0x01) // x
Ownasaurus 3:52b2a7514406 244 {
Ownasaurus 3:52b2a7514406 245 n64_data.b = 1;
Ownasaurus 3:52b2a7514406 246 }
Ownasaurus 3:52b2a7514406 247 if((AXYB >> 3) & 0x01) // y
Ownasaurus 3:52b2a7514406 248 {
Ownasaurus 3:52b2a7514406 249 n64_data.c_up = 1;
Ownasaurus 3:52b2a7514406 250 }
Ownasaurus 3:52b2a7514406 251 if(bkStrtLCRC & 0x01) // start
Ownasaurus 3:52b2a7514406 252 {
Ownasaurus 3:52b2a7514406 253 n64_data.start = 1;
Ownasaurus 3:52b2a7514406 254 }
Ownasaurus 3:52b2a7514406 255 if((XLBRB >> 1) & 0x01) // right bumper
Ownasaurus 3:52b2a7514406 256 {
Ownasaurus 3:52b2a7514406 257 n64_data.r = 1;
Ownasaurus 3:52b2a7514406 258 }
Ownasaurus 3:52b2a7514406 259 if(XLBRB & 0x01) // left bumper
Ownasaurus 3:52b2a7514406 260 {
Ownasaurus 3:52b2a7514406 261 n64_data.l = 1;
Ownasaurus 3:52b2a7514406 262 }
Ownasaurus 3:52b2a7514406 263 if(DPad & 0x01) // DPad Up
Ownasaurus 3:52b2a7514406 264 {
Ownasaurus 3:52b2a7514406 265 n64_data.c_up = 1;
Ownasaurus 3:52b2a7514406 266 }
Ownasaurus 3:52b2a7514406 267 if(DPad & 0x02) // DPad Down
Ownasaurus 3:52b2a7514406 268 {
Ownasaurus 3:52b2a7514406 269 n64_data.c_down = 1;
Ownasaurus 3:52b2a7514406 270 }
Ownasaurus 3:52b2a7514406 271 if(DPad & 0x04) // DPad Left
Ownasaurus 3:52b2a7514406 272 {
Ownasaurus 3:52b2a7514406 273 n64_data.c_left = 1;
Ownasaurus 3:52b2a7514406 274 }
Ownasaurus 3:52b2a7514406 275 if(DPad & 0x08) // DPad Right
Ownasaurus 3:52b2a7514406 276 {
Ownasaurus 3:52b2a7514406 277 n64_data.c_right = 1;
Ownasaurus 3:52b2a7514406 278 }
Ownasaurus 3:52b2a7514406 279 if(Rt > 50) // Right trigger greater than threshold
Ownasaurus 3:52b2a7514406 280 {
Ownasaurus 3:52b2a7514406 281 n64_data.z = 1;
Ownasaurus 3:52b2a7514406 282 }
Ownasaurus 3:52b2a7514406 283
Ownasaurus 3:52b2a7514406 284 // Generic analog stick
Ownasaurus 2:c20d8438f206 285 if(LSX > DEADZONE)
Ownasaurus 2:c20d8438f206 286 {
Ownasaurus 2:c20d8438f206 287 n64_data.x_axis = reverse(LSX);
Ownasaurus 2:c20d8438f206 288 }
Ownasaurus 2:c20d8438f206 289 if(LSY > DEADZONE)
Ownasaurus 2:c20d8438f206 290 {
Ownasaurus 2:c20d8438f206 291 n64_data.y_axis = reverse(LSY);
Ownasaurus 2:c20d8438f206 292 }
Ownasaurus 2:c20d8438f206 293 }
Ownasaurus 0:eb2258e8c4b5 294
Ownasaurus 0:eb2258e8c4b5 295 // 0 is 3 microseconds low followed by 1 microsecond high
Ownasaurus 0:eb2258e8c4b5 296 // 1 is 1 microsecond low followed by 3 microseconds high
Ownasaurus 0:eb2258e8c4b5 297 unsigned int GetMiddleOfPulse()
Ownasaurus 0:eb2258e8c4b5 298 {
Ownasaurus 0:eb2258e8c4b5 299 // wait for line to go high
Ownasaurus 0:eb2258e8c4b5 300 while(1)
Ownasaurus 0:eb2258e8c4b5 301 {
Ownasaurus 0:eb2258e8c4b5 302 if(data.read() == 1) break;
Ownasaurus 0:eb2258e8c4b5 303 }
Ownasaurus 0:eb2258e8c4b5 304
Ownasaurus 0:eb2258e8c4b5 305 // wait for line to go low
Ownasaurus 0:eb2258e8c4b5 306 while(1)
Ownasaurus 0:eb2258e8c4b5 307 {
Ownasaurus 0:eb2258e8c4b5 308 if(data.read() == 0) break;
Ownasaurus 0:eb2258e8c4b5 309 }
Ownasaurus 0:eb2258e8c4b5 310
Ownasaurus 0:eb2258e8c4b5 311 // now we have the falling edge
Ownasaurus 0:eb2258e8c4b5 312 // wait 2 microseconds to be in the middle of the pulse, and read. high --> 1. low --> 0.
Ownasaurus 0:eb2258e8c4b5 313 my_wait_us_asm(2);
Ownasaurus 0:eb2258e8c4b5 314 return (unsigned int) data.read();
Ownasaurus 0:eb2258e8c4b5 315 }
Ownasaurus 0:eb2258e8c4b5 316
Ownasaurus 0:eb2258e8c4b5 317 // continuously read bits until at least 9 are read, confirm valid command, return without stop bit
Ownasaurus 0:eb2258e8c4b5 318 unsigned int readCommand()
Ownasaurus 0:eb2258e8c4b5 319 {
Ownasaurus 0:eb2258e8c4b5 320 unsigned int command = GetMiddleOfPulse(), bits_read = 1;
Ownasaurus 0:eb2258e8c4b5 321
Ownasaurus 0:eb2258e8c4b5 322 while(1) // read at least 9 bits (2 bytes + stop bit)
Ownasaurus 0:eb2258e8c4b5 323 {
Ownasaurus 0:eb2258e8c4b5 324 //my_wait_us_asm(4);
Ownasaurus 0:eb2258e8c4b5 325 command = command << 1; // make room for the new bit
Ownasaurus 0:eb2258e8c4b5 326 //command += data.read(); // place the new bit into the command
Ownasaurus 0:eb2258e8c4b5 327 command += GetMiddleOfPulse();
Ownasaurus 0:eb2258e8c4b5 328 command &= 0x1FF; // remove all except the last 9 bits
Ownasaurus 0:eb2258e8c4b5 329
Ownasaurus 0:eb2258e8c4b5 330 bits_read++;
Ownasaurus 0:eb2258e8c4b5 331
Ownasaurus 0:eb2258e8c4b5 332 if(bits_read >= 9) // only consider when at least a whole command's length has been read
Ownasaurus 0:eb2258e8c4b5 333 {
Ownasaurus 1:3c21da72660d 334 if(command == 0x3 || command == 0x1 || command == 0x1FF || command == 0x5 || command == 0x7)
Ownasaurus 0:eb2258e8c4b5 335 {
Ownasaurus 0:eb2258e8c4b5 336 // 0x3 = 0x1 + stop bit --> get controller state
Ownasaurus 0:eb2258e8c4b5 337 // 0x1 = 0x0 + stop bit --> who are you?
Ownasaurus 0:eb2258e8c4b5 338 // 0x1FF = 0xFF + stop bit --> reset signal
Ownasaurus 1:3c21da72660d 339 // 0x5 = 0x10 + stop bit --> read
Ownasaurus 1:3c21da72660d 340 // 0x7 = 0x11 + stop bit --> write
Ownasaurus 0:eb2258e8c4b5 341 command = command >> 1; // get rid of the stop bit
Ownasaurus 0:eb2258e8c4b5 342 return command;
Ownasaurus 0:eb2258e8c4b5 343 }
Ownasaurus 0:eb2258e8c4b5 344 }
Ownasaurus 0:eb2258e8c4b5 345 }
Ownasaurus 0:eb2258e8c4b5 346 }
Ownasaurus 0:eb2258e8c4b5 347
Ownasaurus 0:eb2258e8c4b5 348 void write_1()
Ownasaurus 0:eb2258e8c4b5 349 {
Ownasaurus 0:eb2258e8c4b5 350 data = 0;
Ownasaurus 0:eb2258e8c4b5 351 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 352 data = 1;
Ownasaurus 0:eb2258e8c4b5 353 my_wait_us_asm(3);
Ownasaurus 0:eb2258e8c4b5 354 //pc.printf("1");
Ownasaurus 0:eb2258e8c4b5 355 }
Ownasaurus 0:eb2258e8c4b5 356
Ownasaurus 0:eb2258e8c4b5 357 void write_0()
Ownasaurus 0:eb2258e8c4b5 358 {
Ownasaurus 0:eb2258e8c4b5 359 data = 0;
Ownasaurus 0:eb2258e8c4b5 360 my_wait_us_asm(3);
Ownasaurus 0:eb2258e8c4b5 361 data = 1;
Ownasaurus 0:eb2258e8c4b5 362 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 363 //pc.printf("0");
Ownasaurus 0:eb2258e8c4b5 364 }
Ownasaurus 0:eb2258e8c4b5 365
Ownasaurus 0:eb2258e8c4b5 366
Ownasaurus 1:3c21da72660d 367 void SendStop()
Ownasaurus 0:eb2258e8c4b5 368 {
Ownasaurus 0:eb2258e8c4b5 369 data = 0;
Ownasaurus 0:eb2258e8c4b5 370 my_wait_us_asm(1);
Ownasaurus 0:eb2258e8c4b5 371 data = 1;
Ownasaurus 0:eb2258e8c4b5 372 }
Ownasaurus 0:eb2258e8c4b5 373
Ownasaurus 1:3c21da72660d 374 // send a byte from LSB to MSB (proper serialization)
Ownasaurus 1:3c21da72660d 375 void SendByte(unsigned char b)
Ownasaurus 0:eb2258e8c4b5 376 {
Ownasaurus 0:eb2258e8c4b5 377 for(int i = 0;i < 8;i++) // send all 8 bits, one at a time
Ownasaurus 0:eb2258e8c4b5 378 {
Ownasaurus 0:eb2258e8c4b5 379 if((b >> i) & 1)
Ownasaurus 0:eb2258e8c4b5 380 {
Ownasaurus 0:eb2258e8c4b5 381 write_1();
Ownasaurus 0:eb2258e8c4b5 382 }
Ownasaurus 0:eb2258e8c4b5 383 else
Ownasaurus 0:eb2258e8c4b5 384 {
Ownasaurus 0:eb2258e8c4b5 385 write_0();
Ownasaurus 0:eb2258e8c4b5 386 }
Ownasaurus 0:eb2258e8c4b5 387 }
Ownasaurus 0:eb2258e8c4b5 388 }
Ownasaurus 0:eb2258e8c4b5 389
Ownasaurus 1:3c21da72660d 390 void SendIdentity()
Ownasaurus 1:3c21da72660d 391 {
Ownasaurus 1:3c21da72660d 392 // reply 0x05, 0x00, 0x02
Ownasaurus 1:3c21da72660d 393 SendByte(0x05);
Ownasaurus 1:3c21da72660d 394 SendByte(0x00);
Ownasaurus 1:3c21da72660d 395 SendByte(0x02);
Ownasaurus 1:3c21da72660d 396 SendStop();
Ownasaurus 1:3c21da72660d 397 }
Ownasaurus 1:3c21da72660d 398
Ownasaurus 1:3c21da72660d 399 void SendControllerData()
Ownasaurus 1:3c21da72660d 400 {
Ownasaurus 1:3c21da72660d 401 unsigned long data = *(unsigned long*)&n64_data;
Ownasaurus 1:3c21da72660d 402 unsigned int size = sizeof(data) * 8; // should be 4 bytes * 8 = 32 bits
Ownasaurus 1:3c21da72660d 403
Ownasaurus 1:3c21da72660d 404 for(unsigned int i = 0;i < size;i++)
Ownasaurus 1:3c21da72660d 405 {
Ownasaurus 1:3c21da72660d 406 if((data >> i) & 1)
Ownasaurus 1:3c21da72660d 407 {
Ownasaurus 1:3c21da72660d 408 write_1();
Ownasaurus 1:3c21da72660d 409 }
Ownasaurus 1:3c21da72660d 410 else
Ownasaurus 1:3c21da72660d 411 {
Ownasaurus 1:3c21da72660d 412 write_0();
Ownasaurus 1:3c21da72660d 413 }
Ownasaurus 1:3c21da72660d 414 }
Ownasaurus 1:3c21da72660d 415
Ownasaurus 1:3c21da72660d 416 SendStop();
Ownasaurus 1:3c21da72660d 417 }
Ownasaurus 1:3c21da72660d 418
Ownasaurus 0:eb2258e8c4b5 419 int main()
Ownasaurus 0:eb2258e8c4b5 420 {
Ownasaurus 2:c20d8438f206 421 pc.printf("\r\nNow loaded! SystemCoreClock = %d Hz\r\n", SystemCoreClock);
Ownasaurus 1:3c21da72660d 422
Ownasaurus 2:c20d8438f206 423 USBHostXpad xpad;
Ownasaurus 2:c20d8438f206 424 if (!xpad.connect()) {
Ownasaurus 2:c20d8438f206 425 pc.printf("Error: XBox controller not found.\n");
Ownasaurus 1:3c21da72660d 426 }
Ownasaurus 2:c20d8438f206 427
Ownasaurus 2:c20d8438f206 428 //int USBHostXpad::read (PAD pad) <-- try using this instead of callbacks
Ownasaurus 2:c20d8438f206 429 xpad.attachEvent(onXpadEvent);
Ownasaurus 2:c20d8438f206 430 xpad.led(USBHostXpad::LED1_ON);
Ownasaurus 0:eb2258e8c4b5 431
Ownasaurus 0:eb2258e8c4b5 432 while(1)
Ownasaurus 0:eb2258e8c4b5 433 {
Ownasaurus 0:eb2258e8c4b5 434 // Set pin mode to input
Ownasaurus 0:eb2258e8c4b5 435 data.input();
Ownasaurus 0:eb2258e8c4b5 436
Ownasaurus 1:3c21da72660d 437 USBHost::poll();
Ownasaurus 1:3c21da72660d 438
Ownasaurus 1:3c21da72660d 439 __disable_irq(); // Disable Interrupts
Ownasaurus 1:3c21da72660d 440 // Read 64 command
Ownasaurus 0:eb2258e8c4b5 441 unsigned int cmd = readCommand();
Ownasaurus 0:eb2258e8c4b5 442
Ownasaurus 0:eb2258e8c4b5 443 my_wait_us_asm(2); // wait a small amount of time before replying
Ownasaurus 1:3c21da72660d 444
Ownasaurus 1:3c21da72660d 445 //-------- SEND RESPONSE
Ownasaurus 0:eb2258e8c4b5 446 // Set pin mode to output
Ownasaurus 0:eb2258e8c4b5 447 data.output();
Ownasaurus 0:eb2258e8c4b5 448
Ownasaurus 0:eb2258e8c4b5 449 switch(cmd)
Ownasaurus 0:eb2258e8c4b5 450 {
Ownasaurus 0:eb2258e8c4b5 451 case 0x00: // identity
Ownasaurus 0:eb2258e8c4b5 452 case 0xFF: // reset
Ownasaurus 1:3c21da72660d 453 SendIdentity();
Ownasaurus 0:eb2258e8c4b5 454 break;
Ownasaurus 0:eb2258e8c4b5 455 case 0x01: // poll for state
Ownasaurus 1:3c21da72660d 456 SendControllerData();
Ownasaurus 1:3c21da72660d 457 break;
Ownasaurus 1:3c21da72660d 458 default:
Ownasaurus 1:3c21da72660d 459 // we do not process the read and write commands (memory pack)
Ownasaurus 1:3c21da72660d 460 break;
Ownasaurus 0:eb2258e8c4b5 461 }
Ownasaurus 1:3c21da72660d 462 __enable_irq(); // Enable Interrupts
Ownasaurus 1:3c21da72660d 463 //-------- DONE SENDING RESPOSE
Ownasaurus 0:eb2258e8c4b5 464 }
Ownasaurus 0:eb2258e8c4b5 465 }