summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tracker-tobii/CMakeLists.txt1
-rw-r--r--tracker-tobii/ftnoir_tracker_tobii.cpp5
-rw-r--r--tracker-tobii/thread.cpp73
-rw-r--r--tracker-tobii/thread.hpp18
4 files changed, 46 insertions, 51 deletions
diff --git a/tracker-tobii/CMakeLists.txt b/tracker-tobii/CMakeLists.txt
index 4593ae4e..8551c8fa 100644
--- a/tracker-tobii/CMakeLists.txt
+++ b/tracker-tobii/CMakeLists.txt
@@ -1,5 +1,6 @@
# https://developer.tobii.com/download-packages/stream-engine-4-1-0-for-windows-x86
# https://developer.tobii.com/download-packages/stream-engine-4-1-0-for-windows-x64
+set(SDK_TOBII "" CACHE PATH "Tobii SDK path")
if(SDK_TOBII)
otr_module(tracker-tobii)
target_include_directories(${self} SYSTEM PRIVATE "${SDK_TOBII}/include")
diff --git a/tracker-tobii/ftnoir_tracker_tobii.cpp b/tracker-tobii/ftnoir_tracker_tobii.cpp
index f0d66ae4..43cb1662 100644
--- a/tracker-tobii/ftnoir_tracker_tobii.cpp
+++ b/tracker-tobii/ftnoir_tracker_tobii.cpp
@@ -2,6 +2,8 @@
#include "api/plugin-api.hpp"
#include "compat/math.hpp"
+tobii::~tobii() = default;
+
module_status tobii::start_tracker(QFrame*)
{
t.start();
@@ -18,6 +20,9 @@ void tobii::data(double *data)
p.position_xyz[1] = p.position_xyz[1] - center_pose.position_xyz[1];
p.position_xyz[2] = p.position_xyz[2] - center_pose.position_xyz[2];
}
+ else {
+ center_pose = p;
+ }
data[0] = clamp(p.position_xyz[0] * 30.0 / 300.0, -30.0, 30.0);
data[1] = clamp(p.position_xyz[1] * 30.0 / 300.0, -30.0, 30.0);
data[2] = clamp(p.position_xyz[2] * 30.0 / 300.0, -30.0, 30.0);
diff --git a/tracker-tobii/thread.cpp b/tracker-tobii/thread.cpp
index f9fd2c01..bdd48125 100644
--- a/tracker-tobii/thread.cpp
+++ b/tracker-tobii/thread.cpp
@@ -1,20 +1,15 @@
#include "thread.hpp"
#include "compat/sleep.hpp"
-tobii_thread::tobii_thread()
-{
- head_pose = new tobii_head_pose_t();
- connect(this, &tobii_thread::tobii_ready_signal, this, &tobii_thread::tobii_ready_signal_impl, Qt::QueuedConnection);
- connect(this, &tobii_thread::tobii_error_signal, this, &tobii_thread::tobii_error_signal_impl, Qt::QueuedConnection);
-}
-
tobii_thread::~tobii_thread()
{
- if (device) tobii_device_destroy(device);
- if (api) tobii_api_destroy(api);
exit_thread = true;
- terminate();
wait();
+
+ if (device) tobii_device_destroy(device);
+ if (api) tobii_api_destroy(api);
+
+ quit();
}
void tobii_thread::run()
@@ -22,7 +17,8 @@ void tobii_thread::run()
/* See https://developer.tobii.com/consumer-eye-trackers/stream-engine/ */
if (tobii_api_create(&api, nullptr, nullptr) != TOBII_ERROR_NO_ERROR)
{
- emit tobii_error_signal("Failed to initialize the Tobii Stream Engine API.");
+ error_last = "Failed to initialize the Tobii Stream Engine API.";
+ exit_thread = true;
}
std::vector<std::string> devices;
@@ -33,13 +29,15 @@ void tobii_thread::run()
list->push_back(url);
}, &devices) != TOBII_ERROR_NO_ERROR)
{
- emit tobii_error_signal("Failed to enumerate devices.");
+ error_last = "Failed to enumerate devices.";
+ exit_thread = true;
}
if (devices.size() == 0)
{
tobii_api_destroy(api);
- emit tobii_error_signal("No stream engine compatible device(s) found.");
+ error_last = "No stream engine compatible device(s) found.";
+ exit_thread = true;
}
std::string selected_device = devices[0];
@@ -54,10 +52,25 @@ void tobii_thread::run()
} while (retry < retries);
if (tobii_error != TOBII_ERROR_NO_ERROR) {
tobii_api_destroy(api);
- emit tobii_error_signal("Failed to connect to device.");
+ error_last = "Failed to connect to device.";
+ exit_thread = true;
}
- emit tobii_ready_signal();
+ if (tobii_head_pose_subscribe(device, [](tobii_head_pose_t const* head_pose, void* user_data) {
+
+ if ((*head_pose).position_validity != TOBII_VALIDITY_VALID
+ || (*head_pose).rotation_validity_xyz[0] != TOBII_VALIDITY_VALID
+ || (*head_pose).rotation_validity_xyz[1] != TOBII_VALIDITY_VALID
+ || (*head_pose).rotation_validity_xyz[2] != TOBII_VALIDITY_VALID) return;
+
+ tobii_head_pose_t* tobii_head_pose_storage = (tobii_head_pose_t*)user_data;
+ *tobii_head_pose_storage = *head_pose;
+
+ }, head_pose) != TOBII_ERROR_NO_ERROR)
+ {
+ error_last = "Failed to subscribe to head pose stream.";
+ exit_thread = true;
+ }
tobii_error = TOBII_ERROR_NO_ERROR;
while (!exit_thread)
@@ -66,7 +79,7 @@ void tobii_thread::run()
if (tobii_error == TOBII_ERROR_TIMED_OUT) continue;
else if (tobii_error != TOBII_ERROR_NO_ERROR)
{
- emit tobii_error_signal("tobii_wait_for_callbacks failed.");
+ error_last = "tobii_wait_for_callbacks failed.";
}
tobii_error = tobii_device_process_callbacks(device);
@@ -83,36 +96,14 @@ void tobii_thread::run()
} while (retry < retries);
if (tobii_error != TOBII_ERROR_NO_ERROR)
{
- emit tobii_error_signal("Connection was lost and reconnection failed.");
+ error_last = "Connection was lost and reconnection failed.";
+ exit_thread = true;
}
continue;
}
else if (tobii_error != TOBII_ERROR_NO_ERROR)
{
- emit tobii_error_signal("tobii_device_process_callbacks failed.");
+ error_last = "tobii_device_process_callbacks failed.";
}
}
}
-
-void tobii_thread::tobii_error_signal_impl(QString error_message)
-{
- //TODO: log? terminate?
-}
-
-void tobii_thread::tobii_ready_signal_impl()
-{
- if (tobii_head_pose_subscribe(device, [](tobii_head_pose_t const* head_pose, void* user_data) {
-
- if ((*head_pose).position_validity != TOBII_VALIDITY_VALID
- || (*head_pose).rotation_validity_xyz[0] != TOBII_VALIDITY_VALID
- || (*head_pose).rotation_validity_xyz[1] != TOBII_VALIDITY_VALID
- || (*head_pose).rotation_validity_xyz[2] != TOBII_VALIDITY_VALID) return;
-
- tobii_head_pose_t* tobii_head_pose_storage = (tobii_head_pose_t*)user_data;
- *tobii_head_pose_storage = *head_pose;
-
- }, head_pose) != TOBII_ERROR_NO_ERROR)
- {
- emit tobii_error_signal("Failed to subscribe to head pose stream.");
- }
-}
diff --git a/tracker-tobii/thread.hpp b/tracker-tobii/thread.hpp
index a2838272..d311db87 100644
--- a/tracker-tobii/thread.hpp
+++ b/tracker-tobii/thread.hpp
@@ -14,12 +14,11 @@ class tobii_thread : public QThread
Q_OBJECT
void run() override;
-signals:
- void tobii_error_signal(QString error_message);
- void tobii_ready_signal();
-
public:
- tobii_thread();
+ tobii_thread()
+ {
+ head_pose = new tobii_head_pose_t();
+ }
~tobii_thread() override;
tobii_head_pose_t* head_pose;
@@ -28,10 +27,9 @@ private:
tobii_api_t* api;
tobii_device_t* device;
- const unsigned int retries = 300;
- const unsigned int interval = 100;
- std::atomic<bool> exit_thread = false;
+ static constexpr unsigned int retries = 300;
+ static constexpr unsigned int interval = 100;
- void tobii_error_signal_impl(QString error_message);
- void tobii_ready_signal_impl();
+ QString error_last = "";
+ std::atomic<bool> exit_thread = false;
};