GamePortAdapter

Dependencies:   mbed-rtos mbed USBDevice USBJoystick

Committer:
obsoleet37
Date:
Thu Dec 14 06:55:10 2017 +0000
Revision:
5:c2e3d6e70d85
Parent:
4:17b8ede8063a
Child:
6:43b59cb5dcd9
Added loading from binding file and keymouse/joystick mode switch in bindings

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cblackstone7 0:8b4f60bf3f80 1 #include "mbed.h"
obsoleet37 3:20f3136e49fa 2 #include "USBMouseKeyboard.h"
obsoleet37 3:20f3136e49fa 3 #include "USBJoystick.h"
cblackstone7 0:8b4f60bf3f80 4 #include "rtos.h"
obsoleet37 3:20f3136e49fa 5 #include "string.h"
obsoleet37 3:20f3136e49fa 6
obsoleet37 5:c2e3d6e70d85 7 extern "C" void mbed_reset();
obsoleet37 5:c2e3d6e70d85 8
cblackstone7 0:8b4f60bf3f80 9 Serial pc(USBTX, USBRX);
cblackstone7 0:8b4f60bf3f80 10 //macOS: screen /dev/tty.usbmodem{num} {baud rate}
obsoleet37 2:c7f76dac3723 11 //Windows: Realterm lol
cblackstone7 0:8b4f60bf3f80 12
cblackstone7 0:8b4f60bf3f80 13 Timer y1_t;
cblackstone7 0:8b4f60bf3f80 14 Timer x1_t;
cblackstone7 0:8b4f60bf3f80 15 Timer y2_t;
cblackstone7 0:8b4f60bf3f80 16 Timer x2_t;
cblackstone7 0:8b4f60bf3f80 17
cblackstone7 0:8b4f60bf3f80 18 InterruptIn y1(p16);
cblackstone7 0:8b4f60bf3f80 19 InterruptIn x1(p15);
cblackstone7 0:8b4f60bf3f80 20 InterruptIn y2(p18);
cblackstone7 0:8b4f60bf3f80 21 InterruptIn x2(p17);
cblackstone7 0:8b4f60bf3f80 22
cblackstone7 0:8b4f60bf3f80 23 volatile int y1_pulse;
cblackstone7 0:8b4f60bf3f80 24 volatile int x1_pulse;
cblackstone7 0:8b4f60bf3f80 25 volatile int y2_pulse;
cblackstone7 0:8b4f60bf3f80 26 volatile int x2_pulse;
obsoleet37 3:20f3136e49fa 27 volatile int buttons;
cblackstone7 0:8b4f60bf3f80 28
cblackstone7 0:8b4f60bf3f80 29 DigitalOut trig(p19);
cblackstone7 0:8b4f60bf3f80 30
obsoleet37 3:20f3136e49fa 31 BusIn buttons_raw(p21, p22, p23, p24);
obsoleet37 3:20f3136e49fa 32
obsoleet37 5:c2e3d6e70d85 33 //first row: necessary garbage, size, mode, reserved x2
obsoleet37 5:c2e3d6e70d85 34 //following rows: input, min, max, output, value
obsoleet37 5:c2e3d6e70d85 35 int bindings[128][5];
obsoleet37 5:c2e3d6e70d85 36 /*int bindings[128][5] = {{0xFFFFFFFF, 7, 0, 0, 0},
obsoleet37 5:c2e3d6e70d85 37 {0, 0, 100, 4, (int)'a'},
obsoleet37 4:17b8ede8063a 38 {0, 400, 1000, 4, (int)'d'},
obsoleet37 4:17b8ede8063a 39 {1, 0, 100, 4, (int)'w'},
obsoleet37 4:17b8ede8063a 40 {1, 400, 1000, 4, (int)'s'},
obsoleet37 4:17b8ede8063a 41 {4, 128, 255, 4, (int)'1'},
obsoleet37 4:17b8ede8063a 42 {5, 128, 255, 4, (int)'2'}};*/
obsoleet37 4:17b8ede8063a 43
obsoleet37 5:c2e3d6e70d85 44 /*int bindings[8][5] = {{0, 0, 1000, 0, 0},
obsoleet37 4:17b8ede8063a 45 {1, 0, 1000, 1, 0},
obsoleet37 4:17b8ede8063a 46 {4, 128, 255, 4, 0x1},
obsoleet37 5:c2e3d6e70d85 47 {5, 128, 255, 4, 0x2}};*/
obsoleet37 4:17b8ede8063a 48
obsoleet37 5:c2e3d6e70d85 49 LocalFileSystem local("local");
obsoleet37 2:c7f76dac3723 50
cblackstone7 0:8b4f60bf3f80 51 void start_y1() {
cblackstone7 0:8b4f60bf3f80 52 y1_t.reset();
cblackstone7 0:8b4f60bf3f80 53 y1_t.start();
cblackstone7 0:8b4f60bf3f80 54 }
cblackstone7 0:8b4f60bf3f80 55
cblackstone7 0:8b4f60bf3f80 56 void stop_y1() {
cblackstone7 0:8b4f60bf3f80 57 y1_t.stop();
cblackstone7 0:8b4f60bf3f80 58 y1_pulse = y1_t.read_us();
cblackstone7 0:8b4f60bf3f80 59 }
cblackstone7 0:8b4f60bf3f80 60
cblackstone7 0:8b4f60bf3f80 61 void start_x1() {
cblackstone7 0:8b4f60bf3f80 62 x1_t.reset();
cblackstone7 0:8b4f60bf3f80 63 x1_t.start();
cblackstone7 0:8b4f60bf3f80 64 }
cblackstone7 0:8b4f60bf3f80 65
cblackstone7 0:8b4f60bf3f80 66 void stop_x1() {
cblackstone7 0:8b4f60bf3f80 67 x1_t.stop();
cblackstone7 0:8b4f60bf3f80 68 x1_pulse = x1_t.read_us();
cblackstone7 0:8b4f60bf3f80 69 }
cblackstone7 0:8b4f60bf3f80 70 void start_y2() {
cblackstone7 0:8b4f60bf3f80 71 y2_t.reset();
cblackstone7 0:8b4f60bf3f80 72 y2_t.start();
cblackstone7 0:8b4f60bf3f80 73 }
cblackstone7 0:8b4f60bf3f80 74
cblackstone7 0:8b4f60bf3f80 75 void stop_y2() {
cblackstone7 0:8b4f60bf3f80 76 y2_t.stop();
cblackstone7 0:8b4f60bf3f80 77 y2_pulse = y2_t.read_us();
cblackstone7 0:8b4f60bf3f80 78 }
cblackstone7 0:8b4f60bf3f80 79
cblackstone7 0:8b4f60bf3f80 80 void start_x2() {
cblackstone7 0:8b4f60bf3f80 81 x2_t.reset();
cblackstone7 0:8b4f60bf3f80 82 x2_t.start();
cblackstone7 0:8b4f60bf3f80 83 }
cblackstone7 0:8b4f60bf3f80 84
cblackstone7 0:8b4f60bf3f80 85 void stop_x2() {
cblackstone7 0:8b4f60bf3f80 86 x2_t.stop();
cblackstone7 0:8b4f60bf3f80 87 x2_pulse = x2_t.read_us();
cblackstone7 0:8b4f60bf3f80 88 }
cblackstone7 0:8b4f60bf3f80 89
cblackstone7 0:8b4f60bf3f80 90
cblackstone7 0:8b4f60bf3f80 91 void analog_thread() {
obsoleet37 3:20f3136e49fa 92
obsoleet37 3:20f3136e49fa 93 buttons_raw.mode(PullUp);
obsoleet37 3:20f3136e49fa 94
cblackstone7 0:8b4f60bf3f80 95 trig = 1;
cblackstone7 0:8b4f60bf3f80 96 y1_pulse = 0;
cblackstone7 0:8b4f60bf3f80 97 x1_pulse = 0;
cblackstone7 0:8b4f60bf3f80 98 y2_pulse = 0;
cblackstone7 0:8b4f60bf3f80 99 x2_pulse = 0;
cblackstone7 0:8b4f60bf3f80 100
cblackstone7 0:8b4f60bf3f80 101 y1.rise(&start_y1);
cblackstone7 0:8b4f60bf3f80 102 y1.fall(&stop_y1);
cblackstone7 0:8b4f60bf3f80 103
cblackstone7 0:8b4f60bf3f80 104 x1.rise(&start_x1);
cblackstone7 0:8b4f60bf3f80 105 x1.fall(&stop_x1);
cblackstone7 0:8b4f60bf3f80 106
cblackstone7 0:8b4f60bf3f80 107 y2.rise(&start_y2);
cblackstone7 0:8b4f60bf3f80 108 y2.fall(&stop_y2);
cblackstone7 0:8b4f60bf3f80 109
cblackstone7 0:8b4f60bf3f80 110 x2.rise(&start_x2);
cblackstone7 0:8b4f60bf3f80 111 x2.fall(&stop_x2);
cblackstone7 0:8b4f60bf3f80 112
cblackstone7 0:8b4f60bf3f80 113 while(1) {
cblackstone7 0:8b4f60bf3f80 114 trig = 0;
cblackstone7 0:8b4f60bf3f80 115 trig = 1;
obsoleet37 3:20f3136e49fa 116 buttons = ~buttons_raw&0xF;
obsoleet37 3:20f3136e49fa 117 Thread::wait(1);
cblackstone7 0:8b4f60bf3f80 118 }
cblackstone7 0:8b4f60bf3f80 119 }
cblackstone7 0:8b4f60bf3f80 120
obsoleet37 3:20f3136e49fa 121
obsoleet37 3:20f3136e49fa 122 void debug_thread() {
cblackstone7 0:8b4f60bf3f80 123 pc.printf("Beginning Joystick Test...\r\n");
cblackstone7 0:8b4f60bf3f80 124 pc.printf("---------------------------------\r\n");
cblackstone7 0:8b4f60bf3f80 125
cblackstone7 0:8b4f60bf3f80 126 while(1) {
obsoleet37 3:20f3136e49fa 127 pc.printf("Joystick 1 - %d, %d, %X \r\n", x1_pulse, y1_pulse, buttons&0x3);
obsoleet37 3:20f3136e49fa 128 pc.printf("Joystick 2 - %d, %d, %X \r\n", x2_pulse, y2_pulse, (buttons>>2)&0x3);
cblackstone7 0:8b4f60bf3f80 129 pc.printf("\r\n");
obsoleet37 3:20f3136e49fa 130 Thread::wait(500);
cblackstone7 0:8b4f60bf3f80 131 }
cblackstone7 0:8b4f60bf3f80 132 }
obsoleet37 3:20f3136e49fa 133
obsoleet37 3:20f3136e49fa 134
obsoleet37 4:17b8ede8063a 135 void keys_mouse_output_thread() {
obsoleet37 4:17b8ede8063a 136 USBMouseKeyboard keys_mouse;
obsoleet37 3:20f3136e49fa 137 int mouse[4];
obsoleet37 3:20f3136e49fa 138 int value, trigval;
obsoleet37 3:20f3136e49fa 139
obsoleet37 5:c2e3d6e70d85 140 while(true) {
obsoleet37 3:20f3136e49fa 141 memset(mouse, 0, sizeof(mouse));
obsoleet37 3:20f3136e49fa 142
obsoleet37 5:c2e3d6e70d85 143 for (int i=1; i<bindings[0][1]; i++) {
obsoleet37 3:20f3136e49fa 144 //pc.printf("Checking %d: ", i);
obsoleet37 4:17b8ede8063a 145 switch (bindings[i][0]) {
obsoleet37 3:20f3136e49fa 146 case 0: value = x1_pulse; trigval = x1_pulse; break;
obsoleet37 3:20f3136e49fa 147 case 1: value = y1_pulse; trigval = y1_pulse; break;
obsoleet37 3:20f3136e49fa 148 case 2: value = x2_pulse; trigval = x2_pulse; break;
obsoleet37 3:20f3136e49fa 149 case 3: value = y2_pulse; trigval = y2_pulse; break;
obsoleet37 4:17b8ede8063a 150 case 4: trigval = (buttons & 0x1)*255; value = bindings[i][4]; break;
obsoleet37 4:17b8ede8063a 151 case 5: trigval = ((buttons>>1) & 0x1)*255; value = bindings[i][4]; break;
obsoleet37 4:17b8ede8063a 152 case 6: trigval = ((buttons>>2) & 0x1)*255; value = bindings[i][4]; break;
obsoleet37 4:17b8ede8063a 153 case 7: trigval = ((buttons>>3) & 0x1)*255; value = bindings[i][4]; break;
obsoleet37 4:17b8ede8063a 154 }
obsoleet37 4:17b8ede8063a 155
obsoleet37 4:17b8ede8063a 156 if (trigval >= bindings[i][1] && trigval <= bindings[i][2]) {
obsoleet37 4:17b8ede8063a 157 pc.printf("Triggered : %d, %d, %d\r\n", i, trigval, value);
obsoleet37 4:17b8ede8063a 158 switch (bindings[i][3]) {
obsoleet37 4:17b8ede8063a 159 case 0: mouse[0] = value/10; break; //Mouse X
obsoleet37 4:17b8ede8063a 160 case 1: mouse[1] = value/10; break; //Mouse Y
obsoleet37 4:17b8ede8063a 161 case 2: mouse[2] |= bindings[i][4]; break; //Mouse buttons
obsoleet37 4:17b8ede8063a 162 case 3: mouse[3] = value/10; break; //Mouse scroll
obsoleet37 5:c2e3d6e70d85 163 case 4: keys_mouse.keyCode(bindings[i][4]); break; //Keypress
obsoleet37 4:17b8ede8063a 164 }
obsoleet37 4:17b8ede8063a 165 }
obsoleet37 4:17b8ede8063a 166 }
obsoleet37 4:17b8ede8063a 167 keys_mouse.update(mouse[0], mouse[1], mouse[2], mouse[3]);
obsoleet37 4:17b8ede8063a 168 Thread::wait(20);
obsoleet37 4:17b8ede8063a 169 }
obsoleet37 4:17b8ede8063a 170 }
obsoleet37 4:17b8ede8063a 171
obsoleet37 4:17b8ede8063a 172
obsoleet37 4:17b8ede8063a 173 void joystick_output_thread() {
obsoleet37 4:17b8ede8063a 174 USBJoystick joystick;
obsoleet37 4:17b8ede8063a 175 int joy[6];
obsoleet37 4:17b8ede8063a 176 int value, trigval;
obsoleet37 4:17b8ede8063a 177
obsoleet37 5:c2e3d6e70d85 178 while(true) {
obsoleet37 4:17b8ede8063a 179 memset(joy, 0, sizeof(joy));
obsoleet37 4:17b8ede8063a 180
obsoleet37 5:c2e3d6e70d85 181 for (int i=1; i<bindings[0][1]; i++) {
obsoleet37 4:17b8ede8063a 182 //pc.printf("Checking %d: ", i);
obsoleet37 4:17b8ede8063a 183 switch (bindings[i][0]) {
obsoleet37 4:17b8ede8063a 184 case 0: value = x1_pulse; trigval = x1_pulse; break;
obsoleet37 4:17b8ede8063a 185 case 1: value = y1_pulse; trigval = y1_pulse; break;
obsoleet37 4:17b8ede8063a 186 case 2: value = x2_pulse; trigval = x2_pulse; break;
obsoleet37 4:17b8ede8063a 187 case 3: value = y2_pulse; trigval = y2_pulse; break;
obsoleet37 4:17b8ede8063a 188 case 4: trigval = (buttons & 0x1)*255; value = bindings[i][4]; break;
obsoleet37 4:17b8ede8063a 189 case 5: trigval = ((buttons>>1) & 0x1)*255; value = bindings[i][4]; break;
obsoleet37 4:17b8ede8063a 190 case 6: trigval = ((buttons>>2) & 0x1)*255; value = bindings[i][4]; break;
obsoleet37 4:17b8ede8063a 191 case 7: trigval = ((buttons>>3) & 0x1)*255; value = bindings[i][4]; break;
obsoleet37 3:20f3136e49fa 192 }
obsoleet37 3:20f3136e49fa 193
obsoleet37 3:20f3136e49fa 194 if (trigval >= bindings[i][1] && trigval <= bindings[i][2]) {
obsoleet37 3:20f3136e49fa 195 //pc.printf("Triggered : %d, %d, %d\r\n", i, trigval, value);
obsoleet37 4:17b8ede8063a 196 switch (bindings[i][3]) {
obsoleet37 3:20f3136e49fa 197 case 0: joy[2] = value; break;//Joy X
obsoleet37 3:20f3136e49fa 198 case 1: joy[3] = value; break; //Joy Y
obsoleet37 3:20f3136e49fa 199 case 2: joy[0] = value; break; //Joy throttle
obsoleet37 3:20f3136e49fa 200 case 3: joy[1] = value; break; //Joy rudder
obsoleet37 4:17b8ede8063a 201 case 4: joy[4] |= bindings[i][4]; break; //Joy buttons
obsoleet37 4:17b8ede8063a 202 case 5: joy[5] |= bindings[i][4]; break; //Joy hat
obsoleet37 3:20f3136e49fa 203 }
obsoleet37 3:20f3136e49fa 204 }
obsoleet37 3:20f3136e49fa 205 }
obsoleet37 4:17b8ede8063a 206 joystick.update(joy[0], joy[1], joy[2], joy[3], joy[4], joy[5]);
obsoleet37 3:20f3136e49fa 207 Thread::wait(20);
obsoleet37 3:20f3136e49fa 208 }
obsoleet37 3:20f3136e49fa 209 }
obsoleet37 3:20f3136e49fa 210
obsoleet37 3:20f3136e49fa 211
obsoleet37 3:20f3136e49fa 212 int main() {
obsoleet37 5:c2e3d6e70d85 213
obsoleet37 5:c2e3d6e70d85 214 //Load bindings from file
obsoleet37 5:c2e3d6e70d85 215 FILE *bf = fopen("/local/bindings", "rb");
obsoleet37 5:c2e3d6e70d85 216 fread(bindings, 5*sizeof(int), 1, bf);
obsoleet37 5:c2e3d6e70d85 217 fread(bindings[1], 5*sizeof(int), bindings[0][1]-1, bf);
obsoleet37 5:c2e3d6e70d85 218 fclose(bf);
obsoleet37 5:c2e3d6e70d85 219
obsoleet37 3:20f3136e49fa 220 Thread analogThread;
obsoleet37 3:20f3136e49fa 221 Thread outputThread;
obsoleet37 3:20f3136e49fa 222
obsoleet37 3:20f3136e49fa 223 analogThread.start(analog_thread);
obsoleet37 3:20f3136e49fa 224 Thread::wait(100);
obsoleet37 5:c2e3d6e70d85 225 switch(bindings[0][2]) {
obsoleet37 5:c2e3d6e70d85 226 case 0: outputThread.start(keys_mouse_output_thread); break;
obsoleet37 5:c2e3d6e70d85 227 case 1: outputThread.start(joystick_output_thread); break;
obsoleet37 5:c2e3d6e70d85 228 }
obsoleet37 3:20f3136e49fa 229
obsoleet37 3:20f3136e49fa 230 //Thread debugThread;
obsoleet37 3:20f3136e49fa 231 //debugThread.start(debug_thread);
obsoleet37 3:20f3136e49fa 232
obsoleet37 3:20f3136e49fa 233 while(1) Thread::yield();
obsoleet37 3:20f3136e49fa 234 }