GamePortAdapter
Dependencies: mbed-rtos mbed USBDevice USBJoystick
main.cpp@5:c2e3d6e70d85, 2017-12-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |