Added a new "Undefined" control mode. Changed the GPU fan control to restore to default (auto) settings when the Open Hardware Monitor closes (unless the control remained in "Undefined" mode).
     1.1 --- a/Hardware/ATI/ATIGPU.cs	Sun Dec 28 22:42:36 2014 +0000
     1.2 +++ b/Hardware/ATI/ATIGPU.cs	Tue Dec 30 16:02:52 2014 +0000
     1.3 @@ -4,7 +4,7 @@
     1.4    License, v. 2.0. If a copy of the MPL was not distributed with this
     1.5    file, You can obtain one at http://mozilla.org/MPL/2.0/.
     1.6   
     1.7 -  Copyright (C) 2009-2011 Michael Möller <mmoeller@openhardwaremonitor.org>
     1.8 +  Copyright (C) 2009-2014 Michael Möller <mmoeller@openhardwaremonitor.org>
     1.9  	
    1.10  */
    1.11  
    1.12 @@ -24,10 +24,7 @@
    1.13      private readonly Sensor coreVoltage;
    1.14      private readonly Sensor coreLoad;
    1.15      private readonly Sensor controlSensor;
    1.16 -    private readonly Control fanControl;
    1.17 -
    1.18 -    private bool restoreDefaultFanSpeedRequired = false;
    1.19 -    private ADLFanSpeedValue initialFanSpeedValue;    
    1.20 +    private readonly Control fanControl;  
    1.21  
    1.22      public ATIGPU(string name, int adapterIndex, int busNumber, 
    1.23        int deviceNumber, ISettings settings) 
    1.24 @@ -64,31 +61,8 @@
    1.25        Update();                   
    1.26      }
    1.27  
    1.28 -    private void SaveDefaultFanSpeed() {
    1.29 -      if (!restoreDefaultFanSpeedRequired) {        
    1.30 -        initialFanSpeedValue = new ADLFanSpeedValue();
    1.31 -        initialFanSpeedValue.SpeedType =
    1.32 -          ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
    1.33 -        restoreDefaultFanSpeedRequired = 
    1.34 -          ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0,
    1.35 -          ref initialFanSpeedValue) == ADL.ADL_OK;
    1.36 -      }
    1.37 -    }
    1.38 -
    1.39 -    private void RestoreDefaultFanSpeed() {
    1.40 -      if (restoreDefaultFanSpeedRequired) {        
    1.41 -        ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0,
    1.42 -          ref this.initialFanSpeedValue);
    1.43 -        if ((initialFanSpeedValue.Flags &
    1.44 -          ADL.ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED) == 0)
    1.45 -          ADL.ADL_Overdrive5_FanSpeedToDefault_Set(adapterIndex, 0);
    1.46 -        restoreDefaultFanSpeedRequired = false;
    1.47 -      }
    1.48 -    }
    1.49 -
    1.50      private void SoftwareControlValueChanged(IControl control) {
    1.51 -      if (control.ControlMode == ControlMode.Software) {
    1.52 -        SaveDefaultFanSpeed();
    1.53 +      if (control.ControlMode == ControlMode.Software) {        
    1.54          ADLFanSpeedValue adlf = new ADLFanSpeedValue();
    1.55          adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
    1.56          adlf.Flags = ADL.ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
    1.57 @@ -98,13 +72,24 @@
    1.58      }
    1.59  
    1.60      private void ControlModeChanged(IControl control) {
    1.61 -      if (control.ControlMode == ControlMode.Default) {
    1.62 -        RestoreDefaultFanSpeed();     
    1.63 -      } else {
    1.64 -        SoftwareControlValueChanged(control);
    1.65 +      switch (control.ControlMode) {
    1.66 +        case ControlMode.Undefined:
    1.67 +          return;
    1.68 +        case ControlMode.Default:
    1.69 +          SetDefaultFanSpeed();
    1.70 +          break;
    1.71 +        case ControlMode.Software:
    1.72 +          SoftwareControlValueChanged(control);
    1.73 +          break;
    1.74 +        default:
    1.75 +          return;
    1.76        }
    1.77      }
    1.78  
    1.79 +    private void SetDefaultFanSpeed() {
    1.80 +      ADL.ADL_Overdrive5_FanSpeedToDefault_Set(adapterIndex, 0);
    1.81 +    }
    1.82 +
    1.83      public int BusNumber { get { return busNumber; } }
    1.84  
    1.85      public int DeviceNumber { get { return deviceNumber; } }
    1.86 @@ -186,7 +171,8 @@
    1.87        this.fanControl.SoftwareControlValueChanged -=
    1.88          SoftwareControlValueChanged;
    1.89  
    1.90 -      RestoreDefaultFanSpeed();
    1.91 +      if (this.fanControl.ControlMode != ControlMode.Undefined)
    1.92 +        SetDefaultFanSpeed();
    1.93        base.Close();
    1.94      }
    1.95    }
     2.1 --- a/Hardware/Control.cs	Sun Dec 28 22:42:36 2014 +0000
     2.2 +++ b/Hardware/Control.cs	Tue Dec 30 16:02:52 2014 +0000
     2.3 @@ -4,7 +4,7 @@
     2.4    License, v. 2.0. If a copy of the MPL was not distributed with this
     2.5    file, You can obtain one at http://mozilla.org/MPL/2.0/.
     2.6   
     2.7 -  Copyright (C) 2010 Michael Möller <mmoeller@openhardwaremonitor.org>
     2.8 +  Copyright (C) 2010-2014 Michael Möller <mmoeller@openhardwaremonitor.org>
     2.9  	
    2.10  */
    2.11  
    2.12 @@ -42,11 +42,11 @@
    2.13        int mode;
    2.14        if (!int.TryParse(settings.GetValue(
    2.15            new Identifier(identifier, "mode").ToString(),
    2.16 -          ((int)ControlMode.Default).ToString(CultureInfo.InvariantCulture)),
    2.17 +          ((int)ControlMode.Undefined).ToString(CultureInfo.InvariantCulture)),
    2.18          NumberStyles.Integer, CultureInfo.InvariantCulture,
    2.19          out mode)) 
    2.20        {
    2.21 -        this.mode = ControlMode.Default;
    2.22 +        this.mode = ControlMode.Undefined;
    2.23        } else {
    2.24          this.mode = (ControlMode)mode;
    2.25        }
     3.1 --- a/Hardware/IControl.cs	Sun Dec 28 22:42:36 2014 +0000
     3.2 +++ b/Hardware/IControl.cs	Tue Dec 30 16:02:52 2014 +0000
     3.3 @@ -4,15 +4,16 @@
     3.4    License, v. 2.0. If a copy of the MPL was not distributed with this
     3.5    file, You can obtain one at http://mozilla.org/MPL/2.0/.
     3.6   
     3.7 -  Copyright (C) 2010 Michael Möller <mmoeller@openhardwaremonitor.org>
     3.8 +  Copyright (C) 2010-2014 Michael Möller <mmoeller@openhardwaremonitor.org>
     3.9  	
    3.10  */
    3.11  
    3.12  namespace OpenHardwareMonitor.Hardware {
    3.13  
    3.14    public enum ControlMode {
    3.15 -    Default,
    3.16 -    Software
    3.17 +    Undefined,
    3.18 +    Software,
    3.19 +    Default
    3.20    }
    3.21  
    3.22    public interface IControl {
     4.1 --- a/Hardware/Mainboard/SuperIOHardware.cs	Sun Dec 28 22:42:36 2014 +0000
     4.2 +++ b/Hardware/Mainboard/SuperIOHardware.cs	Tue Dec 30 16:02:52 2014 +0000
     4.3 @@ -4,7 +4,7 @@
     4.4    License, v. 2.0. If a copy of the MPL was not distributed with this
     4.5    file, You can obtain one at http://mozilla.org/MPL/2.0/.
     4.6   
     4.7 -  Copyright (C) 2009-2013 Michael Möller <mmoeller@openhardwaremonitor.org>
     4.8 +  Copyright (C) 2009-2014 Michael Möller <mmoeller@openhardwaremonitor.org>
     4.9  	
    4.10  */
    4.11  
    4.12 @@ -72,18 +72,37 @@
    4.13              this, settings);
    4.14            Control control = new Control(sensor, settings, 0, 100);
    4.15            control.ControlModeChanged += (cc) => {
    4.16 -            if (cc.ControlMode == ControlMode.Default) {
    4.17 -              superIO.SetControl(index, null);
    4.18 -            } else {
    4.19 -              superIO.SetControl(index, (byte)(cc.SoftwareValue * 2.55));
    4.20 +            switch (cc.ControlMode) {
    4.21 +              case ControlMode.Undefined:
    4.22 +                return;
    4.23 +              case ControlMode.Default:
    4.24 +                superIO.SetControl(index, null);
    4.25 +                break;
    4.26 +              case ControlMode.Software:
    4.27 +                superIO.SetControl(index, (byte)(cc.SoftwareValue * 2.55));
    4.28 +                break;
    4.29 +              default:
    4.30 +                return;
    4.31              }
    4.32            };
    4.33            control.SoftwareControlValueChanged += (cc) => {
    4.34              if (cc.ControlMode == ControlMode.Software)
    4.35                superIO.SetControl(index, (byte)(cc.SoftwareValue * 2.55));
    4.36            };
    4.37 -          if (control.ControlMode == ControlMode.Software)
    4.38 -            superIO.SetControl(index, (byte)(control.SoftwareValue * 2.55));
    4.39 +
    4.40 +          switch (control.ControlMode) {
    4.41 +            case ControlMode.Undefined:
    4.42 +              break;
    4.43 +            case ControlMode.Default:
    4.44 +              superIO.SetControl(index, null);
    4.45 +              break;
    4.46 +            case ControlMode.Software:
    4.47 +              superIO.SetControl(index, (byte)(control.SoftwareValue * 2.55));
    4.48 +              break;
    4.49 +            default:
    4.50 +              break;
    4.51 +          }            
    4.52 +
    4.53            sensor.Control = control;
    4.54            controls.Add(sensor);
    4.55            ActivateSensor(sensor);
     5.1 --- a/Hardware/Nvidia/NvidiaGPU.cs	Sun Dec 28 22:42:36 2014 +0000
     5.2 +++ b/Hardware/Nvidia/NvidiaGPU.cs	Tue Dec 30 16:02:52 2014 +0000
     5.3 @@ -4,7 +4,7 @@
     5.4    License, v. 2.0. If a copy of the MPL was not distributed with this
     5.5    file, You can obtain one at http://mozilla.org/MPL/2.0/.
     5.6   
     5.7 -  Copyright (C) 2009-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
     5.8 +  Copyright (C) 2009-2014 Michael Möller <mmoeller@openhardwaremonitor.org>
     5.9  	Copyright (C) 2011 Christian Vallières
    5.10   
    5.11  */
    5.12 @@ -28,9 +28,6 @@
    5.13      private readonly Sensor memoryLoad;
    5.14      private readonly Control fanControl;
    5.15  
    5.16 -    private bool restoreDefaultFanSpeedRequired;
    5.17 -    private NvLevel initialFanSpeedValue;
    5.18 -
    5.19      public NvidiaGPU(int adapterIndex, NvPhysicalGpuHandle handle,
    5.20        NvDisplayHandle? displayHandle, ISettings settings)
    5.21        : base(GetName(handle), new Identifier("nvidiagpu",
    5.22 @@ -431,7 +428,6 @@
    5.23      }
    5.24  
    5.25      private void SoftwareControlValueChanged(IControl control) {
    5.26 -      SaveDefaultFanSpeed();
    5.27        NvGPUCoolerLevels coolerLevels = new NvGPUCoolerLevels();
    5.28        coolerLevels.Version = NVAPI.GPU_COOLER_LEVELS_VER;
    5.29        coolerLevels.Levels = new NvLevel[NVAPI.MAX_COOLER_PER_GPU];
    5.30 @@ -440,34 +436,39 @@
    5.31        NVAPI.NvAPI_GPU_SetCoolerLevels(handle, 0, ref coolerLevels);
    5.32      }
    5.33  
    5.34 -    private void SaveDefaultFanSpeed() {
    5.35 -      if (!restoreDefaultFanSpeedRequired) {
    5.36 -        NvGPUCoolerSettings coolerSettings = GetCoolerSettings();
    5.37 -        if (coolerSettings.Count > 0) {
    5.38 -          restoreDefaultFanSpeedRequired = true;
    5.39 -          initialFanSpeedValue.Level = coolerSettings.Cooler[0].CurrentLevel;
    5.40 -          initialFanSpeedValue.Policy = coolerSettings.Cooler[0].CurrentPolicy;
    5.41 -        }
    5.42 +    private void ControlModeChanged(IControl control) {
    5.43 +      switch (control.ControlMode) {
    5.44 +        case ControlMode.Undefined:
    5.45 +          return;
    5.46 +        case ControlMode.Default:
    5.47 +          SetDefaultFanSpeed();
    5.48 +          break;
    5.49 +        case ControlMode.Software:
    5.50 +          SoftwareControlValueChanged(control);
    5.51 +          break;
    5.52 +        default:
    5.53 +          return;
    5.54        }
    5.55      }
    5.56  
    5.57 -    private void ControlModeChanged(IControl control) {
    5.58 -      if (control.ControlMode == ControlMode.Default) {
    5.59 -        RestoreDefaultFanSpeed();
    5.60 -      } else {
    5.61 -        SoftwareControlValueChanged(control);
    5.62 -      }
    5.63 +    private void SetDefaultFanSpeed() {
    5.64 +      NvGPUCoolerLevels coolerLevels = new NvGPUCoolerLevels();
    5.65 +      coolerLevels.Version = NVAPI.GPU_COOLER_LEVELS_VER;
    5.66 +      coolerLevels.Levels = new NvLevel[NVAPI.MAX_COOLER_PER_GPU];
    5.67 +      coolerLevels.Levels[0].Policy = 0x20;
    5.68 +      NVAPI.NvAPI_GPU_SetCoolerLevels(handle, 0, ref coolerLevels);
    5.69      }
    5.70  
    5.71 -    private void RestoreDefaultFanSpeed() {
    5.72 -      if (restoreDefaultFanSpeedRequired) {
    5.73 -        NvGPUCoolerLevels coolerLevels = new NvGPUCoolerLevels();
    5.74 -        coolerLevels.Version = NVAPI.GPU_COOLER_LEVELS_VER;
    5.75 -        coolerLevels.Levels = new NvLevel[NVAPI.MAX_COOLER_PER_GPU];
    5.76 -        coolerLevels.Levels[0] = initialFanSpeedValue;
    5.77 -        NVAPI.NvAPI_GPU_SetCoolerLevels(handle, 0, ref coolerLevels);
    5.78 -        restoreDefaultFanSpeedRequired = false;
    5.79 +    public override void Close() {
    5.80 +      if (this.fanControl != null) {
    5.81 +        this.fanControl.ControlModeChanged -= ControlModeChanged;
    5.82 +        this.fanControl.SoftwareControlValueChanged -=
    5.83 +          SoftwareControlValueChanged;
    5.84 +
    5.85 +        if (this.fanControl.ControlMode != ControlMode.Undefined)
    5.86 +          SetDefaultFanSpeed();
    5.87        }
    5.88 +      base.Close();
    5.89      }
    5.90    }
    5.91  }
     6.1 --- a/Properties/AssemblyVersion.cs	Sun Dec 28 22:42:36 2014 +0000
     6.2 +++ b/Properties/AssemblyVersion.cs	Tue Dec 30 16:02:52 2014 +0000
     6.3 @@ -4,11 +4,11 @@
     6.4    License, v. 2.0. If a copy of the MPL was not distributed with this
     6.5    file, You can obtain one at http://mozilla.org/MPL/2.0/.
     6.6   
     6.7 -  Copyright (C) 2009-2013 Michael Möller <mmoeller@openhardwaremonitor.org>
     6.8 +  Copyright (C) 2009-2014 Michael Möller <mmoeller@openhardwaremonitor.org>
     6.9   
    6.10  */
    6.11  
    6.12  using System.Reflection;
    6.13  
    6.14 -[assembly: AssemblyVersion("0.6.0.15")]
    6.15 -[assembly: AssemblyInformationalVersion("0.6.0.15 Alpha")]
    6.16 \ No newline at end of file
    6.17 +[assembly: AssemblyVersion("0.6.0.16")]
    6.18 +[assembly: AssemblyInformationalVersion("0.6.0.16 Alpha")]
    6.19 \ No newline at end of file