From b94c0235b61ccde77b6f53f9c1c4ef41be7bc8e1 Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Sun, 3 May 2026 19:42:26 +0200 Subject: [PATCH] =?UTF-8?q?OpenVR=20:=20log=20la=20d=C3=A9cision=20d'?= =?UTF-8?q?=C3=A9tat=20au=20niveau=20INFO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Single ligne par transition de state (RuntimeMissing → HmdAbsent → Ready). Si jamais ça re-crash dans cette zone, on aura la dernière trace avant le silence de Serilog ; ex. « OpenVR state: HmdAbsent (vrserver.exe pas lancé) ». Pas de spam : on log uniquement à la transition (un check tourne toutes les 5 s, sans dédup ce serait 700 messages/heure). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Health/OpenVR/OpenVrService.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/PSLauncher.Core/Health/OpenVR/OpenVrService.cs b/src/PSLauncher.Core/Health/OpenVR/OpenVrService.cs index 2872132..0eea724 100644 --- a/src/PSLauncher.Core/Health/OpenVR/OpenVrService.cs +++ b/src/PSLauncher.Core/Health/OpenVR/OpenVrService.cs @@ -27,6 +27,7 @@ public sealed class OpenVrService : IOpenVrService, IDisposable private bool _resolverEnsured; private bool _initAttempted; + private VrRuntimeState _lastLoggedState = (VrRuntimeState)(-99); // sentinelle « jamais loggé » private uint _initToken; private IntPtr _vrSystemVTable = IntPtr.Zero; @@ -50,6 +51,7 @@ public sealed class OpenVrService : IOpenVrService, IDisposable lock (_lock) { var state = EnsureReady(); + LogStateTransition(state); var label = ResolveLabel(deviceAlias); if (state != VrRuntimeState.Ready) { @@ -317,6 +319,28 @@ public sealed class OpenVrService : IOpenVrService, IDisposable catch { return null; } } + /// + /// Log au niveau INFO la première occurrence d'un état + chaque transition. + /// Évite de spammer (un check s'exécute toutes les 5 s, on aurait 700 messages + /// par heure si on loggait à chaque tick) tout en laissant une trace claire + /// dans le journal au cas où ça re-crasherait — la dernière ligne avant le + /// silence de Serilog dirait par exemple « OpenVR state: HmdAbsent ». + /// + private void LogStateTransition(VrRuntimeState newState) + { + if (newState == _lastLoggedState) return; + _lastLoggedState = newState; + var detail = newState switch + { + VrRuntimeState.RuntimeMissing => "openvr_api.dll introuvable (SteamVR pas installé)", + VrRuntimeState.HmdAbsent => "vrserver.exe pas lancé ou aucun HMD branché", + VrRuntimeState.InitFailed => "VR_InitInternal2 a échoué", + VrRuntimeState.Ready => "OK, vtable IVRSystem_022 bindée", + _ => "?", + }; + _logger.LogInformation("OpenVR state: {State} ({Detail})", newState, detail); + } + /// /// vrserver.exe est le process central de SteamVR ; sa présence garantit qu'on /// peut init OpenVR sans déclencher de chargement de drivers risqué. Cache de