v1 Stable

Dependencies:   F401RE-USBHost USBHostXpad mbed

Committer:
Ownasaurus
Date:
Fri Nov 04 21:29:33 2016 +0000
Revision:
2:c20d8438f206
Parent:
1:3c21da72660d
Child:
3:52b2a7514406
Functional X360 proof of concept

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