diff options
Diffstat (limited to 'tracker-tobii-eyex')
-rw-r--r-- | tracker-tobii-eyex/CMakeLists.txt | 24 | ||||
-rw-r--r-- | tracker-tobii-eyex/images/tobii-eyex-logo.png | bin | 402 -> 0 bytes | |||
-rw-r--r-- | tracker-tobii-eyex/lang/nl_NL.ts | 56 | ||||
-rw-r--r-- | tracker-tobii-eyex/lang/ru_RU.ts | 56 | ||||
-rw-r--r-- | tracker-tobii-eyex/lang/stub.ts | 56 | ||||
-rw-r--r-- | tracker-tobii-eyex/lang/zh_CN.ts | 56 | ||||
-rw-r--r-- | tracker-tobii-eyex/tobii-eyex-dialog.cpp | 25 | ||||
-rw-r--r-- | tracker-tobii-eyex/tobii-eyex-dialog.hpp | 21 | ||||
-rw-r--r-- | tracker-tobii-eyex/tobii-eyex-dialog.ui | 484 | ||||
-rw-r--r-- | tracker-tobii-eyex/tobii-eyex-res.qrc | 5 | ||||
-rw-r--r-- | tracker-tobii-eyex/tobii-eyex.cpp | 312 | ||||
-rw-r--r-- | tracker-tobii-eyex/tobii-eyex.hpp | 87 | ||||
-rw-r--r-- | tracker-tobii-eyex/tobii-settings.hpp | 36 |
13 files changed, 0 insertions, 1218 deletions
diff --git a/tracker-tobii-eyex/CMakeLists.txt b/tracker-tobii-eyex/CMakeLists.txt deleted file mode 100644 index eead67bf..00000000 --- a/tracker-tobii-eyex/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -if(WIN32) - set(SDK_TOBII_EYEX "" CACHE PATH "") - if(SDK_TOBII_EYEX) - otr_module(tracker-tobii) - set(tobii-libdir ${SDK_TOBII_EYEX}/lib/x86/) - set(tobii-dll "${tobii-libdir}/Tobii.EyeX.Client.dll") - # we only care about the .lib for MSVC++ build anyway - target_link_libraries(opentrack-tracker-tobii "${tobii-libdir}/Tobii.EyeX.Client.lib") - # we only ever use the C headers due to Microsoft CRT ABI incompatibility with GNU - target_include_directories(opentrack-tracker-tobii SYSTEM PUBLIC "${SDK_TOBII_EYEX}/include/eyex") - - install(FILES "${tobii-dll}" DESTINATION "${opentrack-hier-pfx}" PERMISSIONS ${opentrack-perms-exec}) - if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") - file(TO_CMAKE_PATH "$ENV{SystemRoot}" sysroot) - if (IS_DIRECTORY "${sysroot}/SysWOW64") - set(src "${sysroot}/SysWOW64") - else() - set(src "${sysroot}/System32") - endif() - install(FILES "${src}/msvcp110.dll" DESTINATION ${opentrack-hier-pfx} PERMISSIONS ${opentrack-perms-exec}) - install(FILES "${src}/msvcr110.dll" DESTINATION ${opentrack-hier-pfx} PERMISSIONS ${opentrack-perms-exec}) - endif() - endif() -endif() diff --git a/tracker-tobii-eyex/images/tobii-eyex-logo.png b/tracker-tobii-eyex/images/tobii-eyex-logo.png Binary files differdeleted file mode 100644 index e01bc1ae..00000000 --- a/tracker-tobii-eyex/images/tobii-eyex-logo.png +++ /dev/null diff --git a/tracker-tobii-eyex/lang/nl_NL.ts b/tracker-tobii-eyex/lang/nl_NL.ts deleted file mode 100644 index f58d6213..00000000 --- a/tracker-tobii-eyex/lang/nl_NL.ts +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.1" language="nl_NL"> -<context> - <name>tobii_eyex_dialog_widgets</name> - <message> - <source>Tracker options</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Tracking settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accumulative mode shifts the view toward a target that may be offscreen then fixes upon it. -On the other hand, the snap mode allows for a quick glance outside the field of vision.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accumulative mode settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Screen edge length</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Max yaw</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Max pitch</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Position output</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Enabled</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Snap mode settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Tracking mode</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Speed</source> - <translation type="unfinished"></translation> - </message> -</context> -</TS> diff --git a/tracker-tobii-eyex/lang/ru_RU.ts b/tracker-tobii-eyex/lang/ru_RU.ts deleted file mode 100644 index 844cb931..00000000 --- a/tracker-tobii-eyex/lang/ru_RU.ts +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.1" language="ru_RU"> -<context> - <name>tobii_eyex_dialog_widgets</name> - <message> - <source>Tracker options</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Tracking settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accumulative mode shifts the view toward a target that may be offscreen then fixes upon it. -On the other hand, the snap mode allows for a quick glance outside the field of vision.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accumulative mode settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Screen edge length</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Max yaw</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Max pitch</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Position output</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Enabled</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Snap mode settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Tracking mode</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Speed</source> - <translation type="unfinished"></translation> - </message> -</context> -</TS> diff --git a/tracker-tobii-eyex/lang/stub.ts b/tracker-tobii-eyex/lang/stub.ts deleted file mode 100644 index a8702a56..00000000 --- a/tracker-tobii-eyex/lang/stub.ts +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.1"> -<context> - <name>tobii_eyex_dialog_widgets</name> - <message> - <source>Tracker options</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Tracking settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accumulative mode shifts the view toward a target that may be offscreen then fixes upon it. -On the other hand, the snap mode allows for a quick glance outside the field of vision.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accumulative mode settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Screen edge length</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Max yaw</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Max pitch</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Position output</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Enabled</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Snap mode settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Tracking mode</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Speed</source> - <translation type="unfinished"></translation> - </message> -</context> -</TS> diff --git a/tracker-tobii-eyex/lang/zh_CN.ts b/tracker-tobii-eyex/lang/zh_CN.ts deleted file mode 100644 index 57899430..00000000 --- a/tracker-tobii-eyex/lang/zh_CN.ts +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.1"> -<context> - <name>tobii_eyex_dialog_widgets</name> - <message> - <source>Tracker options</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Tracking settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accumulative mode shifts the view toward a target that may be offscreen then fixes upon it. -On the other hand, the snap mode allows for a quick glance outside the field of vision.</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Tracking mode</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Accumulative mode settings</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Screen edge length</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Speed</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Max yaw</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Max pitch</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Position output</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Enabled</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Snap mode settings</source> - <translation type="unfinished"></translation> - </message> -</context> -</TS> diff --git a/tracker-tobii-eyex/tobii-eyex-dialog.cpp b/tracker-tobii-eyex/tobii-eyex-dialog.cpp deleted file mode 100644 index 807542e1..00000000 --- a/tracker-tobii-eyex/tobii-eyex-dialog.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "tobii-eyex-dialog.hpp" - -tobii_eyex_dialog::tobii_eyex_dialog() -{ - ui.setupUi(this); - - connect(ui.buttonBox, &QDialogButtonBox::accepted, this, &tobii_eyex_dialog::do_ok); - connect(ui.buttonBox, &QDialogButtonBox::rejected, this, &tobii_eyex_dialog::do_cancel); - - ui.tracking_mode->addItem("Snap", tobii_snap); - ui.tracking_mode->addItem("Accumulative", tobii_acc); - - tie_setting(s.mode, ui.tracking_mode); -} - -void tobii_eyex_dialog::do_ok() -{ - s.b->save(); - close(); -} - -void tobii_eyex_dialog::do_cancel() -{ - close(); -} diff --git a/tracker-tobii-eyex/tobii-eyex-dialog.hpp b/tracker-tobii-eyex/tobii-eyex-dialog.hpp deleted file mode 100644 index 67cab885..00000000 --- a/tracker-tobii-eyex/tobii-eyex-dialog.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "tobii-settings.hpp" - -#include "api/plugin-api.hpp" -#include "ui_tobii-eyex-dialog.h" -#include <QObject> - -class tobii_eyex_dialog final : public ITrackerDialog -{ - Q_OBJECT - Ui::tobii_eyex_dialog_widgets ui; - settings s; -private slots: - void do_ok(); - void do_cancel(); -public: - tobii_eyex_dialog(); - void register_tracker(ITracker*) override {} - void unregister_tracker() override {} -}; diff --git a/tracker-tobii-eyex/tobii-eyex-dialog.ui b/tracker-tobii-eyex/tobii-eyex-dialog.ui deleted file mode 100644 index a6aecafb..00000000 --- a/tracker-tobii-eyex/tobii-eyex-dialog.ui +++ /dev/null @@ -1,484 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>tobii_eyex_dialog_widgets</class> - <widget class="QWidget" name="tobii_eyex_dialog_widgets"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>659</width> - <height>471</height> - </rect> - </property> - <property name="windowTitle"> - <string>Tracker options</string> - </property> - <property name="windowIcon"> - <iconset resource="tobii-eyex-res.qrc"> - <normaloff>:/images/tobii-eyex-logo.png</normaloff>:/images/tobii-eyex-logo.png</iconset> - </property> - <layout class="QGridLayout" name="gridLayout_4"> - <property name="bottomMargin"> - <number>4</number> - </property> - <item row="0" column="0"> - <widget class="QGroupBox" name="groupBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Tracking settings</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <widget class="QLabel" name="label_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>617</width> - <height>0</height> - </size> - </property> - <property name="text"> - <string>Accumulative mode shifts the view toward a target that may be offscreen then fixes upon it. -On the other hand, the snap mode allows for a quick glance outside the field of vision.</string> - </property> - <property name="textFormat"> - <enum>Qt::PlainText</enum> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QFrame" name="frame"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="frameShape"> - <enum>QFrame::NoFrame</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Raised</enum> - </property> - <layout class="QGridLayout" name="gridLayout"> - <property name="leftMargin"> - <number>4</number> - </property> - <property name="topMargin"> - <number>4</number> - </property> - <property name="rightMargin"> - <number>4</number> - </property> - <property name="bottomMargin"> - <number>4</number> - </property> - <property name="horizontalSpacing"> - <number>9</number> - </property> - <property name="verticalSpacing"> - <number>4</number> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Tracking mode</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QComboBox" name="tracking_mode"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="0" column="2"> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>10</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - </item> - <item row="1" column="0"> - <widget class="QGroupBox" name="groupBox_2"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Accumulative mode settings</string> - </property> - <layout class="QGridLayout" name="gridLayout_2"> - <item row="0" column="0"> - <widget class="QLabel" name="label_3"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Screen edge length</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QSlider" name="acc_inv_deadzone_slider"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> - <horstretch>9</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>20</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLabel" name="acc_inv_deadzone_label"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> - <horstretch>10</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_4"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Speed</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_6"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Max yaw</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSlider" name="acc_speed_slider"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> - <horstretch>9</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximum"> - <number>100</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="label_7"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Max pitch</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QComboBox" name="acc_max_yaw"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="3" column="1"> - <widget class="QComboBox" name="acc_max_pitch"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="4" column="0"> - <widget class="QLabel" name="label_11"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Position output</string> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QCheckBox" name="acc_pos_output"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Enabled</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="2" column="0"> - <widget class="QGroupBox" name="groupBox_3"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="title"> - <string>Snap mode settings</string> - </property> - <layout class="QGridLayout" name="gridLayout_3"> - <item row="2" column="1" rowspan="2"> - <widget class="QComboBox" name="snap_max_yaw"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="3" column="0" rowspan="2"> - <widget class="QLabel" name="label_10"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Max pitch</string> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="label_9"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Max yaw</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="label_8"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Speed</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QSlider" name="snap_inv_deazone_slider"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> - <horstretch>8</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>20</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="4" column="1"> - <widget class="QComboBox" name="snap_max_pitch"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - </widget> - </item> - <item row="0" column="2"> - <widget class="QLabel" name="snap_inv_deadzone_label"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>10</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSlider" name="snap_speed_slider"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Expanding" vsizetype="Maximum"> - <horstretch>8</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="maximum"> - <number>100</number> - </property> - <property name="pageStep"> - <number>1</number> - </property> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - </widget> - </item> - <item row="0" column="0"> - <widget class="QLabel" name="label_5"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Screen edge length</string> - </property> - </widget> - </item> - <item row="5" column="1"> - <widget class="QCheckBox" name="snap_pos_output"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Enabled</string> - </property> - </widget> - </item> - <item row="5" column="0"> - <widget class="QLabel" name="label_12"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Position output</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="3" column="0"> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Maximum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - </layout> - </widget> - <resources> - <include location="tobii-eyex-res.qrc"/> - </resources> - <connections/> -</ui> diff --git a/tracker-tobii-eyex/tobii-eyex-res.qrc b/tracker-tobii-eyex/tobii-eyex-res.qrc deleted file mode 100644 index e3395df9..00000000 --- a/tracker-tobii-eyex/tobii-eyex-res.qrc +++ /dev/null @@ -1,5 +0,0 @@ -<RCC> - <qresource prefix="/"> - <file>images/tobii-eyex-logo.png</file> - </qresource> -</RCC> diff --git a/tracker-tobii-eyex/tobii-eyex.cpp b/tracker-tobii-eyex/tobii-eyex.cpp deleted file mode 100644 index a559c8dd..00000000 --- a/tracker-tobii-eyex/tobii-eyex.cpp +++ /dev/null @@ -1,312 +0,0 @@ -#include "tobii-eyex.hpp" -#include "compat/math-imports.hpp" - -#include <cstdlib> -#include <cstdio> - -#include <QDebug> -#include <QMutexLocker> -#include <QMessageBox> - -//#define TOBII_EYEX_DEBUG_PRINTF -#define TOBII_EYEX_VERBOSE_PRINTF - -#ifdef TOBII_EYEX_VERBOSE_PRINTF -# define dbg_verbose(msg) (qDebug() << "tobii-eyex:" << (msg)) -#else -# define dbg_verbose(msg) (QMessageLogger().noDebug() << (msg)) -#endif - -#ifdef TOBII_EYEX_DEBUG_PRINTF -# define dbg_debug(msg) (qDebug() << "tobii-eyex:" << (msg)) -#else -# define dbg_debug(msg) (QMessageLogger().noDebug() << (msg)) -#endif - -#define dbg_notice(msg) (qDebug() << "tobii-eyex:" << (msg)) - -std::atomic_flag tobii_eyex_tracker::atexit_done = ATOMIC_FLAG_INIT; - -static inline tobii_eyex_tracker& to_self(TX_USERPARAM param) -{ - return *reinterpret_cast<tobii_eyex_tracker*>(param); -} - -tobii_eyex_tracker::tobii_eyex_tracker() : - dev_ctx(TX_EMPTY_HANDLE), - conn_state_changed_ticket(TX_INVALID_TICKET), - event_handler_ticket(TX_INVALID_TICKET), - state_snapshot(TX_EMPTY_HANDLE), - display_state(TX_EMPTY_HANDLE), - yaw(0), - pitch(0), - do_center(false) -{ -} - -void tobii_eyex_tracker::call_tx_deinit() -{ - dbg_notice("uninitialize in atexit at _fini time"); - (void) txUninitializeEyeX(); -} - -tobii_eyex_tracker::~tobii_eyex_tracker() -{ - dbg_verbose("dtor"); - - (void) txDisableConnection(dev_ctx); - (void) txReleaseObject(&state_snapshot); - - bool status = true; - status &= txShutdownContext(dev_ctx, TX_CLEANUPTIMEOUT_FORCEIMMEDIATE, TX_FALSE) == TX_RESULT_OK; - status &= txReleaseContext(&dev_ctx) == TX_RESULT_OK; - - // the API cleanup function needs to be called exactly once over image lifetime. - // client software communicates with a service and a desktop program. - // API is ambiguous as to what happens if the image doesn't call it or crashes. - if (!atexit_done.test_and_set()) - std::atexit(call_tx_deinit); - - if (!status) - dbg_notice("tobii-eyex: can't shutdown properly"); -} - -bool tobii_eyex_tracker::register_state_snapshot(TX_CONTEXTHANDLE dev_ctx, TX_HANDLE* state_snapshot_ptr) -{ - TX_HANDLE handle = TX_EMPTY_HANDLE; - TX_GAZEPOINTDATAPARAMS params = { TX_GAZEPOINTDATAMODE_LIGHTLYFILTERED }; - - bool status = true; - - status &= txCreateGlobalInteractorSnapshot(dev_ctx, client_id, state_snapshot_ptr, &handle) == TX_RESULT_OK; - status &= txCreateGazePointDataBehavior(handle, ¶ms) == TX_RESULT_OK; - - (void) txReleaseObject(&handle); - - return status; -} - -void tobii_eyex_tracker::process_display_state(TX_HANDLE display_state_handle) -{ - TX_SIZE2 screen_res; - - if (txGetStateValueAsSize2(display_state_handle, TX_STATEPATH_EYETRACKINGSCREENBOUNDS, &screen_res) == TX_RESULT_OK) - { - dbg_verbose("got display resolution") << screen_res.Width << screen_res.Height; - - QMutexLocker l(&global_state_mtx); - - dev_state.display_res_x = screen_res.Width; - dev_state.display_res_y = screen_res.Height; - } - else - dbg_notice("can't get display resolution"); -} - -void tobii_eyex_tracker::display_state_handler(TX_CONSTHANDLE async_data_handle, TX_USERPARAM param) -{ - tobii_eyex_tracker& self = to_self(param); - - TX_RESULT result = TX_RESULT_UNKNOWN; - TX_HANDLE state = TX_EMPTY_HANDLE; - - if (txGetAsyncDataResultCode(async_data_handle, &result) == TX_RESULT_OK && - txGetAsyncDataContent(async_data_handle, &state) == TX_RESULT_OK) - { - self.process_display_state(state); - txReleaseObject(&state); - } - else - dbg_notice("error in display state handler"); -} - -void tobii_eyex_tracker::snapshot_committed_handler(TX_CONSTHANDLE async_data_handle, TX_USERPARAM) -{ - TX_RESULT result = TX_RESULT_UNKNOWN; - txGetAsyncDataResultCode(async_data_handle, &result); - - if (!(result == TX_RESULT_OK || result == TX_RESULT_CANCELLED)) - dbg_notice("snapshot bad result code") << result; -} - -void tobii_eyex_tracker::connection_state_change_handler(TX_CONNECTIONSTATE state, TX_USERPARAM param) -{ - tobii_eyex_tracker& self = to_self(param); - - switch (state) - { - case TX_CONNECTIONSTATE_CONNECTED: - { - bool status = txCommitSnapshotAsync(self.state_snapshot, snapshot_committed_handler, param) == TX_RESULT_OK; - if (!status) - dbg_notice("connected but failed to initialize data stream"); - else - { - txGetStateAsync(self.dev_ctx, TX_STATEPATH_EYETRACKINGSCREENBOUNDS, display_state_handler, param); - dbg_notice("connected, data stream ok"); - } - } - break; - case TX_CONNECTIONSTATE_DISCONNECTED: - dbg_notice("connection state is now disconnected"); - break; - case TX_CONNECTIONSTATE_TRYINGTOCONNECT: - dbg_verbose("trying to establish connection"); - break; - case TX_CONNECTIONSTATE_SERVERVERSIONTOOLOW: - dbg_notice("installed driver version too low"); - break; - case TX_CONNECTIONSTATE_SERVERVERSIONTOOHIGH: - dbg_notice("new driver came up, we need to update sdk"); - break; - } -} - -void tobii_eyex_tracker::gaze_data_handler(TX_HANDLE gaze_data_handle) -{ - TX_GAZEPOINTDATAEVENTPARAMS params; - - if (txGetGazePointDataEventParams(gaze_data_handle, ¶ms) == TX_RESULT_OK) - { - { - QMutexLocker l(&global_state_mtx); - - if (params.Timestamp > dev_state.last_timestamp && - dev_state.display_res_x > 0 && - // the API allows for events outside screen bounds to e.g. detect looking at keyboard. - // closer to the screen bounds, the values get less accurate. - // ignore events outside the screen bounds. - params.X >= 0 && params.X < dev_state.display_res_x && - params.Y >= 0 && params.Y < dev_state.display_res_y) - { - dev_state.last_timestamp = params.Timestamp; - dev_state.px = params.X; - dev_state.py = params.Y; - -#ifdef TOBII_EYEX_DEBUG_PRINTF - char buf[256] = {0}; - (void) std::sprintf(buf, "gaze data: (%.1f, %.1f)", params.X, params.Y); - dbg_debug(buf); -#endif - - dev_state.fresh = true; - } - } - } - else - { - dbg_notice("failed to interpret gaze data event packet"); - } -} - -void tobii_eyex_tracker::event_handler(TX_CONSTHANDLE async_data_handle, TX_USERPARAM param) -{ - tobii_eyex_tracker& self = to_self(param); - - TX_HANDLE event_handle = TX_EMPTY_HANDLE; - TX_HANDLE behavior_handle = TX_EMPTY_HANDLE; - - txGetAsyncDataContent(async_data_handle, &event_handle); - - if (txGetEventBehavior(event_handle, &behavior_handle, TX_BEHAVIORTYPE_GAZEPOINTDATA) == TX_RESULT_OK) - { - self.gaze_data_handler(behavior_handle); - txReleaseObject(&behavior_handle); - } - - txReleaseObject(&event_handle); -} - -module_status tobii_eyex_tracker::start_tracker(QFrame*) -{ - bool status = true; - - status &= txInitializeEyeX(TX_EYEXCOMPONENTOVERRIDEFLAG_NONE, nullptr, nullptr, nullptr, nullptr) == TX_RESULT_OK; - status &= txCreateContext(&dev_ctx, TX_FALSE) == TX_RESULT_OK; - status &= register_state_snapshot(dev_ctx, &state_snapshot); - status &= txRegisterConnectionStateChangedHandler(dev_ctx, &conn_state_changed_ticket, connection_state_change_handler, reinterpret_cast<TX_USERPARAM>(this)) == TX_RESULT_OK; - status &= txRegisterEventHandler(dev_ctx, &event_handler_ticket, event_handler, reinterpret_cast<TX_USERPARAM>(this)) == TX_RESULT_OK; - status &= txEnableConnection(dev_ctx) == TX_RESULT_OK; - - if (!status) - return error(otr_tr("Connection can't be established. device missing?")); - else - return status_ok(); -} - -tobii_eyex_tracker::num tobii_eyex_tracker::gain(num x) -{ - return 1; -} - -static inline double signum(double x) -{ - return !(x < 0) - (x < 0); -} - -void tobii_eyex_tracker::data(double* data) -{ - TX_REAL px, py, dw, dh, x_, y_; - bool fresh; - - { - QMutexLocker l(&global_state_mtx); - - if (!dev_state.is_valid()) - return; - - px = dev_state.px; - py = dev_state.py; - dw = dev_state.display_res_x; - dh = dev_state.display_res_y; - - fresh = dev_state.fresh; - dev_state.fresh = false; - } - - x_ = (px-dw/2.) / (dw/2.); - y_ = (py-dh/2.) / (dh/2.); - - data[TX] = x_ * 50; - data[TY] = y_ * -50; - - if (fresh) - { - const double dt = t.elapsed_seconds(); - t.start(); - - using std::fabs; - - constexpr double max_yaw = 45, max_pitch = 30; - constexpr double c_yaw = 3; - constexpr double c_pitch = c_yaw * max_pitch / max_yaw; - - const double yaw_delta = gain(fabs(x_)) * signum(x_) * c_yaw * dt; - const double pitch_delta = gain(fabs(y_)) * signum(y_) * c_pitch * dt; - - yaw += yaw_delta; - pitch += pitch_delta; - - yaw = clamp(yaw, -max_yaw, max_yaw); - pitch = clamp(pitch, -max_pitch, max_pitch); - } - - if (do_center) - { - do_center = false; - yaw = 0; - pitch = 0; - } - - data[Yaw] = yaw; - data[Pitch] = pitch; - data[Roll] = 0; - data[TZ] = 0; // XXX TODO - - // tan(x) in 0->.7 is almost linear. we don't need to adjust. - // .7 is 40 degrees which is already quite a lot from the monitor. -} - -#include "tobii-eyex-dialog.hpp" - -OPENTRACK_DECLARE_TRACKER(tobii_eyex_tracker, tobii_eyex_dialog, tobii_eyex_metadata) diff --git a/tracker-tobii-eyex/tobii-eyex.hpp b/tracker-tobii-eyex/tobii-eyex.hpp deleted file mode 100644 index 170e74c1..00000000 --- a/tracker-tobii-eyex/tobii-eyex.hpp +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once - -/* Copyright (c) 2016 Stanislaw Halik <sthalik@misaki.pl> - - * Permission to use, copy, modify, and/or distribute this - * software for any purpose with or without fee is hereby granted, - * provided that the above copyright notice and this permission - * notice appear in all copies. - */ - -#include "tobii-settings.hpp" - -#include "api/plugin-api.hpp" -#include "options/options.hpp" -using namespace options; -#include "compat/timer.hpp" - -#include <EyeX.h> - -#include <functional> -#include <atomic> - -#include <QObject> -#include <QMutex> - -class tobii_eyex_tracker : public ITracker -{ -public: - tobii_eyex_tracker(); - ~tobii_eyex_tracker() override; - module_status start_tracker(QFrame *) override; - void data(double *data) override; - bool center() override - { - do_center = true; - return true; - } -private: - static constexpr inline const char* const client_id = "opentrack-tobii-eyex"; - - static void call_tx_deinit(); - - static bool register_state_snapshot(TX_CONTEXTHANDLE ctx, TX_HANDLE* state_snapshot_ptr); - static std::atomic_flag atexit_done; - static void TX_CALLCONVENTION connection_state_change_handler(TX_CONNECTIONSTATE state, TX_USERPARAM param); - static void TX_CALLCONVENTION event_handler(TX_CONSTHANDLE async_data_handle, TX_USERPARAM param); - void gaze_data_handler(TX_HANDLE gaze_data_handle); - static void TX_CALLCONVENTION snapshot_committed_handler(TX_CONSTHANDLE async_data_handle, TX_USERPARAM param); - static void TX_CALLCONVENTION display_state_handler(TX_CONSTHANDLE async_data_handle, TX_USERPARAM param); - void process_display_state(TX_HANDLE display_state_handle); - - using num = double; - - num gain(num x); - - TX_CONTEXTHANDLE dev_ctx; - TX_TICKET conn_state_changed_ticket; - TX_TICKET event_handler_ticket; - TX_HANDLE state_snapshot; - TX_HANDLE display_state; - - QMutex global_state_mtx; - settings s; - Timer t; - - struct state - { - TX_REAL display_res_x, display_res_y; - TX_REAL px, py; - TX_REAL last_timestamp; - bool fresh; - - state() : display_res_x(-1), display_res_y(-1), px(-1), py(-1), last_timestamp(0), fresh(false) {} - bool is_valid() const { return !(display_res_x < 0 || px < 0); } - } dev_state; - - double yaw, pitch; - std::atomic<bool> do_center; -}; - -class tobii_eyex_metadata : public Metadata -{ -public: - QString name() { return QString("Tobii EyeX"); } - QIcon icon() { return QIcon(":/images/tobii-eyex-logo.png"); } -}; - diff --git a/tracker-tobii-eyex/tobii-settings.hpp b/tracker-tobii-eyex/tobii-settings.hpp deleted file mode 100644 index a486306d..00000000 --- a/tracker-tobii-eyex/tobii-settings.hpp +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "options/options.hpp" -using namespace options; - -enum tobii_mode -{ - tobii_snap = 0xf00d, - tobii_acc = 0xacc, -}; - -enum max_yaw -{ - y10, y15, y20, y30, y45, -}; - -enum max_pitch -{ - p10, p15, p25, p35, -}; - -struct settings final : public opts -{ - value<tobii_mode> mode { b, "mode", tobii_snap }; - - value<slider_value> snap_speed {b, "snap-speed", slider_value(.1, .05, 1)}, - snap_inv_dz {b, "snap-screen-edge-length", slider_value(.35, .1, .5)}; - value<slider_value> acc_speed {b, "acc-speed", slider_value(.1, .05, 1)}, - acc_dz_len {b, "acc-screen-edge-length", slider_value(.1, .1, 1)}; - value<max_yaw> snap_yaw {b, "snap-max-yaw", y20}, - acc_yaw {b, "acc-max-yaw", y20}; - value<max_pitch> snap_pitch {b, "snap-max-pitch", p15}, - acc_pitch {b, "acc-max-pitch", p15}; - - settings() : opts("tobii-eyex") {} -}; |