using GHelper.Mode; namespace GHelper.Fan { public class FanSensorControl { public const int DEFAULT_FAN_MIN = 18; public const int DEFAULT_FAN_MAX = 58; public const int XGM_FAN_MAX = 72; public const int INADEQUATE_MAX = 104; const int FAN_COUNT = 3; Fans fansForm; ModeControl modeControl = Program.modeControl; static int[] measuredMax; static int sameCount = 0; static System.Timers.Timer timer = default!; static int[] _fanMax = InitFanMax(); static bool _fanRpm = AppConfig.IsNotFalse("fan_rpm"); public FanSensorControl(Fans fansForm) { this.fansForm = fansForm; timer = new System.Timers.Timer(1000); timer.Elapsed += Timer_Elapsed; } static int[] InitFanMax() { int[] defaultMax = GetDefaultMax(); return new int[3] { AppConfig.Get("fan_max_" + (int)AsusFan.CPU, defaultMax[(int)AsusFan.CPU]), AppConfig.Get("fan_max_" + (int)AsusFan.GPU, defaultMax[(int)AsusFan.GPU]), AppConfig.Get("fan_max_" + (int)AsusFan.Mid, defaultMax[(int)AsusFan.Mid]) }; } static int[] GetDefaultMax() { if (AppConfig.ContainsModel("GA401I")) return new int[3] { 78, 76, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("GA401")) return new int[3] { 71, 73, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("GA402")) return new int[3] { 55, 56, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("G513R")) return new int[3] { 58, 60, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("G513Q")) return new int[3] { 69, 69, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("GA503")) return new int[3] { 64, 64, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("GU603")) return new int[3] { 62, 64, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("FA507R")) return new int[3] { 63, 57, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("FA507X")) return new int[3] { 63, 68, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("GX650")) return new int[3] { 62, 62, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("G732")) return new int[3] { 61, 60, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("G713")) return new int[3] { 56, 60, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("Z301")) return new int[3] { 72, 64, DEFAULT_FAN_MAX }; if (AppConfig.ContainsModel("GV601")) return new int[3] { 78, 59, 85 }; if (AppConfig.ContainsModel("GA403")) return new int[3] { 68, 68, 80 }; return new int[3] { DEFAULT_FAN_MAX, DEFAULT_FAN_MAX, DEFAULT_FAN_MAX }; } public static int GetFanMax(AsusFan device) { if (device == AsusFan.XGM) return XGM_FAN_MAX; if (_fanMax[(int)device] < 0 || _fanMax[(int)device] > INADEQUATE_MAX) SetFanMax(device, DEFAULT_FAN_MAX); return _fanMax[(int)device]; } public static void SetFanMax(AsusFan device, int value) { _fanMax[(int)device] = value; AppConfig.Set("fan_max_" + (int)device, value); } public static bool fanRpm { get { return _fanRpm; } set { AppConfig.Set("fan_rpm", value ? 1 : 0); _fanRpm = value; } } public static string FormatFan(AsusFan device, int value) { if (value < 0) return null; if (value > GetFanMax(device) && value <= INADEQUATE_MAX) SetFanMax(device, value); if (fanRpm) return Properties.Strings.FanSpeed + ": " + (value * 100).ToString() + "RPM"; else return Properties.Strings.FanSpeed + ": " + Math.Min(Math.Round((float)value / GetFanMax(device) * 100), 100).ToString() + "%"; // relatively to max RPM } public void StartCalibration() { measuredMax = new int[] { 0, 0, 0 }; timer.Enabled = true; for (int i = 0; i < FAN_COUNT; i++) AppConfig.Remove("fan_max_" + i); Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AsusACPI.PerformanceTurbo, "ModeCalibration"); for (int i = 0; i < FAN_COUNT; i++) Program.acpi.SetFanCurve((AsusFan)i, new byte[] { 20, 30, 40, 50, 60, 70, 80, 90, 100, 100, 100, 100, 100, 100, 100, 100 }); } private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e) { int fan; bool same = true; for (int i = 0; i < FAN_COUNT; i++) { fan = Program.acpi.GetFan((AsusFan)i); if (fan > measuredMax[i]) { measuredMax[i] = fan; same = false; } } if (same) sameCount++; else sameCount = 0; string label = "Measuring Max Speed - CPU: " + measuredMax[(int)AsusFan.CPU] * 100 + ", GPU: " + measuredMax[(int)AsusFan.GPU] * 100; if (measuredMax[(int)AsusFan.Mid] > 10) label = label + ", Mid: " + measuredMax[(int)AsusFan.Mid] * 100; label = label + " (" + sameCount + "s)"; fansForm.LabelFansResult(label); if (sameCount >= 15) { for (int i = 0; i < FAN_COUNT; i++) { if (measuredMax[i] > 30 && measuredMax[i] < INADEQUATE_MAX) SetFanMax((AsusFan)i, measuredMax[i]); } sameCount = 0; FinishCalibration(); } } private void FinishCalibration() { timer.Enabled = false; modeControl.SetPerformanceMode(); string label = "Measured - CPU: " + AppConfig.Get("fan_max_" + (int)AsusFan.CPU) * 100; if (AppConfig.Get("fan_max_" + (int)AsusFan.GPU) > 0) label = label + ", GPU: " + AppConfig.Get("fan_max_" + (int)AsusFan.GPU) * 100; if (AppConfig.Get("fan_max_" + (int)AsusFan.Mid) > 0) label = label + ", Mid: " + AppConfig.Get("fan_max_" + (int)AsusFan.Mid) * 100; fansForm.LabelFansResult(label); fansForm.InitAxis(); } } }