diff options
-rw-r--r-- | tracker-tobii/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tracker-tobii/ftnoir_tracker_tobii.cpp | 5 | ||||
-rw-r--r-- | tracker-tobii/thread.cpp | 73 | ||||
-rw-r--r-- | tracker-tobii/thread.hpp | 18 |
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; }; |