Christopher Blackstone / Mbed 2 deprecated GamePortAdapter

Dependencies:   mbed-rtos mbed USBDevice USBJoystick

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?

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"
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 }