summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mariokart01.cpp187
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);