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 }