From 1167d6c38027549ba6cf9f087afd03b2522a6ae6 Mon Sep 17 00:00:00 2001 From: Serge <5920850+seerge@users.noreply.github.com> Date: Mon, 26 Jun 2023 19:27:50 +0200 Subject: [PATCH] GPU and Screen Controls --- app/Display/ScreenControl.cs | 100 ++++++++++++++++++++++++++++++++++ app/Extra.cs | 8 ++- app/GHelper.csproj | 2 +- app/Gpu/GPUModeControl.cs | 7 ++- app/Helpers/ToastForm.cs | 4 +- app/Input/InputDispatcher.cs | 77 ++++---------------------- app/Input/KeyboardListener.cs | 56 +++++++++++++++++++ app/Mode/ModeControl.cs | 3 +- app/Program.cs | 6 +- app/Settings.cs | 95 ++++---------------------------- 10 files changed, 198 insertions(+), 160 deletions(-) create mode 100644 app/Display/ScreenControl.cs create mode 100644 app/Input/KeyboardListener.cs diff --git a/app/Display/ScreenControl.cs b/app/Display/ScreenControl.cs new file mode 100644 index 00000000..f54dc8c5 --- /dev/null +++ b/app/Display/ScreenControl.cs @@ -0,0 +1,100 @@ +using System.Diagnostics; + +namespace GHelper.Display +{ + public class ScreenControl + { + static SettingsForm settings = Program.settingsForm; + public void AutoScreen(bool force = false) + { + if (force || AppConfig.Is("screen_auto")) + { + if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online) + SetScreen(1000, 1); + else + SetScreen(60, 0); + } + else + { + SetScreen(overdrive: AppConfig.Get("overdrive")); + } + } + + public void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1) + { + + if (NativeMethods.GetRefreshRate() < 0) // Laptop screen not detected or has unknown refresh rate + { + InitScreen(); + return; + } + + if (frequency >= 1000) + { + frequency = NativeMethods.GetRefreshRate(true); + } + + if (frequency > 0) + { + NativeMethods.SetRefreshRate(frequency); + } + + if (overdrive >= 0) + { + if (AppConfig.Get("no_overdrive") == 1) overdrive = 0; + Program.acpi.DeviceSet(AsusACPI.ScreenOverdrive, overdrive, "ScreenOverdrive"); + + } + + if (miniled >= 0) + { + Program.acpi.DeviceSet(AsusACPI.ScreenMiniled, miniled, "Miniled"); + Debug.WriteLine("Miniled " + miniled); + } + + InitScreen(); + } + + + public void ToogleMiniled() + { + int miniled = (AppConfig.Get("miniled") == 1) ? 0 : 1; + AppConfig.Set("miniled", miniled); + SetScreen(-1, -1, miniled); + } + + public void InitScreen() + { + int frequency = NativeMethods.GetRefreshRate(); + int maxFrequency = NativeMethods.GetRefreshRate(true); + + bool screenAuto = AppConfig.Is("screen_auto"); + bool overdriveSetting = !AppConfig.Is("no_overdrive"); + + int overdrive = Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive); + int miniled = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled); + + if (miniled >= 0) + AppConfig.Set("miniled", miniled); + + bool screenEnabled = (frequency >= 0); + + AppConfig.Set("frequency", frequency); + AppConfig.Set("overdrive", overdrive); + + settings.Invoke(delegate + { + settings.VisualiseScreen( + screenEnabled: screenEnabled, + screenAuto: screenAuto, + frequency: frequency, + maxFrequency: maxFrequency, + overdrive: overdrive, + overdriveSetting: overdriveSetting, + miniled: miniled + ); + }); + + } + } +} diff --git a/app/Extra.cs b/app/Extra.cs index 544ce007..3271acaf 100644 --- a/app/Extra.cs +++ b/app/Extra.cs @@ -1,4 +1,5 @@ -using GHelper.Gpu.AMD; +using GHelper.Display; +using GHelper.Gpu.AMD; using GHelper.Helpers; using GHelper.Input; using GHelper.UI; @@ -9,6 +10,9 @@ namespace GHelper public partial class Extra : RForm { + ScreenControl screenControl = new ScreenControl(); + + Dictionary customActions = new Dictionary { {"","--------------" }, @@ -371,7 +375,7 @@ namespace GHelper private void CheckNoOverdrive_CheckedChanged(object? sender, EventArgs e) { AppConfig.Set("no_overdrive", (checkNoOverdrive.Checked ? 1 : 0)); - Program.settingsForm.AutoScreen(true); + screenControl.AutoScreen(true); } diff --git a/app/GHelper.csproj b/app/GHelper.csproj index a35f74db..b504f567 100644 --- a/app/GHelper.csproj +++ b/app/GHelper.csproj @@ -16,7 +16,7 @@ AnyCPU False True - 0.91 + 0.92 diff --git a/app/Gpu/GPUModeControl.cs b/app/Gpu/GPUModeControl.cs index c9e32ecf..550c47b6 100644 --- a/app/Gpu/GPUModeControl.cs +++ b/app/Gpu/GPUModeControl.cs @@ -1,4 +1,5 @@ -using GHelper.Gpu.NVidia; +using GHelper.Display; +using GHelper.Gpu.NVidia; using GHelper.Helpers; using GHelper.Mode; using System.Diagnostics; @@ -9,6 +10,7 @@ namespace GHelper.Gpu { static SettingsForm settings = Program.settingsForm; ModeControl modeControl = new ModeControl(); + ScreenControl screenControl = new ScreenControl(); public void InitGPUMode() { @@ -33,6 +35,7 @@ namespace GHelper.Gpu // Ultimate mode not suported if (mux != 1) settings.HideUltimateMode(); + // GPU mode not supported if (eco < 0 && mux < 0) settings.HideGPUModes(); } @@ -143,7 +146,7 @@ namespace GHelper.Gpu settings.Invoke(delegate { InitGPUMode(); - settings.AutoScreen(); + screenControl.AutoScreen(); }); if (eco == 0) diff --git a/app/Helpers/ToastForm.cs b/app/Helpers/ToastForm.cs index f22e22bd..928de066 100644 --- a/app/Helpers/ToastForm.cs +++ b/app/Helpers/ToastForm.cs @@ -1,6 +1,4 @@ -using System.Diagnostics; -using System.Drawing.Drawing2D; - +using System.Drawing.Drawing2D; namespace GHelper.Helpers { diff --git a/app/Input/InputDispatcher.cs b/app/Input/InputDispatcher.cs index b6a75605..c6d1ffc9 100644 --- a/app/Input/InputDispatcher.cs +++ b/app/Input/InputDispatcher.cs @@ -1,6 +1,6 @@ -using GHelper.Helpers; +using GHelper.Display; +using GHelper.Helpers; using GHelper.Mode; -using HidLibrary; using Microsoft.Win32; using NAudio.CoreAudioApi; using System.Diagnostics; @@ -8,58 +8,6 @@ using System.Management; namespace GHelper.Input { - public class KeyboardListener - { - - CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); - - public KeyboardListener(Action KeyHandler) - { - HidDevice? input = AsusUSB.GetDevice(); - if (input == null) return; - - Logger.WriteLine($"Input: {input.DevicePath}"); - - var task = Task.Run(() => - { - try - { - while (!cancellationTokenSource.Token.IsCancellationRequested) - { - - // Emergency break - if (input == null || !input.IsConnected) - { - Logger.WriteLine("Listener terminated"); - break; - } - - var data = input.Read().Data; - if (data.Length > 1 && data[0] == AsusUSB.INPUT_HID_ID && data[1] > 0 && data[1] != 236) - { - Logger.WriteLine($"Key: {data[1]}"); - KeyHandler(data[1]); - } - } - - Logger.WriteLine("Listener stopped"); - - } - catch (Exception ex) - { - Logger.WriteLine(ex.ToString()); - } - }); - - - } - - public void Dispose() - { - cancellationTokenSource?.Cancel(); - } - } - public class InputDispatcher { @@ -70,7 +18,7 @@ namespace GHelper.Input public static Keys keyApp = Keys.F12; static ModeControl modeControl = new ModeControl(); - static ToastForm toast = new ToastForm(); + static ScreenControl screenControl = new ScreenControl(); KeyboardListener listener; KeyboardHook hook = new KeyboardHook(); @@ -255,12 +203,12 @@ namespace GHelper.Input break; case Keys.F7: if (AppConfig.ContainsModel("TUF")) - toast.RunToast(ScreenBrightness.Adjust(-10) + "%", ToastIcon.BrightnessDown); + Program.toast.RunToast(ScreenBrightness.Adjust(-10) + "%", ToastIcon.BrightnessDown); HandleOptimizationEvent(16); break; case Keys.F8: if (AppConfig.ContainsModel("TUF")) - toast.RunToast(ScreenBrightness.Adjust(+10) + "%", ToastIcon.BrightnessUp); + Program.toast.RunToast(ScreenBrightness.Adjust(+10) + "%", ToastIcon.BrightnessUp); HandleOptimizationEvent(32); break; case Keys.F9: @@ -330,7 +278,7 @@ namespace GHelper.Input NativeMethods.TurnOffScreen(Program.settingsForm.Handle); break; case "miniled": - Program.settingsForm.BeginInvoke(Program.settingsForm.ToogleMiniled); + screenControl.ToogleMiniled(); break; case "aura": Program.settingsForm.BeginInvoke(Program.settingsForm.CycleAuraMode); @@ -353,7 +301,7 @@ namespace GHelper.Input var commDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Communications); bool muteStatus = !commDevice.AudioEndpointVolume.Mute; commDevice.AudioEndpointVolume.Mute = muteStatus; - toast.RunToast(muteStatus ? "Muted" : "Unmuted", muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone); + Program.toast.RunToast(muteStatus ? "Muted" : "Unmuted", muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone); } break; case "brightness_up": @@ -389,7 +337,7 @@ namespace GHelper.Input else Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys); - toast.RunToast("Fn-Lock " + (fnLock == 1 ? "On" : "Off"), ToastIcon.FnLock); + Program.toast.RunToast("Fn-Lock " + (fnLock == 1 ? "On" : "Off"), ToastIcon.FnLock); } public static void TabletMode() @@ -444,14 +392,11 @@ namespace GHelper.Input } if (!OptimizationService.IsRunning()) - HandleOptimizationEvent(EventID); - // Asus Optimization service Events - - } + // Asus Optimization service Events static void HandleOptimizationEvent(int EventID) { switch (EventID) @@ -465,7 +410,7 @@ namespace GHelper.Input case 107: // FN+F10 bool touchpadState = GetTouchpadState(); AsusUSB.TouchpadToggle(); - toast.RunToast(touchpadState ? "Off" : "On", ToastIcon.Touchpad); + Program.toast.RunToast(touchpadState ? "Off" : "On", ToastIcon.Touchpad); break; case 108: // FN+F11 Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.KB_Sleep, "Sleep"); @@ -518,7 +463,7 @@ namespace GHelper.Input { AsusUSB.ApplyBrightness(backlight, "HotKey"); string[] backlightNames = new string[] { "Off", "Low", "Mid", "Max" }; - toast.RunToast(backlightNames[backlight], delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown); + Program.toast.RunToast(backlightNames[backlight], delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown); } } diff --git a/app/Input/KeyboardListener.cs b/app/Input/KeyboardListener.cs new file mode 100644 index 00000000..6e182e9b --- /dev/null +++ b/app/Input/KeyboardListener.cs @@ -0,0 +1,56 @@ +using HidLibrary; + +namespace GHelper.Input +{ + public class KeyboardListener + { + + CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); + + public KeyboardListener(Action KeyHandler) + { + HidDevice? input = AsusUSB.GetDevice(); + if (input == null) return; + + Logger.WriteLine($"Input: {input.DevicePath}"); + + var task = Task.Run(() => + { + try + { + while (!cancellationTokenSource.Token.IsCancellationRequested) + { + + // Emergency break + if (input == null || !input.IsConnected) + { + Logger.WriteLine("Listener terminated"); + break; + } + + var data = input.Read().Data; + if (data.Length > 1 && data[0] == AsusUSB.INPUT_HID_ID && data[1] > 0 && data[1] != 236) + { + Logger.WriteLine($"Key: {data[1]}"); + KeyHandler(data[1]); + } + } + + Logger.WriteLine("Listener stopped"); + + } + catch (Exception ex) + { + Logger.WriteLine(ex.ToString()); + } + }); + + + } + + public void Dispose() + { + cancellationTokenSource?.Cancel(); + } + } +} diff --git a/app/Mode/ModeControl.cs b/app/Mode/ModeControl.cs index 62673b39..99ba61a0 100644 --- a/app/Mode/ModeControl.cs +++ b/app/Mode/ModeControl.cs @@ -8,7 +8,6 @@ namespace GHelper.Mode { static SettingsForm settings = Program.settingsForm; - static ToastForm toast = new ToastForm(); private static bool customFans = false; private static int customPower = 0; @@ -46,7 +45,7 @@ namespace GHelper.Mode if (AppConfig.Is("xgm_fan") && Program.acpi.IsXGConnected()) AsusUSB.ResetXGM(); if (notify) - toast.RunToast(Modes.GetCurrentName(), SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online ? ToastIcon.Charger : ToastIcon.Battery); + Program.toast.RunToast(Modes.GetCurrentName(), SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online ? ToastIcon.Charger : ToastIcon.Battery); SetGPUClocks(); AutoFans(); diff --git a/app/Program.cs b/app/Program.cs index 21cd5598..13e53f8b 100644 --- a/app/Program.cs +++ b/app/Program.cs @@ -2,6 +2,7 @@ using GHelper.Gpu; using GHelper.Helpers; using GHelper.Input; using GHelper.Mode; +using GHelper.Display; using Microsoft.Win32; using Ryzen; using System.Diagnostics; @@ -26,6 +27,9 @@ namespace GHelper public static SettingsForm settingsForm = new SettingsForm(); public static ModeControl modeControl = new ModeControl(); public static GPUModeControl gpuControl = new GPUModeControl(); + public static ScreenControl screenControl = new ScreenControl(); + + public static ToastForm toast = new ToastForm(); public static IntPtr unRegPowerNotify; @@ -159,7 +163,7 @@ namespace GHelper if (!switched) { gpuControl.InitGPUMode(); - settingsForm.AutoScreen(); + screenControl.AutoScreen(); } settingsForm.AutoKeyboard(); diff --git a/app/Settings.cs b/app/Settings.cs index e4930cc1..accc7fa5 100644 --- a/app/Settings.cs +++ b/app/Settings.cs @@ -3,6 +3,7 @@ using GHelper.Gpu; using GHelper.Helpers; using GHelper.Input; using GHelper.Mode; +using GHelper.Display; using GHelper.UI; using System.Diagnostics; using System.Net; @@ -21,6 +22,7 @@ namespace GHelper ModeControl modeControl = new ModeControl(); GPUModeControl gpuControl = new GPUModeControl(); + ScreenControl screenControl = new ScreenControl(); public static System.Timers.Timer aTimer = default!; public string versionUrl = "http://github.com/seerge/g-helper/releases"; @@ -190,7 +192,7 @@ namespace GHelper aTimer.Enabled = this.Visible; if (this.Visible) { - InitScreen(); + screenControl.InitScreen(); gpuControl.InitXGM(); // Run update once per 12 hours @@ -537,8 +539,7 @@ namespace GHelper private void ButtonScreenAuto_Click(object? sender, EventArgs e) { AppConfig.Set("screen_auto", 1); - InitScreen(); - AutoScreen(); + screenControl.AutoScreen(); } @@ -779,76 +780,26 @@ namespace GHelper private void Button120Hz_Click(object? sender, EventArgs e) { AppConfig.Set("screen_auto", 0); - SetScreen(1000, 1); + screenControl.SetScreen(1000, 1); } private void Button60Hz_Click(object? sender, EventArgs e) { AppConfig.Set("screen_auto", 0); - SetScreen(60, 0); + screenControl.SetScreen(60, 0); } - public void ToogleMiniled() - { - int miniled = (AppConfig.Get("miniled") == 1) ? 0 : 1; - AppConfig.Set("miniled", miniled); - SetScreen(-1, -1, miniled); - } private void ButtonMiniled_Click(object? sender, EventArgs e) { - ToogleMiniled(); + screenControl.ToogleMiniled(); } - public void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1) + + + public void VisualiseScreen(bool screenEnabled, bool screenAuto, int frequency, int maxFrequency, int overdrive, bool overdriveSetting, int miniled) { - if (NativeMethods.GetRefreshRate() < 0) // Laptop screen not detected or has unknown refresh rate - { - InitScreen(); - return; - } - - if (frequency >= 1000) - { - frequency = NativeMethods.GetRefreshRate(true); - } - - if (frequency > 0) - { - NativeMethods.SetRefreshRate(frequency); - } - - if (overdrive >= 0) - { - if (AppConfig.Get("no_overdrive") == 1) overdrive = 0; - Program.acpi.DeviceSet(AsusACPI.ScreenOverdrive, overdrive, "ScreenOverdrive"); - - } - - if (miniled >= 0) - { - Program.acpi.DeviceSet(AsusACPI.ScreenMiniled, miniled, "Miniled"); - Debug.WriteLine("Miniled " + miniled); - } - - InitScreen(); - } - - public void InitScreen() - { - - int frequency = NativeMethods.GetRefreshRate(); - int maxFrequency = NativeMethods.GetRefreshRate(true); - - bool screenAuto = AppConfig.Is("screen_auto"); - bool overdriveSetting = (AppConfig.Get("no_overdrive") != 1); - - int overdrive = Program.acpi.DeviceGet(AsusACPI.ScreenOverdrive); - int miniled = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled); - - bool screenEnabled = (frequency >= 0); - ButtonEnabled(button60Hz, screenEnabled); ButtonEnabled(button120Hz, screenEnabled); ButtonEnabled(buttonScreenAuto, screenEnabled); @@ -888,15 +839,12 @@ namespace GHelper if (miniled >= 0) { buttonMiniled.Activated = (miniled == 1); - AppConfig.Set("miniled", miniled); } else { buttonMiniled.Visible = false; } - AppConfig.Set("frequency", frequency); - AppConfig.Set("overdrive", overdrive); } private void ButtonQuit_Click(object? sender, EventArgs e) @@ -914,9 +862,6 @@ namespace GHelper if (keyb != null && keyb.Text != "") keyb.Close(); } - public void CloseOthers() - { - } private void SettingsForm_FormClosing(object? sender, FormClosingEventArgs e) { @@ -1058,24 +1003,6 @@ namespace GHelper } - public void AutoScreen(bool force = false) - { - if (force || AppConfig.Is("screen_auto")) - { - if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online) - SetScreen(1000, 1); - else - SetScreen(60, 0); - } - else - { - SetScreen(overdrive: AppConfig.Get("overdrive")); - } - - - - } - public void VisualizeXGM(bool connected, bool activated) { @@ -1113,10 +1040,12 @@ namespace GHelper public void HideGPUModes() { isGpuSection = false; + buttonEco.Visible = false; buttonStandard.Visible = false; buttonUltimate.Visible = false; buttonOptimized.Visible = false; + buttonStopGPU.Visible = true; SetContextMenu();