diff options
-rw-r--r-- | ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp | 57 | ||||
-rw-r--r-- | ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h | 6 |
2 files changed, 43 insertions, 20 deletions
diff --git a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp index 6f34d20b..74986299 100644 --- a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp +++ b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.cpp @@ -1,37 +1,52 @@ #include "ftnoir_protocol_libevdev.h" #include "facetracknoir/global-settings.h" //#include "ftnoir_tracker_base/ftnoir_tracker_types.h" +#include <cstdio> +#include <algorithm> -#define CHECK_LIBEVDEV(expr) if ((expr) != 0) goto error; +#include <sys/types.h> +#include <sys/stat.h> + +#define CHECK_LIBEVDEV(expr) if (error = (expr) != 0) goto error; + +static const int max_input = 8192; +static const int mid_input = 4096; +static const int min_input = 0; + +#define HT_PI 3.1415926535 FTNoIR_Protocol::FTNoIR_Protocol() : dev(NULL), uidev(NULL) { - int error; + int error = 0; dev = libevdev_new(); if (!dev) goto error; + CHECK_LIBEVDEV(libevdev_enable_property(dev, INPUT_PROP_BUTTONPAD)); + libevdev_set_name(dev, "opentrack headpose"); struct input_absinfo absinfo; - absinfo.minimum = -ABS_MAX; - absinfo.maximum = ABS_MAX; - absinfo.resolution= 1; /* units per radian? let's go shopping */ - absinfo.value = 0; - absinfo.fuzz = 1; /* no filtering in evdev subsystem, we do our own */ + absinfo.minimum = min_input; + absinfo.maximum = max_input; + absinfo.resolution = 1; + absinfo.value = mid_input; + absinfo.flat = 8192 / 180; + absinfo.fuzz = 1; + + CHECK_LIBEVDEV(libevdev_enable_event_type(dev, EV_ABS)); + CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_X, &absinfo)); + CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_Y, &absinfo)); + CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_Z, &absinfo)); + CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_RX, &absinfo)); + CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_RY, &absinfo)); - CHECK_LIBEVDEV(libevdev_enable_event_type(dev, EV_ABS)) - CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_X, &absinfo)) - CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_Y, &absinfo)) - CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_Z, &absinfo)) - CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_RX, &absinfo)) - CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_RY, &absinfo)) - CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_RZ, &absinfo)) + CHECK_LIBEVDEV(libevdev_enable_event_code(dev, EV_ABS, ABS_RZ, &absinfo)); - CHECK_LIBEVDEV(error = libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uidev)) + CHECK_LIBEVDEV(libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uidev)); return; error: @@ -39,6 +54,8 @@ error: libevdev_uinput_destroy(uidev); if (dev) libevdev_free(dev); + if (error) + fprintf(stderr, "libevdev error: %d\n", error); uidev = NULL; dev = NULL; } @@ -60,15 +77,19 @@ void FTNoIR_Protocol::sendHeadposeToGame( double *headpose, double *rawheadpose 2, 2, 2, - 2, /* | pitch | only goes to 90 */ - 1, + 2, + 1, /* |pitch| only goes to 90 */ 2 }; const int max_euler = 90; for (int i = 0; i < 6; i++) - (void) libevdev_uinput_write_event(uidev, EV_ABS, axes[i], ranges[i] * headpose[i] * max_euler / ABS_MAX); + { + int value = headpose[i] * mid_input / (max_euler * ranges[i]) + mid_input; + int normalized = std::max(std::min(max_input, value), min_input); + (void) libevdev_uinput_write_event(uidev, EV_ABS, axes[i], normalized); + } } extern "C" FTNOIR_PROTOCOL_BASE_EXPORT IProtocol* CALLING_CONVENTION GetConstructor() diff --git a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h index b71738f1..42864a07 100644 --- a/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h +++ b/ftnoir_protocol_libevdev/ftnoir_protocol_libevdev.h @@ -12,8 +12,10 @@ #include <QSettings> #include "facetracknoir/global-settings.h" -#include <libevdev-1.0/libevdev/libevdev.h> -#include <libevdev-1.0/libevdev/libevdev-uinput.h> +extern "C" { +# include <libevdev-1.0/libevdev/libevdev.h> +# include <libevdev-1.0/libevdev/libevdev-uinput.h> +} class FTNoIR_Protocol : public IProtocol { |