/** * beyond_spike_monitor — OpenVR background client that monitors HMD proximity * state via three independent signals: * 1. ActivityLevel (GetTrackedDeviceActivityLevel) * 2. ButtonPressed bit 31 (GetControllerState, legacy) * 3. UserInteraction events (PollNextEvent) * * Purpose: The driver-side IVRDriverInput API is write-only (no * GetBooleanComponent). To determine which handle corresponds to /proximity, * we need a client-side observer that detects when UpdateBooleanComponent * actually changes the proximity state visible to applications. */ #include #include #include int main() { setvbuf(stdout, NULL, _IONBF, 0); printf("beyond_spike_monitor — OpenVR proximity state monitor\n"); vr::EVRInitError eError = vr::VRInitError_None; vr::IVRSystem* pSystem = vr::VR_Init(&eError, vr::VRApplication_Background); if (!pSystem) { printf("VR_Init failed: %s\n", vr::VR_GetVRInitErrorAsEnglishDescription(eError)); return 1; } printf("Connected to SteamVR. Monitoring HMD (device 0) proximity...\n" "Press Ctrl+C to exit.\n\n"); vr::EDeviceActivityLevel lastLevel = vr::k_EDeviceActivityLevel_Unknown; uint64_t lastButtonState = 0; for (;;) { // Signal 1 — Activity Level vr::EDeviceActivityLevel level = pSystem->GetTrackedDeviceActivityLevel(0); if (level != lastLevel) { const char* names[] = {"Unknown(-1)", "Idle", "UserInteraction", "UserInteraction_Timeout", "Standby", "Idle_Timeout"}; int idx = (int)level + 1; printf("[ActivityLevel] %s (%d)\n", (idx >= 0 && idx < 6) ? names[idx] : "?", (int)level); lastLevel = level; } // Signal 2 — Button State (legacy, may not work for HMD) vr::VRControllerState_t state = {}; if (pSystem->GetControllerState(0, &state, sizeof(state))) { uint64_t proxBit = state.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ProximitySensor); if (proxBit != lastButtonState) { printf("[ButtonState] ProximitySensor bit=%s\n", proxBit ? "PRESSED" : "released"); lastButtonState = proxBit; } } // Signal 3 — Events vr::VREvent_t event; while (pSystem->PollNextEvent(&event, sizeof(event))) { if (event.eventType == vr::VREvent_TrackedDeviceUserInteractionStarted) printf("[Event] UserInteractionStarted (device %u)\n", event.trackedDeviceIndex); if (event.eventType == vr::VREvent_TrackedDeviceUserInteractionEnded) printf("[Event] UserInteractionEnded (device %u)\n", event.trackedDeviceIndex); if (event.eventType == vr::VREvent_ButtonPress) printf("[Event] ButtonPress button=%u (device %u)\n", event.data.controller.button, event.trackedDeviceIndex); if (event.eventType == vr::VREvent_ButtonUnpress) printf("[Event] ButtonUnpress button=%u (device %u)\n", event.data.controller.button, event.trackedDeviceIndex); } Sleep(100); } vr::VR_Shutdown(); return 0; }