summaryrefslogtreecommitdiffhomepage
path: root/tracker-steamvr/steamvr.hpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2017-03-30 13:52:35 +0200
committerStanislaw Halik <sthalik@misaki.pl>2017-04-06 04:29:47 +0200
commit61e861de7a6a6d39f75c79b93140f2db0768d183 (patch)
treeef8822dd4d9b24fbe8ffe350412247b4a8bf1b17 /tracker-steamvr/steamvr.hpp
parentf9160866df2a045146910ab555af718cde676694 (diff)
tracker/steamvr: support choosing device by its serial number
Since the vr handle is accessed on the GUI and pipeline threads now, had to add implicit locking. This sadly reorganizes most of the file. Sadly this refactor likely broke things. cf. https://github.com/opentrack/opentrack/issues/352#issuecomment-290252520
Diffstat (limited to 'tracker-steamvr/steamvr.hpp')
-rw-r--r--tracker-steamvr/steamvr.hpp66
1 files changed, 52 insertions, 14 deletions
diff --git a/tracker-steamvr/steamvr.hpp b/tracker-steamvr/steamvr.hpp
index 2842fda3..0c6af65a 100644
--- a/tracker-steamvr/steamvr.hpp
+++ b/tracker-steamvr/steamvr.hpp
@@ -8,47 +8,86 @@
#include <openvr.h>
-#include <atomic>
#include <cmath>
#include <memory>
+#include <tuple>
#include <QString>
#include <QMutex>
#include <QMutexLocker>
+#include <QList>
using namespace options;
+using error_t = vr::EVRInitError;
+using vr_t = vr::IVRSystem*;
+
+using tt = std::tuple<vr_t, error_t>;
+using pose_t = vr::TrackedDevicePose_t;
+using origin = vr::ETrackingUniverseOrigin;
struct settings : opts
{
+ value<QString> device_serial;
settings() :
- opts("valve-steamvr")
+ opts("valve-steamvr"),
+ device_serial(b, "serial", "")
{}
};
+struct device_spec
+{
+ vr::TrackedDevicePose_t pose;
+ QString model, serial;
+ unsigned k;
+};
+
+struct device_list final
+{
+ using maybe_pose = std::tuple<bool, pose_t>;
+
+ device_list();
+ void refresh_device_list();
+ const QList<device_spec>& devices() const & { return device_specs; }
+
+ static OTR_NEVER_INLINE maybe_pose get_pose(int k);
+ static bool get_all_poses(pose_t*poses);
+ static QString strerror(error_t error);
+ static constexpr int max_devices = int(vr::k_unMaxTrackedDeviceCount);
+
+ template<typename F>
+ friend static auto with_vr_lock(F&& fun) -> decltype(fun(vr_t(), error_t()));
+
+private:
+ QList<device_spec> device_specs;
+ static QMutex mtx;
+ static tt vr_init_();
+ static void vr_deleter();
+ static void fill_device_specs(QList<device_spec>& list);
+ static tt vr_init();
+};
+
class steamvr : public QObject, public ITracker
{
Q_OBJECT
+
+ using error_t = vr::EVRInitError;
+ using vr_t = vr::IVRSystem*;
+
public:
steamvr();
~steamvr() override;
void start_tracker(QFrame *) override;
void data(double *data) override;
bool center() override;
-private:
- using error_t = vr::EVRInitError;
- using vr_t = vr::IVRSystem*;
-
- vr_t vr;
+private:
+ void matrix_to_euler(double &yaw, double &pitch, double &roll, const vr::HmdMatrix34_t& result);
settings s;
+ int device_index;
using rmat = euler::rmat;
using euler_t = euler::euler_t;
-
- static void vr_deleter();
- static vr_t vr_init(error_t& error);
- static QString strerror(error_t error);
};
class steamvr_dialog : public ITrackerDialog
@@ -57,12 +96,11 @@ class steamvr_dialog : public ITrackerDialog
public:
steamvr_dialog();
- void register_tracker(ITracker *) override;
- void unregister_tracker() override;
private:
Ui::dialog ui;
settings s;
- vr::IVRSystem* vr;
+ device_list devices;
+
private slots:
void doOK();
void doCancel();