PSMoveSteamVRBridge
ps_navi_controller.h
1 #pragma once
2 #include "trackable_device.h"
3 #include "constants.h"
4 #include "controller.h"
5 #include "PSMoveClient_CAPI.h"
6 #include <openvr_driver.h>
7 
8 namespace steamvrbridge {
9 
11  {
12  public:
13  static const int CONFIG_VERSION;
14 
15  PSNaviControllerConfig(const std::string &fnamebase = "NaviControllerConfig")
16  : ControllerConfig(fnamebase)
17  , thumbstick_deadzone(k_defaultThumbstickDeadZoneRadius)
18  {
19  };
20 
21  configuru::Config WriteToJSON() override;
22  bool ReadFromJSON(const configuru::Config &pt) override;
23 
24  // The inner deadzone of the thumbsticks
25  float thumbstick_deadzone;
26  };
27 
28  /* An un-tracked PSNavi controller.
29  The controller class bridges the PSMoveService controller to OpenVR's tracked device.*/
30  class PSNaviController : public Controller {
31 
32  public:
33  // Constructor/Destructor
34  PSNaviController(PSMControllerID psmControllerID, vr::ETrackedControllerRole trackedControllerRole, const char *psmSerialNo);
35  virtual ~PSNaviController();
36 
37  // Sends button data to a parent controller
38  // instead of acting as an independant device
39  void AttachToController(Controller *parent_controller);
40 
41  // Overridden Implementation of vr::ITrackedDeviceServerDriver
42  vr::EVRInitError Activate(vr::TrackedDeviceIndex_t unObjectId) override;
43  void Deactivate() override;
44 
45  // TrackableDevice interface implementation
46  vr::ETrackedDeviceClass GetTrackedDeviceClass() const override { return vr::TrackedDeviceClass_Controller; }
47  void Update() override;
48  void RefreshWorldFromDriverPose() override;
49 
50  // IController interface implementation
51  const char *GetControllerSettingsPrefix() const override { return "playstation_navi"; }
52  bool HasPSMControllerId(int ControllerID) const override { return ControllerID == m_nPSMControllerId; }
53  const PSMController * GetPSMControllerView() const override { return m_PSMServiceController; }
54  std::string GetPSMControllerSerialNo() const override { return m_strPSMControllerSerialNo; }
55  PSMControllerType GetPSMControllerType() const override { return PSMController_Virtual; }
56 
57  protected:
58  const PSNaviControllerConfig *getConfig() const { return static_cast<const PSNaviControllerConfig *>(m_config); }
59  ControllerConfig *AllocateControllerConfig() override {
60  std::string fnamebase= std::string("psnavi_") + m_strPSMControllerSerialNo;
61  return new PSNaviControllerConfig(fnamebase);
62  }
63 
64  private:
65  void UpdateThumbstick();
66  void UpdateEmulatedTrackpad();
67  void UpdateControllerState();
68  void UpdateTrackingState();
69 
70  // Parent controller to send button events to
71  Controller *m_parentController;
72 
73  // Controller State
74  int m_nPSMControllerId;
75  PSMController *m_PSMServiceController;
76  std::string m_strPSMControllerSerialNo;
77 
78  // Used to report the controllers calibration status
79  vr::ETrackingResult m_trackingStatus;
80 
81  // Used to ignore old state from PSM Service
82  int m_nPoseSequenceNumber;
83 
84  std::chrono::time_point<std::chrono::high_resolution_clock> m_lastTouchpadPressTime;
85  bool m_touchpadDirectionsUsed;
86 
87  std::chrono::time_point<std::chrono::high_resolution_clock> m_resetPoseButtonPressTime;
88  bool m_bResetPoseRequestSent;
89  std::chrono::time_point<std::chrono::high_resolution_clock> m_resetAlignButtonPressTime;
90  bool m_bResetAlignRequestSent;
91 
92  // The last normalized thumbstick values (post dead zone application);
93  float m_lastSanitizedThumbstick_X;
94  float m_lastSanitizedThumbstick_Y;
95 
96  // Callbacks
97  static void start_controller_response_callback(const PSMResponseMessage *response, void *userdata);
98  };
99 }
Definition: controller.h:39
Definition: ps_navi_controller.h:30
Provides printf-style line logging via the vr::IVRDriverLog interface provided by SteamVR during init...
Definition: config.cpp:18
Definition: controller.h:14
Definition: ps_navi_controller.h:10