Hardware/Nvidia/NvidiaGPU.cs
changeset 428 3c1cdc197b24
parent 344 3145aadca3d2
child 430 6b24e39f1b84
     1.1 --- a/Hardware/Nvidia/NvidiaGPU.cs	Sun Dec 28 22:42:36 2014 +0000
     1.2 +++ b/Hardware/Nvidia/NvidiaGPU.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-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
     1.8 +  Copyright (C) 2009-2014 Michael Möller <mmoeller@openhardwaremonitor.org>
     1.9  	Copyright (C) 2011 Christian Vallières
    1.10   
    1.11  */
    1.12 @@ -28,9 +28,6 @@
    1.13      private readonly Sensor memoryLoad;
    1.14      private readonly Control fanControl;
    1.15  
    1.16 -    private bool restoreDefaultFanSpeedRequired;
    1.17 -    private NvLevel initialFanSpeedValue;
    1.18 -
    1.19      public NvidiaGPU(int adapterIndex, NvPhysicalGpuHandle handle,
    1.20        NvDisplayHandle? displayHandle, ISettings settings)
    1.21        : base(GetName(handle), new Identifier("nvidiagpu",
    1.22 @@ -431,7 +428,6 @@
    1.23      }
    1.24  
    1.25      private void SoftwareControlValueChanged(IControl control) {
    1.26 -      SaveDefaultFanSpeed();
    1.27        NvGPUCoolerLevels coolerLevels = new NvGPUCoolerLevels();
    1.28        coolerLevels.Version = NVAPI.GPU_COOLER_LEVELS_VER;
    1.29        coolerLevels.Levels = new NvLevel[NVAPI.MAX_COOLER_PER_GPU];
    1.30 @@ -440,34 +436,39 @@
    1.31        NVAPI.NvAPI_GPU_SetCoolerLevels(handle, 0, ref coolerLevels);
    1.32      }
    1.33  
    1.34 -    private void SaveDefaultFanSpeed() {
    1.35 -      if (!restoreDefaultFanSpeedRequired) {
    1.36 -        NvGPUCoolerSettings coolerSettings = GetCoolerSettings();
    1.37 -        if (coolerSettings.Count > 0) {
    1.38 -          restoreDefaultFanSpeedRequired = true;
    1.39 -          initialFanSpeedValue.Level = coolerSettings.Cooler[0].CurrentLevel;
    1.40 -          initialFanSpeedValue.Policy = coolerSettings.Cooler[0].CurrentPolicy;
    1.41 -        }
    1.42 +    private void ControlModeChanged(IControl control) {
    1.43 +      switch (control.ControlMode) {
    1.44 +        case ControlMode.Undefined:
    1.45 +          return;
    1.46 +        case ControlMode.Default:
    1.47 +          SetDefaultFanSpeed();
    1.48 +          break;
    1.49 +        case ControlMode.Software:
    1.50 +          SoftwareControlValueChanged(control);
    1.51 +          break;
    1.52 +        default:
    1.53 +          return;
    1.54        }
    1.55      }
    1.56  
    1.57 -    private void ControlModeChanged(IControl control) {
    1.58 -      if (control.ControlMode == ControlMode.Default) {
    1.59 -        RestoreDefaultFanSpeed();
    1.60 -      } else {
    1.61 -        SoftwareControlValueChanged(control);
    1.62 -      }
    1.63 +    private void SetDefaultFanSpeed() {
    1.64 +      NvGPUCoolerLevels coolerLevels = new NvGPUCoolerLevels();
    1.65 +      coolerLevels.Version = NVAPI.GPU_COOLER_LEVELS_VER;
    1.66 +      coolerLevels.Levels = new NvLevel[NVAPI.MAX_COOLER_PER_GPU];
    1.67 +      coolerLevels.Levels[0].Policy = 0x20;
    1.68 +      NVAPI.NvAPI_GPU_SetCoolerLevels(handle, 0, ref coolerLevels);
    1.69      }
    1.70  
    1.71 -    private void RestoreDefaultFanSpeed() {
    1.72 -      if (restoreDefaultFanSpeedRequired) {
    1.73 -        NvGPUCoolerLevels coolerLevels = new NvGPUCoolerLevels();
    1.74 -        coolerLevels.Version = NVAPI.GPU_COOLER_LEVELS_VER;
    1.75 -        coolerLevels.Levels = new NvLevel[NVAPI.MAX_COOLER_PER_GPU];
    1.76 -        coolerLevels.Levels[0] = initialFanSpeedValue;
    1.77 -        NVAPI.NvAPI_GPU_SetCoolerLevels(handle, 0, ref coolerLevels);
    1.78 -        restoreDefaultFanSpeedRequired = false;
    1.79 +    public override void Close() {
    1.80 +      if (this.fanControl != null) {
    1.81 +        this.fanControl.ControlModeChanged -= ControlModeChanged;
    1.82 +        this.fanControl.SoftwareControlValueChanged -=
    1.83 +          SoftwareControlValueChanged;
    1.84 +
    1.85 +        if (this.fanControl.ControlMode != ControlMode.Undefined)
    1.86 +          SetDefaultFanSpeed();
    1.87        }
    1.88 +      base.Close();
    1.89      }
    1.90    }
    1.91  }