Compare commits

..

21 Commits

Author SHA1 Message Date
Serge
8c5f4aa0f3 Handheld form behavior 2024-01-27 12:06:46 +01:00
Serge
6f861957df Version Bump 2024-01-27 11:51:27 +01:00
Serge
8884b0d844 XBox controller toggle 2024-01-27 11:50:13 +01:00
Serge
2987d750e3 XBox controller disable / enable toggle 2024-01-27 11:44:07 +01:00
Serge
b5e160bc00 Bindings UI 2024-01-26 21:23:22 +01:00
Serge
fb33f426d3 Binding UI 2024-01-26 20:43:51 +01:00
Serge
163b35d6b0 Advanced Settings Plugin downloader fixes 2024-01-26 18:21:47 +01:00
Serge
325c6ff3ea Advanced Settings Plugin downloader tweaks 2024-01-26 18:10:11 +01:00
Serge
7b34ec4a8c Update release.yml 2024-01-26 17:59:29 +01:00
Serge
31b535a582 Update README.md 2024-01-26 17:52:37 +01:00
Serge
1fa2442023 Update README.md 2024-01-26 17:15:29 +01:00
Serge
39cc2b7563 Update README.md 2024-01-26 17:14:56 +01:00
Serge
8a37520453 Advanced Settings Plugin downloader 2024-01-26 15:01:14 +01:00
Serge
fbfbe8e730 Ally Backlight control 2024-01-25 16:54:34 +01:00
Serge
545e2cc705 Update feature_request.yml 2024-01-25 11:40:54 +01:00
Serge
a27b02ff62 Delete .github/ISSUE_TEMPLATE/feature_request.md 2024-01-25 11:35:35 +01:00
Serge
06bfe8361d Create feature_request.yml 2024-01-25 11:35:16 +01:00
Serge
8531d903bb Minor tweaks 2024-01-24 23:00:06 +01:00
Serge
a3768bcedf Anime Matrix tweaks https://github.com/seerge/g-helper/issues/1648 2024-01-24 18:49:57 +01:00
Serge
ef1a823294 Update README.md 2024-01-23 13:17:00 +01:00
Serge
5e49c2e699 Update README.md 2024-01-23 13:16:40 +01:00
27 changed files with 1299 additions and 644 deletions

View File

@@ -1,20 +0,0 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View File

@@ -0,0 +1,46 @@
name: Feature request
description: Suggest an idea for this project
body:
- type: checkboxes
id: rules
attributes:
label: Rules
options:
- label: I made myself familiar with the <a href='https://github.com/seerge/g-helper?tab=readme-ov-file'>Readme</a>, <a href='https://github.com/seerge/g-helper/wiki/FAQ'>FAQ</a> and <a href='https://github.com/seerge/g-helper/wiki/Troubleshooting'>Troubleshooting</a>.
required: true
- label: I understand that, if insufficient information will be provided, my issue will be closed without an answer.
required: true
validations:
required: true
- type: textarea
id: description
attributes:
label: Is your feature request related to a problem? Please describe
placeholder: A clear and concise description of what the problem is.
validations:
required: true
- type: textarea
id: solution
attributes:
label: Describe the solution you'd like
placeholder: A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered
placeholder: A clear and concise description of any alternative solutions or features you've considered.
- type: input
id: device
attributes:
label: Device and Model
description: Which laptop do you use?
placeholder: e.g. Asus Zephyrus G14 GA404RK
validations:
required: true
- type: textarea
id: additional
attributes:
label: Additional information.
placeholder: If applicable, add screenshots or other relevant information

View File

@@ -22,9 +22,10 @@ jobs:
- name: Publish
run: |
dotnet publish app/GHelper.sln --configuration Release --runtime win-x64 -p:PublishSingleFile=true --no-self-contained
powershell Compress-Archive app/bin/x64/Release/net7.0-windows/win-x64/publish/* GHelper.zip
powershell Compress-Archive app/bin/x64/Release/net7.0-windows/win-x64/publish/GHelper.exe GHelper.zip
powershell Compress-Archive app/bin/x64/Release/net7.0-windows/win-x64/publish/WinRing* PluginAdvancedSettings.zip
- name: Upload
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release upload ${{ github.ref_name }} GHelper.zip
gh release upload ${{ github.ref_name }} GHelper.zip PluginAdvancedSettings.zip

View File

@@ -1,5 +1,6 @@
using GHelper.Gpu.AMD;
using GHelper.Input;
using GHelper.Mode;
using GHelper.USB;
using HidSharp;
using System.Text;
@@ -509,6 +510,11 @@ namespace GHelper.Ally
}
public static void ApplyXBoxStatus()
{
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xD1, 0x0B, 0x01, AppConfig.Is("controller_disabled") ? (byte)0x02 : (byte)0x01 }, "Status");
}
public static void ApplyMode(ControllerMode applyMode = ControllerMode.Auto)
{
Task.Run(() =>
@@ -536,7 +542,7 @@ namespace GHelper.Ally
InputDispatcher.SetBacklightAuto(true);
WakeUp();
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xd1, 0x01, 0x01, (byte)_applyMode }, "Controller");
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xD1, 0x01, 0x01, (byte)_applyMode }, "Controller");
AsusHid.WriteInput(CommandSave, null);
BindZone(BindingZone.M1M2);
@@ -580,7 +586,6 @@ namespace GHelper.Ally
public void ToggleMode()
{
switch (_mode)
{
case ControllerMode.Auto:
@@ -596,7 +601,6 @@ namespace GHelper.Ally
SetMode(ControllerMode.Auto);
break;
}
}
}

View File

@@ -4,7 +4,6 @@ using Starlight.AnimeMatrix;
using System.Diagnostics;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Timers;
namespace GHelper.AnimeMatrix
@@ -69,49 +68,51 @@ namespace GHelper.AnimeMatrix
StopMatrixTimer();
StopMatrixAudio();
try
Task.Run(() =>
{
device.SetProvider();
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
return;
}
if (wakeUp && AppConfig.ContainsModel("401")) device.WakeUp();
if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online))
{
device.SetDisplayState(false);
device.SetDisplayState(false); // some devices are dumb
Logger.WriteLine("Matrix Off");
}
else
{
device.SetDisplayState(true);
device.SetBrightness((BrightnessMode)brightness);
switch (running)
try
{
case 2:
SetMatrixPicture(AppConfig.GetString("matrix_picture"));
break;
case 3:
SetMatrixClock();
break;
case 4:
SetMatrixAudio();
break;
default:
device.SetBuiltInAnimation(true, animation);
Logger.WriteLine("Matrix builtin " + animation.AsByte);
break;
device.SetProvider();
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
return;
}
//mat.SetBrightness((BrightnessMode)brightness);
}
if (wakeUp && AppConfig.ContainsModel("401")) device.WakeUp();
if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online))
{
device.SetDisplayState(false);
device.SetDisplayState(false); // some devices are dumb
Logger.WriteLine("Matrix Off");
}
else
{
device.SetDisplayState(true);
device.SetBrightness((BrightnessMode)brightness);
switch (running)
{
case 2:
SetMatrixPicture(AppConfig.GetString("matrix_picture"));
break;
case 3:
SetMatrixClock();
break;
case 4:
SetMatrixAudio();
break;
default:
device.SetBuiltInAnimation(true, animation);
Logger.WriteLine("Matrix builtin " + animation.AsByte);
break;
}
}
});
}
private void StartMatrixTimer(int interval = 100)
@@ -358,10 +359,10 @@ namespace GHelper.AnimeMatrix
int matrixZoom = AppConfig.Get("matrix_zoom", 100);
int matrixContrast = AppConfig.Get("matrix_contrast", 100);
int matrixSpeed = AppConfig.Get("matrix_speed", 50);
MatrixRotation rotation = (MatrixRotation)AppConfig.Get("matrix_rotation", 0);
MatrixRotation rotation = (MatrixRotation)AppConfig.Get("matrix_rotation", 0);
InterpolationMode matrixQuality = (InterpolationMode)AppConfig.Get("matrix_quality", 0);
@@ -382,7 +383,7 @@ namespace GHelper.AnimeMatrix
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
else
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
device.AddFrame();
}

View File

@@ -3,7 +3,6 @@
using GHelper.AnimeMatrix.Communication;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Management;
using System.Text;
namespace Starlight.AnimeMatrix
@@ -107,9 +106,7 @@ namespace Starlight.AnimeMatrix
public AnimeMatrixDevice() : base(0x0B05, 0x193B, 640)
{
string model = GetModel();
if (model.Contains("401"))
if (AppConfig.ContainsModel("401"))
{
_model = AnimeType.GA401;
@@ -124,7 +121,7 @@ namespace Starlight.AnimeMatrix
LedStart = 1;
}
if (model.Contains("GU604"))
if (AppConfig.ContainsModel("GU604"))
{
_model = AnimeType.GU604;
@@ -154,18 +151,6 @@ namespace Starlight.AnimeMatrix
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
}
public string GetModel()
{
using (var searcher = new ManagementObjectSearcher(@"Select * from Win32_ComputerSystem"))
{
foreach (var process in searcher.Get())
return process["Model"].ToString();
}
return null;
}
public byte[] GetBuffer()
{
return _displayBuffer;
@@ -408,7 +393,7 @@ namespace Starlight.AnimeMatrix
var pixel = bmp.GetPixel(x, y);
var color = Math.Min((pixel.R + pixel.G + pixel.B) * contrast / 300, 255);
if (color > 20)
SetLedDiagonal(x, y, (byte)color, deltaX + (FullRows / 2) + 1, deltaY - (FullRows / 2) - 1);
SetLedDiagonal(x, y, (byte)color, deltaX, deltaY - (FullRows / 2) - 1);
}
}
}
@@ -431,7 +416,7 @@ namespace Starlight.AnimeMatrix
public void Text(string text, float fontSize = 10, int x = 0, int y = 0)
{
int width = MaxRows - FullRows;
int width = MaxRows;
int height = MaxRows - FullRows;
int textHeight, textWidth;
@@ -452,7 +437,7 @@ namespace Starlight.AnimeMatrix
}
}
SetBitmapDiagonal(bmp, 5 , height);
SetBitmapDiagonal(bmp, 5, height);
}
}
@@ -501,8 +486,11 @@ namespace Starlight.AnimeMatrix
public void GenerateFrameDiagonal(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default, int contrast = 100)
{
int width = MaxRows - FullRows;
int height = MaxRows - FullRows*2;
int width = MaxRows + FullRows;
int height = MaxColumns + FullRows;
if ((image.Height / image.Width) > (height / width)) height = MaxColumns;
float scale;
using (Bitmap bmp = new Bitmap(width, height))
@@ -518,7 +506,7 @@ namespace Starlight.AnimeMatrix
graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, width - scaleWidth, height - scaleHeight, scaleWidth, scaleHeight);
graph.DrawImage(image, (width - scaleWidth) / 2, height - scaleHeight, scaleWidth, scaleHeight);
}

View File

@@ -412,6 +412,11 @@ public static class AppConfig
return ContainsModel("X13");
}
public static bool IsG14AMD()
{
return ContainsModel("GA402R");
}
public static bool DynamicBoost5()
{
return ContainsModel("GZ301ZE");

View File

@@ -133,7 +133,7 @@ public class AsusACPI
public const int MinTotal = 5;
public static int MaxTotal = 150;
public static int DefaultTotal = 125;
public static int DefaultTotal = 80;
public const int MinCPU = 5;
public const int MaxCPU = 100;
@@ -251,6 +251,11 @@ public class AsusACPI
MaxTotal = 250;
}
if (AppConfig.IsG14AMD())
{
DefaultTotal = 125;
}
if (AppConfig.IsX13())
{
MaxTotal = 75;

View File

@@ -101,13 +101,12 @@ namespace GHelper.Display
int miniled1 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled1);
int miniled2 = Program.acpi.DeviceGet(AsusACPI.ScreenMiniled2);
Logger.WriteLine($"Miniled: {miniled1} {miniled2}");
int miniled = (miniled1 >= 0) ? miniled1 : miniled2;
bool hdr = false;
if (miniled >= 0)
{
Logger.WriteLine($"Miniled: {miniled1} {miniled2}");
AppConfig.Set("miniled", miniled);
hdr = ScreenCCD.GetHDRStatus();
}

View File

@@ -13,7 +13,6 @@ namespace GHelper
{
ScreenControl screenControl = new ScreenControl();
ModeControl modeControl = new ModeControl();
ClamshellModeControl clamshellControl = new ClamshellModeControl();
const string EMPTY = "--------------";
@@ -228,6 +227,8 @@ namespace GHelper
checkGpuApps.Visible = false;
checkUSBC.Visible = false;
checkAutoToggleClamshellMode.Visible = false;
checkNoOverdrive.Visible = false;
int apuMem = Program.acpi.GetAPUMem();
if (apuMem >= 0)

106
app/Fans.Designer.cs generated
View File

@@ -31,14 +31,14 @@ namespace GHelper
/// </summary>
private void InitializeComponent()
{
ChartArea chartArea5 = new ChartArea();
Title title5 = new Title();
ChartArea chartArea6 = new ChartArea();
Title title6 = new Title();
ChartArea chartArea7 = new ChartArea();
Title title7 = new Title();
ChartArea chartArea8 = new ChartArea();
Title title8 = new Title();
ChartArea chartArea1 = new ChartArea();
Title title1 = new Title();
ChartArea chartArea2 = new ChartArea();
Title title2 = new Title();
ChartArea chartArea3 = new ChartArea();
Title title3 = new Title();
ChartArea chartArea4 = new ChartArea();
Title title4 = new Title();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Fans));
panelFans = new Panel();
labelTip = new Label();
@@ -85,6 +85,8 @@ namespace GHelper
panelTitleTemp = new Panel();
pictureTemp = new PictureBox();
labelTempLimit = new Label();
panelDownload = new Panel();
buttonDownload = new RButton();
panelPower = new Panel();
panelApplyPower = new Panel();
checkApplyPower = new RCheckBox();
@@ -168,6 +170,7 @@ namespace GHelper
((System.ComponentModel.ISupportInitialize)trackTemp).BeginInit();
panelTitleTemp.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureTemp).BeginInit();
panelDownload.SuspendLayout();
panelPower.SuspendLayout();
panelApplyPower.SuspendLayout();
panelCPU.SuspendLayout();
@@ -257,8 +260,8 @@ namespace GHelper
//
// chartGPU
//
chartArea5.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea5);
chartArea1.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea1);
chartGPU.Dock = DockStyle.Fill;
chartGPU.Location = new Point(12, 493);
chartGPU.Margin = new Padding(2, 10, 2, 10);
@@ -266,13 +269,13 @@ namespace GHelper
chartGPU.Size = new Size(782, 463);
chartGPU.TabIndex = 17;
chartGPU.Text = "chartGPU";
title5.Name = "Title1";
chartGPU.Titles.Add(title5);
title1.Name = "Title1";
chartGPU.Titles.Add(title1);
//
// chartCPU
//
chartArea6.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea6);
chartArea2.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea2);
chartCPU.Dock = DockStyle.Fill;
chartCPU.Location = new Point(12, 10);
chartCPU.Margin = new Padding(2, 10, 2, 10);
@@ -280,13 +283,13 @@ namespace GHelper
chartCPU.Size = new Size(782, 463);
chartCPU.TabIndex = 14;
chartCPU.Text = "chartCPU";
title6.Name = "Title1";
chartCPU.Titles.Add(title6);
title2.Name = "Title1";
chartCPU.Titles.Add(title2);
//
// chartXGM
//
chartArea7.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea7);
chartArea3.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea3);
chartXGM.Dock = DockStyle.Fill;
chartXGM.Location = new Point(12, 1459);
chartXGM.Margin = new Padding(2, 10, 2, 10);
@@ -294,14 +297,14 @@ namespace GHelper
chartXGM.Size = new Size(782, 463);
chartXGM.TabIndex = 14;
chartXGM.Text = "chartXGM";
title7.Name = "Title4";
chartXGM.Titles.Add(title7);
title3.Name = "Title4";
chartXGM.Titles.Add(title3);
chartXGM.Visible = false;
//
// chartMid
//
chartArea8.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea8);
chartArea4.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea4);
chartMid.Dock = DockStyle.Fill;
chartMid.Location = new Point(12, 976);
chartMid.Margin = new Padding(2, 10, 2, 10);
@@ -309,8 +312,8 @@ namespace GHelper
chartMid.Size = new Size(782, 463);
chartMid.TabIndex = 14;
chartMid.Text = "chartMid";
title8.Name = "Title3";
chartMid.Titles.Add(title8);
title4.Name = "Title3";
chartMid.Titles.Add(title4);
chartMid.Visible = false;
//
// panelTitleFans
@@ -528,10 +531,11 @@ namespace GHelper
panelAdvanced.Controls.Add(panelTitleAdvanced);
panelAdvanced.Controls.Add(panelTemperature);
panelAdvanced.Controls.Add(panelTitleTemp);
panelAdvanced.Controls.Add(panelDownload);
panelAdvanced.Dock = DockStyle.Top;
panelAdvanced.Location = new Point(10, 1644);
panelAdvanced.Name = "panelAdvanced";
panelAdvanced.Size = new Size(520, 888);
panelAdvanced.Size = new Size(520, 992);
panelAdvanced.TabIndex = 14;
panelAdvanced.Visible = false;
//
@@ -540,7 +544,7 @@ namespace GHelper
panelAdvancedAlways.AutoSize = true;
panelAdvancedAlways.Controls.Add(checkApplyUV);
panelAdvancedAlways.Dock = DockStyle.Top;
panelAdvancedAlways.Location = new Point(0, 827);
panelAdvancedAlways.Location = new Point(0, 931);
panelAdvancedAlways.Name = "panelAdvancedAlways";
panelAdvancedAlways.Padding = new Padding(16, 0, 16, 15);
panelAdvancedAlways.Size = new Size(520, 61);
@@ -566,7 +570,7 @@ namespace GHelper
panelAdvancedApply.AutoSize = true;
panelAdvancedApply.Controls.Add(buttonApplyAdvanced);
panelAdvancedApply.Dock = DockStyle.Top;
panelAdvancedApply.Location = new Point(0, 747);
panelAdvancedApply.Location = new Point(0, 851);
panelAdvancedApply.Name = "panelAdvancedApply";
panelAdvancedApply.Padding = new Padding(15);
panelAdvancedApply.Size = new Size(520, 80);
@@ -595,7 +599,7 @@ namespace GHelper
labelRisky.BackColor = Color.IndianRed;
labelRisky.Dock = DockStyle.Top;
labelRisky.ForeColor = SystemColors.ControlLightLight;
labelRisky.Location = new Point(0, 504);
labelRisky.Location = new Point(0, 608);
labelRisky.Margin = new Padding(0);
labelRisky.Name = "labelRisky";
labelRisky.Padding = new Padding(10, 10, 10, 5);
@@ -611,7 +615,7 @@ namespace GHelper
panelUViGPU.Controls.Add(labelLeftUViGPU);
panelUViGPU.Controls.Add(trackUViGPU);
panelUViGPU.Dock = DockStyle.Top;
panelUViGPU.Location = new Point(0, 380);
panelUViGPU.Location = new Point(0, 484);
panelUViGPU.Margin = new Padding(4);
panelUViGPU.MaximumSize = new Size(0, 124);
panelUViGPU.Name = "panelUViGPU";
@@ -659,7 +663,7 @@ namespace GHelper
panelUV.Controls.Add(labelLeftUV);
panelUV.Controls.Add(trackUV);
panelUV.Dock = DockStyle.Top;
panelUV.Location = new Point(0, 256);
panelUV.Location = new Point(0, 360);
panelUV.Margin = new Padding(4);
panelUV.MaximumSize = new Size(0, 124);
panelUV.Name = "panelUV";
@@ -704,7 +708,7 @@ namespace GHelper
panelTitleAdvanced.Controls.Add(pictureUV);
panelTitleAdvanced.Controls.Add(labelTitleUV);
panelTitleAdvanced.Dock = DockStyle.Top;
panelTitleAdvanced.Location = new Point(0, 190);
panelTitleAdvanced.Location = new Point(0, 294);
panelTitleAdvanced.Name = "panelTitleAdvanced";
panelTitleAdvanced.Size = new Size(520, 66);
panelTitleAdvanced.TabIndex = 48;
@@ -740,7 +744,7 @@ namespace GHelper
panelTemperature.Controls.Add(labelLeftTemp);
panelTemperature.Controls.Add(trackTemp);
panelTemperature.Dock = DockStyle.Top;
panelTemperature.Location = new Point(0, 66);
panelTemperature.Location = new Point(0, 170);
panelTemperature.Margin = new Padding(4);
panelTemperature.MaximumSize = new Size(0, 124);
panelTemperature.Name = "panelTemperature";
@@ -785,7 +789,7 @@ namespace GHelper
panelTitleTemp.Controls.Add(pictureTemp);
panelTitleTemp.Controls.Add(labelTempLimit);
panelTitleTemp.Dock = DockStyle.Top;
panelTitleTemp.Location = new Point(0, 0);
panelTitleTemp.Location = new Point(0, 104);
panelTitleTemp.Name = "panelTitleTemp";
panelTitleTemp.Size = new Size(520, 66);
panelTitleTemp.TabIndex = 50;
@@ -813,6 +817,38 @@ namespace GHelper
labelTempLimit.TabIndex = 47;
labelTempLimit.Text = "Temp Limit";
//
// panelDownload
//
panelDownload.AutoSize = true;
panelDownload.Controls.Add(buttonDownload);
panelDownload.Dock = DockStyle.Top;
panelDownload.Location = new Point(0, 0);
panelDownload.Name = "panelDownload";
panelDownload.Padding = new Padding(20);
panelDownload.Size = new Size(520, 104);
panelDownload.TabIndex = 52;
panelDownload.Visible = false;
//
// buttonDownload
//
buttonDownload.Activated = false;
buttonDownload.AutoSize = true;
buttonDownload.AutoSizeMode = AutoSizeMode.GrowAndShrink;
buttonDownload.BackColor = SystemColors.ControlLight;
buttonDownload.BorderColor = Color.Transparent;
buttonDownload.BorderRadius = 2;
buttonDownload.Dock = DockStyle.Top;
buttonDownload.FlatStyle = FlatStyle.Flat;
buttonDownload.Location = new Point(20, 20);
buttonDownload.Margin = new Padding(20);
buttonDownload.Name = "buttonDownload";
buttonDownload.Padding = new Padding(10);
buttonDownload.Secondary = true;
buttonDownload.Size = new Size(480, 64);
buttonDownload.TabIndex = 19;
buttonDownload.Text = "Download Advanced Settings Plugin";
buttonDownload.UseVisualStyleBackColor = false;
//
// panelPower
//
panelPower.AutoSize = true;
@@ -1634,6 +1670,8 @@ namespace GHelper
panelTitleTemp.ResumeLayout(false);
panelTitleTemp.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureTemp).EndInit();
panelDownload.ResumeLayout(false);
panelDownload.PerformLayout();
panelPower.ResumeLayout(false);
panelPower.PerformLayout();
panelApplyPower.ResumeLayout(false);
@@ -1793,5 +1831,7 @@ namespace GHelper
private Label labelSlow;
private Label labelLeftSlow;
private TrackBar trackSlow;
private Panel panelDownload;
private RButton buttonDownload;
}
}

View File

@@ -213,6 +213,8 @@ namespace GHelper
buttonCalibrate.Click += ButtonCalibrate_Click;
buttonDownload.Click += ButtonDownload_Click;
ToggleNavigation(0);
if (Program.acpi.DeviceGet(AsusACPI.DevsCPUFanCurve) < 0) buttonCalibrate.Visible = false;
@@ -221,7 +223,21 @@ namespace GHelper
}
private void ButtonDownload_Click(object? sender, EventArgs e)
{
RyzenControl.DownloadRing();
panelAdvancedAlways.Visible = true;
panelAdvancedApply.Visible = true;
labelRisky.Visible = true;
panelUViGPU.Visible = true;
panelUV.Visible = true;
panelTitleAdvanced.Visible = true;
panelTemperature.Visible = true;
panelTitleTemp.Visible = true;
VisualiseAdvanced();
}
private void ButtonCalibrate_Click(object? sender, EventArgs e)
{
@@ -365,6 +381,24 @@ namespace GHelper
private void VisualiseAdvanced()
{
if (!RyzenControl.IsRingExsists())
{
panelTitleAdvanced.Visible = false;
labelRisky.Visible = false;
panelUV.Visible = false;
panelUViGPU.Visible = false;
panelTitleTemp.Visible = false;
panelTemperature.Visible = false;
panelAdvancedAlways.Visible = false;
panelAdvancedApply.Visible = false;
panelDownload.Visible = true;
} else
{
panelDownload.Visible = false;
}
if (!RyzenControl.IsSupportedUV())
{
panelTitleAdvanced.Visible = false;

View File

@@ -15,7 +15,7 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<AssemblyVersion>0.149</AssemblyVersion>
<AssemblyVersion>0.150</AssemblyVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

1273
app/Handheld.Designer.cs generated

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,9 @@ namespace GHelper
public partial class Handheld : RForm
{
static string activeBinding = "";
static RButton? activeButton;
public Handheld()
{
InitializeComponent();
@@ -41,80 +44,131 @@ namespace GHelper
trackVibra.ValueChanged += Controller_Complete;
FillBinding("m1", "M1");
FillBinding("m2", "M2");
ButtonBinding("m1", "M1", buttonM1);
ButtonBinding("m2", "M2", buttonM2);
FillBinding("a", "A");
FillBinding("b", "B");
FillBinding("x", "X");
FillBinding("y", "Y");
ButtonBinding("a", "A", buttonA);
ButtonBinding("b", "B", buttonB);
ButtonBinding("x", "X", buttonX);
ButtonBinding("y", "Y", buttonY);
FillBinding("du", "DPadUp");
FillBinding("dd", "DPadDown");
FillBinding("dl", "DPadLeft");
FillBinding("dr", "DPadRight");
ButtonBinding("du", "DPad Up", buttonDPU);
ButtonBinding("dd", "DPad Down", buttonDPD);
FillBinding("rb", "RBumper");
FillBinding("lb", "LBumper");
ButtonBinding("dl", "DPad Left", buttonDPL);
ButtonBinding("dr", "DPad Right", buttonDPR);
FillBinding("rs", "RStick");
FillBinding("ll", "LStick");
ButtonBinding("rt", "Right Trigger", buttonRT);
ButtonBinding("lt", "Left Trigger", buttonLT);
ButtonBinding("rb", "Right Bumper", buttonRB);
ButtonBinding("lb", "Left Bumper", buttonLB);
ButtonBinding("rs", "Right Stick", buttonRS);
ButtonBinding("ll", "Left Stick", buttonLS);
ButtonBinding("vb", "View", buttonView);
ButtonBinding("mb", "Menu", buttonMenu);
ComboBinding(comboPrimary);
ComboBinding(comboSecondary);
checkController.Checked = AppConfig.Is("controller_disabled");
checkController.CheckedChanged += CheckController_CheckedChanged;
FillBinding("vb", "View");
FillBinding("mb", "Menu");
}
private RComboBox ComboBinding(string name, string value)
private void CheckController_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.Set("controller_disabled", checkController.Checked ? 1 : 0);
AllyControl.ApplyXBoxStatus();
}
private void ComboBinding(RComboBox combo)
{
var combo = new RComboBox();
combo.BorderColor = Color.White;
combo.ButtonColor = Color.FromArgb(255, 255, 255);
combo.Dock = DockStyle.Fill;
combo.Name = name;
combo.Margin = new Padding(5, 5, 5, 5);
combo.DropDownStyle = ComboBoxStyle.DropDownList;
combo.DisplayMember = "Value";
combo.ValueMember = "Key";
foreach (var item in AllyControl.BindCodes)
{
combo.Items.Add(new KeyValuePair<string, string>(item.Key, item.Value));
if (item.Key == value) combo.SelectedItem = item;
}
combo.SelectedValueChanged += Binding_SelectedValueChanged;
return combo;
}
private void FillBinding(string binding, string label)
{
tableBindings.RowStyles.Add(new RowStyle(SizeType.AutoSize));
tableBindings.Controls.Add(new Label { Text = label, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 0, tableBindings.RowCount);
tableBindings.Controls.Add(ComboBinding("bind_" + binding, AppConfig.GetString("bind_" + binding, "")), 1, tableBindings.RowCount);
tableBindings.Controls.Add(ComboBinding("bind2_" + binding, AppConfig.GetString("bind2_" + binding, "")), 2, tableBindings.RowCount);
tableBindings.RowCount++;
}
private void Binding_SelectedValueChanged(object? sender, EventArgs e)
{
if (sender is null) return;
RComboBox combo = (RComboBox)sender;
string value = ((KeyValuePair<string, string>)combo.SelectedItem).Key;
string binding = "bind" + (combo.Name == "comboPrimary" ? "" : "2") + "_" + activeBinding;
if (value != "") AppConfig.Set(combo.Name, value);
else AppConfig.Remove(combo.Name);
if (value != "") AppConfig.Set(binding, value);
else AppConfig.Remove(binding);
VisualiseButton(activeButton, activeBinding);
AllyControl.ApplyMode();
}
private void SetComboValue(RComboBox combo, string value)
{
foreach (var item in AllyControl.BindCodes)
if (item.Key == value)
{
combo.SelectedItem = item;
return;
}
combo.SelectedIndex = 0;
}
private void VisualiseButton(RButton button, string binding)
{
if (button == null) return;
string primary = AppConfig.GetString("bind_" + binding, "");
string secondary = AppConfig.GetString("bind2_" + binding, "");
if (primary != "" || secondary != "")
{
button.BorderColor = colorStandard;
button.Activated = true;
}
else
{
button.Activated = false;
}
}
private void ButtonBinding(string binding, string label, RButton button)
{
button.Click += (sender, EventArgs) => { buttonBinding_Click(sender, EventArgs, binding, label); };
VisualiseButton(button, binding);
}
void buttonBinding_Click(object sender, EventArgs e, string binding, string label)
{
if (sender is null) return;
RButton button = (RButton)sender;
panelBinding.Visible = true;
activeButton = button;
activeBinding = binding;
labelBinding.Text = "Binding: " + label;
SetComboValue(comboPrimary, AppConfig.GetString("bind_" + binding, ""));
SetComboValue(comboSecondary, AppConfig.GetString("bind2_" + binding, ""));
}
private void Controller_Complete(object? sender, EventArgs e)
{
AllyControl.SetDeadzones();
@@ -201,5 +255,6 @@ namespace GHelper
Top = Program.settingsForm.Top;
Left = Program.settingsForm.Left - Width - 5;
}
}
}

View File

@@ -69,12 +69,14 @@ namespace GHelper.Helpers
}
public static void DisableClamshellMode()
{
if (PowerNative.GetLidAction(true) == GetDefaultLidAction()) return;
PowerNative.SetLidAction(GetDefaultLidAction(), true);
Logger.WriteLine("Disengaging Clamshell Mode");
}
public static void EnableClamshellMode()
{
if (PowerNative.GetLidAction(true) == 0) return;
PowerNative.SetLidAction(0, true);
Logger.WriteLine("Engaging Clamshell Mode");
}

View File

@@ -37,14 +37,14 @@ namespace GHelper.Helpers
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
public static void RunAsAdmin(string? param = null)
public static void RunAsAdmin(string? param = null, bool force = false)
{
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastAdmin) < 2000) return;
lastAdmin = DateTimeOffset.Now.ToUnixTimeMilliseconds();
// Check if the current user is an administrator
if (!IsUserAdministrator())
if (!IsUserAdministrator() || force)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = true;

View File

@@ -415,6 +415,8 @@ namespace GHelper.Mode
return;
}
if (!RyzenControl.IsRingExsists()) return;
try
{
SetUV(AppConfig.GetMode("cpu_uv", 0));

View File

@@ -60,6 +60,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ally {
get {
object obj = ResourceManager.GetObject("ally", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@@ -680,6 +690,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_xbox_rt_32 {
get {
object obj = ResourceManager.GetObject("icons8-xbox-rt-32", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View File

@@ -136,6 +136,9 @@
<data name="icons8-bicycle-48 (1)" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-bicycle-48 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="standard" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\standard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="eco" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\eco.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -154,8 +157,8 @@
<data name="icons8-controller-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-controller-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_share_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-share-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="icons8-controls-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-controls-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-next-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-next-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -187,6 +190,9 @@
<data name="icons8-laptop-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-laptop-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ally" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ally.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_remove_64" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-remove-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -307,8 +313,8 @@
<data name="icons8_software_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-software-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="standard" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\standard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="icons8_share_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-share-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-soonvibes-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-soonvibes-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -319,7 +325,7 @@
<data name="icons8-charging-battery-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-charging-battery-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-controls-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-controls-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="icons8-xbox-rt-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-xbox-rt-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

BIN
app/Resources/ally.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 B

View File

@@ -4,7 +4,10 @@
//
using GHelper.Helpers;
using System.Management;
using System.Net;
using System.Reflection;
namespace Ryzen
{
@@ -52,7 +55,8 @@ namespace Ryzen
CPUName = obj["Name"].ToString();
CPUModel = obj["Caption"].ToString();
}
} catch (Exception ex)
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
}
@@ -142,6 +146,54 @@ namespace Ryzen
return CPUName.Contains("6900H") || CPUName.Contains("7945H") || CPUName.Contains("7845H");
}
public static bool IsRingExsists()
{
string exeDir = Path.GetDirectoryName(Application.ExecutablePath);
return File.Exists(exeDir + "\\" + "WinRing0x64.dll");
}
public static void DownloadRing()
{
var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString());
string requestUri = "https://github.com/seerge/g-helper/releases/download/v" + appVersion.Major + "." + appVersion.Minor + "/PluginAdvancedSettings.zip";
Uri uri = new Uri(requestUri);
string exeDir = Path.GetDirectoryName(Application.ExecutablePath);
string zipName = Path.GetFileName(uri.LocalPath);
string zipLocation = exeDir + "\\" + zipName;
using (WebClient client = new WebClient())
{
Logger.WriteLine(requestUri);
Logger.WriteLine(exeDir);
Logger.WriteLine(zipName);
try
{
client.DownloadFile(uri, zipLocation);
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
Logger.WriteLine(ex.ToString());
if (!ProcessHelper.IsUserAdministrator() && !ex.Message.Contains("remote server")) ProcessHelper.RunAsAdmin("uv");
return;
}
try
{
System.IO.Compression.ZipFile.ExtractToDirectory(zipLocation, exeDir, overwriteFiles: true);
File.Delete(zipLocation);
ProcessHelper.RunAsAdmin("uv", true);
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
}
}
}
public static void SetAddresses()
{

View File

@@ -1024,6 +1024,7 @@ namespace GHelper
if (extraForm != null && extraForm.Text != "") extraForm.Close();
if (updatesForm != null && updatesForm.Text != "") updatesForm.Close();
if (matrixForm != null && matrixForm.Text != "") matrixForm.Close();
if (handheldForm != null && handheldForm.Text != "") handheldForm.Close();
}
/// <summary>
@@ -1044,6 +1045,7 @@ namespace GHelper
(extraForm != null && extraForm.ContainsFocus) ||
(updatesForm != null && updatesForm.ContainsFocus) ||
(matrixForm != null && matrixForm.ContainsFocus) ||
(handheldForm != null && handheldForm.ContainsFocus) ||
this.ContainsFocus ||
(lostFocusCheck && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastLostFocus) < 300);
}

View File

@@ -21,19 +21,6 @@ namespace GHelper.UI
public static Color chartMain;
public static Color chartGrid;
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
static readonly IntPtr HWND_TOP = new IntPtr(0);
static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
protected override bool ShowWithoutActivation => true;
[DllImport("UXTheme.dll", SetLastError = true, EntryPoint = "#138")]
public static extern bool CheckSystemDarkModeStatus();

View File

@@ -343,7 +343,17 @@ namespace GHelper.USB
if (flags.SleepRear) rear |= 1 << 6;
if (flags.ShutdownRear) rear |= 1 << 7;
return new byte[] { 0x5d, 0xbd, 0x01, keyb, bar, lid, rear, 0xFF };
return new byte[] { AsusHid.AURA_ID, 0xBD, 0x01, keyb, bar, lid, rear, 0xFF };
}
private static void ApplyAllyPower(AuraPower flags)
{
byte power = 0x00;
if (flags.BootKeyb) power |= 0x01;
if (flags.AwakeKeyb) power |= 0x02;
if (flags.SleepKeyb) power |= 0x04;
if (flags.ShutdownKeyb) power |= 0x08;
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xD1, 0x09, 0x01, power }, "Aura");
}
public static void ApplyPower()
@@ -381,6 +391,12 @@ namespace GHelper.USB
flags.SleepRear = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownRear = AppConfig.IsNotFalse("keyboard_shutdown_lid");
if (AppConfig.IsAlly())
{
ApplyAllyPower(flags);
return;
}
AsusHid.Write(AuraPowerMessage(flags));
if (isACPI)

View File

@@ -82,13 +82,6 @@ Each BIOS mode is paired with matching Windows Power Mode. You can adjust this s
![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)
### 🔖 Important Notice
G-Helper is **NOT** an operating system, firmware or a driver. It **DOESN'T** "run" your hardware in realtime anyhow.
It's an app that lets you select (already predefined and stored in BIOS) operating modes and (optionally) set some settings that already exist on your device (same as Armoury Crate). If you use same mode / settings as in Armoury Crate - performance of your device won't be different.
Role of G-Helper for your laptop is similar to a role of a remote control for your TV.
### :mouse: Asus Mouse and other peripherals support
@@ -121,8 +114,13 @@ Huge thanks to [@IceStormNG](https://github.com/IceStormNG) 👑 for contributio
- ``Fn + Shift + F7 / F8`` - Matrix brightness Down / Up
- ``Fn + Shift + F7 / F8`` - Screenpad brightness Down / Up
- ``Ctrl + Shift + F20`` - Mute Microphone
- ``Ctrl + Shift + Alt + F14`` - Eco Mode
- ``Ctrl + Shift + Alt + F15`` - Standard Mode
- ``Ctrl + Shift + Alt + F14`` - Eco GPU Mode
- ``Ctrl + Shift + Alt + F15`` - Standard GPU Mode
- ``Ctrl + Shift + Alt + F16`` - Silent
- ``Ctrl + Shift + Alt + F17`` - Balanced
- ``Ctrl + Shift + Alt + F18`` - Turbo
- ``Ctrl + Shift + Alt + F19`` - Custom 1 (if exists)
- ``Ctrl + Shift + Alt + F20`` - Custom 2 (if exists)
- [Custom keybindings / hotkeys](https://github.com/seerge/g-helper/wiki/Power-user-settings#custom-hotkey-actions)
------------------
@@ -134,14 +132,24 @@ Huge thanks to [@IceStormNG](https://github.com/IceStormNG) 👑 for contributio
------------------
**Libraries and projects used**
### 🔖 Important Notice
G-Helper is **NOT** an operating system, firmware, or driver. It **DOES NOT** "run" your hardware in real-time anyhow.
It's an app that lets you select one of the predefined operating modes created by Asus (and stored in BIOS) and optionally(!) set some settings that already exist on your device same as Armoury Crate can. It does it by using the Asus System Control Interface "driver" that Armoury uses for it.
If you use equivalent mode/settings as in Armoury Crate - the performance or the behavior of your device won't be different.
The role of G-Helper for your laptop is similar to the role of a remote control for your TV.
### Libraries and projects used
- [Linux Kernel](https://github.com/torvalds/linux/blob/master/drivers/platform/x86/asus-wmi.c) for some basic endpoints in ASUS ACPI/WMI interface
- [NvAPIWrapper](https://github.com/falahati/NvAPIWrapper) for accessing Nvidia API
- [Starlight](https://github.com/vddCore/Starlight) for anime matrix communication protocol
- [UXTU](https://github.com/JamesCJ60/Universal-x86-Tuning-Utility) for undervolting using Ryzen System Management Unit
- [AsusCtl](https://gitlab.com/asus-linux/asusctl) for inspiration and some reverse engineering
**Disclaimers**
### Disclaimers
"ROG", "TUF", and "Armoury Crate" are trademarked by and belong to AsusTek Computer, Inc. I make no claims to these or any assets belonging to AsusTek Computer and use them purely for informational purposes only.
THE SOFTWARE IS PROVIDED “AS IS” AND WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. MISUSE OF THIS SOFTWARE COULD CAUSE SYSTEM INSTABILITY OR MALFUNCTION.