From 0fc2fc42d3015656fc71e4f7d9e1792aab7752cc Mon Sep 17 00:00:00 2001 From: Yu Leng Date: Thu, 11 Dec 2025 09:27:10 +0800 Subject: [PATCH] Refactor DDC/CI brightness initialization logic Move brightness setup from MonitorDiscoveryHelper to DdcCiController to avoid slow I2C operations during monitor discovery. Set default brightness to 50 and update after discovery. Remove unused brightness methods and type aliases. Update comments to clarify initialization responsibilities. --- .../Drivers/DDC/DdcCiController.cs | 16 ++++++++++++ .../Drivers/DDC/DdcCiNative.cs | 9 ------- .../Drivers/DDC/MonitorDiscoveryHelper.cs | 25 +++---------------- .../PowerDisplay/Helpers/MonitorManager.cs | 3 ++- 4 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/DdcCiController.cs b/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/DdcCiController.cs index 574e451def..0c9fc598f3 100644 --- a/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/DdcCiController.cs +++ b/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/DdcCiController.cs @@ -418,6 +418,9 @@ namespace PowerDisplay.Common.Drivers.DDC } } + // Initialize brightness (always supported for DDC/CI monitors) + InitializeBrightness(monitor, candidate.Handle); + monitors.Add(monitor); newHandleMap[monitor.Id] = candidate.Handle; @@ -452,6 +455,19 @@ namespace PowerDisplay.Common.Drivers.DDC } } + /// + /// Initialize brightness value for a monitor using VCP 0x10. + /// + private static void InitializeBrightness(Monitor monitor, IntPtr handle) + { + if (GetVCPFeatureAndVCPFeatureReply(handle, VcpCodeBrightness, IntPtr.Zero, out uint current, out uint max)) + { + var brightnessInfo = new VcpFeatureValue((int)current, 0, (int)max); + monitor.CurrentBrightness = brightnessInfo.ToPercentage(); + Logger.LogDebug($"[{monitor.Id}] Brightness: {monitor.CurrentBrightness}%"); + } + } + /// /// Update monitor capability flags based on parsed VCP capabilities. /// diff --git a/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/DdcCiNative.cs b/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/DdcCiNative.cs index 48beabe5ec..64f21d0e2a 100644 --- a/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/DdcCiNative.cs +++ b/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/DdcCiNative.cs @@ -7,19 +7,10 @@ using System.Collections.Generic; using System.Runtime.InteropServices; using ManagedCommon; using static PowerDisplay.Common.Drivers.NativeConstants; -using static PowerDisplay.Common.Drivers.NativeDelegates; using static PowerDisplay.Common.Drivers.PInvoke; // Type aliases for Windows API naming conventions compatibility -using DISPLAY_DEVICE = PowerDisplay.Common.Drivers.DisplayDevice; -using DISPLAYCONFIG_DEVICE_INFO_HEADER = PowerDisplay.Common.Drivers.DISPLAYCONFIG_DEVICE_INFO_HEADER; -using DISPLAYCONFIG_MODE_INFO = PowerDisplay.Common.Drivers.DISPLAYCONFIG_MODE_INFO; -using DISPLAYCONFIG_PATH_INFO = PowerDisplay.Common.Drivers.DISPLAYCONFIG_PATH_INFO; -using DISPLAYCONFIG_TARGET_DEVICE_NAME = PowerDisplay.Common.Drivers.DISPLAYCONFIG_TARGET_DEVICE_NAME; using LUID = PowerDisplay.Common.Drivers.Luid; -using MONITORINFOEX = PowerDisplay.Common.Drivers.MonitorInfoEx; -using PHYSICAL_MONITOR = PowerDisplay.Common.Drivers.PhysicalMonitor; -using RECT = PowerDisplay.Common.Drivers.Rect; #pragma warning disable SA1649 // File name should match first type name - Multiple related types for DDC/CI #pragma warning disable SA1402 // File may only contain a single type - Related DDC/CI types grouped together diff --git a/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/MonitorDiscoveryHelper.cs b/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/MonitorDiscoveryHelper.cs index 2bdc864b31..6e56b687fa 100644 --- a/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/MonitorDiscoveryHelper.cs +++ b/src/modules/powerdisplay/PowerDisplay.Lib/Drivers/DDC/MonitorDiscoveryHelper.cs @@ -6,11 +6,8 @@ using System; using System.Collections.Generic; using ManagedCommon; using PowerDisplay.Common.Models; -using PowerDisplay.Common.Utils; using static PowerDisplay.Common.Drivers.NativeConstants; using static PowerDisplay.Common.Drivers.PInvoke; - -using MONITORINFOEX = PowerDisplay.Common.Drivers.MonitorInfoEx; using PHYSICAL_MONITOR = PowerDisplay.Common.Drivers.PhysicalMonitor; namespace PowerDisplay.Common.Drivers.DDC @@ -100,6 +97,8 @@ namespace PowerDisplay.Common.Drivers.DDC /// /// Create Monitor object from physical monitor and display info. /// Uses MonitorDisplayInfo directly from QueryDisplayConfig for stable identification. + /// Note: Brightness is not initialized here - MonitorManager handles brightness initialization + /// after discovery to avoid slow I2C operations during the discovery phase. /// /// Physical monitor structure with handle and description /// Display info from QueryDisplayConfig (HardwareId, FriendlyName, MonitorNumber) @@ -131,14 +130,11 @@ namespace PowerDisplay.Common.Drivers.DDC name = "External Display"; } - // Get current brightness - var brightnessInfo = GetCurrentBrightness(physicalMonitor.HPhysicalMonitor); - var monitor = new Monitor { Id = monitorId, Name = name.Trim(), - CurrentBrightness = brightnessInfo.IsValid ? brightnessInfo.ToPercentage() : 50, + CurrentBrightness = 50, // Default value, will be updated by MonitorManager after discovery MinBrightness = 0, MaxBrightness = 100, IsAvailable = true, @@ -165,23 +161,10 @@ namespace PowerDisplay.Common.Drivers.DDC } } - /// - /// Get current brightness using VCP code 0x10 - /// - private VcpFeatureValue GetCurrentBrightness(IntPtr handle) - { - if (GetVCPFeatureAndVCPFeatureReply(handle, VcpCodeBrightness, IntPtr.Zero, out uint current, out uint max)) - { - return new VcpFeatureValue((int)current, 0, (int)max); - } - - return VcpFeatureValue.Invalid; - } - /// /// Extract manufacturer from name /// - private string ExtractManufacturer(string name) + private static string ExtractManufacturer(string name) { if (string.IsNullOrEmpty(name)) { diff --git a/src/modules/powerdisplay/PowerDisplay/Helpers/MonitorManager.cs b/src/modules/powerdisplay/PowerDisplay/Helpers/MonitorManager.cs index 8cf2e5c844..7c2bb3aa6c 100644 --- a/src/modules/powerdisplay/PowerDisplay/Helpers/MonitorManager.cs +++ b/src/modules/powerdisplay/PowerDisplay/Helpers/MonitorManager.cs @@ -79,7 +79,8 @@ namespace PowerDisplay.Helpers /// /// Discover all monitors from all controllers. - /// All initialization (brightness, capabilities, input source) is done during controller discovery. + /// Each controller is responsible for fully initializing its monitors + /// (including brightness, capabilities, input source, color temperature, etc.) /// public async Task> DiscoverMonitorsAsync(CancellationToken cancellationToken = default) {