Christopher Blackstone / Mbed 2 deprecated GamePortAdapter

Dependencies:   mbed-rtos mbed USBDevice USBJoystick

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "USBMouseKeyboard.h"
00003 #include "USBJoystick.h"
00004 #include "rtos.h"
00005 #include "string.h"
00006 
00007 #define min(a, b) (a)<(b) ? (a) : (b)
00008 #define max(a, b) (a)>(b) ? (a) : (b)
00009 #define clamp(val, floor, ceil) min(max(val, floor), ceil)
00010 
00011 extern "C" void mbed_reset();
00012 
00013 Serial pc(USBTX, USBRX);
00014 //macOS: screen /dev/tty.usbmodem{num} {baud rate}
00015 //Windows: Realterm
00016 
00017 class Axis {
00018     public:
00019         Axis(PinName pin) : _pin(pin) {
00020             _t.reset();
00021             _center = 0;
00022             _scale = 1.0;
00023             _pin.rise(this, &Axis::start);
00024             _pin.fall(this, &Axis::stop);
00025         }
00026         
00027         int8_t read() {
00028             int val = _t.read_us();
00029             return val < 1000 ? clamp((val - _center)*_scale, -128, 127) : -128;
00030         }
00031         
00032         int16_t read_raw() {
00033             return _t.read_us();
00034         }
00035         
00036         void setup(int center, int range) {
00037             _center = center;
00038             _scale = 255.0/range;
00039         }
00040         
00041         bool connected() {
00042             int val = _t.read_us();
00043             return val == clamp(val, 10, 1000);
00044         }
00045     
00046     private:
00047         InterruptIn _pin;
00048         Timer _t;
00049         int _center;
00050         float _scale;
00051         
00052         void start() {
00053             _t.reset();
00054             _t.start();
00055         }
00056 
00057         void stop() {
00058             _t.stop();
00059         }
00060         
00061 };
00062 
00063 Axis x1 = Axis(p15);
00064 Axis y1 = Axis(p16);
00065 Axis x2 = Axis(p17);
00066 Axis y2 = Axis(p18);
00067 
00068 volatile int buttons;
00069 
00070 DigitalOut trig(p19);
00071 
00072 //1st row: necessary garbage, size, mode, reserved, reserved
00073 //2nd row: x1 center, x1 range, y1 center, y1 range, reserved
00074 //3rd row: x2 center, x2 range, y2 center, y2 range, reserved
00075 //following rows: input, min, max, output, value
00076 int bindings[128][5];
00077 /*int bindings[128][5] = {{0xFFFFFFFF, 9, 0, 0, 0},
00078                       {128, 255, 128, 255, 0},
00079                       {128, 255, 128, 255, 0},
00080                       {0, 0, 100, 4, (int)'a'},
00081                       {0, 400, 1000, 4, (int)'d'},
00082                       {1, 0, 100, 4, (int)'w'},
00083                       {1, 400, 1000, 4, (int)'s'},
00084                       {4, 128, 255, 4, (int)'1'},
00085                       {5, 128, 255, 4, (int)'2'}};*/
00086                       
00087 /*int bindings[8][5] = {{0, 0, 1000, 0, 0},
00088                       {1, 0, 1000, 1, 0},
00089                       {4, 128, 255, 4, 0x1},
00090                       {5, 128, 255, 4, 0x2}};*/
00091                       
00092 LocalFileSystem local("local");
00093 
00094 void analog_trig() {
00095     trig = 0;
00096     trig = 1;
00097 }
00098 
00099 
00100 void debug_thread() {
00101     pc.printf("Beginning Joystick Test...\r\n");
00102     pc.printf("---------------------------------\r\n");
00103     
00104     while(1) {
00105         pc.printf("Joystick 1 - %d, %d, %X \r\n", x1.read_raw(), y1.read_raw(), buttons&0x3);
00106         pc.printf("Joystick 2 - %d, %d, %X \r\n", x2.read_raw(), y2.read_raw(), (buttons>>2)&0x3);
00107         pc.printf("\r\n");
00108         Thread::wait(500);
00109     }
00110 }
00111 
00112 
00113 void keys_mouse_output_thread() {
00114     USBMouseKeyboard keys_mouse;
00115     BusIn buttons_raw(p21, p22, p23, p24);
00116     buttons_raw.mode(PullUp);
00117     
00118     int mouse[4];
00119     int value, trigval;
00120     
00121     while(true) {
00122         memset(mouse, 0, sizeof(mouse));
00123         buttons = ~buttons_raw&0xF;
00124         
00125         for (int i=3; i<bindings[0][1]; i++) {
00126             //pc.printf("Checking %d: ", i);
00127             switch (bindings[i][0]) {
00128                 case 0: trigval = x1.read(); break;
00129                 case 1: trigval = y1.read(); break;
00130                 case 2: trigval = x2.read(); break;
00131                 case 3: trigval = y2.read(); break;
00132                 case 4: trigval = (buttons & 0x1)*127; break;
00133                 case 5: trigval = ((buttons>>1) & 0x1)*127; break;
00134                 case 6: trigval = ((buttons>>2) & 0x1)*127; break;
00135                 case 7: trigval = ((buttons>>3) & 0x1)*127; break;
00136             }
00137             value = bindings[i][4];
00138             
00139             if (trigval >= bindings[i][1] && trigval <= bindings[i][2]) {
00140                 //pc.printf("Triggered : %d, %d, %d\r\n", i, trigval, value);
00141                 switch (bindings[i][3]) {
00142                     case 0: mouse[0] = trigval/value; break; //Mouse X
00143                     case 1: mouse[1] = trigval/value; break; //Mouse Y
00144                     case 2: mouse[2] |= value; break; //Mouse buttons
00145                     case 3: mouse[3] = trigval/value; break; //Mouse scroll
00146                     case 4: keys_mouse.keyCode(value); break; //Keypress
00147                 }  
00148             }
00149         }
00150         keys_mouse.update(mouse[0], mouse[1], mouse[2], mouse[3]);
00151         Thread::wait(15);
00152     }
00153 }
00154 
00155 
00156 void joystick_output_thread() {
00157     USBJoystick joystick;
00158     BusIn buttons_raw(p21, p22, p23, p24);
00159     buttons_raw.mode(PullUp);
00160     
00161     int joy[6];
00162     int value, trigval;
00163     
00164     while(true) {
00165         memset(joy, 0, sizeof(joy));
00166         buttons = ~buttons_raw&0xF;
00167         
00168         for (int i=3; i<bindings[0][1]; i++) {
00169             //pc.printf("Checking %d: ", i);
00170             switch (bindings[i][0]) {
00171                 case 0: trigval = x1.read(); break;
00172                 case 1: trigval = y1.read(); break;
00173                 case 2: trigval = x2.read(); break;
00174                 case 3: trigval = y2.read(); break;
00175                 case 4: trigval = (buttons & 0x1)*127; break;
00176                 case 5: trigval = ((buttons>>1) & 0x1)*127; break;
00177                 case 6: trigval = ((buttons>>2) & 0x1)*127; break;
00178                 case 7: trigval = ((buttons>>3) & 0x1)*127; break;
00179             }
00180             value = bindings[i][4];
00181             
00182             if (trigval >= bindings[i][1] && trigval <= bindings[i][2]) {
00183                 //pc.printf("Triggered : %d, %d, %d\r\n", i, trigval, value);
00184                 switch (bindings[i][3]) {
00185                     case 0: joy[2] = trigval/value; break;//Joy X
00186                     case 1: joy[3] = trigval/value; break; //Joy Y
00187                     case 2: joy[0] = trigval/value; break; //Joy throttle
00188                     case 3: joy[1] = trigval/value; break; //Joy rudder
00189                     case 4: joy[4] |= value; break; //Joy buttons
00190                     case 5: joy[5] |= value; break; //Joy hat
00191                 }  
00192             }
00193         }
00194         joystick.update(joy[0], joy[1], joy[2], joy[3], joy[4], joy[5]);
00195         Thread::wait(15);
00196     }
00197 }
00198 
00199 
00200 int main() {
00201     
00202     //Load bindings from file
00203     FILE *bf = fopen("/local/bindings", "rb");
00204     fread(bindings, 5*sizeof(int), 1, bf);
00205     fread(bindings[1], 5*sizeof(int), bindings[0][1]-1, bf);
00206     fclose(bf);
00207     
00208     x1.setup(bindings[1][0], bindings[1][1]);
00209     y1.setup(bindings[1][2], bindings[1][3]);
00210     x2.setup(bindings[2][0], bindings[2][1]);
00211     y2.setup(bindings[2][2], bindings[2][3]);
00212     
00213     //Thread analogThread(analog_thread);
00214     Ticker analog_ticker;
00215     analog_ticker.attach(&analog_trig, 0.05);
00216     
00217     Thread outputThread;
00218     //Thread::wait(100);
00219     switch(bindings[0][2]) {
00220         case 0: outputThread.start(keys_mouse_output_thread); break;
00221         case 1: outputThread.start(joystick_output_thread); break;
00222     }
00223     
00224     Thread debugThread(debug_thread);
00225     
00226     while(1) Thread::yield();
00227 }