From 51cd700e25d8f2c24ba197eb472de881004a8fd7 Mon Sep 17 00:00:00 2001
From: Serge <5920850+seerge@users.noreply.github.com>
Date: Fri, 12 May 2023 15:51:57 +0200
Subject: [PATCH] Improved GPU restart
---
app/GHelper.csproj | 2 +-
app/Gpu/NvidiaGpuControl.cs | 21 ++++++++++--
app/OptimizationService.cs | 38 ++++++++++++++++++++++
app/Program.cs | 15 +++++----
app/Properties/Strings.Designer.cs | 2 +-
app/Properties/Strings.resx | 2 +-
app/Settings.cs | 51 +++++++++++++++++++++++-------
7 files changed, 108 insertions(+), 23 deletions(-)
create mode 100644 app/OptimizationService.cs
diff --git a/app/GHelper.csproj b/app/GHelper.csproj
index 6d30aa74..a2e501eb 100644
--- a/app/GHelper.csproj
+++ b/app/GHelper.csproj
@@ -16,7 +16,7 @@
AnyCPU
False
True
- 0.60
+ 0.61
diff --git a/app/Gpu/NvidiaGpuControl.cs b/app/Gpu/NvidiaGpuControl.cs
index 50901951..f757b1db 100644
--- a/app/Gpu/NvidiaGpuControl.cs
+++ b/app/Gpu/NvidiaGpuControl.cs
@@ -90,7 +90,7 @@ public class NvidiaGpuControl : IGpuControl
}
- public bool RestartGPU()
+ public bool RestartGPUPnP()
{
if (!IsValid) return false;
@@ -99,13 +99,30 @@ public class NvidiaGpuControl : IGpuControl
{
PhysicalGPU internalGpu = _internalGpu!;
var pnpDeviceId = internalGpu.BusInformation.PCIIdentifiers.ToString();
- Logger.WriteLine("Device ID:"+ pnpDeviceId);
+ Logger.WriteLine("Device ID:" + pnpDeviceId);
RunCMD("pnputil", $"/disable-device /deviceid \"{pnpDeviceId}\"");
Thread.Sleep(3000);
RunCMD("pnputil", $"/enable-device /deviceid \"{pnpDeviceId}\"");
Thread.Sleep(2000);
return true;
}
+ catch (Exception ex)
+ {
+ Logger.WriteLine(ex.ToString());
+ return false;
+ }
+ }
+
+ public bool RestartGPU()
+ {
+ try
+ {
+ string script = @"$device = Get-PnpDevice | Where-Object { $_.FriendlyName -imatch 'NVIDIA' -and $_.Class -eq 'Display' }; Disable-PnpDevice $device.InstanceId -Confirm:$false; Start-Sleep -Seconds 2; Enable-PnpDevice $device.InstanceId -Confirm:$false";
+ Logger.WriteLine(script);
+ RunCMD("powershell", script);
+ Thread.Sleep(2000);
+ return true;
+ }
catch (Exception ex )
{
Logger.WriteLine(ex.ToString());
diff --git a/app/OptimizationService.cs b/app/OptimizationService.cs
new file mode 100644
index 00000000..04b0ce2b
--- /dev/null
+++ b/app/OptimizationService.cs
@@ -0,0 +1,38 @@
+using System.Text.RegularExpressions;
+using System.Text;
+
+namespace GHelper
+{
+ public static class OptimizationService
+ {
+ public static void SetChargeLimit (int newValue)
+ {
+ // Set the path to the .ini file
+ string path = @"C:\ProgramData\ASUS\ASUS System Control Interface\ASUSOptimization\Customization.ini";
+
+
+ // Make a backup copy of the INI file
+ string backupPath = path + ".bak";
+ File.Copy(path, backupPath, true);
+
+ string fileContents = File.ReadAllText(path, Encoding.Unicode);
+
+ // Find the section [BatteryHealthCharging]
+ string sectionPattern = @"\[BatteryHealthCharging\]\s*(version=\d+)?\s+value=(\d+)";
+ Match sectionMatch = Regex.Match(fileContents, sectionPattern);
+ if (sectionMatch.Success)
+ {
+ // Replace the value with the new value
+ string oldValueString = sectionMatch.Groups[2].Value;
+ int oldValue = int.Parse(oldValueString);
+ string newSection = sectionMatch.Value.Replace($"value={oldValue}", $"value={newValue}");
+
+ // Replace the section in the file contents
+ fileContents = fileContents.Replace(sectionMatch.Value, newSection);
+
+ File.WriteAllText(path, fileContents, Encoding.Unicode);
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/Program.cs b/app/Program.cs
index 26935ddb..1a8acec4 100644
--- a/app/Program.cs
+++ b/app/Program.cs
@@ -291,16 +291,19 @@ namespace GHelper
{
settingsForm.Show();
settingsForm.Activate();
+ settingsForm.VisualiseGPUMode();
- if (action == "gpu")
+ switch (action)
{
- Startup.ReScheduleAdmin();
- settingsForm.FansToggle();
+ case "gpu":
+ Startup.ReScheduleAdmin();
+ settingsForm.FansToggle();
+ break;
+ case "gpurestart":
+ settingsForm.RestartGPU(false);
+ break;
}
}
-
- settingsForm.VisualiseGPUMode();
-
}
static void TrayIcon_MouseClick(object? sender, MouseEventArgs e)
diff --git a/app/Properties/Strings.Designer.cs b/app/Properties/Strings.Designer.cs
index 500aa547..1d7a5479 100644
--- a/app/Properties/Strings.Designer.cs
+++ b/app/Properties/Strings.Designer.cs
@@ -826,7 +826,7 @@ namespace GHelper.Properties {
}
///
- /// Looks up a localized string similar to Something is using dGPU and blocking Eco mode. Restart dGPU in device manager and try to set Eco again?.
+ /// Looks up a localized string similar to Something is using dGPU and preventing Eco mode. Restart dGPU in device manager? * Please proceed on your own risk..
///
internal static string RestartGPU {
get {
diff --git a/app/Properties/Strings.resx b/app/Properties/Strings.resx
index d7e53434..d255a48f 100644
--- a/app/Properties/Strings.resx
+++ b/app/Properties/Strings.resx
@@ -373,7 +373,7 @@
Quit
- Something is using dGPU and blocking Eco mode. Restart dGPU in device manager and try to set Eco again?
+ Something is using dGPU and preventing Eco mode. Restart dGPU in device manager? * Please proceed on your own risk.
RPM
diff --git a/app/Settings.cs b/app/Settings.cs
index 0a9bccec..f862d545 100644
--- a/app/Settings.cs
+++ b/app/Settings.cs
@@ -1454,19 +1454,43 @@ namespace GHelper
}
- public bool RestartGPU()
+ public void RestartGPU(bool confirm = true)
{
- if (HardwareControl.GpuControl is null) return false;
- if (!HardwareControl.GpuControl!.IsNvidia) return false;
+ if (HardwareControl.GpuControl is null) return;
+ if (!HardwareControl.GpuControl!.IsNvidia) return;
- DialogResult dialogResult = MessageBox.Show(Properties.Strings.RestartGPU, Properties.Strings.EcoMode, MessageBoxButtons.YesNo);
- if (dialogResult == DialogResult.No) return false;
+ if (confirm)
+ {
+ DialogResult dialogResult = MessageBox.Show(Properties.Strings.RestartGPU, Properties.Strings.EcoMode, MessageBoxButtons.YesNo);
+ if (dialogResult == DialogResult.No) return;
+ }
- Program.RunAsAdmin();
+ Program.RunAsAdmin("gpurestart");
- Logger.WriteLine("Trying to restart GPU");
- var nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;
- return nvControl.RestartGPU();
+ if (!Program.IsUserAdministrator()) return;
+
+ Logger.WriteLine("Trying to restart dGPU");
+
+ Task.Run(async () =>
+ {
+ Program.settingsForm.BeginInvoke(delegate
+ {
+ labelTipGPU.Text = "Restarting GPU ...";
+ ButtonEnabled(buttonOptimized, false);
+ ButtonEnabled(buttonEco, false);
+ ButtonEnabled(buttonStandard, false);
+ ButtonEnabled(buttonUltimate, false);
+ });
+
+ var nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;
+ bool status = nvControl.RestartGPU();
+
+ Program.settingsForm.BeginInvoke(delegate
+ {
+ labelTipGPU.Text = status ? "GPU Restarted, you can try Eco mode again" : "Failed to restart GPU";
+ InitGPUMode();
+ });
+ });
}
@@ -1490,13 +1514,14 @@ namespace GHelper
string[] tokill = { "EADesktop", "RadeonSoftware" };
foreach (string kill in tokill)
foreach (var process in Process.GetProcessesByName(kill)) process.Kill();
- }
+ }
+ //if (eco == 1) status = 0; else
status = Program.wmi.SetGPUEco(eco);
if (status == 0 && eco == 1 && hardWay)
{
- if (RestartGPU()) Program.wmi.SetGPUEco(1);
+ RestartGPU();
}
await Task.Delay(TimeSpan.FromMilliseconds(500));
@@ -1508,7 +1533,7 @@ namespace GHelper
if (eco == 0)
{
- await Task.Delay(TimeSpan.FromMilliseconds(1000));
+ await Task.Delay(TimeSpan.FromMilliseconds(3000));
HardwareControl.RecreateGpuControl();
SetGPUClocks(false);
}
@@ -1669,6 +1694,8 @@ namespace GHelper
sliderBattery.Value = limit;
Program.wmi.DeviceSet(ASUSWmi.BatteryLimit, limit, "BatteryLimit");
+ OptimizationService.SetChargeLimit(limit);
+
Program.config.setConfig("charge_limit", limit);
}