2022-11-12 11:41:24 +01:00
|
|
|
|
using LibreHardwareMonitor.Hardware;
|
|
|
|
|
|
using LibreHardwareMonitor.Hardware.CPU;
|
|
|
|
|
|
using Microsoft.VisualBasic.Devices;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
|
using System.Diagnostics.Metrics;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
2022-11-13 14:39:29 +01:00
|
|
|
|
using CommonHelpers;
|
2022-11-12 11:41:24 +01:00
|
|
|
|
|
|
|
|
|
|
namespace FanControl
|
|
|
|
|
|
{
|
|
|
|
|
|
[TypeConverter(typeof(ExpandableObjectConverter))]
|
2022-11-12 17:06:34 +01:00
|
|
|
|
[RefreshProperties(RefreshProperties.Repaint)]
|
2022-11-12 11:41:24 +01:00
|
|
|
|
internal partial class FanController : IDisposable
|
|
|
|
|
|
{
|
|
|
|
|
|
[CategoryAttribute("Fan")]
|
2022-12-19 11:58:48 +01:00
|
|
|
|
public FanMode Mode { get; private set; } = FanMode.Default;
|
|
|
|
|
|
|
|
|
|
|
|
[CategoryAttribute("Fan")]
|
|
|
|
|
|
public bool KernelDriversLoaded
|
|
|
|
|
|
{
|
|
|
|
|
|
get => Instance.UseKernelDrivers;
|
|
|
|
|
|
}
|
2022-11-12 11:41:24 +01:00
|
|
|
|
|
|
|
|
|
|
[CategoryAttribute("Fan")]
|
2022-11-12 17:06:34 +01:00
|
|
|
|
[NotifyParentProperty(true)]
|
|
|
|
|
|
|
2022-11-26 20:09:30 +01:00
|
|
|
|
public ushort? CurrentRPM { get; private set; }
|
2022-11-12 11:41:24 +01:00
|
|
|
|
|
|
|
|
|
|
[CategoryAttribute("Fan")]
|
2022-11-12 17:06:34 +01:00
|
|
|
|
[NotifyParentProperty(true)]
|
|
|
|
|
|
|
2022-11-12 11:41:24 +01:00
|
|
|
|
public ushort DesiredRPM { get; private set; }
|
|
|
|
|
|
|
2022-11-12 14:25:57 +01:00
|
|
|
|
[CategoryAttribute("Board")]
|
2022-11-26 20:09:30 +01:00
|
|
|
|
public String PDVersion { get; private set; } = Vlv0100.FirmwareVersion.ToString("X");
|
2022-11-12 14:25:57 +01:00
|
|
|
|
|
2022-11-12 11:41:24 +01:00
|
|
|
|
public FanController()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void visitHardware(IHardware hardware)
|
|
|
|
|
|
{
|
|
|
|
|
|
Dictionary<FanSensor, ISensor> matched = new Dictionary<FanSensor, ISensor>();
|
|
|
|
|
|
|
|
|
|
|
|
foreach (ISensor hwSensor in hardware.Sensors)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var sensor in allSensors.Values)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (sensor.Matches(hwSensor))
|
|
|
|
|
|
matched[sensor] = hwSensor;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (matched.Any())
|
|
|
|
|
|
{
|
|
|
|
|
|
hardware.Update();
|
|
|
|
|
|
foreach (var sensor in matched)
|
|
|
|
|
|
sensor.Key.Update(sensor.Value, Mode);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach (IHardware subhardware in hardware.SubHardware)
|
|
|
|
|
|
{
|
|
|
|
|
|
visitHardware(subhardware);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private ushort getDesiredRPM()
|
|
|
|
|
|
{
|
|
|
|
|
|
ushort rpm = 0;
|
|
|
|
|
|
foreach (var sensor in allSensors.Values)
|
|
|
|
|
|
if (sensor.CalculatedRPM.HasValue)
|
|
|
|
|
|
rpm = Math.Max(rpm, sensor.CalculatedRPM.Value);
|
|
|
|
|
|
return rpm;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-12-19 11:58:48 +01:00
|
|
|
|
[Browsable(false)]
|
2022-11-26 20:09:30 +01:00
|
|
|
|
public bool IsActive
|
2022-11-12 11:41:24 +01:00
|
|
|
|
{
|
2022-11-26 20:09:30 +01:00
|
|
|
|
get { return Vlv0100.IsOpen; }
|
|
|
|
|
|
}
|
2022-11-20 21:17:21 +01:00
|
|
|
|
|
2022-12-19 11:58:48 +01:00
|
|
|
|
public void Update(bool showForDefault = false)
|
2022-11-26 20:09:30 +01:00
|
|
|
|
{
|
|
|
|
|
|
var mutex = Instance.WaitGlobalMutex(200);
|
2022-11-20 21:17:21 +01:00
|
|
|
|
if (mutex is null)
|
|
|
|
|
|
{
|
|
|
|
|
|
// If we cannot acquire mutex slightly increase FAN to compensate just in case
|
|
|
|
|
|
Vlv0100.SetFanDesiredRPM((ushort)(Vlv0100.GetFanDesiredRPM() * 110 / 100));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
2023-01-12 22:58:40 +01:00
|
|
|
|
if (AntiCheatSettings.Default.NotYet || Mode == FanMode.Default && !showForDefault)
|
2022-11-26 20:09:30 +01:00
|
|
|
|
{
|
|
|
|
|
|
Instance.UseKernelDrivers = false;
|
2022-12-19 11:58:48 +01:00
|
|
|
|
CurrentRPM = null;
|
|
|
|
|
|
DesiredRPM = 0;
|
|
|
|
|
|
foreach (var sensor in allSensors.Values)
|
|
|
|
|
|
sensor.Reset();
|
2022-11-26 20:09:30 +01:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (!Vlv0100.IsOpen)
|
|
|
|
|
|
{
|
|
|
|
|
|
Instance.UseKernelDrivers = true;
|
|
|
|
|
|
SetMode(Mode);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-11-20 21:17:21 +01:00
|
|
|
|
foreach (var sensor in allSensors.Values)
|
|
|
|
|
|
sensor.Reset();
|
2022-11-12 11:41:24 +01:00
|
|
|
|
|
2022-11-20 21:17:21 +01:00
|
|
|
|
foreach (var hardware in Instance.HardwareComputer.Hardware)
|
|
|
|
|
|
visitHardware(hardware);
|
|
|
|
|
|
}
|
|
|
|
|
|
finally
|
|
|
|
|
|
{
|
|
|
|
|
|
mutex.ReleaseMutex();
|
|
|
|
|
|
}
|
2022-11-12 11:41:24 +01:00
|
|
|
|
|
|
|
|
|
|
allSensors["Batt"].Update("VLV0100", Vlv0100.GetBattTemperature(), Mode);
|
|
|
|
|
|
|
|
|
|
|
|
Vlv0100.SetFanDesiredRPM(getDesiredRPM());
|
|
|
|
|
|
|
|
|
|
|
|
CurrentRPM = Vlv0100.GetFanRPM();
|
|
|
|
|
|
DesiredRPM = Vlv0100.GetFanDesiredRPM();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void SetMode(FanMode mode)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (mode)
|
|
|
|
|
|
{
|
|
|
|
|
|
case FanMode.Default:
|
|
|
|
|
|
Vlv0100.SetFanControl(false);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
2022-11-26 20:09:30 +01:00
|
|
|
|
Instance.UseKernelDrivers = true;
|
2022-11-12 11:41:24 +01:00
|
|
|
|
Vlv0100.SetFanControl(true);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.Mode = mode;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool IsAnyInvalid()
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var sensor in allSensors.Values)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!sensor.IsValid(Mode))
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|