diff options
Diffstat (limited to 'ftnoir_tracker_libevdev')
-rw-r--r-- | ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp | 70 | ||||
-rw-r--r-- | ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h | 36 | ||||
-rw-r--r-- | ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp | 20 |
3 files changed, 74 insertions, 52 deletions
diff --git a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp index 8bb35314..13669cf9 100644 --- a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp +++ b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.cpp @@ -15,38 +15,43 @@ static const int ot_libevdev_joystick_axes[6] = { ABS_X, ABS_Y, ABS_Z, ABS_RX, ABS_RY, ABS_RZ }; -FTNoIR_Tracker::FTNoIR_Tracker() : node(nullptr), success(false) +FTNoIR_Tracker::FTNoIR_Tracker() : node(nullptr), success(false), should_quit(false) { } FTNoIR_Tracker::~FTNoIR_Tracker() { + if (success) + { + should_quit = true; + wait(); + } if (node) libevdev_free(node); if (fd != -1) close(fd); } -void FTNoIR_Tracker::StartTracker(QFrame*) +void FTNoIR_Tracker::start_tracker(QFrame*) { QString node_name = s.device_name; std::string str = (QString("/dev/input/by-id/") + node_name).toStdString(); const char* filename = str.c_str(); - - fd = open(filename, O_NONBLOCK, O_RDWR); + + fd = open(filename, 0, O_RDWR); if (fd == -1) { qDebug() << "error opening" << filename; return; } - + int ret = libevdev_new_from_fd(fd, &node); if (ret) { qDebug() << "libevdev open error" << ret; return; } - + for (int i = 0; i < 6; i++) { // no error checking here, errors result in SIGFPE @@ -54,32 +59,65 @@ void FTNoIR_Tracker::StartTracker(QFrame*) a_max[i] = libevdev_get_abs_maximum(node, ot_libevdev_joystick_axes[i]); qDebug() << "axis limits" << i << a_min[i] << "->" << a_max[i]; } - + success = true; + + QThread::start(); } -void FTNoIR_Tracker::GetHeadPoseData(double *data) +void FTNoIR_Tracker::run() { - if (node) + bool absp = libevdev_has_event_code(node, EV_ABS, ABS_X) && + !libevdev_has_event_code(node, EV_REL, ABS_X); + while (!should_quit) { - while (libevdev_has_event_pending(node) == 1) + struct input_event ev; + int status = libevdev_next_event(node, LIBEVDEV_READ_FLAG_NORMAL, &ev); + if (status != LIBEVDEV_READ_STATUS_SUCCESS) + continue; + if (absp) { - struct input_event ev; - int status = libevdev_next_event(node, LIBEVDEV_READ_FLAG_NORMAL, &ev); - if (status != LIBEVDEV_READ_STATUS_SUCCESS) - continue; if (ev.type == EV_ABS) { - const int val = ev.value, code = ev.code; + const int code = ev.code; for (int i = 0; i < 6; i++) { if (ot_libevdev_joystick_axes[i] == code) { - data[i] = (val - a_min[i])*(i >= Yaw ? 180. : 100.) / a_max[i] - a_min[i]; + QMutexLocker l(&mtx); + values[i] = ev.value; break; } } } + } else { + if (ev.type == EV_REL) + { + const int code = ev.code; + for (int i = 0; i < 6; i++) + { + if (ot_libevdev_joystick_axes[i] == code) + { + QMutexLocker l(&mtx); + values[i] += ev.value; + break; + } + } + } + } + } +} + +void FTNoIR_Tracker::data(double *data) +{ + if (node) + { + QMutexLocker l(&mtx); + for (int i = 0; i < 6; i++) + { + int val = values[i]; + double v = (val - a_min[i])*(i >= Yaw ? 180. : 100.) / a_max[i] - a_min[i]; + data[i] = v; } } } diff --git a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h index 2474fb35..4251435c 100644 --- a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h +++ b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev.h @@ -4,6 +4,9 @@ #include "facetracknoir/plugin-api.hpp" #include "facetracknoir/options.h" #include "./ui_ftnoir_libevdev.h" +#include <QThread> +#include <QMutex> +#include <QMutexLocker> using namespace options; struct settings { @@ -15,41 +18,42 @@ struct settings { {} }; -class FTNoIR_Tracker : public ITracker +class FTNoIR_Tracker : public ITracker, private QThread { public: - FTNoIR_Tracker(); + FTNoIR_Tracker(); ~FTNoIR_Tracker() override; - void StartTracker(QFrame *); - void GetHeadPoseData(double *data); + void start_tracker(QFrame *); + void data(double *data); private: + void run() override; struct libevdev* node; int fd; settings s; bool success; - int a_min[6], a_max[6]; + int a_min[6], a_max[6], values[6]; + QMutex mtx; + volatile bool should_quit; }; -class TrackerControls: public QWidget, public ITrackerDialog +class TrackerControls: public ITrackerDialog { Q_OBJECT public: - TrackerControls(); - void registerTracker(ITracker *) {} - void unRegisterTracker() {} + TrackerControls(); + void register_tracker(ITracker *) {} + void unregister_tracker() {} private: - Ui::ui_libevdev_tracker_dialog ui; + Ui::ui_libevdev_tracker_dialog ui; settings s; private slots: - void doOK(); - void doCancel(); + void doOK(); + void doCancel(); }; class FTNoIR_TrackerDll : public Metadata { public: - void getFullName(QString *strToBeFilled); - void getShortName(QString *strToBeFilled); - void getDescription(QString *strToBeFilled); - void getIcon(QIcon *icon); + QString name() { return QString("libevdev joystick input"); } + QIcon icon() { return QIcon(":/images/facetracknoir.png"); } }; diff --git a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp index 6ad13c8c..e6216d7f 100644 --- a/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp +++ b/ftnoir_tracker_libevdev/ftnoir_tracker_libevdev_dll.cpp @@ -1,26 +1,6 @@ #include "ftnoir_tracker_libevdev.h" #include "facetracknoir/plugin-support.h" -void FTNoIR_TrackerDll::getFullName(QString *strToBeFilled) -{ - *strToBeFilled = "Joystick"; -} - -void FTNoIR_TrackerDll::getShortName(QString *strToBeFilled) -{ - *strToBeFilled = "Joystick"; -} - -void FTNoIR_TrackerDll::getDescription(QString *strToBeFilled) -{ - *strToBeFilled = "Joystick"; -} - -void FTNoIR_TrackerDll::getIcon(QIcon *icon) -{ - *icon = QIcon(":/images/facetracknoir.png"); -} - extern "C" OPENTRACK_EXPORT Metadata* GetMetadata() { return new FTNoIR_TrackerDll; |