Compare commits

...

20 Commits
v0.40 ... v0.43

Author SHA1 Message Date
seerge
a7a7170676 Merge branch 'main' of https://github.com/seerge/g-helper 2023-03-30 00:00:22 +02:00
seerge
1d43ca3ce4 Max fan RPM auto calibration 2023-03-30 00:00:20 +02:00
Serge
ff7618f16f Update README.md 2023-03-29 23:33:14 +02:00
seerge
bb947bf8bf Merge branch 'main' of https://github.com/seerge/g-helper 2023-03-29 23:32:14 +02:00
seerge
63092d8415 Removed unsupported aura modes for some models 2023-03-29 23:32:12 +02:00
Serge
6fbce2f495 Update README.md 2023-03-29 21:06:36 +02:00
seerge
8d89a04608 Merge branch 'main' of https://github.com/seerge/g-helper 2023-03-29 17:51:28 +02:00
seerge
0cbc48d526 Added old cpu temp reading as fallback 2023-03-29 17:51:25 +02:00
Serge
81013ca0be Update README.md 2023-03-29 17:32:07 +02:00
seerge
af2509fc17 Merge branch 'main' of https://github.com/seerge/g-helper 2023-03-29 17:04:24 +02:00
seerge
136b5b4f55 Added native temp sensors, brightness controll, etc 2023-03-29 17:04:22 +02:00
Serge
4e2abff942 Update README.md 2023-03-29 13:58:03 +02:00
Serge
2c8a11fc24 Update README.md 2023-03-29 12:26:19 +02:00
seerge
8af8823ee4 Merge branch 'main' of https://github.com/seerge/g-helper 2023-03-29 12:19:02 +02:00
seerge
ec0a1b710e New slider 2023-03-29 12:19:00 +02:00
Serge
2ac2e84161 Update README.md 2023-03-28 22:09:06 +02:00
seerge
14dc1741f7 New battery slider 2023-03-28 20:11:30 +02:00
seerge
fbed195194 - 2023-03-28 16:35:20 +02:00
seerge
0d002edf65 Animatrix fix for 2020/2021 models 2023-03-28 16:05:24 +02:00
seerge
28a17562a8 CPU boost per mode 2023-03-28 14:19:51 +02:00
15 changed files with 398 additions and 139 deletions

View File

@@ -31,6 +31,10 @@ public class ASUSWmi
public const uint DevsGPUFanCurve = 0x00110025; public const uint DevsGPUFanCurve = 0x00110025;
public const uint DevsMidFanCurve = 0x00110032; public const uint DevsMidFanCurve = 0x00110032;
public const int Temp_CPU = 0x00120094;
public const int Temp_GPU = 0x00120097;
public const int PPT_TotalA0 = 0x001200A0; // Total PPT on 2022 and CPU PPT on 2021 public const int PPT_TotalA0 = 0x001200A0; // Total PPT on 2022 and CPU PPT on 2021
public const int PPT_EDCA1 = 0x001200A1; // CPU EDC public const int PPT_EDCA1 = 0x001200A1; // CPU EDC
public const int PPT_TDCA2 = 0x001200A2; // CPU TDC public const int PPT_TDCA2 = 0x001200A2; // CPU TDC

View File

@@ -1,9 +1,8 @@
// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me // Source thanks to https://github.com/vddCore/Starlight with some adjustments from me
using Starlight.Communication; using Starlight.Communication;
using System.Diagnostics;
using System.Management; using System.Management;
using System.Runtime.CompilerServices; using System.Drawing.Drawing2D;
using System.Text; using System.Text;
namespace Starlight.AnimeMatrix namespace Starlight.AnimeMatrix
@@ -104,13 +103,14 @@ namespace Starlight.AnimeMatrix
_model = AnimeType.GA401; _model = AnimeType.GA401;
MaxColumns = 33; MaxColumns = 33;
dx = 0; dx = 1;
//FullRows = 7; //FullRows = 7;
//FullEvenRows = 3; //FullEvenRows = 3;
MaxRows = 55; MaxRows = 55;
LedCount = 1214; LedCount = 1245;
UpdatePageLength = 410; UpdatePageLength = 410;
} }
@@ -179,7 +179,8 @@ namespace Starlight.AnimeMatrix
if (y < 11) if (y < 11)
{ {
return 0; return 0;
} else }
else
{ {
return (y) / 2 - 5; return (y) / 2 - 5;
} }
@@ -359,43 +360,44 @@ namespace Starlight.AnimeMatrix
public void PresentText(string text, float fontSize = 8.5F) public void PresentText(string text1, string text2 = "")
{ {
using (Bitmap bmp = new Bitmap(MaxColumns * 3, MaxRows)) using (Bitmap bmp = new Bitmap(MaxColumns * 3, MaxRows))
{ {
using (Graphics g = Graphics.FromImage(bmp)) using (Graphics g = Graphics.FromImage(bmp))
{ {
using (Font font = new Font("Arial", fontSize)) g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
using (Font font = new Font("Arial", 12F))
{ {
SizeF textSize = g.MeasureString(text1, font);
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; g.DrawString(text1, font, Brushes.White, (MaxColumns*3 - textSize.Width)+3, -5);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
/*
SizeF textSize = g.MeasureString(text, font);
g.TranslateTransform(bmp.Width / 2, bmp.Height / 2);
g.RotateTransform(33);
g.DrawString(text, font, Brushes.White, -textSize.Width/2, -textSize.Height / 2);
*/
g.DrawString(text, font, Brushes.White, 5, -2);
} }
if (text2.Length > 0)
using (Font font = new Font("Arial", 9F))
{
SizeF textSize = g.MeasureString(text2, font);
g.DrawString(text2, font, Brushes.White, (MaxColumns * 3 - textSize.Width)+1, 25);
}
} }
GenerateFrame(bmp, System.Drawing.Drawing2D.InterpolationMode.Bicubic); GenerateFrame(bmp, InterpolationMode.Bicubic);
Present(); Present();
} }
} }
public void GenerateFrame(Image image, System.Drawing.Drawing2D.InterpolationMode interpolation = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic) public void GenerateFrame(Image image, InterpolationMode interpolation = InterpolationMode.HighQualityBicubic)
{ {
int width = MaxColumns * 3; int width = MaxColumns/2 * 6;
int height = MaxRows; int height = MaxRows;
int targetWidth = MaxColumns * 2; int targetWidth = MaxColumns * 2;
float scale; float scale;
using (Bitmap bmp = new Bitmap(targetWidth, height)) using (Bitmap bmp = new Bitmap(targetWidth, height))
@@ -408,8 +410,8 @@ namespace Starlight.AnimeMatrix
var scaleHeight = (float)(image.Height * scale); var scaleHeight = (float)(image.Height * scale);
graph.InterpolationMode = interpolation; graph.InterpolationMode = interpolation;
graph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, (float)Math.Round(targetWidth - scaleWidth * targetWidth / width), 0, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight); graph.DrawImage(image, (float)Math.Round(targetWidth - scaleWidth * targetWidth / width), 0, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);
@@ -418,7 +420,7 @@ namespace Starlight.AnimeMatrix
for (int y = 0; y < bmp.Height; y++) for (int y = 0; y < bmp.Height; y++)
{ {
for (int x = 0; x < bmp.Width; x++) for (int x = 0; x < bmp.Width; x++)
if (x % 2 == y % 2) if (x % 2 == (y+dx) % 2)
{ {
var pixel = bmp.GetPixel(x, y); var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3; var color = (pixel.R + pixel.G + pixel.B) / 3;

View File

@@ -108,6 +108,8 @@ public class AppConfig
if (device == 1) if (device == 1)
name = "gpu"; name = "gpu";
else if (device == 2)
name = "mid";
else else
name = "cpu"; name = "cpu";

View File

@@ -71,9 +71,8 @@ namespace GHelper
{ 2, "Fast" } { 2, "Fast" }
}; };
} }
public static Dictionary<int, string> GetModes()
{ static Dictionary<int, string> _modes = new Dictionary<int, string>
return new Dictionary<int, string>
{ {
{ 0, "Static" }, { 0, "Static" },
{ 1, "Breathe" }, { 1, "Breathe" },
@@ -81,6 +80,21 @@ namespace GHelper
{ 3, "Rainbow" }, { 3, "Rainbow" },
{ 10, "Strobe" }, { 10, "Strobe" },
}; };
public static Dictionary<int, string> GetModes()
{
if (Program.config.ContainsModel("TUF"))
{
_modes.Remove(3);
}
if (Program.config.ContainsModel("401"))
{
_modes.Remove(2);
_modes.Remove(3);
}
return _modes;
} }
@@ -148,7 +162,7 @@ namespace GHelper
{ {
HidDevice[] HidDeviceList = HidDevices.Enumerate(0x0b05, deviceIds).ToArray(); HidDevice[] HidDeviceList = HidDevices.Enumerate(0x0b05, deviceIds).ToArray();
byte[] msg = { 0x5a, 0xba, 0xc5, 0xc4, (byte)brightness }; byte[] msg = { 0x5d, 0xba, 0xc5, 0xc4, (byte)brightness };
foreach (HidDevice device in HidDeviceList) foreach (HidDevice device in HidDeviceList)
if (device.IsConnected && device.Description.Contains("HID")) if (device.IsConnected && device.Description.Contains("HID"))

View File

@@ -1,4 +1,5 @@
using CustomControls; using CustomControls;
using WinFormsSliderBar;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Windows.Forms.DataVisualization.Charting; using System.Windows.Forms.DataVisualization.Charting;
@@ -8,6 +9,7 @@ public static class ControlHelper
static bool _invert = false; static bool _invert = false;
static bool _darkTheme = false; static bool _darkTheme = false;
static float _scale = 1; static float _scale = 1;
static Color formBack; static Color formBack;
@@ -38,7 +40,7 @@ public static class ControlHelper
foreMain = SystemColors.ControlText; foreMain = SystemColors.ControlText;
foreAccent = Color.LightGray; foreAccent = Color.LightGray;
borderMain = Color.LightGray; borderMain = Color.LightGray;
buttonMain = Color.FromArgb(255, 230, 230, 230); buttonMain = Color.FromArgb(255, 250, 250, 250);
} }
container.BackColor = formBack; container.BackColor = formBack;
@@ -53,7 +55,7 @@ public static class ControlHelper
public static void Resize(RForm container, float baseScale = 2) public static void Resize(RForm container, float baseScale = 2)
{ {
_scale = GetDpiScale(container).Value / baseScale; _scale = GetDpiScale(container).Value / baseScale;
ResizeControls(container.Controls); if (Math.Abs(_scale - 1) > 0.2) ResizeControls(container.Controls);
} }
@@ -65,9 +67,11 @@ public static class ControlHelper
if (button != null && button.Image is not null) if (button != null && button.Image is not null)
button.Image = ResizeImage(button.Image); button.Image = ResizeImage(button.Image);
/*
var pictureBox = control as PictureBox; var pictureBox = control as PictureBox;
if (pictureBox != null && pictureBox.BackgroundImage is not null) if (pictureBox != null && pictureBox.BackgroundImage is not null)
pictureBox.BackgroundImage = ResizeImage(pictureBox.BackgroundImage); pictureBox.BackgroundImage = ResizeImage(pictureBox.BackgroundImage);
*/
ResizeControls(control.Controls); ResizeControls(control.Controls);
} }
@@ -95,7 +99,7 @@ public static class ControlHelper
if (pictureBox != null && pictureBox.BackgroundImage is not null) if (pictureBox != null && pictureBox.BackgroundImage is not null)
pictureBox.BackgroundImage = AdjustImage(pictureBox.BackgroundImage); pictureBox.BackgroundImage = AdjustImage(pictureBox.BackgroundImage);
var combo = control as RComboBox; var combo = control as RComboBox;
if (combo != null) if (combo != null)
{ {
@@ -111,6 +115,11 @@ public static class ControlHelper
gb.ForeColor = foreMain; gb.ForeColor = foreMain;
} }
var sl = control as Slider;
if (sl != null)
{
sl.borderColor = buttonMain;
}
var chart = control as Chart; var chart = control as Chart;
if (chart != null) if (chart != null)

View File

@@ -1,5 +1,6 @@
using Microsoft.Win32; using Microsoft.Win32;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@@ -30,9 +31,9 @@ namespace CustomControls
return (int)registryValueObject <= 0; return (int)registryValueObject <= 0;
} }
public void InitTheme(bool setDPI = true) public bool InitTheme(bool setDPI = false)
{ {
bool newDarkTheme = IsDarkTheme(); bool newDarkTheme = CheckSystemDarkModeStatus();
bool changed = (darkTheme != newDarkTheme); bool changed = (darkTheme != newDarkTheme);
darkTheme = newDarkTheme; darkTheme = newDarkTheme;
@@ -45,16 +46,13 @@ namespace CustomControls
ControlHelper.Adjust(this, darkTheme, changed); ControlHelper.Adjust(this, darkTheme, changed);
} }
return changed;
} }
} }
public class RTrackBar : TrackBar
{
}
public class RComboBox : ComboBox public class RComboBox : ComboBox
{ {
private Color borderColor = Color.Gray; private Color borderColor = Color.Gray;
@@ -71,6 +69,8 @@ namespace CustomControls
} }
} }
} }
private Color buttonColor = Color.FromArgb(255,230, 230, 230); private Color buttonColor = Color.FromArgb(255,230, 230, 230);
[DefaultValue(typeof(Color), "230, 230, 230")] [DefaultValue(typeof(Color), "230, 230, 230")]
public Color ButtonColor public Color ButtonColor

View File

@@ -18,7 +18,7 @@ namespace GHelper
{ {
if (percentage == 0) return "OFF"; if (percentage == 0) return "OFF";
return (200 * Math.Round((float)(MinRPM + (MaxRPM - MinRPM) * percentage * 0.01) / 200)).ToString() + unit; return (200 * Math.Round((float)(MinRPM*100 + (MaxRPM - MinRPM) * percentage) / 200)).ToString() + unit;
} }
void SetChart(Chart chart, int device) void SetChart(Chart chart, int device)
@@ -89,14 +89,8 @@ namespace GHelper
InitializeComponent(); InitializeComponent();
InitTheme(); InitTheme();
MinRPM = 1800; MinRPM = 18;
MaxRPM = HardwareMonitor.GetFanMax();
if (Program.config.ContainsModel("401"))
MaxRPM = 7200;
else if (Program.config.ContainsModel("503"))
MaxRPM = 6800;
else
MaxRPM = 5800;
@@ -146,7 +140,7 @@ namespace GHelper
InitPower(); InitPower();
InitBoost(); InitBoost();
comboBoost.SelectedIndexChanged += ComboBoost_Changed; comboBoost.SelectedValueChanged += ComboBoost_Changed;
Shown += Fans_Shown; Shown += Fans_Shown;
@@ -162,9 +156,11 @@ namespace GHelper
private void ComboBoost_Changed(object? sender, EventArgs e) private void ComboBoost_Changed(object? sender, EventArgs e)
{ {
if (sender is null) return; if (Program.config.getConfigPerf("auto_boost") != comboBoost.SelectedIndex)
ComboBox cmb = (ComboBox)sender; {
NativeMethods.SetCPUBoost(cmb.SelectedIndex); NativeMethods.SetCPUBoost(comboBoost.SelectedIndex);
Program.config.setConfigPerf("auto_boost", comboBoost.SelectedIndex);
}
} }
private void CheckApplyPower_Click(object? sender, EventArgs e) private void CheckApplyPower_Click(object? sender, EventArgs e)

View File

@@ -16,7 +16,7 @@
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly> <ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks> <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<AssemblyVersion>0.40</AssemblyVersion> <AssemblyVersion>0.43</AssemblyVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,4 +1,5 @@
using System.Diagnostics; using System.Diagnostics;
using GHelper;
using GHelper.Gpu; using GHelper.Gpu;
public static class HardwareMonitor public static class HardwareMonitor
@@ -9,12 +10,53 @@ public static class HardwareMonitor
public static float? batteryDischarge = -1; public static float? batteryDischarge = -1;
public static int? gpuTemp = null; public static int? gpuTemp = null;
public static string? cpuFan;
public static string? gpuFan;
public static string? midFan;
public static int GetFanMax()
{
int max = 58;
if (Program.config.ContainsModel("401")) max = 72;
else if (Program.config.ContainsModel("503")) max = 68;
return Math.Max(max, Program.config.getConfig("fan_max"));
}
public static void SetFanMax(int fan)
{
Program.config.setConfig("fan_max", fan);
}
private static string FormatFan(int fan)
{
// fix for old models
if (fan < 0)
{
fan += 65536;
if (fan <= 0 || fan > 100) return null; //nothing reasonable
}
int fanMax = GetFanMax();
if (fan > fanMax) SetFanMax(fan);
if (Program.config.getConfig("fan_rpm") == 1)
return " Fan: " + (fan * 100).ToString() + "RPM";
else
return " Fan: " + Math.Min(Math.Round((float)fan/fanMax*100), 100).ToString() + "%"; // relatively to 6000 rpm
}
public static void ReadSensors() public static void ReadSensors()
{ {
cpuTemp = -1;
batteryDischarge = -1; batteryDischarge = -1;
try cpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.CPU_Fan));
gpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.GPU_Fan));
midFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.Mid_Fan));
cpuTemp = Program.wmi.DeviceGet(ASUSWmi.Temp_CPU);
gpuTemp = Program.wmi.DeviceGet(ASUSWmi.Temp_GPU);
if (cpuTemp < 0) try
{ {
var ct = new PerformanceCounter("Thermal Zone Information", "Temperature", @"\_TZ.THRM", true); var ct = new PerformanceCounter("Thermal Zone Information", "Temperature", @"\_TZ.THRM", true);
cpuTemp = ct.NextValue() - 273; cpuTemp = ct.NextValue() - 273;
@@ -24,26 +66,29 @@ public static class HardwareMonitor
Logger.WriteLine("Failed reading CPU temp"); Logger.WriteLine("Failed reading CPU temp");
} }
if (gpuTemp < 0) try
{
if (GpuTemperatureProvider is null) RecreateGpuTemperatureProvider();
gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature();
}
catch (Exception ex) {
gpuTemp = null;
Logger.WriteLine("Failed reading GPU temp");
Logger.WriteLine(ex.ToString());
}
try try
{ {
var cb = new PerformanceCounter("Power Meter", "Power", "Power Meter (0)", true); var cb = new PerformanceCounter("Power Meter", "Power", "Power Meter (0)", true);
batteryDischarge = cb.NextValue() / 1000; batteryDischarge = cb.NextValue() / 1000;
cb.Dispose(); cb.Dispose();
} catch }
catch
{ {
Logger.WriteLine("Failed reading Battery discharge"); Logger.WriteLine("Failed reading Battery discharge");
} }
try
{
gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature();
} catch (Exception ex) {
gpuTemp = null;
Logger.WriteLine("Failed reading GPU temp");
Logger.WriteLine(ex.ToString());
}
} }
public static void RecreateGpuTemperatureProviderWithDelay() { public static void RecreateGpuTemperatureProviderWithDelay() {

View File

@@ -1,6 +1,8 @@
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Xml.Linq;
using static Tools.ScreenInterrogatory; using static Tools.ScreenInterrogatory;
namespace Tools namespace Tools
@@ -683,6 +685,7 @@ public class NativeMethods
PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid); PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);
*/ */
Logger.WriteLine("Boost " + boost);
} }
public static void SetPowerScheme(int mode) public static void SetPowerScheme(int mode)

View File

@@ -1,8 +1,6 @@
using Microsoft.Win32; using Microsoft.Win32;
using System.Diagnostics; using System.Diagnostics;
using System.Management; using System.Management;
using System.Reflection;
using System.Text.Json;
namespace GHelper namespace GHelper
{ {
@@ -61,13 +59,9 @@ namespace GHelper
Application.EnableVisualStyles(); Application.EnableVisualStyles();
SystemEvents.UserPreferenceChanged += new
UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
var ds = settingsForm.Handle; var ds = settingsForm.Handle;
trayIcon.MouseClick += TrayIcon_MouseClick; trayIcon.MouseClick += TrayIcon_MouseClick;
wmi.SubscribeToEvents(WatcherEventArrived); wmi.SubscribeToEvents(WatcherEventArrived);
@@ -78,10 +72,10 @@ namespace GHelper
settingsForm.SetStartupCheck(Startup.IsScheduled()); settingsForm.SetStartupCheck(Startup.IsScheduled());
SetAutoModes(); SetAutoModes();
HardwareMonitor.RecreateGpuTemperatureProvider();
// Subscribing for system power change events // Subscribing for system power change events
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
if (Environment.CurrentDirectory.Trim('\\') == Application.StartupPath.Trim('\\')) if (Environment.CurrentDirectory.Trim('\\') == Application.StartupPath.Trim('\\'))
@@ -106,13 +100,13 @@ namespace GHelper
case UserPreferenceCategory.General: case UserPreferenceCategory.General:
Debug.WriteLine("Theme Changed"); Debug.WriteLine("Theme Changed");
Thread.Sleep(1000); Thread.Sleep(1000);
settingsForm.InitTheme(false); settingsForm.InitTheme();
if (settingsForm.fans is not null && settingsForm.fans.Text != "") if (settingsForm.fans is not null && settingsForm.fans.Text != "")
settingsForm.fans.InitTheme(false); settingsForm.fans.InitTheme();
if (settingsForm.keyb is not null && settingsForm.keyb.Text != "") if (settingsForm.keyb is not null && settingsForm.keyb.Text != "")
settingsForm.keyb.InitTheme(false); settingsForm.keyb.InitTheme();
break; break;
} }

View File

@@ -40,12 +40,12 @@ namespace GHelper
pictureMatrix = new PictureBox(); pictureMatrix = new PictureBox();
labelMatrix = new Label(); labelMatrix = new Label();
panelBattery = new Panel(); panelBattery = new Panel();
sliderBattery = new WinFormsSliderBar.Slider();
labelModel = new Label(); labelModel = new Label();
labelVersion = new Label(); labelVersion = new Label();
labelBattery = new Label(); labelBattery = new Label();
pictureBattery = new PictureBox(); pictureBattery = new PictureBox();
labelBatteryTitle = new Label(); labelBatteryTitle = new Label();
trackBattery = new TrackBar();
panelFooter = new Panel(); panelFooter = new Panel();
buttonQuit = new RButton(); buttonQuit = new RButton();
checkStartup = new CheckBox(); checkStartup = new CheckBox();
@@ -93,7 +93,6 @@ namespace GHelper
((System.ComponentModel.ISupportInitialize)pictureMatrix).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureMatrix).BeginInit();
panelBattery.SuspendLayout(); panelBattery.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBattery).BeginInit(); ((System.ComponentModel.ISupportInitialize)pictureBattery).BeginInit();
((System.ComponentModel.ISupportInitialize)trackBattery).BeginInit();
panelFooter.SuspendLayout(); panelFooter.SuspendLayout();
panelPerformance.SuspendLayout(); panelPerformance.SuspendLayout();
((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit(); ((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit();
@@ -237,12 +236,12 @@ namespace GHelper
// //
panelBattery.AutoSize = true; panelBattery.AutoSize = true;
panelBattery.AutoSizeMode = AutoSizeMode.GrowAndShrink; panelBattery.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelBattery.Controls.Add(sliderBattery);
panelBattery.Controls.Add(labelModel); panelBattery.Controls.Add(labelModel);
panelBattery.Controls.Add(labelVersion); panelBattery.Controls.Add(labelVersion);
panelBattery.Controls.Add(labelBattery); panelBattery.Controls.Add(labelBattery);
panelBattery.Controls.Add(pictureBattery); panelBattery.Controls.Add(pictureBattery);
panelBattery.Controls.Add(labelBatteryTitle); panelBattery.Controls.Add(labelBatteryTitle);
panelBattery.Controls.Add(trackBattery);
panelBattery.Dock = DockStyle.Top; panelBattery.Dock = DockStyle.Top;
panelBattery.Location = new Point(10, 926); panelBattery.Location = new Point(10, 926);
panelBattery.Margin = new Padding(8); panelBattery.Margin = new Padding(8);
@@ -251,6 +250,17 @@ namespace GHelper
panelBattery.Size = new Size(810, 163); panelBattery.Size = new Size(810, 163);
panelBattery.TabIndex = 34; panelBattery.TabIndex = 34;
// //
// sliderBattery
//
sliderBattery.Location = new Point(16, 70);
sliderBattery.Max = 100;
sliderBattery.Min = 50;
sliderBattery.Name = "sliderBattery";
sliderBattery.Size = new Size(772, 40);
sliderBattery.TabIndex = 39;
sliderBattery.Text = "sliderBattery";
sliderBattery.Value = 80;
//
// labelModel // labelModel
// //
labelModel.Anchor = AnchorStyles.Top | AnchorStyles.Right; labelModel.Anchor = AnchorStyles.Top | AnchorStyles.Right;
@@ -307,22 +317,6 @@ namespace GHelper
labelBatteryTitle.TabIndex = 34; labelBatteryTitle.TabIndex = 34;
labelBatteryTitle.Text = "Battery Charge Limit"; labelBatteryTitle.Text = "Battery Charge Limit";
// //
// trackBattery
//
trackBattery.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
trackBattery.LargeChange = 10;
trackBattery.Location = new Point(20, 52);
trackBattery.Margin = new Padding(8, 4, 8, 4);
trackBattery.Maximum = 100;
trackBattery.Minimum = 50;
trackBattery.Name = "trackBattery";
trackBattery.Size = new Size(766, 90);
trackBattery.SmallChange = 5;
trackBattery.TabIndex = 33;
trackBattery.TickFrequency = 10;
trackBattery.TickStyle = TickStyle.TopLeft;
trackBattery.Value = 100;
//
// panelFooter // panelFooter
// //
panelFooter.AutoSize = true; panelFooter.AutoSize = true;
@@ -1033,7 +1027,6 @@ namespace GHelper
panelBattery.ResumeLayout(false); panelBattery.ResumeLayout(false);
panelBattery.PerformLayout(); panelBattery.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBattery).EndInit(); ((System.ComponentModel.ISupportInitialize)pictureBattery).EndInit();
((System.ComponentModel.ISupportInitialize)trackBattery).EndInit();
panelFooter.ResumeLayout(false); panelFooter.ResumeLayout(false);
panelFooter.PerformLayout(); panelFooter.PerformLayout();
panelPerformance.ResumeLayout(false); panelPerformance.ResumeLayout(false);
@@ -1069,7 +1062,6 @@ namespace GHelper
private Label labelBattery; private Label labelBattery;
private PictureBox pictureBattery; private PictureBox pictureBattery;
private Label labelBatteryTitle; private Label labelBatteryTitle;
private TrackBar trackBattery;
private Panel panelFooter; private Panel panelFooter;
private RButton buttonQuit; private RButton buttonQuit;
private CheckBox checkStartup; private CheckBox checkStartup;
@@ -1118,5 +1110,6 @@ namespace GHelper
private RButton buttonFans; private RButton buttonFans;
private Label labelMidFan; private Label labelMidFan;
private Label labelModel; private Label labelModel;
private WinFormsSliderBar.Slider sliderBattery;
} }
} }

View File

@@ -26,12 +26,13 @@ namespace GHelper
public Keyboard keyb; public Keyboard keyb;
static AnimeMatrixDevice mat; static AnimeMatrixDevice mat;
static int matrixTick = 0;
static long lastRefresh; static long lastRefresh;
public SettingsForm() public SettingsForm()
{ {
InitializeComponent(); InitializeComponent();
InitTheme(); InitTheme(true);
FormClosing += SettingsForm_FormClosing; FormClosing += SettingsForm_FormClosing;
@@ -114,12 +115,10 @@ namespace GHelper
button120Hz.MouseMove += Button120Hz_MouseHover; button120Hz.MouseMove += Button120Hz_MouseHover;
button120Hz.MouseLeave += ButtonScreen_MouseLeave; button120Hz.MouseLeave += ButtonScreen_MouseLeave;
trackBattery.ValueChanged += TrackBattery_ValueChanged; sliderBattery.ValueChanged += SliderBattery_ValueChanged;
Program.trayIcon.MouseMove += TrayIcon_MouseMove; Program.trayIcon.MouseMove += TrayIcon_MouseMove;
//buttonStandard.Image = (Image)(new Bitmap(buttonStandard.Image, new Size(16, 16))); aTimer = new System.Timers.Timer(1000);
aTimer = new System.Timers.Timer(500);
aTimer.Elapsed += OnTimedEvent; aTimer.Elapsed += OnTimedEvent;
// Subscribing for monitor power on events // Subscribing for monitor power on events
@@ -127,7 +126,7 @@ namespace GHelper
Program.unRegPowerNotify = NativeMethods.RegisterPowerSettingNotification(Handle, settingGuid.ConsoleDisplayState, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE); Program.unRegPowerNotify = NativeMethods.RegisterPowerSettingNotification(Handle, settingGuid.ConsoleDisplayState, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE);
SetVersionLabel("Version: " + Assembly.GetExecutingAssembly().GetName().Version); SetVersionLabel("Version: " + Assembly.GetExecutingAssembly().GetName().Version);
string model = Program.config.GetModel(); string model = Program.config.GetModel();
int trim = model.LastIndexOf("_"); int trim = model.LastIndexOf("_");
if (trim > 0) model = model.Substring(0, trim); if (trim > 0) model = model.Substring(0, trim);
@@ -138,17 +137,16 @@ namespace GHelper
Task.Run(async () => Task.Run(async () =>
{ {
await Task.Delay(TimeSpan.FromSeconds(5)); await Task.Delay(TimeSpan.FromSeconds(1));
CheckForUpdatesAsync(); CheckForUpdatesAsync();
}); });
} }
private void SliderBattery_ValueChanged(object? sender, EventArgs e)
private void TrackBattery_ValueChanged(object? sender, EventArgs e)
{ {
SetBatteryChargeLimit(trackBattery.Value); SetBatteryChargeLimit(sliderBattery.Value);
} }
@@ -356,7 +354,29 @@ namespace GHelper
mat.PresentNextFrame(); mat.PresentNextFrame();
break; break;
case 3: case 3:
mat.PresentText(DateTime.Now.ToString("H:mm:ss")); string format1, format2;
if (CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern.Contains("H"))
{
format1 = "H:mm";
format2 = "";
}
else
{
format1 = "h:mm";
format2 = "tt";
}
if (matrixTick > 0)
{
format1 = format1.Replace(":", " ");
matrixTick = 0;
}
else
{
matrixTick++;
}
mat.PresentText(DateTime.Now.ToString(format1), DateTime.Now.ToString(format2));
break; break;
} }
@@ -726,7 +746,7 @@ namespace GHelper
bool overdriveSetting = (Program.config.getConfig("no_overdrive") != 1); bool overdriveSetting = (Program.config.getConfig("no_overdrive") != 1);
int overdrive = Program.wmi.DeviceGet(ASUSWmi.ScreenOverdrive); int overdrive = Program.wmi.DeviceGet(ASUSWmi.ScreenOverdrive);
int miniled = Program.wmi.DeviceGet(ASUSWmi.ScreenMiniled); int miniled = Program.wmi.DeviceGet(ASUSWmi.ScreenMiniled);
bool screenEnabled = (frequency >= 0); bool screenEnabled = (frequency >= 0);
@@ -808,26 +828,12 @@ namespace GHelper
} }
private static string FormatFan(int fan)
{
if (fan < 0) return null;
if (Program.config.getConfig("fan_rpm") == 1)
return " Fan: " + (fan * 100).ToString() + "RPM";
else
return " Fan: " + Math.Min(Math.Round(fan / 0.6), 100).ToString() + "%"; // relatively to 6000 rpm
}
private static void RefreshSensors(bool force = false) private static void RefreshSensors(bool force = false)
{ {
if (!force && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastRefresh) < 2000) return; if (!force && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastRefresh) < 2000) return;
lastRefresh = DateTimeOffset.Now.ToUnixTimeMilliseconds(); lastRefresh = DateTimeOffset.Now.ToUnixTimeMilliseconds();
string cpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.CPU_Fan));
string gpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.GPU_Fan));
string midFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.Mid_Fan));
string cpuTemp = ""; string cpuTemp = "";
string gpuTemp = ""; string gpuTemp = "";
string battery = ""; string battery = "";
@@ -847,12 +853,16 @@ namespace GHelper
Program.settingsForm.BeginInvoke(delegate Program.settingsForm.BeginInvoke(delegate
{ {
Program.settingsForm.labelCPUFan.Text = "CPU" + cpuTemp + cpuFan; Program.settingsForm.labelCPUFan.Text = "CPU" + cpuTemp + HardwareMonitor.cpuFan;
Program.settingsForm.labelGPUFan.Text = "GPU" + gpuTemp + gpuFan; Program.settingsForm.labelGPUFan.Text = "GPU" + gpuTemp + HardwareMonitor.gpuFan;
if (midFan is not null) Program.settingsForm.labelMidFan.Text = "Mid" + midFan; if (HardwareMonitor.midFan is not null)
Program.settingsForm.labelMidFan.Text = "Mid" + HardwareMonitor.midFan;
Program.settingsForm.labelBattery.Text = battery; Program.settingsForm.labelBattery.Text = battery;
Program.trayIcon.Text = "CPU" + cpuTemp + cpuFan + "\n" + "GPU" + gpuTemp + gpuFan + ((battery.Length > 0) ? ("\n" + battery) : ""); Program.trayIcon.Text = "CPU" + cpuTemp + HardwareMonitor.cpuFan + "\n"
+ "GPU" + gpuTemp + HardwareMonitor.gpuFan +
((battery.Length > 0) ? ("\n" + battery) : "");
}); });
} }
@@ -868,7 +878,7 @@ namespace GHelper
this.Top = Screen.FromControl(this).WorkingArea.Height - 10 - this.Height; this.Top = Screen.FromControl(this).WorkingArea.Height - 10 - this.Height;
this.Activate(); this.Activate();
aTimer.Interval = 300; //aTimer.Interval = 300;
aTimer.Enabled = true; aTimer.Enabled = true;
//RefreshSensors(); //RefreshSensors();
@@ -915,7 +925,8 @@ namespace GHelper
labelPerf.Text = "Performance Mode+"; labelPerf.Text = "Performance Mode+";
} else }
else
{ {
labelPerf.Text = "Performance Mode"; labelPerf.Text = "Performance Mode";
} }
@@ -932,6 +943,10 @@ namespace GHelper
timer.Start(); timer.Start();
} }
if (Program.config.getConfigPerf("auto_boost") != -1)
{
NativeMethods.SetCPUBoost(Program.config.getConfigPerf("auto_boost"));
}
} }
public void SetPerformanceMode(int PerformanceMode = ASUSWmi.PerformanceBalanced, bool notify = false) public void SetPerformanceMode(int PerformanceMode = ASUSWmi.PerformanceBalanced, bool notify = false)
@@ -991,6 +1006,7 @@ namespace GHelper
{ {
fans.InitFans(); fans.InitFans();
fans.InitPower(); fans.InitPower();
fans.InitBoost();
} }
@@ -1009,9 +1025,11 @@ namespace GHelper
if (Program.config.getConfig("keyboard_auto") != 1) return; if (Program.config.getConfig("keyboard_auto") != 1) return;
if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online) if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online)
Program.wmi.DeviceSet(ASUSWmi.UniversalControl, ASUSWmi.KB_Light_Up); Aura.ApplyBrightness(3);
//Program.wmi.DeviceSet(ASUSWmi.UniversalControl, ASUSWmi.KB_Light_Up);
else else
Program.wmi.DeviceSet(ASUSWmi.UniversalControl, ASUSWmi.KB_Light_Down); Aura.ApplyBrightness(0);
//Program.wmi.DeviceSet(ASUSWmi.UniversalControl, ASUSWmi.KB_Light_Down);
} }
@@ -1093,6 +1111,9 @@ namespace GHelper
int eco = Program.wmi.DeviceGet(ASUSWmi.GPUEco); int eco = Program.wmi.DeviceGet(ASUSWmi.GPUEco);
int mux = Program.wmi.DeviceGet(ASUSWmi.GPUMux); int mux = Program.wmi.DeviceGet(ASUSWmi.GPUMux);
//Logger.WriteLine("Eco flag : " + eco);
//Logger.WriteLine("Mux flag : " + mux);
int GpuMode; int GpuMode;
if (mux == 0) if (mux == 0)
@@ -1144,11 +1165,12 @@ namespace GHelper
} }
Program.wmi.DeviceSet(ASUSWmi.GPUEco, eco); Program.wmi.DeviceSet(ASUSWmi.GPUEco, eco);
Logger.WriteLine("Setting Eco mode: " + eco);
Program.settingsForm.BeginInvoke(delegate Program.settingsForm.BeginInvoke(delegate
{ {
InitGPUMode();
HardwareMonitor.RecreateGpuTemperatureProviderWithDelay();
Thread.Sleep(500); Thread.Sleep(500);
InitGPUMode();
AutoScreen(); AutoScreen();
}); });
}); });
@@ -1298,8 +1320,10 @@ namespace GHelper
if (limit < 40 || limit > 100) return; if (limit < 40 || limit > 100) return;
//Debug.WriteLine(limit);
labelBatteryTitle.Text = "Battery Charge Limit: " + limit.ToString() + "%"; labelBatteryTitle.Text = "Battery Charge Limit: " + limit.ToString() + "%";
trackBattery.Value = limit; sliderBattery.Value = limit;
Program.wmi.DeviceSet(ASUSWmi.BatteryLimit, limit); Program.wmi.DeviceSet(ASUSWmi.BatteryLimit, limit);
Program.config.setConfig("charge_limit", limit); Program.config.setConfig("charge_limit", limit);

168
app/Slider.cs Normal file
View File

@@ -0,0 +1,168 @@
using System.Drawing.Drawing2D;
namespace WinFormsSliderBar
{
public static class GraphicsExtensions
{
public static void DrawCircle(this Graphics g, Pen pen,
float centerX, float centerY, float radius)
{
g.DrawEllipse(pen, centerX - radius, centerY - radius,
radius + radius, radius + radius);
}
public static void FillCircle(this Graphics g, Brush brush,
float centerX, float centerY, float radius)
{
g.FillEllipse(brush, centerX - radius, centerY - radius,
radius + radius, radius + radius);
}
}
public class Slider : Control
{
private float _radius;
private PointF _thumbPos;
private SizeF _barSize;
private PointF _barPos;
private int _step = 5;
public Color accentColor = Color.FromArgb(255, 58, 174, 239);
public Color borderColor = Color.White;
public event EventHandler ValueChanged;
public Slider()
{
// This reduces flicker
DoubleBuffered = true;
}
private int _min = 0;
public int Min
{
get => _min;
set
{
_min = value;
RecalculateParameters();
}
}
private int _max = 100;
public int Max
{
get => _max;
set
{
_max = value;
RecalculateParameters();
}
}
private int _value = 50;
public int Value
{
get => _value;
set
{
value = (int)Math.Round(value / (float)_step) * _step;
if (_value != value)
{
_value = value;
ValueChanged?.Invoke(this, EventArgs.Empty);
RecalculateParameters();
}
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Brush brushAccent = new SolidBrush(accentColor);
Brush brushEmpty = new SolidBrush(Color.Gray);
Brush brushBorder = new SolidBrush(borderColor);
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.FillRectangle(brushEmpty,
_barPos.X, _barPos.Y, _barSize.Width, _barSize.Height);
e.Graphics.FillRectangle(brushAccent,
_barPos.X, _barPos.Y, _thumbPos.X - _barPos.X, _barSize.Height);
e.Graphics.FillCircle(brushBorder, _thumbPos.X, _thumbPos.Y, _radius);
e.Graphics.FillCircle(brushAccent, _thumbPos.X, _thumbPos.Y, 0.7f * _radius);
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
RecalculateParameters();
}
private void RecalculateParameters()
{
_radius = 0.4F * ClientSize.Height;
_barSize = new SizeF(ClientSize.Width - 4 * _radius, ClientSize.Height * 0.15F);
_barPos = new PointF(_radius, (ClientSize.Height - _barSize.Height) / 2);
_thumbPos = new PointF(
_barSize.Width / (Max - Min) * (Value - Min) + _barPos.X,
_barPos.Y + 0.5f * _barSize.Height);
Invalidate();
}
bool _moving = false;
SizeF _delta;
protected override void OnMouseDown(MouseEventArgs e)
{
base.OnMouseDown(e);
// Difference between tumb and mouse position.
_delta = new SizeF(e.Location.X - _thumbPos.X, e.Location.Y - _thumbPos.Y);
if (_delta.Width * _delta.Width + _delta.Height * _delta.Height <= _radius * _radius)
{
// Clicking inside thumb.
_moving = true;
}
_calculateValue(e);
}
private void _calculateValue(MouseEventArgs e)
{
float thumbX = e.Location.X; // - _delta.Width;
if (thumbX < _barPos.X)
{
thumbX = _barPos.X;
}
else if (thumbX > _barPos.X + _barSize.Width)
{
thumbX = _barPos.X + _barSize.Width;
}
Value = (int)Math.Round(Min + (thumbX - _barPos.X) * (Max - Min) / _barSize.Width);
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
if (_moving)
{
_calculateValue(e);
}
}
protected override void OnMouseUp(MouseEventArgs e)
{
base.OnMouseUp(e);
_moving = false;
}
}
}

View File

@@ -1,4 +1,4 @@
# [G-Helper (GHelper)](https://github.com/seerge/g-helper) # [G-Helper](https://github.com/seerge/g-helper)
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub release](https://img.shields.io/github/release/seerge/g-helper.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social&label=Star)](https://GitHub.com/seerge/g-helper/stargazers/) [![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub release](https://img.shields.io/github/release/seerge/g-helper.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social&label=Star)](https://GitHub.com/seerge/g-helper/stargazers/)
@@ -11,13 +11,15 @@ A small utility that allows you to do almost everything you could do with Armour
1. Seamless and automatic GPU switching (without asking you to close all apps, etc) 1. Seamless and automatic GPU switching (without asking you to close all apps, etc)
2. All performance modes can be fully customized (with fan curves and PPTs) 2. All performance modes can be fully customized (with fan curves and PPTs)
3. Very lightweight and consumes almost no resources, doesn't install any services. Just a single exe to run 3. Very lightweight and consumes almost no resources, doesn't install any services. Just a single exe to run
4. Simple and clean UI with easy access to all settings 4. Simple and clean native UI with easy access to all settings
### [:floppy_disk: Download latest release](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip) ### [:floppy_disk: Download latest release](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
If you like this app, please [star :star: it on Github](https://github.com/seerge/g-helper) and spread a word about it! If you like this app, please [star :star: it on Github](https://github.com/seerge/g-helper) and spread a word about it!
![Screenshot](https://raw.githubusercontent.com/seerge/g-helper/main/docs/screenshot.png) If you post about app - please include a link. Thanks.
![Screenshot 2023-03-29 122524](https://user-images.githubusercontent.com/5920850/228505505-c3682509-a9e4-4cac-a5fd-e10d30c477cd.png)
### :zap: Main features ### :zap: Main features
@@ -45,6 +47,8 @@ To keep auto switching and hotkeys working the app needs to stay in running in t
Modes are **same** as in Armory Crate (as they are stored in bios), including default fan curves Modes are **same** as in Armory Crate (as they are stored in bios), including default fan curves
![Screenshot 2023-03-29 122534](https://user-images.githubusercontent.com/5920850/228505581-4e7d087c-bd0a-4a48-b572-de2c01192830.png)
1. Silent (minimal or no fans, 70W PPT total, up to 45W PPT to CPU) + Best power efficiency setting in windows 1. Silent (minimal or no fans, 70W PPT total, up to 45W PPT to CPU) + Best power efficiency setting in windows
2. Balanced (balanced fans, 100W PPT total, up to 45W PPT to CPU) + Balanced setting in windows 2. Balanced (balanced fans, 100W PPT total, up to 45W PPT to CPU) + Balanced setting in windows
3. Turbo (intense fans, 125W PPT total, up to 80W PPT to CPU) + Best performance setting in windows 3. Turbo (intense fans, 125W PPT total, up to 80W PPT to CPU) + Best performance setting in windows
@@ -61,7 +65,8 @@ PPTs are shown for G14 2022, for other models PPTs will be different as they are
## :question: FAQ ## :question: FAQ
### How do I stop Armory Crate install popup appearing every time I press M4 / Rog key? ### How do I stop Armory Crate install popup appearing every time I press M4 / Rog key?
Go to BIOS (F2 on boot), open Advanced Settings and disable "Armory Control Interface". If it still appears - delete or move somwhere following file C:\Windows\System32\ASUSACCI\ArmouryCrateKeyControl.exe Go to BIOS (F2 on boot), open Advanced Settings and disable "Armory Control Interface".
If it still appears - delete or move somwhere following file ``C:\Windows\System32\ASUSACCI\ArmouryCrateKeyControl.exe``
### Why Ultimate GPU mode is not available on my laptop? ### Why Ultimate GPU mode is not available on my laptop?
Ultimate mode is supported (by hardware) only on G14 2022 (and possibly other models from 2022+) Ultimate mode is supported (by hardware) only on G14 2022 (and possibly other models from 2022+)