From 60c28cc25010282f1506a16916ab1c46e8f9f27e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=B6ller?= Date: Thu, 20 Jan 2011 21:48:26 +0000 Subject: [PATCH] Improved the saving and restoring of default fan control settings for ATI GPUs. --- GUI/MainForm.cs | 1 + Hardware/ATI/ATIGPU.cs | 41 +++++++++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/GUI/MainForm.cs b/GUI/MainForm.cs index 9307d93..c232de5 100644 --- a/GUI/MainForm.cs +++ b/GUI/MainForm.cs @@ -462,6 +462,7 @@ namespace OpenHardwareMonitor.GUI { sensorContextMenu.MenuItems.Add(item); } if (node.Sensor.Control != null) { + sensorContextMenu.MenuItems.Add(new MenuItem("-")); IControl control = node.Sensor.Control; MenuItem controlItem = new MenuItem("Control"); MenuItem defaultItem = new MenuItem("Default"); diff --git a/Hardware/ATI/ATIGPU.cs b/Hardware/ATI/ATIGPU.cs index c0813a1..80e6619 100644 --- a/Hardware/ATI/ATIGPU.cs +++ b/Hardware/ATI/ATIGPU.cs @@ -54,7 +54,8 @@ namespace OpenHardwareMonitor.Hardware.ATI { private readonly Sensor controlSensor; private readonly Control fanControl; - private ADLFanSpeedValue initialFanSpeedValue; + private bool restoreDefaultFanSpeedRequired = false; + private ADLFanSpeedValue initialFanSpeedValue; public ATIGPU(string name, int adapterIndex, int busNumber, int deviceNumber, ISettings settings) @@ -64,12 +65,6 @@ namespace OpenHardwareMonitor.Hardware.ATI { this.busNumber = busNumber; this.deviceNumber = deviceNumber; - this.initialFanSpeedValue = new ADLFanSpeedValue(); - this.initialFanSpeedValue.SpeedType = - ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; - ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, - ref this.initialFanSpeedValue); - this.temperature = new Sensor("GPU Core", 0, SensorType.Temperature, this, settings); this.fan = new Sensor("GPU Fan", 0, SensorType.Fan, this, settings); this.coreClock = new Sensor("GPU Core", 0, SensorType.Clock, this, settings); @@ -96,8 +91,28 @@ namespace OpenHardwareMonitor.Hardware.ATI { Update(); } + private void SaveDefaultFanSpeed() { + if (!restoreDefaultFanSpeedRequired) { + initialFanSpeedValue = new ADLFanSpeedValue(); + initialFanSpeedValue.SpeedType = + ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; + restoreDefaultFanSpeedRequired = + ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, + ref initialFanSpeedValue) == ADL.ADL_OK; + } + } + + private void RestoreDefaultFanSpeed() { + if (restoreDefaultFanSpeedRequired) { + ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0, + ref this.initialFanSpeedValue); + restoreDefaultFanSpeedRequired = false; + } + } + private void SoftwareControlValueChanged(IControl control) { if (control.ControlMode == ControlMode.Software) { + SaveDefaultFanSpeed(); ADLFanSpeedValue adlf = new ADLFanSpeedValue(); adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; adlf.Flags = ADL.ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED; @@ -108,14 +123,9 @@ namespace OpenHardwareMonitor.Hardware.ATI { private void ControlModeChanged(IControl control) { if (control.ControlMode == ControlMode.Default) { - ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0, - ref this.initialFanSpeedValue); + RestoreDefaultFanSpeed(); } else { - ADLFanSpeedValue adlf = new ADLFanSpeedValue(); - adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; - adlf.Flags = ADL.ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED; - adlf.FanSpeed = (int)control.SoftwareValue; - ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0, ref adlf); + SoftwareControlValueChanged(control); } } @@ -204,8 +214,7 @@ namespace OpenHardwareMonitor.Hardware.ATI { this.fanControl.SoftwareControlValueChanged -= SoftwareControlValueChanged; - ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0, - ref this.initialFanSpeedValue); + RestoreDefaultFanSpeed(); } } }