#pragma once #include #include #include #include class HidDevice; class DeviceProvider : public vr::IServerTrackedDeviceProvider { public: DeviceProvider(); ~DeviceProvider(); vr::EVRInitError Init( vr::IVRDriverContext* pDriverContext ) override; void Cleanup() override; const char* const* GetInterfaceVersions() override; void RunFrame() override; bool ShouldBlockStandbyMode() override; void EnterStandby() override; void LeaveStandby() override; private: std::unique_ptr m_pHidDevice; // Configuration (read from VRSettings on Init) int32_t m_reportRateMs = 200; int32_t m_movingAvgLength = 8; bool m_logVerbose = false; // Proximity state -- input component on HMD container (Phase 11.1) bool m_bProximity = false; bool m_bManualOverride = false; vr::VRInputComponentHandle_t m_hProximityComponent = vr::k_ulInvalidInputComponentHandle; bool m_bProximityComponentAttempted = false; void SetHmdProximity(bool on); void TryCreateProximityComponent(); // IPD state float m_fCurrentIpd = 0.0f; // Current IPD in meters (0 = unknown) bool m_bLhConfigLoaded = false; // true after rotation matrices cached from config.json std::string m_sTrackingSerial; // from HID user flash, for lhr-* folder matching float m_cachedLeftRot[3][3] = {}; float m_cachedRightRot[3][3] = {}; #ifdef ENABLE_IPD_PERSIST // IPD persistence (Phase 13) float m_fStartupIpd = 0.0f; // IPD at session start for D-03 change detection void PersistIpdToConfig(); std::string FindLighthouseConsole(); #endif // Beyond 1 detection (per D-09, D-10, D-12) bool m_bIsBeyond1 = false; bool m_bHmdSerialChecked = false; void CheckHmdSerial(); // Track B native slider (per D-01) bool m_bSliderPropsAttempted = false; void TrySetSliderProperties(); // Track A settings tab polling (per D-03) float m_fLastSettingsIpd = 0.0f; // last value read from VRSettings ipd_mm // Shared IPD application (refactored from HandleIpdSet) bool ApplyIpd(float mm); // IPD methods bool LoadLighthouseConfig(); bool LoadLighthouseConfigFromPath(const std::string& path); bool ReadEyeToHeadFromConfigFile(const std::string& configPath); void HandleIpdSet(float mm, char* response, size_t responseSize); void HandleIpdQuery(char* response, size_t responseSize); void HandleLoadLhConfig(const char* path, char* response, size_t responseSize); // Named pipe server for debug control HANDLE m_hPipe = INVALID_HANDLE_VALUE; bool m_bClientConnected = false; void CreatePipeServer(); void PollPipe(); void HandlePipeCommand(const char* cmd, DWORD len); void DestroyPipeServer(); // Debug: handle testing (retained from spike) void HandleTestHandle(uint64_t handle, bool value, char* response, size_t responseSize); };