Hardware/ATI/ATIGPU.cs
changeset 247 6dc755f1970e
parent 195 0ee888c485d5
child 248 045eb5c1ec32
     1.1 --- a/Hardware/ATI/ATIGPU.cs	Wed Dec 08 19:23:13 2010 +0000
     1.2 +++ b/Hardware/ATI/ATIGPU.cs	Thu Jan 20 21:31:54 2011 +0000
     1.3 @@ -51,7 +51,10 @@
     1.4      private readonly Sensor memoryClock;
     1.5      private readonly Sensor coreVoltage;
     1.6      private readonly Sensor coreLoad;
     1.7 -    private readonly Sensor fanControl;
     1.8 +    private readonly Sensor controlSensor;
     1.9 +    private readonly Control fanControl;
    1.10 +
    1.11 +    private ADLFanSpeedValue initialFanSpeedValue;
    1.12  
    1.13      public ATIGPU(string name, int adapterIndex, int busNumber, 
    1.14        int deviceNumber, ISettings settings) 
    1.15 @@ -61,16 +64,61 @@
    1.16        this.busNumber = busNumber;
    1.17        this.deviceNumber = deviceNumber;
    1.18  
    1.19 +      this.initialFanSpeedValue = new ADLFanSpeedValue();
    1.20 +      this.initialFanSpeedValue.SpeedType = 
    1.21 +        ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
    1.22 +      ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, 
    1.23 +        ref this.initialFanSpeedValue);
    1.24 +
    1.25        this.temperature = new Sensor("GPU Core", 0, SensorType.Temperature, this, settings);
    1.26        this.fan = new Sensor("GPU Fan", 0, SensorType.Fan, this, settings);
    1.27        this.coreClock = new Sensor("GPU Core", 0, SensorType.Clock, this, settings);
    1.28        this.memoryClock = new Sensor("GPU Memory", 1, SensorType.Clock, this, settings);
    1.29        this.coreVoltage = new Sensor("GPU Core", 0, SensorType.Voltage, this, settings);
    1.30        this.coreLoad = new Sensor("GPU Core", 0, SensorType.Load, this, settings);
    1.31 -      this.fanControl = new Sensor("GPU Fan", 0, SensorType.Control, this, settings);
    1.32 +      this.controlSensor = new Sensor("GPU Fan", 0, SensorType.Control, this, settings);
    1.33 +
    1.34 +      ADLFanSpeedInfo afsi = new ADLFanSpeedInfo();
    1.35 +      if (ADL.ADL_Overdrive5_FanSpeedInfo_Get(adapterIndex, 0, ref afsi)
    1.36 +        != ADL.ADL_OK) 
    1.37 +      {
    1.38 +        afsi.MaxPercent = 100;
    1.39 +        afsi.MinPercent = 0;
    1.40 +      }
    1.41 +
    1.42 +      this.fanControl = new Control(controlSensor, settings, afsi.MinPercent, 
    1.43 +        afsi.MaxPercent);
    1.44 +      this.fanControl.ControlModeChanged += ControlModeChanged;
    1.45 +      this.fanControl.SoftwareControlValueChanged += 
    1.46 +        SoftwareControlValueChanged;
    1.47 +      ControlModeChanged(fanControl);
    1.48 +      this.controlSensor.Control = fanControl;
    1.49        Update();                   
    1.50      }
    1.51  
    1.52 +    private void SoftwareControlValueChanged(IControl control) {
    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 +        adlf.FanSpeed = (int)control.SoftwareValue;
    1.58 +        ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0, ref adlf);
    1.59 +      }
    1.60 +    }
    1.61 +
    1.62 +    private void ControlModeChanged(IControl control) {
    1.63 +      if (control.ControlMode == ControlMode.Default) {
    1.64 +        ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0,
    1.65 +          ref this.initialFanSpeedValue);
    1.66 +      } else {
    1.67 +        ADLFanSpeedValue adlf = new ADLFanSpeedValue();
    1.68 +        adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
    1.69 +        adlf.Flags = ADL.ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
    1.70 +        adlf.FanSpeed = (int)control.SoftwareValue;
    1.71 +        ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0, ref adlf);
    1.72 +      }
    1.73 +    }
    1.74 +
    1.75      public int BusNumber { get { return busNumber; } }
    1.76  
    1.77      public int DeviceNumber { get { return deviceNumber; } }
    1.78 @@ -116,10 +164,10 @@
    1.79        adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
    1.80        if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
    1.81          == ADL.ADL_OK) {
    1.82 -        fanControl.Value = adlf.FanSpeed;
    1.83 -        ActivateSensor(fanControl);
    1.84 +        controlSensor.Value = adlf.FanSpeed;
    1.85 +        ActivateSensor(controlSensor);
    1.86        } else {
    1.87 -        fanControl.Value = null;
    1.88 +        controlSensor.Value = null;
    1.89        }
    1.90  
    1.91        ADLPMActivity adlp = new ADLPMActivity();
    1.92 @@ -150,5 +198,14 @@
    1.93          coreLoad.Value = null;
    1.94        }
    1.95      }
    1.96 +
    1.97 +    public void Close() {
    1.98 +      this.fanControl.ControlModeChanged -= ControlModeChanged;
    1.99 +      this.fanControl.SoftwareControlValueChanged -=
   1.100 +        SoftwareControlValueChanged;
   1.101 +
   1.102 +      ADL.ADL_Overdrive5_FanSpeed_Set(adapterIndex, 0,
   1.103 +        ref this.initialFanSpeedValue);
   1.104 +    }
   1.105    }
   1.106  }