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