GamePortAdapter
Dependencies: mbed-rtos mbed USBDevice USBJoystick
main.cpp
00001 #include "mbed.h" 00002 #include "USBMouseKeyboard.h" 00003 #include "USBJoystick.h" 00004 #include "rtos.h" 00005 #include "string.h" 00006 00007 #define min(a, b) (a)<(b) ? (a) : (b) 00008 #define max(a, b) (a)>(b) ? (a) : (b) 00009 #define clamp(val, floor, ceil) min(max(val, floor), ceil) 00010 00011 extern "C" void mbed_reset(); 00012 00013 Serial pc(USBTX, USBRX); 00014 //macOS: screen /dev/tty.usbmodem{num} {baud rate} 00015 //Windows: Realterm 00016 00017 class Axis { 00018 public: 00019 Axis(PinName pin) : _pin(pin) { 00020 _t.reset(); 00021 _center = 0; 00022 _scale = 1.0; 00023 _pin.rise(this, &Axis::start); 00024 _pin.fall(this, &Axis::stop); 00025 } 00026 00027 int8_t read() { 00028 int val = _t.read_us(); 00029 return val < 1000 ? clamp((val - _center)*_scale, -128, 127) : -128; 00030 } 00031 00032 int16_t read_raw() { 00033 return _t.read_us(); 00034 } 00035 00036 void setup(int center, int range) { 00037 _center = center; 00038 _scale = 255.0/range; 00039 } 00040 00041 bool connected() { 00042 int val = _t.read_us(); 00043 return val == clamp(val, 10, 1000); 00044 } 00045 00046 private: 00047 InterruptIn _pin; 00048 Timer _t; 00049 int _center; 00050 float _scale; 00051 00052 void start() { 00053 _t.reset(); 00054 _t.start(); 00055 } 00056 00057 void stop() { 00058 _t.stop(); 00059 } 00060 00061 }; 00062 00063 Axis x1 = Axis(p15); 00064 Axis y1 = Axis(p16); 00065 Axis x2 = Axis(p17); 00066 Axis y2 = Axis(p18); 00067 00068 volatile int buttons; 00069 00070 DigitalOut trig(p19); 00071 00072 //1st row: necessary garbage, size, mode, reserved, reserved 00073 //2nd row: x1 center, x1 range, y1 center, y1 range, reserved 00074 //3rd row: x2 center, x2 range, y2 center, y2 range, reserved 00075 //following rows: input, min, max, output, value 00076 int bindings[128][5]; 00077 /*int bindings[128][5] = {{0xFFFFFFFF, 9, 0, 0, 0}, 00078 {128, 255, 128, 255, 0}, 00079 {128, 255, 128, 255, 0}, 00080 {0, 0, 100, 4, (int)'a'}, 00081 {0, 400, 1000, 4, (int)'d'}, 00082 {1, 0, 100, 4, (int)'w'}, 00083 {1, 400, 1000, 4, (int)'s'}, 00084 {4, 128, 255, 4, (int)'1'}, 00085 {5, 128, 255, 4, (int)'2'}};*/ 00086 00087 /*int bindings[8][5] = {{0, 0, 1000, 0, 0}, 00088 {1, 0, 1000, 1, 0}, 00089 {4, 128, 255, 4, 0x1}, 00090 {5, 128, 255, 4, 0x2}};*/ 00091 00092 LocalFileSystem local("local"); 00093 00094 void analog_trig() { 00095 trig = 0; 00096 trig = 1; 00097 } 00098 00099 00100 void debug_thread() { 00101 pc.printf("Beginning Joystick Test...\r\n"); 00102 pc.printf("---------------------------------\r\n"); 00103 00104 while(1) { 00105 pc.printf("Joystick 1 - %d, %d, %X \r\n", x1.read_raw(), y1.read_raw(), buttons&0x3); 00106 pc.printf("Joystick 2 - %d, %d, %X \r\n", x2.read_raw(), y2.read_raw(), (buttons>>2)&0x3); 00107 pc.printf("\r\n"); 00108 Thread::wait(500); 00109 } 00110 } 00111 00112 00113 void keys_mouse_output_thread() { 00114 USBMouseKeyboard keys_mouse; 00115 BusIn buttons_raw(p21, p22, p23, p24); 00116 buttons_raw.mode(PullUp); 00117 00118 int mouse[4]; 00119 int value, trigval; 00120 00121 while(true) { 00122 memset(mouse, 0, sizeof(mouse)); 00123 buttons = ~buttons_raw&0xF; 00124 00125 for (int i=3; i<bindings[0][1]; i++) { 00126 //pc.printf("Checking %d: ", i); 00127 switch (bindings[i][0]) { 00128 case 0: trigval = x1.read(); break; 00129 case 1: trigval = y1.read(); break; 00130 case 2: trigval = x2.read(); break; 00131 case 3: trigval = y2.read(); break; 00132 case 4: trigval = (buttons & 0x1)*127; break; 00133 case 5: trigval = ((buttons>>1) & 0x1)*127; break; 00134 case 6: trigval = ((buttons>>2) & 0x1)*127; break; 00135 case 7: trigval = ((buttons>>3) & 0x1)*127; break; 00136 } 00137 value = bindings[i][4]; 00138 00139 if (trigval >= bindings[i][1] && trigval <= bindings[i][2]) { 00140 //pc.printf("Triggered : %d, %d, %d\r\n", i, trigval, value); 00141 switch (bindings[i][3]) { 00142 case 0: mouse[0] = trigval/value; break; //Mouse X 00143 case 1: mouse[1] = trigval/value; break; //Mouse Y 00144 case 2: mouse[2] |= value; break; //Mouse buttons 00145 case 3: mouse[3] = trigval/value; break; //Mouse scroll 00146 case 4: keys_mouse.keyCode(value); break; //Keypress 00147 } 00148 } 00149 } 00150 keys_mouse.update(mouse[0], mouse[1], mouse[2], mouse[3]); 00151 Thread::wait(15); 00152 } 00153 } 00154 00155 00156 void joystick_output_thread() { 00157 USBJoystick joystick; 00158 BusIn buttons_raw(p21, p22, p23, p24); 00159 buttons_raw.mode(PullUp); 00160 00161 int joy[6]; 00162 int value, trigval; 00163 00164 while(true) { 00165 memset(joy, 0, sizeof(joy)); 00166 buttons = ~buttons_raw&0xF; 00167 00168 for (int i=3; i<bindings[0][1]; i++) { 00169 //pc.printf("Checking %d: ", i); 00170 switch (bindings[i][0]) { 00171 case 0: trigval = x1.read(); break; 00172 case 1: trigval = y1.read(); break; 00173 case 2: trigval = x2.read(); break; 00174 case 3: trigval = y2.read(); break; 00175 case 4: trigval = (buttons & 0x1)*127; break; 00176 case 5: trigval = ((buttons>>1) & 0x1)*127; break; 00177 case 6: trigval = ((buttons>>2) & 0x1)*127; break; 00178 case 7: trigval = ((buttons>>3) & 0x1)*127; break; 00179 } 00180 value = bindings[i][4]; 00181 00182 if (trigval >= bindings[i][1] && trigval <= bindings[i][2]) { 00183 //pc.printf("Triggered : %d, %d, %d\r\n", i, trigval, value); 00184 switch (bindings[i][3]) { 00185 case 0: joy[2] = trigval/value; break;//Joy X 00186 case 1: joy[3] = trigval/value; break; //Joy Y 00187 case 2: joy[0] = trigval/value; break; //Joy throttle 00188 case 3: joy[1] = trigval/value; break; //Joy rudder 00189 case 4: joy[4] |= value; break; //Joy buttons 00190 case 5: joy[5] |= value; break; //Joy hat 00191 } 00192 } 00193 } 00194 joystick.update(joy[0], joy[1], joy[2], joy[3], joy[4], joy[5]); 00195 Thread::wait(15); 00196 } 00197 } 00198 00199 00200 int main() { 00201 00202 //Load bindings from file 00203 FILE *bf = fopen("/local/bindings", "rb"); 00204 fread(bindings, 5*sizeof(int), 1, bf); 00205 fread(bindings[1], 5*sizeof(int), bindings[0][1]-1, bf); 00206 fclose(bf); 00207 00208 x1.setup(bindings[1][0], bindings[1][1]); 00209 y1.setup(bindings[1][2], bindings[1][3]); 00210 x2.setup(bindings[2][0], bindings[2][1]); 00211 y2.setup(bindings[2][2], bindings[2][3]); 00212 00213 //Thread analogThread(analog_thread); 00214 Ticker analog_ticker; 00215 analog_ticker.attach(&analog_trig, 0.05); 00216 00217 Thread outputThread; 00218 //Thread::wait(100); 00219 switch(bindings[0][2]) { 00220 case 0: outputThread.start(keys_mouse_output_thread); break; 00221 case 1: outputThread.start(joystick_output_thread); break; 00222 } 00223 00224 Thread debugThread(debug_thread); 00225 00226 while(1) Thread::yield(); 00227 }
Generated on Fri Jul 22 2022 10:09:01 by
1.7.2
