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) {