GamePortAdapter
Dependencies: mbed-rtos mbed USBDevice USBJoystick
main.cpp@4:17b8ede8063a, 2017-12-14 (annotated)
- Committer:
- obsoleet37
- Date:
- Thu Dec 14 03:33:02 2017 +0000
- Revision:
- 4:17b8ede8063a
- Parent:
- 3:20f3136e49fa
- Child:
- 5:c2e3d6e70d85
Revising bindings system
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" |
| obsoleet37 | 4:17b8ede8063a | 4 | #include "USBHID.h" |
| cblackstone7 | 0:8b4f60bf3f80 | 5 | #include "rtos.h" |
| obsoleet37 | 3:20f3136e49fa | 6 | #include "string.h" |
| obsoleet37 | 3:20f3136e49fa | 7 | |
| cblackstone7 | 0:8b4f60bf3f80 | 8 | Serial pc(USBTX, USBRX); |
| cblackstone7 | 0:8b4f60bf3f80 | 9 | //macOS: screen /dev/tty.usbmodem{num} {baud rate} |
| obsoleet37 | 2:c7f76dac3723 | 10 | //Windows: Realterm lol |
| cblackstone7 | 0:8b4f60bf3f80 | 11 | |
| cblackstone7 | 0:8b4f60bf3f80 | 12 | Timer y1_t; |
| cblackstone7 | 0:8b4f60bf3f80 | 13 | Timer x1_t; |
| cblackstone7 | 0:8b4f60bf3f80 | 14 | Timer y2_t; |
| cblackstone7 | 0:8b4f60bf3f80 | 15 | Timer x2_t; |
| cblackstone7 | 0:8b4f60bf3f80 | 16 | |
| cblackstone7 | 0:8b4f60bf3f80 | 17 | InterruptIn y1(p16); |
| cblackstone7 | 0:8b4f60bf3f80 | 18 | InterruptIn x1(p15); |
| cblackstone7 | 0:8b4f60bf3f80 | 19 | InterruptIn y2(p18); |
| cblackstone7 | 0:8b4f60bf3f80 | 20 | InterruptIn x2(p17); |
| cblackstone7 | 0:8b4f60bf3f80 | 21 | |
| cblackstone7 | 0:8b4f60bf3f80 | 22 | volatile int y1_pulse; |
| cblackstone7 | 0:8b4f60bf3f80 | 23 | volatile int x1_pulse; |
| cblackstone7 | 0:8b4f60bf3f80 | 24 | volatile int y2_pulse; |
| cblackstone7 | 0:8b4f60bf3f80 | 25 | volatile int x2_pulse; |
| obsoleet37 | 3:20f3136e49fa | 26 | volatile int buttons; |
| cblackstone7 | 0:8b4f60bf3f80 | 27 | |
| cblackstone7 | 0:8b4f60bf3f80 | 28 | DigitalOut trig(p19); |
| cblackstone7 | 0:8b4f60bf3f80 | 29 | |
| obsoleet37 | 3:20f3136e49fa | 30 | BusIn buttons_raw(p21, p22, p23, p24); |
| obsoleet37 | 3:20f3136e49fa | 31 | |
| obsoleet37 | 4:17b8ede8063a | 32 | //input, min, max, output, value |
| obsoleet37 | 4:17b8ede8063a | 33 | int numbindings = 4; |
| obsoleet37 | 4:17b8ede8063a | 34 | /*int bindings[8][5] = {{0, 0, 100, 4, (int)'a'}, |
| obsoleet37 | 4:17b8ede8063a | 35 | {0, 400, 1000, 4, (int)'d'}, |
| obsoleet37 | 4:17b8ede8063a | 36 | {1, 0, 100, 4, (int)'w'}, |
| obsoleet37 | 4:17b8ede8063a | 37 | {1, 400, 1000, 4, (int)'s'}, |
| obsoleet37 | 4:17b8ede8063a | 38 | {4, 128, 255, 4, (int)'1'}, |
| obsoleet37 | 4:17b8ede8063a | 39 | {5, 128, 255, 4, (int)'2'}};*/ |
| obsoleet37 | 4:17b8ede8063a | 40 | |
| obsoleet37 | 4:17b8ede8063a | 41 | int bindings[8][5] = {{0, 0, 1000, 0, 0}, |
| obsoleet37 | 4:17b8ede8063a | 42 | {1, 0, 1000, 1, 0}, |
| obsoleet37 | 4:17b8ede8063a | 43 | {4, 128, 255, 4, 0x1}, |
| obsoleet37 | 4:17b8ede8063a | 44 | {5, 128, 255, 4, 0x2}}; |
| obsoleet37 | 4:17b8ede8063a | 45 | |
| obsoleet37 | 4:17b8ede8063a | 46 | volatile bool run = false; |
| obsoleet37 | 2:c7f76dac3723 | 47 | |
| cblackstone7 | 0:8b4f60bf3f80 | 48 | void start_y1() { |
| cblackstone7 | 0:8b4f60bf3f80 | 49 | y1_t.reset(); |
| cblackstone7 | 0:8b4f60bf3f80 | 50 | y1_t.start(); |
| cblackstone7 | 0:8b4f60bf3f80 | 51 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 52 | |
| cblackstone7 | 0:8b4f60bf3f80 | 53 | void stop_y1() { |
| cblackstone7 | 0:8b4f60bf3f80 | 54 | y1_t.stop(); |
| cblackstone7 | 0:8b4f60bf3f80 | 55 | y1_pulse = y1_t.read_us(); |
| cblackstone7 | 0:8b4f60bf3f80 | 56 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 57 | |
| cblackstone7 | 0:8b4f60bf3f80 | 58 | void start_x1() { |
| cblackstone7 | 0:8b4f60bf3f80 | 59 | x1_t.reset(); |
| cblackstone7 | 0:8b4f60bf3f80 | 60 | x1_t.start(); |
| cblackstone7 | 0:8b4f60bf3f80 | 61 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 62 | |
| cblackstone7 | 0:8b4f60bf3f80 | 63 | void stop_x1() { |
| cblackstone7 | 0:8b4f60bf3f80 | 64 | x1_t.stop(); |
| cblackstone7 | 0:8b4f60bf3f80 | 65 | x1_pulse = x1_t.read_us(); |
| cblackstone7 | 0:8b4f60bf3f80 | 66 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 67 | void start_y2() { |
| cblackstone7 | 0:8b4f60bf3f80 | 68 | y2_t.reset(); |
| cblackstone7 | 0:8b4f60bf3f80 | 69 | y2_t.start(); |
| cblackstone7 | 0:8b4f60bf3f80 | 70 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 71 | |
| cblackstone7 | 0:8b4f60bf3f80 | 72 | void stop_y2() { |
| cblackstone7 | 0:8b4f60bf3f80 | 73 | y2_t.stop(); |
| cblackstone7 | 0:8b4f60bf3f80 | 74 | y2_pulse = y2_t.read_us(); |
| cblackstone7 | 0:8b4f60bf3f80 | 75 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 76 | |
| cblackstone7 | 0:8b4f60bf3f80 | 77 | void start_x2() { |
| cblackstone7 | 0:8b4f60bf3f80 | 78 | x2_t.reset(); |
| cblackstone7 | 0:8b4f60bf3f80 | 79 | x2_t.start(); |
| cblackstone7 | 0:8b4f60bf3f80 | 80 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 81 | |
| cblackstone7 | 0:8b4f60bf3f80 | 82 | void stop_x2() { |
| cblackstone7 | 0:8b4f60bf3f80 | 83 | x2_t.stop(); |
| cblackstone7 | 0:8b4f60bf3f80 | 84 | x2_pulse = x2_t.read_us(); |
| cblackstone7 | 0:8b4f60bf3f80 | 85 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 86 | |
| cblackstone7 | 0:8b4f60bf3f80 | 87 | |
| cblackstone7 | 0:8b4f60bf3f80 | 88 | void analog_thread() { |
| obsoleet37 | 3:20f3136e49fa | 89 | |
| obsoleet37 | 3:20f3136e49fa | 90 | buttons_raw.mode(PullUp); |
| obsoleet37 | 3:20f3136e49fa | 91 | |
| cblackstone7 | 0:8b4f60bf3f80 | 92 | trig = 1; |
| cblackstone7 | 0:8b4f60bf3f80 | 93 | y1_pulse = 0; |
| cblackstone7 | 0:8b4f60bf3f80 | 94 | x1_pulse = 0; |
| cblackstone7 | 0:8b4f60bf3f80 | 95 | y2_pulse = 0; |
| cblackstone7 | 0:8b4f60bf3f80 | 96 | x2_pulse = 0; |
| cblackstone7 | 0:8b4f60bf3f80 | 97 | |
| cblackstone7 | 0:8b4f60bf3f80 | 98 | y1.rise(&start_y1); |
| cblackstone7 | 0:8b4f60bf3f80 | 99 | y1.fall(&stop_y1); |
| cblackstone7 | 0:8b4f60bf3f80 | 100 | |
| cblackstone7 | 0:8b4f60bf3f80 | 101 | x1.rise(&start_x1); |
| cblackstone7 | 0:8b4f60bf3f80 | 102 | x1.fall(&stop_x1); |
| cblackstone7 | 0:8b4f60bf3f80 | 103 | |
| cblackstone7 | 0:8b4f60bf3f80 | 104 | y2.rise(&start_y2); |
| cblackstone7 | 0:8b4f60bf3f80 | 105 | y2.fall(&stop_y2); |
| cblackstone7 | 0:8b4f60bf3f80 | 106 | |
| cblackstone7 | 0:8b4f60bf3f80 | 107 | x2.rise(&start_x2); |
| cblackstone7 | 0:8b4f60bf3f80 | 108 | x2.fall(&stop_x2); |
| cblackstone7 | 0:8b4f60bf3f80 | 109 | |
| cblackstone7 | 0:8b4f60bf3f80 | 110 | while(1) { |
| cblackstone7 | 0:8b4f60bf3f80 | 111 | trig = 0; |
| cblackstone7 | 0:8b4f60bf3f80 | 112 | trig = 1; |
| obsoleet37 | 3:20f3136e49fa | 113 | buttons = ~buttons_raw&0xF; |
| obsoleet37 | 3:20f3136e49fa | 114 | Thread::wait(1); |
| cblackstone7 | 0:8b4f60bf3f80 | 115 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 116 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 117 | |
| obsoleet37 | 3:20f3136e49fa | 118 | |
| obsoleet37 | 3:20f3136e49fa | 119 | void debug_thread() { |
| cblackstone7 | 0:8b4f60bf3f80 | 120 | pc.printf("Beginning Joystick Test...\r\n"); |
| cblackstone7 | 0:8b4f60bf3f80 | 121 | pc.printf("---------------------------------\r\n"); |
| cblackstone7 | 0:8b4f60bf3f80 | 122 | |
| cblackstone7 | 0:8b4f60bf3f80 | 123 | while(1) { |
| obsoleet37 | 3:20f3136e49fa | 124 | pc.printf("Joystick 1 - %d, %d, %X \r\n", x1_pulse, y1_pulse, buttons&0x3); |
| obsoleet37 | 3:20f3136e49fa | 125 | pc.printf("Joystick 2 - %d, %d, %X \r\n", x2_pulse, y2_pulse, (buttons>>2)&0x3); |
| cblackstone7 | 0:8b4f60bf3f80 | 126 | pc.printf("\r\n"); |
| obsoleet37 | 3:20f3136e49fa | 127 | Thread::wait(500); |
| cblackstone7 | 0:8b4f60bf3f80 | 128 | } |
| cblackstone7 | 0:8b4f60bf3f80 | 129 | } |
| obsoleet37 | 3:20f3136e49fa | 130 | |
| obsoleet37 | 3:20f3136e49fa | 131 | |
| obsoleet37 | 4:17b8ede8063a | 132 | void keys_mouse_output_thread() { |
| obsoleet37 | 4:17b8ede8063a | 133 | USBMouseKeyboard keys_mouse; |
| obsoleet37 | 3:20f3136e49fa | 134 | int mouse[4]; |
| obsoleet37 | 3:20f3136e49fa | 135 | int value, trigval; |
| obsoleet37 | 4:17b8ede8063a | 136 | run = true; |
| obsoleet37 | 3:20f3136e49fa | 137 | |
| obsoleet37 | 4:17b8ede8063a | 138 | while(run) { |
| obsoleet37 | 3:20f3136e49fa | 139 | memset(mouse, 0, sizeof(mouse)); |
| obsoleet37 | 3:20f3136e49fa | 140 | |
| obsoleet37 | 4:17b8ede8063a | 141 | for (int i=0; i<numbindings; i++) { |
| obsoleet37 | 3:20f3136e49fa | 142 | //pc.printf("Checking %d: ", i); |
| obsoleet37 | 4:17b8ede8063a | 143 | switch (bindings[i][0]) { |
| obsoleet37 | 3:20f3136e49fa | 144 | case 0: value = x1_pulse; trigval = x1_pulse; break; |
| obsoleet37 | 3:20f3136e49fa | 145 | case 1: value = y1_pulse; trigval = y1_pulse; break; |
| obsoleet37 | 3:20f3136e49fa | 146 | case 2: value = x2_pulse; trigval = x2_pulse; break; |
| obsoleet37 | 3:20f3136e49fa | 147 | case 3: value = y2_pulse; trigval = y2_pulse; break; |
| obsoleet37 | 4:17b8ede8063a | 148 | case 4: trigval = (buttons & 0x1)*255; value = bindings[i][4]; break; |
| obsoleet37 | 4:17b8ede8063a | 149 | case 5: trigval = ((buttons>>1) & 0x1)*255; value = bindings[i][4]; break; |
| obsoleet37 | 4:17b8ede8063a | 150 | case 6: trigval = ((buttons>>2) & 0x1)*255; value = bindings[i][4]; break; |
| obsoleet37 | 4:17b8ede8063a | 151 | case 7: trigval = ((buttons>>3) & 0x1)*255; value = bindings[i][4]; break; |
| obsoleet37 | 4:17b8ede8063a | 152 | } |
| obsoleet37 | 4:17b8ede8063a | 153 | |
| obsoleet37 | 4:17b8ede8063a | 154 | if (trigval >= bindings[i][1] && trigval <= bindings[i][2]) { |
| obsoleet37 | 4:17b8ede8063a | 155 | pc.printf("Triggered : %d, %d, %d\r\n", i, trigval, value); |
| obsoleet37 | 4:17b8ede8063a | 156 | switch (bindings[i][3]) { |
| obsoleet37 | 4:17b8ede8063a | 157 | case 0: mouse[0] = value/10; break; //Mouse X |
| obsoleet37 | 4:17b8ede8063a | 158 | case 1: mouse[1] = value/10; break; //Mouse Y |
| obsoleet37 | 4:17b8ede8063a | 159 | case 2: mouse[2] |= bindings[i][4]; break; //Mouse buttons |
| obsoleet37 | 4:17b8ede8063a | 160 | case 3: mouse[3] = value/10; break; //Mouse scroll |
| obsoleet37 | 4:17b8ede8063a | 161 | case 4: key_mouse.keyCode(bindings[i][4]); break; //Keypress |
| obsoleet37 | 4:17b8ede8063a | 162 | } |
| obsoleet37 | 4:17b8ede8063a | 163 | } |
| obsoleet37 | 4:17b8ede8063a | 164 | } |
| obsoleet37 | 4:17b8ede8063a | 165 | keys_mouse.update(mouse[0], mouse[1], mouse[2], mouse[3]); |
| obsoleet37 | 4:17b8ede8063a | 166 | Thread::wait(20); |
| obsoleet37 | 4:17b8ede8063a | 167 | } |
| obsoleet37 | 4:17b8ede8063a | 168 | keys_mouse.disconnect(); |
| obsoleet37 | 4:17b8ede8063a | 169 | } |
| obsoleet37 | 4:17b8ede8063a | 170 | |
| obsoleet37 | 4:17b8ede8063a | 171 | |
| obsoleet37 | 4:17b8ede8063a | 172 | void joystick_output_thread() { |
| obsoleet37 | 4:17b8ede8063a | 173 | USBJoystick joystick; |
| obsoleet37 | 4:17b8ede8063a | 174 | int joy[6]; |
| obsoleet37 | 4:17b8ede8063a | 175 | int value, trigval; |
| obsoleet37 | 4:17b8ede8063a | 176 | run = true; |
| obsoleet37 | 4:17b8ede8063a | 177 | |
| obsoleet37 | 4:17b8ede8063a | 178 | while(run) { |
| obsoleet37 | 4:17b8ede8063a | 179 | memset(joy, 0, sizeof(joy)); |
| obsoleet37 | 4:17b8ede8063a | 180 | |
| obsoleet37 | 4:17b8ede8063a | 181 | for (int i=0; i<numbindings; 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 | 4:17b8ede8063a | 209 | joystick.disconnect(); |
| obsoleet37 | 3:20f3136e49fa | 210 | } |
| obsoleet37 | 3:20f3136e49fa | 211 | |
| obsoleet37 | 3:20f3136e49fa | 212 | |
| obsoleet37 | 3:20f3136e49fa | 213 | int main() { |
| obsoleet37 | 3:20f3136e49fa | 214 | Thread analogThread; |
| obsoleet37 | 3:20f3136e49fa | 215 | Thread outputThread; |
| obsoleet37 | 3:20f3136e49fa | 216 | |
| obsoleet37 | 3:20f3136e49fa | 217 | analogThread.start(analog_thread); |
| obsoleet37 | 3:20f3136e49fa | 218 | Thread::wait(100); |
| obsoleet37 | 4:17b8ede8063a | 219 | outputThread.start(joystick_output_thread); |
| obsoleet37 | 4:17b8ede8063a | 220 | Thread::wait(2*60*1000); |
| obsoleet37 | 4:17b8ede8063a | 221 | run = false; |
| obsoleet37 | 4:17b8ede8063a | 222 | outputThread.terminate(); |
| obsoleet37 | 4:17b8ede8063a | 223 | outputThread.start(keys_mouse_output_thread); |
| obsoleet37 | 3:20f3136e49fa | 224 | |
| obsoleet37 | 3:20f3136e49fa | 225 | //Thread debugThread; |
| obsoleet37 | 3:20f3136e49fa | 226 | //debugThread.start(debug_thread); |
| obsoleet37 | 3:20f3136e49fa | 227 | |
| obsoleet37 | 3:20f3136e49fa | 228 | while(1) Thread::yield(); |
| obsoleet37 | 3:20f3136e49fa | 229 | } |
