diff options
-rw-r--r-- | mariokart01.cpp | 187 |
1 files changed, 106 insertions, 81 deletions
diff --git a/mariokart01.cpp b/mariokart01.cpp index bc0be6f..3eb5a73 100644 --- a/mariokart01.cpp +++ b/mariokart01.cpp @@ -28,8 +28,12 @@ #include <pthread.h> #include <semaphore.h> #include <fcntl.h> -#include <linux/input.h> -#include <linux/uinput.h> + +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <sys/uio.h> + #include <iostream> #include <xcb/xcb.h> @@ -217,14 +221,71 @@ void XorgGrabber::read(Mat& mat) -#define THROTTLE_CNT_MAX 20 +#define THROTTLE_CNT_MAX 10 + + + +typedef union { + unsigned int Value; + struct { + unsigned R_DPAD : 1; + unsigned L_DPAD : 1; + unsigned D_DPAD : 1; + unsigned U_DPAD : 1; + unsigned START_BUTTON : 1; + unsigned Z_TRIG : 1; + unsigned B_BUTTON : 1; + unsigned A_BUTTON : 1; + + unsigned R_CBUTTON : 1; + unsigned L_CBUTTON : 1; + unsigned D_CBUTTON : 1; + unsigned U_CBUTTON : 1; + unsigned R_TRIG : 1; + unsigned L_TRIG : 1; + unsigned Reserved1 : 1; + unsigned Reserved2 : 1; + + signed X_AXIS : 8; + signed Y_AXIS : 8; + }; +} BUTTONS; + + +char* pack(const BUTTONS* buttons, char* buf) +{ + buf[0]= (buttons->A_BUTTON ? 1 : 0) + + (buttons->B_BUTTON ? 2 : 0) + + (buttons->L_TRIG ? 4 : 0) + + (buttons->R_TRIG ? 8 : 0) + + (buttons->Z_TRIG ? 16 : 0) + + (buttons->START_BUTTON ? 32 : 0) + + 128; + + buf[1]= (buttons->R_DPAD ? 1 : 0) + + (buttons->L_DPAD ? 2 : 0) + + (buttons->U_DPAD ? 4 : 0) + + (buttons->D_DPAD ? 8 : 0) + + ((buttons->X_AXIS & 128) ? 16 : 0) + + ((buttons->Y_AXIS & 128) ? 32 : 0); + + buf[2]= (buttons->R_CBUTTON ? 1 : 0) + + (buttons->L_CBUTTON ? 2 : 0) + + (buttons->U_CBUTTON ? 4 : 0) + + (buttons->D_CBUTTON ? 8 : 0); + + buf[3]= (buttons->X_AXIS & 127); + + buf[4]= (buttons->Y_AXIS & 127); + + return buf; +} + class Joystick { public: - Joystick(); - ~Joystick(); - + Joystick(const char* fifo); void steer(float dir, float dead_zone=0.0); void throttle(float t); void press_a(bool); @@ -232,58 +293,41 @@ class Joystick void process(); void reset(); - + private: + BUTTONS buttons; + void send_data(); + int fifo_fd; + float throt; int throttle_cnt; - int fd; }; -Joystick::Joystick() +Joystick::Joystick(const char* fifo) { - fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); - if(fd < 0) { - cerr << "open uinput failed. do you have privilegies to access it? (try chown flo:root /dev/uinput)" << endl; - exit(EXIT_FAILURE); - } - - int ret; - - ret=ioctl(fd, UI_SET_EVBIT, EV_KEY); - ret=ioctl(fd, UI_SET_EVBIT, EV_SYN); - ret=ioctl(fd, UI_SET_KEYBIT , BTN_A); - ioctl(fd, UI_SET_EVBIT, EV_ABS); - ioctl(fd, UI_SET_ABSBIT, ABS_X); - ioctl(fd, UI_SET_ABSBIT, ABS_Y); - - struct uinput_user_dev meh; - memset(&meh,0,sizeof(meh)); - - strcpy(meh.name, "flotest"); - meh.id.bustype=BUS_USB; - meh.id.vendor=0xdead; - meh.id.product=0xbeef; - meh.id.version=1; - meh.absmin[ABS_X]=0; - meh.absmax[ABS_X]=10000; - meh.absmin[ABS_Y]=0; - meh.absmax[ABS_Y]=10000; - - - ret=write(fd, &meh, sizeof(meh)); - - ioctl(fd,UI_DEV_CREATE); + if ((fifo_fd=open(fifo, O_WRONLY )) == -1) {throw string(strerror(errno));} + cout << "opened" << endl; + if (fcntl(fifo_fd, F_SETFL, O_NONBLOCK) == -1) throw string("failed to set nonblocking io"); reset(); } -Joystick::~Joystick() +void Joystick::press_a(bool state) { - ioctl(fd, UI_DEV_DESTROY); - close(fd); + buttons.A_BUTTON=state; + send_data(); } +void Joystick::send_data() +{ + char buf[5]; + pack(&buttons, buf); + write(fifo_fd, buf, 5); +} + + + void Joystick::steer(float dir, float dead_zone) { if (dir<-1.0) dir=-1.0; @@ -291,11 +335,8 @@ void Joystick::steer(float dir, float dead_zone) if (fabs(dir)<dead_zone) dir=0.0; - struct input_event ev; - ev.type=EV_ABS; - ev.code=ABS_X; - ev.value=5000+dir*5000; - write(fd, &ev, sizeof(ev)); + buttons.X_AXIS = (signed) (127.0*dir); + send_data(); } void Joystick::throttle(float t) @@ -314,34 +355,15 @@ void Joystick::process() press_a((throttle_cnt < throt*THROTTLE_CNT_MAX)); } -void Joystick::press_a(bool a) -{ - struct input_event ev; - ev.type=EV_KEY; - ev.code=BTN_A; - ev.value = a ? 1 : 0; - write(fd, &ev, sizeof(ev)); -} - void Joystick::reset() { - struct input_event ev; - ev.type=EV_ABS; - ev.code=ABS_Y; - ev.value=5001; - write(fd, &ev, sizeof(ev)); - ev.value=5000; - write(fd, &ev, sizeof(ev)); - - cout << "Y zeroed" << endl; - - steer(0.1); - steer(0); - cout << "X zeroed" << endl; - - press_a(true); - press_a(false); - cout << "A zeroed" << endl; + memset(&buttons, sizeof(buttons), 0); + buttons.Z_TRIG=0; + buttons.R_TRIG=0; + buttons.L_TRIG=0; + buttons.A_BUTTON=0; + buttons.B_BUTTON=0; + send_data(); } @@ -420,7 +442,7 @@ void* thread1_func(void*) sem_wait(&thread1_go); // now we have our private image at thread1_img. - +/* cvtColor(thread1_img, gray, CV_BGR2GRAY); @@ -491,7 +513,7 @@ void* thread1_func(void*) cv::swap(gray_prev, gray); - + */ // now we must stop accessing thread1_img, main() may access it sem_post(&thread1_done); } @@ -511,12 +533,14 @@ try { string tmp; - Joystick joystick; - cout << "joystick initalized, now starting mupen." << endl; if (fork()==0) { system("mupen64plus --nogui --noask ~/MarioKart64.rom"); exit(0); } + + sleep(2); + + Joystick joystick("/var/tmp/mupen64plus_ctl"); sleep(1); @@ -552,9 +576,10 @@ try { getchar();*/ cout << "waiting for game to start, press enter when started." << endl; + joystick.press_a(false); getchar(); - XorgGrabber capture("glN64");//("Mupen64Plus OpenGL Video"); + XorgGrabber capture("Mupen64Plus OpenGL Video"); int road_0=77, road_1=77, road_2=77; @@ -873,7 +898,7 @@ try { joystick.steer(- 4* flopow( (((float)left_sum / (left_sum+right_sum))-0.5 )*2.0 , 1.6) ,0.05); } else - joystick.steer(0.0); + joystick.steer(0.0); |