GamePortAdapter

Dependencies:   mbed-rtos mbed USBDevice USBJoystick

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?

UserRevisionLine numberNew 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 }