Overte C++ Documentation
OculusControllerManager.h
1 //
2 // Created by Bradley Austin Davis on 2016/03/04
3 // Copyright 2013-2016 High Fidelity, Inc.
4 //
5 // Distributed under the Apache License, Version 2.0.
6 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
7 //
8 
9 #ifndef hifi__OculusControllerManager
10 #define hifi__OculusControllerManager
11 
12 #include <QObject>
13 #include <unordered_set>
14 #include <map>
15 
16 #include <GLMHelpers.h>
17 
18 #include <SettingHandle.h>
19 #include <controllers/InputDevice.h>
20 #include <plugins/InputPlugin.h>
21 
22 #include <OVR_CAPI.h>
23 
24 class OculusControllerManager : public InputPlugin {
25  Q_OBJECT
26 public:
27  // Plugin functions
28  bool isSupported() const override;
29  const QString getName() const override { return NAME; }
30  bool isHandController() const override { return _touch != nullptr; }
31  bool isHeadController() const override { return true; }
32  bool configurable() override { return true; }
33  QString configurationLayout() override;
34  QStringList getSubdeviceNames() override;
35  void setConfigurationSettings(const QJsonObject configurationSetting) override;
36  QJsonObject configurationSettings() override;
37 
38  bool activate() override;
39  void deactivate() override;
40 
41  void pluginFocusOutEvent() override;
42  void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override;
43 
44 private slots:
45  void stopHapticPulse(bool leftHand);
46 
47 private:
48  class OculusInputDevice : public controller::InputDevice {
49  public:
50  OculusInputDevice(OculusControllerManager& parent, const QString& name) : controller::InputDevice(name), _parent(parent) {}
51 
52  OculusControllerManager& _parent;
53  friend class OculusControllerManager;
54  };
55 
56  class RemoteDevice : public OculusInputDevice {
57  public:
58  using Pointer = std::shared_ptr<RemoteDevice>;
59  RemoteDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "OculusRemote") {}
60 
61  controller::Input::NamedVector getAvailableInputs() const override;
62  QString getDefaultMappingConfig() const override;
63  void update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override;
64  void focusOutEvent() override;
65 
66  friend class OculusControllerManager;
67  };
68 
69  class TouchDevice : public OculusInputDevice {
70  public:
71  using Pointer = std::shared_ptr<TouchDevice>;
72  TouchDevice(OculusControllerManager& parent) : OculusInputDevice(parent, "OculusTouch") {}
73 
74  controller::Input::NamedVector getAvailableInputs() const override;
75  QString getDefaultMappingConfig() const override;
76  void update(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override;
77  void focusOutEvent() override;
78 
79  bool triggerHapticPulse(float strength, float duration, uint16_t index) override;
80 
81  private:
82  void stopHapticPulse(bool leftHand);
83  void handlePose(float deltaTime, const controller::InputCalibrationData& inputCalibrationData,
84  ovrHandType hand, const ovrPoseStatef& handPose);
85  void handleRotationForUntrackedHand(const controller::InputCalibrationData& inputCalibrationData,
86  ovrHandType hand, const ovrPoseStatef& handPose);
87  void handleHeadPose(float deltaTime, const controller::InputCalibrationData& inputCalibrationData,
88  const ovrPoseStatef& headPose);
89 
90  int _trackedControllers { 0 };
91 
92  // perform an action when the TouchDevice mutex is acquired.
93  using Locker = std::unique_lock<std::recursive_mutex>;
94  template <typename F>
95  void withLock(F&& f) { Locker locker(_lock); f(); }
96 
97  float _leftHapticDuration { 0.0f };
98  float _leftHapticStrength { 0.0f };
99  float _rightHapticDuration { 0.0f };
100  float _rightHapticStrength { 0.0f };
101  mutable std::recursive_mutex _lock;
102  std::map<int, bool> _lostTracking;
103  std::map<int, quint64> _regainTrackingDeadline;
104  std::map<int, ovrPoseStatef> _lastControllerPose;
105 
106  friend class OculusControllerManager;
107  };
108 
109  void checkForConnectedDevices();
110 
111  Setting::Handle<bool> _trackControllersInOculusHome { "trackControllersInOculusHome", false };
112  ovrInputState _remoteInputState {};
113  ovrInputState _touchInputState {};
114  RemoteDevice::Pointer _remote;
115  TouchDevice::Pointer _touch;
116  static const char* NAME;
117 };
118 
119 #endif // hifi__OculusControllerManager