From e45bcdf8a5271a8d3dda203fc2bb927a45109080 Mon Sep 17 00:00:00 2001 From: seerge Date: Tue, 14 Mar 2023 23:07:49 +0100 Subject: [PATCH] Adjusted PPTs for 2021 model, added windows PowerModes --- ASUSWmi.cs | 18 +++++++++------ Fans.cs | 13 +++++++++-- GHelper.csproj | 2 +- NativeMethods.cs | 25 +++++++++++++++++++++ Program.cs | 57 ------------------------------------------------ Settings.cs | 15 ++++++++++--- 6 files changed, 60 insertions(+), 70 deletions(-) diff --git a/ASUSWmi.cs b/ASUSWmi.cs index 4347507e..690fdae7 100644 --- a/ASUSWmi.cs +++ b/ASUSWmi.cs @@ -27,12 +27,16 @@ public class ASUSWmi public const uint DevsCPUFanCurve = 0x00110024; public const uint DevsGPUFanCurve = 0x00110025; - public const int PPT_TotalA0 = 0x001200A0; - public const int PPT_TotalA1 = 0x001200A1; + 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_TDCA2 = 0x001200A2; // CPU TDC + public const int PPT_APUA3 = 0x001200A3; // APU PPT ON 2021, doesn't work on 2022 - public const int PPT_CPUB0 = 0x001200B0; - public const int PPT_CPUB1 = 0x001200B1; - public const int PPT_CPUA2 = 0x001200A2; + public const int PPT_CPUB0 = 0x001200B0; // CPU PPT on 2022 + public const int PPT_CPUB1 = 0x001200B1; // APU PPT on 2022 + + public const int PPT_APUC1 = 0x001200C1; + public const int PPT_APUC2 = 0x001200C2; public const int PerformanceBalanced = 0; public const int PerformanceTurbo = 1; @@ -44,11 +48,11 @@ public class ASUSWmi public const int MaxTotal = 150; - public const int MinTotal = 15; + public const int MinTotal = 5; public const int DefaultTotal = 125; public const int MaxCPU = 90; - public const int MinCPU = 15; + public const int MinCPU = 5; public const int DefaultCPU = 80; diff --git a/Fans.cs b/Fans.cs index cbb6af4b..d2775306 100644 --- a/Fans.cs +++ b/Fans.cs @@ -168,8 +168,17 @@ namespace GHelper public void InitPower(bool changed = false) { - panelPower.Visible = (Program.wmi.DeviceGet(ASUSWmi.PPT_TotalA0) >= 0); - panelCPU.Visible = (Program.wmi.DeviceGet(ASUSWmi.PPT_CPUB0) >= 0); + bool cpuBmode = (Program.wmi.DeviceGet(ASUSWmi.PPT_CPUB0) >= 0); // 2022 model + + bool cpuAmode = (Program.wmi.DeviceGet(ASUSWmi.PPT_TotalA0) >= 0); // 2021 model + + + panelPower.Visible = cpuAmode; + panelCPU.Visible = cpuBmode; + + // Yes, that's stupid, but Total slider on 2021 model actually adjusts CPU PPT + if (!cpuBmode) + { + label1.Text = "CPU SPPT"; + } int limit_total; int limit_cpu; diff --git a/GHelper.csproj b/GHelper.csproj index ddd5486d..8aa824ce 100644 --- a/GHelper.csproj +++ b/GHelper.csproj @@ -16,7 +16,7 @@ x64 False True - 0.27 + 0.28 diff --git a/NativeMethods.cs b/NativeMethods.cs index 64390e3a..e937756a 100644 --- a/NativeMethods.cs +++ b/NativeMethods.cs @@ -458,6 +458,15 @@ public class NativeMethods static readonly Guid GUID_CPU = new Guid("54533251-82be-4824-96c1-47b60b740d00"); static readonly Guid GUID_BOOST = new Guid("be337238-0d82-4146-a960-4f3749d470c7"); + [DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetActualOverlayScheme")] + public static extern uint PowerGetActualOverlayScheme(out Guid ActualOverlayGuid); + + [DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetEffectiveOverlayScheme")] + public static extern uint PowerGetEffectiveOverlayScheme(out Guid EffectiveOverlayGuid); + + [DllImportAttribute("powrprof.dll", EntryPoint = "PowerSetActiveOverlayScheme")] + public static extern uint PowerSetActiveOverlayScheme(Guid OverlaySchemeGuid); + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct DEVMODE { @@ -666,4 +675,20 @@ public class NativeMethods */ } + + public static void SetPowerScheme(int mode) + { + switch (mode) + { + case 0: // balanced + PowerSetActiveOverlayScheme(new Guid("00000000-0000-0000-0000-000000000000")); + break; + case 1: // turbo + PowerSetActiveOverlayScheme(new Guid("ded574b5-45a0-4f42-8737-46345c09c238")); + break; + case 2: //silent + PowerSetActiveOverlayScheme(new Guid("961cc777-2547-4f9d-8174-7d86181b8a7a")); + break; + } + } } diff --git a/Program.cs b/Program.cs index 7c436d70..53b2d70d 100644 --- a/Program.cs +++ b/Program.cs @@ -46,31 +46,6 @@ namespace GHelper { - // Native methods for sleep detection - - [DllImport("Powrprof.dll", SetLastError = true)] - static extern uint PowerRegisterSuspendResumeNotification(uint flags, ref DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS receipient, ref IntPtr registrationHandle); - - - private const int WM_POWERBROADCAST = 536; // (0x218) - private const int PBT_APMPOWERSTATUSCHANGE = 10; // (0xA) - Power status has changed. - private const int PBT_APMRESUMEAUTOMATIC = 18; // (0x12) - Operation is resuming automatically from a low-power state.This message is sent every time the system resumes. - private const int PBT_APMRESUMESUSPEND = 7; // (0x7) - Operation is resuming from a low-power state.This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key. - private const int PBT_APMSUSPEND = 4; // (0x4) - System is suspending operation. - private const int PBT_POWERSETTINGCHANGE = 32787; // (0x8013) - A power setting change event has been received. - private const int DEVICE_NOTIFY_CALLBACK = 2; - - [StructLayout(LayoutKind.Sequential)] - struct DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS - { - public DeviceNotifyCallbackRoutine Callback; - public IntPtr Context; - } - - public delegate int DeviceNotifyCallbackRoutine(IntPtr context, int type, IntPtr setting); - - // - public static NotifyIcon trayIcon = new NotifyIcon { Text = "G-Helper", @@ -128,20 +103,6 @@ namespace GHelper SetAutoModes(); HardwareMonitor.RecreateGpuTemperatureProvider(); - // Subscribing for native power change events - - /* - IntPtr registrationHandle = new IntPtr(); - DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS recipient = new DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS(); - recipient.Callback = new DeviceNotifyCallbackRoutine(DeviceNotifyCallback); - recipient.Context = IntPtr.Zero; - - IntPtr pRecipient = Marshal.AllocHGlobal(Marshal.SizeOf(recipient)); - Marshal.StructureToPtr(recipient, pRecipient, false); - - uint result = PowerRegisterSuspendResumeNotification(DEVICE_NOTIFY_CALLBACK, ref recipient, ref registrationHandle); - */ - // Subscribing for monitor power on events var settingGuid = new NativeMethods.PowerSettingGuid(); unRegPowerNotify = NativeMethods.RegisterPowerSettingNotification(ds, settingGuid.ConsoleDisplayState, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE); @@ -149,29 +110,11 @@ namespace GHelper // Subscribing for system power change events SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; - CheckForUpdates(); Application.Run(); } - private static int DeviceNotifyCallback(IntPtr context, int type, IntPtr setting) - { - Logger.WriteLine($"Power callback {type}"); - switch (type) - { - case PBT_APMRESUMEAUTOMATIC: - settingsForm.BeginInvoke(delegate - { - SetAutoModes(); - }); - break; - } - - return 0; - } - - static async void CheckForUpdates() { diff --git a/Settings.cs b/Settings.cs index f811fce7..1d629f06 100644 --- a/Settings.cs +++ b/Settings.cs @@ -741,9 +741,11 @@ namespace GHelper if (limit_cpu > ASUSWmi.MaxCPU) return; if (limit_cpu < ASUSWmi.MinCPU) return; - Program.wmi.DeviceSet(ASUSWmi.PPT_TotalA0, limit_total); - Program.wmi.DeviceSet(ASUSWmi.PPT_TotalA1, limit_total); - Program.wmi.DeviceSet(ASUSWmi.PPT_CPUB0, limit_cpu); + if (Program.wmi.DeviceGet(ASUSWmi.PPT_TotalA0) >= 0) + Program.wmi.DeviceSet(ASUSWmi.PPT_TotalA0, limit_total); + + if (Program.wmi.DeviceGet(ASUSWmi.PPT_CPUB0) >= 0) + Program.wmi.DeviceSet(ASUSWmi.PPT_CPUB0, limit_cpu); Logger.WriteLine("PowerLimits " + limit_total.ToString() + ", " + limit_cpu.ToString()); @@ -819,6 +821,13 @@ namespace GHelper AutoFansAndPower(); + NativeMethods.SetPowerScheme(PerformanceMode); + + if (NativeMethods.PowerGetEffectiveOverlayScheme(out Guid activeScheme) == 0) + { + Debug.WriteLine("Effective :" + activeScheme); + } + if (fans != null && fans.Text != "") { fans.InitFans();