Compare commits

...

15 Commits
v0.16 ... v0.22

Author SHA1 Message Date
seerge
43c6def162 Update checker 2023-03-09 20:54:32 +01:00
seerge
306697f026 Added possible fix for bios unsetting ppts after wake up 2023-03-09 16:03:39 +01:00
seerge
c5a32cc9d5 Moved turbo boost checkbox to Fans and Power window 2023-03-09 14:10:13 +01:00
seerge
51acd9a612 Fix for startup checkbox 2023-03-09 11:28:02 +01:00
seerge
457a37049c - 2023-03-08 22:51:33 +01:00
seerge
6d2cece4f2 Merge branch 'main' of https://github.com/seerge/g14-helper 2023-03-08 22:44:16 +01:00
seerge
265611009c Improved internal display detection 2023-03-08 22:44:14 +01:00
seerge
2714b6dca7 Update README.md 2023-03-08 20:04:38 +01:00
seerge
f6de5eba64 Screenshot 2023-03-08 20:03:24 +01:00
seerge
13f7c81689 Fix animatrix 2021 size 2023-03-08 19:43:52 +01:00
seerge
8c0d84b65b Fix for possible animatrix custom picture support on older (2021) models 2023-03-08 19:15:21 +01:00
seerge
4e6fa6d9b0 Auto Apply power limits 2023-03-08 17:25:11 +01:00
seerge
be133cd238 Minor fixes 2023-03-07 21:19:04 +01:00
seerge
30f678d08f Hide unsupported power sliders 2023-03-07 16:10:56 +01:00
seerge
cf201632d5 New built in monitor detection system 2023-03-07 15:23:06 +01:00
13 changed files with 1036 additions and 404 deletions

View File

@@ -42,6 +42,15 @@ public class ASUSWmi
public const int GPUModeUltimate = 2; public const int GPUModeUltimate = 2;
public const int MaxTotal = 150;
public const int MinTotal = 15;
public const int DefaultTotal = 125;
public const int MaxCPU = 90;
public const int MinCPU = 15;
public const int DefaultCPU = 80;
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern IntPtr CreateFile( private static extern IntPtr CreateFile(
string lpFileName, string lpFileName,
@@ -200,7 +209,6 @@ public class ASUSWmi
} }
public void SubscribeToEvents(Action<object, EventArrivedEventArgs> EventHandler) public void SubscribeToEvents(Action<object, EventArrivedEventArgs> EventHandler)
{ {
ManagementEventWatcher watcher = new ManagementEventWatcher(); ManagementEventWatcher watcher = new ManagementEventWatcher();

View File

@@ -3,6 +3,7 @@
using Starlight.Communication; using Starlight.Communication;
using System.Diagnostics; using System.Diagnostics;
using System.Text; using System.Text;
using System.Management;
namespace Starlight.AnimeMatrix namespace Starlight.AnimeMatrix
{ {
@@ -70,16 +71,45 @@ namespace Starlight.AnimeMatrix
private const int UpdatePageLength = 0x0278; private const int UpdatePageLength = 0x0278;
public int LedCount => 1450; public int LedCount => 1450;
public int Rows => 61;
private byte[] _displayBuffer = new byte[UpdatePageLength * 3]; private byte[] _displayBuffer = new byte[UpdatePageLength * 3];
private List<byte[]> frames = new List<byte[]>(); private List<byte[]> frames = new List<byte[]>();
private int pages = 3;
public int MaxColumns = 34;
public int MaxRows = 61;
public int FullRows = 11;
private int frameIndex = 0; private int frameIndex = 0;
public AnimeMatrixDevice() public AnimeMatrixDevice()
: base(0x0B05, 0x193B, 640) : base(0x0B05, 0x193B, 640)
{ {
string model = GetModel();
Debug.WriteLine(model);
if (model is not null && model.Contains("401"))
{
pages = 2;
FullRows = 6;
MaxColumns = 33;
MaxRows = 55;
}
}
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() public byte[] GetBuffer()
@@ -115,12 +145,12 @@ namespace Starlight.AnimeMatrix
public int EmptyColumns(int row) public int EmptyColumns(int row)
{ {
return (int)Math.Ceiling(Math.Max(0, row - 11) / 2.0); return (int)Math.Ceiling(Math.Max(0, row - FullRows) / 2.0);
} }
public int Columns(int row) public int Columns(int row)
{ {
EnsureRowInRange(row); EnsureRowInRange(row);
return 34 - EmptyColumns(row); return MaxColumns - EmptyColumns(row);
} }
public int RowToLinearAddress(int row) public int RowToLinearAddress(int row)
@@ -183,6 +213,7 @@ namespace Starlight.AnimeMatrix
public void Present() public void Present()
{ {
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02) Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
.AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 0 + 1))) .AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 0 + 1)))
.AppendData(BitConverter.GetBytes((ushort)UpdatePageLength)) .AppendData(BitConverter.GetBytes((ushort)UpdatePageLength))
@@ -195,12 +226,13 @@ namespace Starlight.AnimeMatrix
.AppendData(_displayBuffer[(UpdatePageLength * 1)..(UpdatePageLength * 2)]) .AppendData(_displayBuffer[(UpdatePageLength * 1)..(UpdatePageLength * 2)])
); );
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02) if (pages > 2)
.AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 2 + 1))) Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
.AppendData(BitConverter.GetBytes((ushort)(LedCount - UpdatePageLength * 2))) .AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 2 + 1)))
.AppendData( .AppendData(BitConverter.GetBytes((ushort)(LedCount - UpdatePageLength * 2)))
_displayBuffer[(UpdatePageLength * 2)..(UpdatePageLength * 2 + (LedCount - UpdatePageLength * 2))]) .AppendData(
); _displayBuffer[(UpdatePageLength * 2)..(UpdatePageLength * 2 + (LedCount - UpdatePageLength * 2))])
);
Set(Packet<AnimeMatrixPacket>(0xC0, 0x03)); Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
} }
@@ -241,8 +273,8 @@ namespace Starlight.AnimeMatrix
public void GenerateFrame(Image image) public void GenerateFrame(Image image)
{ {
int width = 34 * 3; int width = MaxColumns * 3;
int height = 61; int height = MaxRows;
float scale; float scale;
Bitmap canvas = new Bitmap(width, height); Bitmap canvas = new Bitmap(width, height);
@@ -259,7 +291,7 @@ namespace Starlight.AnimeMatrix
graph.DrawImage(image, ((int)width - scaleWidth), ((int)height - scaleHeight) / 2, scaleWidth, scaleHeight); graph.DrawImage(image, ((int)width - scaleWidth), ((int)height - scaleHeight) / 2, scaleWidth, scaleHeight);
Bitmap bmp = new Bitmap(canvas, 34, 61); Bitmap bmp = new Bitmap(canvas, MaxColumns, MaxRows);
for (int y = 0; y < bmp.Height; y++) for (int y = 0; y < bmp.Height; y++)
{ {
@@ -275,9 +307,9 @@ namespace Starlight.AnimeMatrix
private void EnsureRowInRange(int row) private void EnsureRowInRange(int row)
{ {
if (row < 0 || row >= Rows) if (row < 0 || row >= MaxRows)
{ {
throw new IndexOutOfRangeException($"Y-coordinate should fall in range of [0, {Rows - 1}]."); throw new IndexOutOfRangeException($"Y-coordinate should fall in range of [0, {MaxRows - 1}].");
} }
} }

View File

@@ -44,8 +44,9 @@ public class AppConfig
File.WriteAllText(configFile, jsonString); File.WriteAllText(configFile, jsonString);
} }
public int getConfig(string name) public int getConfig(string name, bool performance = false)
{ {
if (config.ContainsKey(name)) if (config.ContainsKey(name))
return int.Parse(config[name].ToString()); return int.Parse(config[name].ToString());
else return -1; else return -1;
@@ -141,4 +142,17 @@ public class AppConfig
return curve; return curve;
} }
public int getConfigPerf(string name)
{
int mode = getConfig("performance_mode");
return getConfig(name + "_" + mode);
}
public void setConfigPerf(string name, int value)
{
int mode = getConfig("performance_mode");
setConfig(name + "_" + mode, value);
}
} }

View File

@@ -1,6 +1,7 @@
// Source thanks to https://github.com/vddCore/Starlight :) // Source thanks to https://github.com/vddCore/Starlight :)
using Starlight.Communication.Platform; using Starlight.Communication.Platform;
using System.Configuration;
namespace Starlight.Communication namespace Starlight.Communication
{ {
@@ -8,9 +9,21 @@ namespace Starlight.Communication
{ {
private static UsbProvider _usbProvider; private static UsbProvider _usbProvider;
private static ushort _vendorId;
private static ushort _productId;
private static int _maxFeatureReportLength;
protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength) protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength)
{ {
_usbProvider = new WindowsUsbProvider(vendorId, productId, maxFeatureReportLength); _vendorId = vendorId;
_productId = productId;
_maxFeatureReportLength = maxFeatureReportLength;
SetProvider();
}
public void SetProvider()
{
_usbProvider = new WindowsUsbProvider(_vendorId, _productId, _maxFeatureReportLength);
} }
protected T Packet<T>(params byte[] command) where T : Packet protected T Packet<T>(params byte[] command) where T : Packet

492
Fans.Designer.cs generated
View File

@@ -30,101 +30,290 @@
{ {
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
chartCPU = new System.Windows.Forms.DataVisualization.Charting.Chart(); panelFans = new Panel();
buttonApply = new Button(); checkBoost = new CheckBox();
buttonReset = new Button(); labelFans = new Label();
checkAuto = new CheckBox();
chartGPU = new System.Windows.Forms.DataVisualization.Charting.Chart(); chartGPU = new System.Windows.Forms.DataVisualization.Charting.Chart();
groupBox1 = new GroupBox(); buttonReset = new Button();
buttonApply = new Button();
chartCPU = new System.Windows.Forms.DataVisualization.Charting.Chart();
panelPower = new Panel();
labelPowerLimits = new Label();
checkApplyPower = new CheckBox();
buttonApplyPower = new Button();
panelCPU = new Panel();
labelCPU = new Label();
label2 = new Label();
trackCPU = new TrackBar();
panelTotal = new Panel();
labelTotal = new Label();
label1 = new Label();
trackTotal = new TrackBar();
labelApplied = new Label(); labelApplied = new Label();
pictureFine = new PictureBox(); pictureFine = new PictureBox();
labelInfo = new Label(); labelInfo = new Label();
labelCPU = new Label(); panelFans.SuspendLayout();
labelTotal = new Label();
label2 = new Label();
label1 = new Label();
trackCPU = new TrackBar();
trackTotal = new TrackBar();
buttonApplyPower = new Button();
checkAuto = new CheckBox();
((System.ComponentModel.ISupportInitialize)chartCPU).BeginInit();
((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit(); ((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();
groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)chartCPU).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureFine).BeginInit(); panelPower.SuspendLayout();
panelCPU.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackCPU).BeginInit(); ((System.ComponentModel.ISupportInitialize)trackCPU).BeginInit();
panelTotal.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackTotal).BeginInit(); ((System.ComponentModel.ISupportInitialize)trackTotal).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureFine).BeginInit();
SuspendLayout(); SuspendLayout();
// //
// chartCPU // panelFans
// //
chartArea1.Name = "ChartArea1"; panelFans.AutoSize = true;
chartCPU.ChartAreas.Add(chartArea1); panelFans.Controls.Add(checkBoost);
chartCPU.Location = new Point(390, 28); panelFans.Controls.Add(labelFans);
chartCPU.Margin = new Padding(4, 2, 4, 2); panelFans.Controls.Add(checkAuto);
chartCPU.Name = "chartCPU"; panelFans.Controls.Add(chartGPU);
chartCPU.Size = new Size(832, 436); panelFans.Controls.Add(buttonReset);
chartCPU.TabIndex = 0; panelFans.Controls.Add(buttonApply);
chartCPU.Text = "chartCPU"; panelFans.Controls.Add(chartCPU);
panelFans.Dock = DockStyle.Left;
panelFans.Location = new Point(363, 0);
panelFans.Margin = new Padding(10);
panelFans.MinimumSize = new Size(872, 1089);
panelFans.Name = "panelFans";
panelFans.Padding = new Padding(10);
panelFans.Size = new Size(872, 1089);
panelFans.TabIndex = 12;
// //
// buttonApply // checkBoost
// //
buttonApply.Location = new Point(946, 952); checkBoost.AutoSize = true;
buttonApply.Margin = new Padding(4, 2, 4, 2); checkBoost.ForeColor = SystemColors.ControlText;
buttonApply.Name = "buttonApply"; checkBoost.Location = new Point(512, 15);
buttonApply.Size = new Size(274, 44); checkBoost.Margin = new Padding(4, 2, 4, 2);
buttonApply.TabIndex = 1; checkBoost.Name = "checkBoost";
buttonApply.Text = "Apply Fan Curve"; checkBoost.Size = new Size(320, 36);
buttonApply.UseVisualStyleBackColor = true; checkBoost.TabIndex = 35;
checkBoost.Text = "CPU Turbo Boost enabled";
checkBoost.UseVisualStyleBackColor = true;
// //
// buttonReset // labelFans
// //
buttonReset.Location = new Point(390, 952); labelFans.AutoSize = true;
buttonReset.Margin = new Padding(4, 2, 4, 2); labelFans.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
buttonReset.Name = "buttonReset"; labelFans.Location = new Point(24, 15);
buttonReset.Size = new Size(274, 44); labelFans.Name = "labelFans";
buttonReset.TabIndex = 2; labelFans.Size = new Size(138, 32);
buttonReset.Text = "Factory Defaults"; labelFans.TabIndex = 28;
buttonReset.UseVisualStyleBackColor = true; labelFans.Text = "Fan Curves";
//
// checkAuto
//
checkAuto.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
checkAuto.AutoSize = true;
checkAuto.Location = new Point(411, 1030);
checkAuto.Margin = new Padding(4, 2, 4, 2);
checkAuto.Name = "checkAuto";
checkAuto.Size = new Size(165, 36);
checkAuto.TabIndex = 17;
checkAuto.Text = "Auto Apply";
checkAuto.UseVisualStyleBackColor = true;
// //
// chartGPU // chartGPU
// //
chartArea2.Name = "ChartArea1"; chartGPU.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
chartGPU.ChartAreas.Add(chartArea2); chartArea1.Name = "ChartArea1";
chartGPU.Location = new Point(390, 480); chartGPU.ChartAreas.Add(chartArea1);
chartGPU.Location = new Point(22, 547);
chartGPU.Margin = new Padding(4, 2, 4, 2); chartGPU.Margin = new Padding(4, 2, 4, 2);
chartGPU.Name = "chartGPU"; chartGPU.Name = "chartGPU";
chartGPU.Size = new Size(832, 450); chartGPU.Size = new Size(810, 460);
chartGPU.TabIndex = 3; chartGPU.TabIndex = 16;
chartGPU.Text = "chart1"; chartGPU.Text = "chart1";
// //
// groupBox1 // buttonReset
// //
groupBox1.Controls.Add(labelApplied); buttonReset.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
groupBox1.Controls.Add(pictureFine); buttonReset.Location = new Point(22, 1025);
groupBox1.Controls.Add(labelInfo); buttonReset.Margin = new Padding(4, 2, 4, 2);
groupBox1.Controls.Add(labelCPU); buttonReset.Name = "buttonReset";
groupBox1.Controls.Add(labelTotal); buttonReset.Size = new Size(231, 44);
groupBox1.Controls.Add(label2); buttonReset.TabIndex = 15;
groupBox1.Controls.Add(label1); buttonReset.Text = "Factory Defaults";
groupBox1.Controls.Add(trackCPU); buttonReset.UseVisualStyleBackColor = true;
groupBox1.Controls.Add(trackTotal); //
groupBox1.Location = new Point(12, 12); // buttonApply
groupBox1.Margin = new Padding(4, 2, 4, 2); //
groupBox1.Name = "groupBox1"; buttonApply.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
groupBox1.Padding = new Padding(6, 4, 6, 4); buttonApply.Location = new Point(584, 1025);
groupBox1.Size = new Size(356, 918); buttonApply.Margin = new Padding(4, 2, 4, 2);
groupBox1.TabIndex = 4; buttonApply.Name = "buttonApply";
groupBox1.TabStop = false; buttonApply.Size = new Size(248, 44);
groupBox1.Text = "Power Limits (PPT)"; buttonApply.TabIndex = 14;
buttonApply.Text = "Apply Fan Curve";
buttonApply.UseVisualStyleBackColor = true;
//
// chartCPU
//
chartCPU.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
chartArea2.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea2);
chartCPU.Location = new Point(22, 66);
chartCPU.Margin = new Padding(10);
chartCPU.Name = "chartCPU";
chartCPU.Size = new Size(810, 460);
chartCPU.TabIndex = 13;
chartCPU.Text = "chartCPU";
//
// panelPower
//
panelPower.Controls.Add(labelPowerLimits);
panelPower.Controls.Add(checkApplyPower);
panelPower.Controls.Add(buttonApplyPower);
panelPower.Controls.Add(panelCPU);
panelPower.Controls.Add(panelTotal);
panelPower.Controls.Add(labelApplied);
panelPower.Controls.Add(pictureFine);
panelPower.Controls.Add(labelInfo);
panelPower.Dock = DockStyle.Left;
panelPower.Location = new Point(0, 0);
panelPower.Name = "panelPower";
panelPower.Size = new Size(363, 1089);
panelPower.TabIndex = 13;
//
// labelPowerLimits
//
labelPowerLimits.AutoSize = true;
labelPowerLimits.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelPowerLimits.Location = new Point(23, 15);
labelPowerLimits.Name = "labelPowerLimits";
labelPowerLimits.Size = new Size(229, 32);
labelPowerLimits.TabIndex = 26;
labelPowerLimits.Text = "Power Limits (PPT)";
//
// checkApplyPower
//
checkApplyPower.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
checkApplyPower.AutoSize = true;
checkApplyPower.Location = new Point(21, 982);
checkApplyPower.Margin = new Padding(4, 2, 4, 2);
checkApplyPower.Name = "checkApplyPower";
checkApplyPower.Size = new Size(165, 36);
checkApplyPower.TabIndex = 25;
checkApplyPower.Text = "Auto Apply";
checkApplyPower.UseVisualStyleBackColor = true;
//
// buttonApplyPower
//
buttonApplyPower.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
buttonApplyPower.Location = new Point(17, 1025);
buttonApplyPower.Margin = new Padding(4, 2, 4, 2);
buttonApplyPower.Name = "buttonApplyPower";
buttonApplyPower.Size = new Size(321, 44);
buttonApplyPower.TabIndex = 24;
buttonApplyPower.Text = "Apply Power Limits";
buttonApplyPower.UseVisualStyleBackColor = true;
//
// panelCPU
//
panelCPU.Controls.Add(labelCPU);
panelCPU.Controls.Add(label2);
panelCPU.Controls.Add(trackCPU);
panelCPU.Location = new Point(184, 89);
panelCPU.Name = "panelCPU";
panelCPU.Size = new Size(160, 510);
panelCPU.TabIndex = 23;
//
// labelCPU
//
labelCPU.AutoSize = true;
labelCPU.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelCPU.Location = new Point(43, 41);
labelCPU.Margin = new Padding(4, 0, 4, 0);
labelCPU.Name = "labelCPU";
labelCPU.Size = new Size(61, 32);
labelCPU.TabIndex = 13;
labelCPU.Text = "CPU";
labelCPU.TextAlign = ContentAlignment.MiddleCenter;
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(45, 7);
label2.Margin = new Padding(4, 0, 4, 0);
label2.Name = "label2";
label2.Size = new Size(58, 32);
label2.TabIndex = 12;
label2.Text = "CPU";
label2.TextAlign = ContentAlignment.MiddleCenter;
//
// trackCPU
//
trackCPU.Location = new Point(47, 89);
trackCPU.Margin = new Padding(4, 2, 4, 2);
trackCPU.Maximum = 85;
trackCPU.Minimum = 15;
trackCPU.Name = "trackCPU";
trackCPU.Orientation = Orientation.Vertical;
trackCPU.Size = new Size(90, 416);
trackCPU.TabIndex = 11;
trackCPU.TickFrequency = 5;
trackCPU.Value = 80;
//
// panelTotal
//
panelTotal.Controls.Add(labelTotal);
panelTotal.Controls.Add(label1);
panelTotal.Controls.Add(trackTotal);
panelTotal.Location = new Point(17, 89);
panelTotal.Name = "panelTotal";
panelTotal.Size = new Size(160, 511);
panelTotal.TabIndex = 22;
//
// labelTotal
//
labelTotal.AutoSize = true;
labelTotal.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelTotal.Location = new Point(46, 41);
labelTotal.Margin = new Padding(4, 0, 4, 0);
labelTotal.Name = "labelTotal";
labelTotal.Size = new Size(70, 32);
labelTotal.TabIndex = 12;
labelTotal.Text = "Total";
labelTotal.TextAlign = ContentAlignment.MiddleCenter;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(48, 7);
label1.Margin = new Padding(4, 0, 4, 0);
label1.Name = "label1";
label1.Size = new Size(65, 32);
label1.TabIndex = 11;
label1.Text = "Total";
label1.TextAlign = ContentAlignment.MiddleCenter;
//
// trackTotal
//
trackTotal.Location = new Point(44, 89);
trackTotal.Margin = new Padding(4, 2, 4, 2);
trackTotal.Maximum = 150;
trackTotal.Minimum = 15;
trackTotal.Name = "trackTotal";
trackTotal.Orientation = Orientation.Vertical;
trackTotal.Size = new Size(90, 416);
trackTotal.TabIndex = 10;
trackTotal.TickFrequency = 5;
trackTotal.TickStyle = TickStyle.TopLeft;
trackTotal.Value = 125;
// //
// labelApplied // labelApplied
// //
labelApplied.AutoSize = true; labelApplied.AutoSize = true;
labelApplied.ForeColor = Color.Tomato; labelApplied.ForeColor = Color.Tomato;
labelApplied.Location = new Point(16, 36); labelApplied.Location = new Point(23, 51);
labelApplied.Margin = new Padding(4, 0, 4, 0); labelApplied.Margin = new Padding(4, 0, 4, 0);
labelApplied.Name = "labelApplied"; labelApplied.Name = "labelApplied";
labelApplied.Size = new Size(143, 32); labelApplied.Size = new Size(143, 32);
labelApplied.TabIndex = 13; labelApplied.TabIndex = 21;
labelApplied.Text = "Not Applied"; labelApplied.Text = "Not Applied";
// //
// pictureFine // pictureFine
@@ -132,170 +321,83 @@
pictureFine.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; pictureFine.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
pictureFine.BackgroundImageLayout = ImageLayout.Zoom; pictureFine.BackgroundImageLayout = ImageLayout.Zoom;
pictureFine.Image = Properties.Resources.everything_is_fine_itsfine; pictureFine.Image = Properties.Resources.everything_is_fine_itsfine;
pictureFine.Location = new Point(10, 682); pictureFine.Location = new Point(17, 671);
pictureFine.Margin = new Padding(4, 2, 4, 2); pictureFine.Margin = new Padding(4, 2, 4, 2);
pictureFine.Name = "pictureFine"; pictureFine.Name = "pictureFine";
pictureFine.Size = new Size(336, 226); pictureFine.Size = new Size(327, 254);
pictureFine.SizeMode = PictureBoxSizeMode.Zoom; pictureFine.SizeMode = PictureBoxSizeMode.Zoom;
pictureFine.TabIndex = 12; pictureFine.TabIndex = 20;
pictureFine.TabStop = false; pictureFine.TabStop = false;
pictureFine.Visible = false; pictureFine.Visible = false;
// //
// labelInfo // labelInfo
// //
labelInfo.AutoSize = true; labelInfo.Location = new Point(17, 603);
labelInfo.Dock = DockStyle.Bottom;
labelInfo.Location = new Point(6, 882);
labelInfo.Margin = new Padding(4, 0, 4, 0); labelInfo.Margin = new Padding(4, 0, 4, 0);
labelInfo.Name = "labelInfo"; labelInfo.Name = "labelInfo";
labelInfo.Size = new Size(65, 32); labelInfo.Size = new Size(327, 330);
labelInfo.TabIndex = 11; labelInfo.TabIndex = 19;
labelInfo.Text = "label"; labelInfo.Text = "label";
// //
// labelCPU
//
labelCPU.AutoSize = true;
labelCPU.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelCPU.Location = new Point(212, 118);
labelCPU.Margin = new Padding(4, 0, 4, 0);
labelCPU.Name = "labelCPU";
labelCPU.Size = new Size(61, 32);
labelCPU.TabIndex = 10;
labelCPU.Text = "CPU";
labelCPU.TextAlign = ContentAlignment.MiddleCenter;
//
// labelTotal
//
labelTotal.AutoSize = true;
labelTotal.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelTotal.Location = new Point(42, 118);
labelTotal.Margin = new Padding(4, 0, 4, 0);
labelTotal.Name = "labelTotal";
labelTotal.Size = new Size(70, 32);
labelTotal.TabIndex = 9;
labelTotal.Text = "Total";
labelTotal.TextAlign = ContentAlignment.MiddleCenter;
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(216, 86);
label2.Margin = new Padding(4, 0, 4, 0);
label2.Name = "label2";
label2.Size = new Size(58, 32);
label2.TabIndex = 8;
label2.Text = "CPU";
label2.TextAlign = ContentAlignment.MiddleCenter;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(44, 86);
label1.Margin = new Padding(4, 0, 4, 0);
label1.Name = "label1";
label1.Size = new Size(65, 32);
label1.TabIndex = 7;
label1.Text = "Total";
label1.TextAlign = ContentAlignment.MiddleCenter;
//
// trackCPU
//
trackCPU.Location = new Point(218, 166);
trackCPU.Margin = new Padding(4, 2, 4, 2);
trackCPU.Maximum = 85;
trackCPU.Minimum = 15;
trackCPU.Name = "trackCPU";
trackCPU.Orientation = Orientation.Vertical;
trackCPU.Size = new Size(90, 416);
trackCPU.TabIndex = 6;
trackCPU.TickFrequency = 5;
trackCPU.Value = 80;
//
// trackTotal
//
trackTotal.Location = new Point(46, 166);
trackTotal.Margin = new Padding(4, 2, 4, 2);
trackTotal.Maximum = 150;
trackTotal.Minimum = 15;
trackTotal.Name = "trackTotal";
trackTotal.Orientation = Orientation.Vertical;
trackTotal.Size = new Size(90, 416);
trackTotal.TabIndex = 5;
trackTotal.TickFrequency = 5;
trackTotal.TickStyle = TickStyle.TopLeft;
trackTotal.Value = 125;
//
// buttonApplyPower
//
buttonApplyPower.Location = new Point(16, 952);
buttonApplyPower.Margin = new Padding(4, 2, 4, 2);
buttonApplyPower.Name = "buttonApplyPower";
buttonApplyPower.Size = new Size(352, 44);
buttonApplyPower.TabIndex = 11;
buttonApplyPower.Text = "Apply Power Limits";
buttonApplyPower.UseVisualStyleBackColor = true;
//
// checkAuto
//
checkAuto.AutoSize = true;
checkAuto.Location = new Point(762, 958);
checkAuto.Margin = new Padding(4, 2, 4, 2);
checkAuto.Name = "checkAuto";
checkAuto.Size = new Size(165, 36);
checkAuto.TabIndex = 12;
checkAuto.Text = "Auto Apply";
checkAuto.UseVisualStyleBackColor = true;
//
// Fans // Fans
// //
AutoScaleDimensions = new SizeF(192F, 192F); AutoScaleDimensions = new SizeF(192F, 192F);
AutoScaleMode = AutoScaleMode.Dpi; AutoScaleMode = AutoScaleMode.Dpi;
AutoSize = true; AutoSize = true;
ClientSize = new Size(1242, 1020); AutoSizeMode = AutoSizeMode.GrowAndShrink;
Controls.Add(checkAuto); ClientSize = new Size(1220, 1089);
Controls.Add(buttonApplyPower); Controls.Add(panelFans);
Controls.Add(groupBox1); Controls.Add(panelPower);
Controls.Add(chartGPU);
Controls.Add(buttonReset);
Controls.Add(buttonApply);
Controls.Add(chartCPU);
Margin = new Padding(4, 2, 4, 2); Margin = new Padding(4, 2, 4, 2);
MaximizeBox = false; MaximizeBox = false;
MdiChildrenMinimizedAnchorBottom = false; MdiChildrenMinimizedAnchorBottom = false;
MinimizeBox = false; MinimizeBox = false;
MinimumSize = new Size(0, 1160);
Name = "Fans"; Name = "Fans";
ShowIcon = false; ShowIcon = false;
ShowInTaskbar = false; ShowInTaskbar = false;
StartPosition = FormStartPosition.CenterScreen; StartPosition = FormStartPosition.CenterScreen;
Text = "Fans and Power"; Text = "Fans and Power";
((System.ComponentModel.ISupportInitialize)chartCPU).EndInit(); panelFans.ResumeLayout(false);
panelFans.PerformLayout();
((System.ComponentModel.ISupportInitialize)chartGPU).EndInit(); ((System.ComponentModel.ISupportInitialize)chartGPU).EndInit();
groupBox1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)chartCPU).EndInit();
groupBox1.PerformLayout(); panelPower.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureFine).EndInit(); panelPower.PerformLayout();
panelCPU.ResumeLayout(false);
panelCPU.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackCPU).EndInit(); ((System.ComponentModel.ISupportInitialize)trackCPU).EndInit();
panelTotal.ResumeLayout(false);
panelTotal.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackTotal).EndInit(); ((System.ComponentModel.ISupportInitialize)trackTotal).EndInit();
((System.ComponentModel.ISupportInitialize)pictureFine).EndInit();
ResumeLayout(false); ResumeLayout(false);
PerformLayout(); PerformLayout();
} }
#endregion #endregion
private Panel panelFans;
private System.Windows.Forms.DataVisualization.Charting.Chart chartCPU;
private Button buttonApply;
private Button buttonReset;
private System.Windows.Forms.DataVisualization.Charting.Chart chartGPU;
private GroupBox groupBox1;
private Label labelCPU;
private Label labelTotal;
private Label label2;
private Label label1;
private TrackBar trackCPU;
private TrackBar trackTotal;
private Button buttonApplyPower;
private Label labelInfo;
private PictureBox pictureFine;
private Label labelApplied;
private CheckBox checkAuto; private CheckBox checkAuto;
private System.Windows.Forms.DataVisualization.Charting.Chart chartGPU;
private Button buttonReset;
private Button buttonApply;
private System.Windows.Forms.DataVisualization.Charting.Chart chartCPU;
private Panel panelPower;
private CheckBox checkApplyPower;
private Button buttonApplyPower;
private Panel panelCPU;
private Label labelCPU;
private Label label2;
private TrackBar trackCPU;
private Panel panelTotal;
private Label labelTotal;
private Label label1;
private TrackBar trackTotal;
private Label labelApplied;
private PictureBox pictureFine;
private Label labelInfo;
private Label labelPowerLimits;
private Label labelFans;
private CheckBox checkBoost;
} }
} }

143
Fans.cs
View File

@@ -11,14 +11,6 @@ namespace GHelper
Series seriesCPU; Series seriesCPU;
Series seriesGPU; Series seriesGPU;
const int MaxTotal = 150;
const int MinTotal = 15;
const int DefaultTotal = 125;
const int MaxCPU = 90;
const int MinCPU = 15;
const int DefaultCPU = 80;
void SetChart(Chart chart, int device) void SetChart(Chart chart, int device)
{ {
@@ -30,7 +22,7 @@ namespace GHelper
title = "CPU Fan Profile"; title = "CPU Fan Profile";
if (Program.settingsForm.perfName.Length > 0) if (Program.settingsForm.perfName.Length > 0)
title += ": " + Program.settingsForm.perfName; labelFans.Text = "Fan Profiles: " + Program.settingsForm.perfName;
if (chart.Titles.Count > 0) if (chart.Titles.Count > 0)
chart.Titles[0].Text = title; chart.Titles[0].Text = title;
@@ -91,11 +83,11 @@ namespace GHelper
buttonReset.Click += ButtonReset_Click; buttonReset.Click += ButtonReset_Click;
buttonApply.Click += ButtonApply_Click; buttonApply.Click += ButtonApply_Click;
trackTotal.Maximum = MaxTotal; trackTotal.Maximum = ASUSWmi.MaxTotal;
trackTotal.Minimum = MinTotal; trackTotal.Minimum = ASUSWmi.MinTotal;
trackCPU.Maximum = MaxCPU; trackCPU.Maximum = ASUSWmi.MaxCPU;
trackCPU.Minimum = MinCPU; trackCPU.Minimum = ASUSWmi.MinCPU;
trackCPU.Scroll += TrackCPU_Scroll; trackCPU.Scroll += TrackCPU_Scroll;
trackTotal.Scroll += TrackTotal_Scroll; trackTotal.Scroll += TrackTotal_Scroll;
@@ -103,25 +95,52 @@ namespace GHelper
buttonApplyPower.Click += ButtonApplyPower_Click; buttonApplyPower.Click += ButtonApplyPower_Click;
checkAuto.Click += CheckAuto_Click; checkAuto.Click += CheckAuto_Click;
checkApplyPower.Click += CheckApplyPower_Click;
//labelInfo.MaximumSize = new Size(280, 0); //labelInfo.MaximumSize = new Size(280, 0);
labelInfo.Text = "Power Limits (PPT) is\nexperimental feature.\n\nValues will be applied\nonly after you click 'Apply'\nand reset after performance\nmode changes.\n\nUse carefully and\non your own risk!"; labelInfo.Text = "Power Limits (PPT) is\nexperimental feature.\n\nUse carefully and\non your own risk!";
LoadFans(); InitFans();
VisualisePower(true); InitPower();
InitBoost();
checkBoost.Click += CheckBoost_Click;
Shown += Fans_Shown; Shown += Fans_Shown;
} }
private void CheckAuto_Click(object? sender, EventArgs e)
public void InitBoost()
{
int boost = NativeMethods.GetCPUBoost();
checkBoost.Checked = (boost > 0);
}
private void CheckBoost_Click(object? sender, EventArgs e)
{ {
if (sender is null) if (sender is null)
return; return;
CheckBox chk = (CheckBox)sender; CheckBox chk = (CheckBox)sender;
if (chk.Checked)
NativeMethods.SetCPUBoost(2);
else
NativeMethods.SetCPUBoost(0);
}
Program.config.setConfig("auto_apply_" + Program.config.getConfig("performance_mode"), chk.Checked ? 1 : 0); private void CheckApplyPower_Click(object? sender, EventArgs e)
{
if (sender is null) return;
CheckBox chk = (CheckBox)sender;
Program.config.setConfigPerf("auto_apply_power", chk.Checked ? 1 : 0);
}
private void CheckAuto_Click(object? sender, EventArgs e)
{
if (sender is null) return;
CheckBox chk = (CheckBox)sender;
Program.config.setConfigPerf("auto_apply", chk.Checked ? 1 : 0);
} }
private void Fans_FormClosing(object? sender, FormClosingEventArgs e) private void Fans_FormClosing(object? sender, FormClosingEventArgs e)
@@ -135,76 +154,82 @@ namespace GHelper
private void ButtonApplyPower_Click(object? sender, EventArgs e) private void ButtonApplyPower_Click(object? sender, EventArgs e)
{ {
int limit_total = trackTotal.Value; Program.settingsForm.SetPower();
int limit_cpu = trackCPU.Value; ApplyLabel(true);
Program.config.setConfig("limit_total", limit_total);
Program.config.setConfig("limit_cpu", limit_cpu);
Program.wmi.DeviceSet(ASUSWmi.PPT_TotalA0, limit_total);
Program.wmi.DeviceSet(ASUSWmi.PPT_TotalA1, limit_total);
Program.wmi.DeviceSet(ASUSWmi.PPT_CPUB0, limit_cpu);
Program.wmi.DeviceSet(ASUSWmi.PPT_CPUA2, limit_cpu);
labelApplied.ForeColor = Color.Blue;
labelApplied.Text = "Applied";
} }
public void VisualisePower(bool init = false) public void InitPower(bool changed = false)
{ {
panelPower.Visible = (Program.wmi.DeviceGet(ASUSWmi.PPT_TotalA0) >= 0);
panelCPU.Visible = (Program.wmi.DeviceGet(ASUSWmi.PPT_CPUB0) >= 0);
int limit_total; int limit_total;
int limit_cpu; int limit_cpu;
bool apply = Program.config.getConfigPerf("auto_apply_power") == 1;
if (init) if (changed)
{
limit_total = Program.config.getConfig("limit_total");
limit_cpu = Program.config.getConfig("limit_cpu");
}
else
{ {
limit_total = trackTotal.Value; limit_total = trackTotal.Value;
limit_cpu = trackCPU.Value; limit_cpu = trackCPU.Value;
ApplyLabel(false);
}
else
{
limit_total = Program.config.getConfigPerf("limit_total");
limit_cpu = Program.config.getConfigPerf("limit_cpu");
ApplyLabel(apply);
} }
if (limit_total < 0) limit_total = DefaultTotal; if (limit_total < 0) limit_total = ASUSWmi.DefaultTotal;
if (limit_total > MaxTotal) limit_total = MaxTotal; if (limit_total > ASUSWmi.MaxTotal) limit_total = ASUSWmi.MaxTotal;
if (limit_total < MinTotal) limit_total = MinTotal; if (limit_total < ASUSWmi.MinTotal) limit_total = ASUSWmi.MinTotal;
if (limit_cpu < 0) limit_cpu = DefaultCPU;
if (limit_cpu > MaxCPU) limit_cpu = MaxCPU;
if (limit_cpu < MinCPU) limit_cpu = MinCPU;
if (limit_cpu < 0) limit_cpu = ASUSWmi.DefaultCPU;
if (limit_cpu > ASUSWmi.MaxCPU) limit_cpu = ASUSWmi.MaxCPU;
if (limit_cpu < ASUSWmi.MinCPU) limit_cpu = ASUSWmi.MinCPU;
if (limit_cpu > limit_total) limit_cpu = limit_total; if (limit_cpu > limit_total) limit_cpu = limit_total;
trackTotal.Value = limit_total; trackTotal.Value = limit_total;
trackCPU.Value = limit_cpu; trackCPU.Value = limit_cpu;
checkApplyPower.Checked = apply;
labelTotal.Text = trackTotal.Value.ToString() + "W"; labelTotal.Text = trackTotal.Value.ToString() + "W";
labelCPU.Text = trackCPU.Value.ToString() + "W"; labelCPU.Text = trackCPU.Value.ToString() + "W";
pictureFine.Visible = (limit_cpu > 85 || limit_total > 145); pictureFine.Visible = (limit_cpu > 85 || limit_total > 145);
Program.config.setConfigPerf("limit_total", limit_total);
Program.config.setConfigPerf("limit_cpu", limit_cpu);
} }
private void TrackTotal_Scroll(object? sender, EventArgs e) private void TrackTotal_Scroll(object? sender, EventArgs e)
{ {
VisualisePower(); InitPower(true);
} }
private void TrackCPU_Scroll(object? sender, EventArgs e) private void TrackCPU_Scroll(object? sender, EventArgs e)
{ {
VisualisePower(); InitPower(true);
} }
public void ResetApplyLabel()
public void ApplyLabel(bool applied = false)
{ {
labelApplied.ForeColor = Color.Red; if (applied)
labelApplied.Text = "Not Applied"; {
labelApplied.ForeColor = Color.Blue;
labelApplied.Text = "Applied";
}
else
{
labelApplied.ForeColor = Color.Red;
labelApplied.Text = "Not Applied";
}
} }
public void LoadFans() public void InitFans()
{ {
SetChart(chartCPU, 0); SetChart(chartCPU, 0);
@@ -213,7 +238,7 @@ namespace GHelper
LoadProfile(seriesCPU, 0); LoadProfile(seriesCPU, 0);
LoadProfile(seriesGPU, 1); LoadProfile(seriesGPU, 1);
int auto_apply = Program.config.getConfig("auto_apply_" + Program.config.getConfig("performance_mode")); int auto_apply = Program.config.getConfigPerf("auto_apply");
checkAuto.Checked = (auto_apply == 1); checkAuto.Checked = (auto_apply == 1);
@@ -275,15 +300,19 @@ namespace GHelper
private void ButtonReset_Click(object? sender, EventArgs e) private void ButtonReset_Click(object? sender, EventArgs e)
{ {
LoadProfile(seriesCPU, 0, 1); LoadProfile(seriesCPU, 0, 1);
LoadProfile(seriesGPU, 1, 1); LoadProfile(seriesGPU, 1, 1);
checkAuto.Checked = false; checkAuto.Checked = false;
Program.config.setConfig("auto_apply_" + Program.config.getConfig("performance_mode"), 0); checkApplyPower.Checked = false;
Program.config.setConfigPerf("auto_apply", 0);
Program.config.setConfigPerf("auto_apply_power", 0);
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode")); Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"));
ResetApplyLabel(); ApplyLabel(false);
} }
private void ChartCPU_MouseUp(object? sender, MouseEventArgs e) private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)

View File

@@ -15,7 +15,7 @@
<AssemblyName>GHelper</AssemblyName> <AssemblyName>GHelper</AssemblyName>
<PlatformTarget>x64</PlatformTarget> <PlatformTarget>x64</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly> <ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AssemblyVersion>0.16</AssemblyVersion> <AssemblyVersion>0.21</AssemblyVersion>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks> <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>

View File

@@ -1,9 +1,316 @@
using System.Diagnostics; using System.ComponentModel;
using System.Diagnostics;
using System.Management;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows.Forms;
using Tools;
using static Tools.ScreenInterrogatory;
namespace Tools
{
public static class ScreenInterrogatory
{
public const int ERROR_SUCCESS = 0;
#region enums
public enum QUERY_DEVICE_CONFIG_FLAGS : uint
{
QDC_ALL_PATHS = 0x00000001,
QDC_ONLY_ACTIVE_PATHS = 0x00000002,
QDC_DATABASE_CURRENT = 0x00000004
}
public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint
{
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
}
public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint
{
DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,
DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,
DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
}
public enum DISPLAYCONFIG_ROTATION : uint
{
DISPLAYCONFIG_ROTATION_IDENTITY = 1,
DISPLAYCONFIG_ROTATION_ROTATE90 = 2,
DISPLAYCONFIG_ROTATION_ROTATE180 = 3,
DISPLAYCONFIG_ROTATION_ROTATE270 = 4,
DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
}
public enum DISPLAYCONFIG_SCALING : uint
{
DISPLAYCONFIG_SCALING_IDENTITY = 1,
DISPLAYCONFIG_SCALING_CENTERED = 2,
DISPLAYCONFIG_SCALING_STRETCHED = 3,
DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,
DISPLAYCONFIG_SCALING_CUSTOM = 5,
DISPLAYCONFIG_SCALING_PREFERRED = 128,
DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
}
public enum DISPLAYCONFIG_PIXELFORMAT : uint
{
DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,
DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,
DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,
DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,
DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,
DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
}
public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint
{
DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
}
public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint
{
DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,
DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,
DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,
DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
}
#endregion
#region structs
[StructLayout(LayoutKind.Sequential)]
public struct LUID
{
public uint LowPart;
public int HighPart;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_SOURCE_INFO
{
public LUID adapterId;
public uint id;
public uint modeInfoIdx;
public uint statusFlags;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_TARGET_INFO
{
public LUID adapterId;
public uint id;
public uint modeInfoIdx;
private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
private DISPLAYCONFIG_ROTATION rotation;
private DISPLAYCONFIG_SCALING scaling;
private DISPLAYCONFIG_RATIONAL refreshRate;
private DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
public bool targetAvailable;
public uint statusFlags;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_RATIONAL
{
public uint Numerator;
public uint Denominator;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_INFO
{
public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;
public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;
public uint flags;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_2DREGION
{
public uint cx;
public uint cy;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
{
public ulong pixelRate;
public DISPLAYCONFIG_RATIONAL hSyncFreq;
public DISPLAYCONFIG_RATIONAL vSyncFreq;
public DISPLAYCONFIG_2DREGION activeSize;
public DISPLAYCONFIG_2DREGION totalSize;
public uint videoStandard;
public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_MODE
{
public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct POINTL
{
private int x;
private int y;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_SOURCE_MODE
{
public uint width;
public uint height;
public DISPLAYCONFIG_PIXELFORMAT pixelFormat;
public POINTL position;
}
[StructLayout(LayoutKind.Explicit)]
public struct DISPLAYCONFIG_MODE_INFO_UNION
{
[FieldOffset(0)]
public DISPLAYCONFIG_TARGET_MODE targetMode;
[FieldOffset(0)]
public DISPLAYCONFIG_SOURCE_MODE sourceMode;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_MODE_INFO
{
public DISPLAYCONFIG_MODE_INFO_TYPE infoType;
public uint id;
public LUID adapterId;
public DISPLAYCONFIG_MODE_INFO_UNION modeInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS
{
public uint value;
}
[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_DEVICE_INFO_HEADER
{
public DISPLAYCONFIG_DEVICE_INFO_TYPE type;
public uint size;
public LUID adapterId;
public uint id;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME
{
public DISPLAYCONFIG_DEVICE_INFO_HEADER header;
public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;
public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
public ushort edidManufactureId;
public ushort edidProductCodeId;
public uint connectorInstance;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
public string monitorFriendlyDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string monitorDevicePath;
}
#endregion
#region DLL-Imports
[DllImport("user32.dll")]
public static extern int GetDisplayConfigBufferSizes(
QUERY_DEVICE_CONFIG_FLAGS flags, out uint numPathArrayElements, out uint numModeInfoArrayElements);
[DllImport("user32.dll")]
public static extern int QueryDisplayConfig(
QUERY_DEVICE_CONFIG_FLAGS flags,
ref uint numPathArrayElements, [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray,
ref uint numModeInfoArrayElements, [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray,
IntPtr currentTopologyId
);
[DllImport("user32.dll")]
public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName);
#endregion
private static DISPLAYCONFIG_TARGET_DEVICE_NAME DeviceName(LUID adapterId, uint targetId)
{
var deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME
{
header =
{
size = (uint)Marshal.SizeOf(typeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)),
adapterId = adapterId,
id = targetId,
type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME
}
};
var error = DisplayConfigGetDeviceInfo(ref deviceName);
if (error != ERROR_SUCCESS)
throw new Win32Exception(error);
return deviceName;
}
public static IEnumerable<DISPLAYCONFIG_TARGET_DEVICE_NAME> GetAllDevices()
{
uint pathCount, modeCount;
var error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount);
if (error != ERROR_SUCCESS)
throw new Win32Exception(error);
var displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount];
var displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount];
error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,
ref pathCount, displayPaths, ref modeCount, displayModes, IntPtr.Zero);
if (error != ERROR_SUCCESS)
throw new Win32Exception(error);
for (var i = 0; i < modeCount; i++)
if (displayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)
yield return DeviceName(displayModes[i].adapterId, displayModes[i].id);
}
}
}
public class NativeMethods public class NativeMethods
{ {
public const int KEYEVENTF_EXTENDEDKEY = 1; public const int KEYEVENTF_EXTENDEDKEY = 1;
public const int KEYEVENTF_KEYUP = 2; public const int KEYEVENTF_KEYUP = 2;
@@ -160,11 +467,6 @@ public class NativeMethods
string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd, string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd,
DisplaySettingsFlags dwflags, IntPtr lParam); DisplaySettingsFlags dwflags, IntPtr lParam);
public const int ENUM_CURRENT_SETTINGS = -1;
public const string laptopScreenName = "\\\\.\\DISPLAY1";
public static DEVMODE CreateDevmode() public static DEVMODE CreateDevmode()
{ {
DEVMODE dm = new DEVMODE(); DEVMODE dm = new DEVMODE();
@@ -174,34 +476,55 @@ public class NativeMethods
return dm; return dm;
} }
public static Screen FindLaptopScreen() public const int ENUM_CURRENT_SETTINGS = -1;
{ public const string defaultDevice = "\\\\.\\DISPLAY1";
var screens = Screen.AllScreens;
Screen laptopScreen = null;
foreach (var screen in screens) public static string FindLaptopScreen()
{
string laptopScreen = null;
try
{ {
if (screen.DeviceName == laptopScreenName) var devices = GetAllDevices();
int count = 0, displayNum = -1;
foreach (var device in devices)
{ {
laptopScreen = screen; if (device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL)
displayNum = count;
count++;
//Debug.WriteLine(device.outputTechnology);
//Debug.WriteLine(device.monitorFriendlyDeviceName);
} }
count = 0;
foreach (var screen in Screen.AllScreens)
{
if (count == displayNum)
laptopScreen = screen.DeviceName;
//Debug.WriteLine(screen.DeviceName);
count++;
}
} catch
{
Debug.WriteLine("Can't find internal screen");
} }
if (laptopScreen is null) return null;
else return laptopScreen; return laptopScreen;
} }
public static int GetRefreshRate() public static int GetRefreshRate()
{ {
DEVMODE dm = CreateDevmode(); DEVMODE dm = CreateDevmode();
Screen laptopScreen = FindLaptopScreen(); string laptopScreen = FindLaptopScreen();
int frequency = -1; int frequency = -1;
if (laptopScreen is null) if (laptopScreen is null)
return -1; return -1;
if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen.DeviceName, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm)) if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
{ {
frequency = dm.dmDisplayFrequency; frequency = dm.dmDisplayFrequency;
} }
@@ -212,15 +535,15 @@ public class NativeMethods
public static int SetRefreshRate(int frequency = 120) public static int SetRefreshRate(int frequency = 120)
{ {
DEVMODE dm = CreateDevmode(); DEVMODE dm = CreateDevmode();
Screen laptopScreen = FindLaptopScreen(); string laptopScreen = FindLaptopScreen();
if (laptopScreen is null) if (laptopScreen is null)
return -1; return -1;
if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen.DeviceName, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm)) if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
{ {
dm.dmDisplayFrequency = frequency; dm.dmDisplayFrequency = frequency;
int iRet = NativeMethods.ChangeDisplaySettingsEx(laptopScreen.DeviceName, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero); int iRet = NativeMethods.ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
return iRet; return iRet;
} }

View File

@@ -1,6 +1,10 @@
using Microsoft.Win32; using Microsoft.Win32;
using System;
using System.Diagnostics; using System.Diagnostics;
using System.Management; using System.Management;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text.Json;
public class HardwareMonitor public class HardwareMonitor
{ {
@@ -36,6 +40,32 @@ namespace GHelper
{ {
static class Program static class Program
{ {
// 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 public static NotifyIcon trayIcon = new NotifyIcon
{ {
Text = "G-Helper", Text = "G-Helper",
@@ -75,7 +105,6 @@ namespace GHelper
wmi.SubscribeToEvents(WatcherEventArrived); wmi.SubscribeToEvents(WatcherEventArrived);
settingsForm.InitGPUMode(); settingsForm.InitGPUMode();
settingsForm.InitBoost();
settingsForm.InitAura(); settingsForm.InitAura();
settingsForm.InitMatrix(); settingsForm.InitMatrix();
@@ -85,24 +114,95 @@ namespace GHelper
SetAutoModes(); SetAutoModes();
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);
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
IntPtr ds = settingsForm.Handle; IntPtr ds = settingsForm.Handle;
CheckForUpdates();
Application.Run(); Application.Run();
} }
private static int DeviceNotifyCallback(IntPtr context, int type, IntPtr setting)
{
//Debug.WriteLine($"Power callback type: {type}");
switch (type)
{
case PBT_APMRESUMEAUTOMATIC:
settingsForm.BeginInvoke(delegate
{
// Setting "other" mode to prevent bios bugging with PPTs after wake up from sleep
wmi.DeviceSet(ASUSWmi.PerformanceMode, config.getConfig("performance_mode"));
Thread.Sleep(1000);
SetAutoModes();
});
break;
}
return 0;
}
static async void CheckForUpdates()
{
settingsForm.SetVersionLabel("Version: " + Assembly.GetExecutingAssembly().GetName().Version.ToString());
try
{
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Add("User-Agent", "C# App");
var json = await httpClient.GetStringAsync("https://api.github.com/repos/seerge/g-helper/releases/latest");
var config = JsonSerializer.Deserialize<JsonElement>(json);
var tag = config.GetProperty("tag_name").ToString().Replace("v", "");
var url = config.GetProperty("assets")[0].GetProperty("browser_download_url").ToString();
var assembly = Assembly.GetExecutingAssembly().GetName().Version.ToString();
var gitVersion = new Version(tag);
var appVersion = new Version();
var result = appVersion.CompareTo(gitVersion);
if (result > 0)
{
settingsForm.SetVersionLabel("Download Update: " + tag, url);
}
}
} catch {
Debug.WriteLine("Failed to get update");
}
}
private static void SetAutoModes() private static void SetAutoModes()
{ {
PowerLineStatus isPlugged = SystemInformation.PowerStatus.PowerLineStatus; PowerLineStatus isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
settingsForm.AutoGPUMode(isPlugged);
settingsForm.AutoScreen(isPlugged); Debug.WriteLine(isPlugged.ToString());
settingsForm.SetBatteryChargeLimit(config.getConfig("charge_limit"));
settingsForm.AutoPerformance(isPlugged); settingsForm.AutoPerformance(isPlugged);
settingsForm.AutoScreen(isPlugged);
settingsForm.AutoGPUMode(isPlugged);
settingsForm.SetMatrix(isPlugged); settingsForm.SetMatrix(isPlugged);
settingsForm.SetBatteryChargeLimit(config.getConfig("charge_limit"));
} }
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)

View File

@@ -1,4 +1,4 @@
# G-Helper (For Asus ROG Zephyrus G14, G15, Flow X13, Flow X16, and others) # G-Helper / GHelper for Asus ROG Zephyrus G14, G15, Flow X13, Flow X16, and other models
A small utility that allows you do almost everyting you could do with Armory Crate but without extra bloat and unnecessary services. A small utility that allows you do almost everyting you could do with Armory Crate but without extra bloat and unnecessary services.

33
Settings.Designer.cs generated
View File

@@ -48,7 +48,6 @@
checkStartup = new CheckBox(); checkStartup = new CheckBox();
panelPerformance = new Panel(); panelPerformance = new Panel();
buttonFans = new Button(); buttonFans = new Button();
checkBoost = new CheckBox();
picturePerf = new PictureBox(); picturePerf = new PictureBox();
labelPerf = new Label(); labelPerf = new Label();
labelCPUFan = new Label(); labelCPUFan = new Label();
@@ -113,17 +112,17 @@
panelMatrix.Controls.Add(pictureMatrix); panelMatrix.Controls.Add(pictureMatrix);
panelMatrix.Controls.Add(labelMatrix); panelMatrix.Controls.Add(labelMatrix);
panelMatrix.Dock = DockStyle.Top; panelMatrix.Dock = DockStyle.Top;
panelMatrix.Location = new Point(16, 806); panelMatrix.Location = new Point(16, 814);
panelMatrix.Margin = new Padding(4); panelMatrix.Margin = new Padding(4);
panelMatrix.Name = "panelMatrix"; panelMatrix.Name = "panelMatrix";
panelMatrix.Size = new Size(722, 156); panelMatrix.Size = new Size(722, 180);
panelMatrix.TabIndex = 33; panelMatrix.TabIndex = 33;
// //
// checkMatrix // checkMatrix
// //
checkMatrix.AutoSize = true; checkMatrix.AutoSize = true;
checkMatrix.ForeColor = SystemColors.GrayText; checkMatrix.ForeColor = SystemColors.GrayText;
checkMatrix.Location = new Point(26, 112); checkMatrix.Location = new Point(28, 109);
checkMatrix.Margin = new Padding(4, 2, 4, 2); checkMatrix.Margin = new Padding(4, 2, 4, 2);
checkMatrix.Name = "checkMatrix"; checkMatrix.Name = "checkMatrix";
checkMatrix.Size = new Size(249, 36); checkMatrix.Size = new Size(249, 36);
@@ -159,7 +158,7 @@
buttonMatrix.Name = "buttonMatrix"; buttonMatrix.Name = "buttonMatrix";
buttonMatrix.Size = new Size(208, 42); buttonMatrix.Size = new Size(208, 42);
buttonMatrix.TabIndex = 43; buttonMatrix.TabIndex = 43;
buttonMatrix.Text = "Picture"; buttonMatrix.Text = "Picture / Gif";
buttonMatrix.UseVisualStyleBackColor = false; buttonMatrix.UseVisualStyleBackColor = false;
// //
// comboMatrixRunning // comboMatrixRunning
@@ -220,7 +219,7 @@
panelBattery.Controls.Add(labelBatteryTitle); panelBattery.Controls.Add(labelBatteryTitle);
panelBattery.Controls.Add(trackBattery); panelBattery.Controls.Add(trackBattery);
panelBattery.Dock = DockStyle.Top; panelBattery.Dock = DockStyle.Top;
panelBattery.Location = new Point(16, 962); panelBattery.Location = new Point(16, 994);
panelBattery.Margin = new Padding(4); panelBattery.Margin = new Padding(4);
panelBattery.Name = "panelBattery"; panelBattery.Name = "panelBattery";
panelBattery.Size = new Size(722, 148); panelBattery.Size = new Size(722, 148);
@@ -291,7 +290,7 @@
panelFooter.Controls.Add(buttonQuit); panelFooter.Controls.Add(buttonQuit);
panelFooter.Controls.Add(checkStartup); panelFooter.Controls.Add(checkStartup);
panelFooter.Dock = DockStyle.Top; panelFooter.Dock = DockStyle.Top;
panelFooter.Location = new Point(16, 1110); panelFooter.Location = new Point(16, 1142);
panelFooter.Margin = new Padding(4); panelFooter.Margin = new Padding(4);
panelFooter.Name = "panelFooter"; panelFooter.Name = "panelFooter";
panelFooter.Size = new Size(722, 64); panelFooter.Size = new Size(722, 64);
@@ -323,7 +322,6 @@
// panelPerformance // panelPerformance
// //
panelPerformance.Controls.Add(buttonFans); panelPerformance.Controls.Add(buttonFans);
panelPerformance.Controls.Add(checkBoost);
panelPerformance.Controls.Add(picturePerf); panelPerformance.Controls.Add(picturePerf);
panelPerformance.Controls.Add(labelPerf); panelPerformance.Controls.Add(labelPerf);
panelPerformance.Controls.Add(labelCPUFan); panelPerformance.Controls.Add(labelCPUFan);
@@ -348,18 +346,6 @@
buttonFans.Text = "Fans and Power"; buttonFans.Text = "Fans and Power";
buttonFans.UseVisualStyleBackColor = false; buttonFans.UseVisualStyleBackColor = false;
// //
// checkBoost
//
checkBoost.AutoSize = true;
checkBoost.ForeColor = SystemColors.GrayText;
checkBoost.Location = new Point(27, 154);
checkBoost.Margin = new Padding(4, 2, 4, 2);
checkBoost.Name = "checkBoost";
checkBoost.Size = new Size(320, 36);
checkBoost.TabIndex = 33;
checkBoost.Text = "CPU Turbo Boost enabled";
checkBoost.UseVisualStyleBackColor = true;
//
// picturePerf // picturePerf
// //
picturePerf.BackgroundImage = (Image)resources.GetObject("picturePerf.BackgroundImage"); picturePerf.BackgroundImage = (Image)resources.GetObject("picturePerf.BackgroundImage");
@@ -595,7 +581,7 @@
// //
checkScreen.AutoSize = true; checkScreen.AutoSize = true;
checkScreen.ForeColor = SystemColors.GrayText; checkScreen.ForeColor = SystemColors.GrayText;
checkScreen.Location = new Point(27, 154); checkScreen.Location = new Point(27, 153);
checkScreen.Margin = new Padding(4, 2, 4, 2); checkScreen.Margin = new Padding(4, 2, 4, 2);
checkScreen.Name = "checkScreen"; checkScreen.Name = "checkScreen";
checkScreen.Size = new Size(527, 36); checkScreen.Size = new Size(527, 36);
@@ -683,7 +669,7 @@
panelKeyboard.Location = new Point(16, 660); panelKeyboard.Location = new Point(16, 660);
panelKeyboard.Margin = new Padding(4); panelKeyboard.Margin = new Padding(4);
panelKeyboard.Name = "panelKeyboard"; panelKeyboard.Name = "panelKeyboard";
panelKeyboard.Size = new Size(722, 146); panelKeyboard.Size = new Size(722, 154);
panelKeyboard.TabIndex = 39; panelKeyboard.TabIndex = 39;
// //
// tableLayoutKeyboard // tableLayoutKeyboard
@@ -775,7 +761,7 @@
buttonKeyboardColor.Name = "buttonKeyboardColor"; buttonKeyboardColor.Name = "buttonKeyboardColor";
buttonKeyboardColor.Size = new Size(208, 42); buttonKeyboardColor.Size = new Size(208, 42);
buttonKeyboardColor.TabIndex = 39; buttonKeyboardColor.TabIndex = 39;
buttonKeyboardColor.Text = "Color "; buttonKeyboardColor.Text = "Color ";
buttonKeyboardColor.UseVisualStyleBackColor = false; buttonKeyboardColor.UseVisualStyleBackColor = false;
// //
// pictureKeyboard // pictureKeyboard
@@ -872,7 +858,6 @@
private CheckBox checkStartup; private CheckBox checkStartup;
private Panel panelPerformance; private Panel panelPerformance;
private Button buttonFans; private Button buttonFans;
private CheckBox checkBoost;
private PictureBox picturePerf; private PictureBox picturePerf;
private Label labelPerf; private Label labelPerf;
private Label labelCPUFan; private Label labelCPUFan;

View File

@@ -1,7 +1,6 @@
using Starlight.AnimeMatrix; using Starlight.AnimeMatrix;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Reflection;
using System.Timers; using System.Timers;
namespace GHelper namespace GHelper
@@ -20,14 +19,14 @@ namespace GHelper
static System.Timers.Timer aTimer = default!; static System.Timers.Timer aTimer = default!;
static System.Timers.Timer matrixTimer = default!; static System.Timers.Timer matrixTimer = default!;
public string versionUrl = "http://github.com/seerge/g-helper/releases";
public string perfName = "Balanced"; public string perfName = "Balanced";
Fans fans; Fans fans;
Keyboard keyb; Keyboard keyb;
static AnimeMatrixDevice mat; static AnimeMatrixDevice mat;
static bool matEnabled = false;
public SettingsForm() public SettingsForm()
{ {
@@ -61,7 +60,6 @@ namespace GHelper
buttonQuit.Click += ButtonQuit_Click; buttonQuit.Click += ButtonQuit_Click;
checkBoost.Click += CheckBoost_Click;
checkScreen.CheckedChanged += checkScreen_CheckedChanged; checkScreen.CheckedChanged += checkScreen_CheckedChanged;
@@ -77,9 +75,6 @@ namespace GHelper
pictureColor.Click += PictureColor_Click; pictureColor.Click += PictureColor_Click;
pictureColor2.Click += PictureColor2_Click; pictureColor2.Click += PictureColor2_Click;
labelVersion.Text = "Version " + Assembly.GetExecutingAssembly().GetName().Version.ToString();
labelVersion.Click += LabelVersion_Click;
labelCPUFan.Click += LabelCPUFan_Click; labelCPUFan.Click += LabelCPUFan_Click;
labelGPUFan.Click += LabelCPUFan_Click; labelGPUFan.Click += LabelCPUFan_Click;
@@ -93,10 +88,46 @@ namespace GHelper
buttonMatrix.Click += ButtonMatrix_Click; buttonMatrix.Click += ButtonMatrix_Click;
checkStartup.CheckedChanged += CheckStartup_CheckedChanged;
labelVersion.Click += LabelVersion_Click;
SetTimer(); SetTimer();
} }
public void SetVersionLabel(string label, string url = null)
{
labelVersion.Text = label;
if (url is not null)
{
versionUrl = url;
labelVersion.ForeColor = Color.Red;
}
}
private void LabelVersion_Click(object? sender, EventArgs e)
{
Process.Start(new ProcessStartInfo(versionUrl) { UseShellExecute = true });
}
private void CheckStartup_CheckedChanged(object? sender, EventArgs e)
{
if (sender is null) return;
CheckBox chk = (CheckBox)sender;
if (chk.Checked)
{
Startup.Schedule();
}
else
{
Startup.UnSchedule();
}
}
private void CheckMatrix_CheckedChanged(object? sender, EventArgs e) private void CheckMatrix_CheckedChanged(object? sender, EventArgs e)
{ {
if (sender is null) return; if (sender is null) return;
@@ -174,9 +205,9 @@ namespace GHelper
private void ButtonMatrix_Click(object? sender, EventArgs e) private void ButtonMatrix_Click(object? sender, EventArgs e)
{ {
string fileName = ""; string fileName = null;
Thread t = new Thread((ThreadStart)(() => Thread t = new Thread(() =>
{ {
OpenFileDialog of = new OpenFileDialog(); OpenFileDialog of = new OpenFileDialog();
of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png,*.gif)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF"; of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png,*.gif)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF";
@@ -185,18 +216,22 @@ namespace GHelper
fileName = of.FileName; fileName = of.FileName;
} }
return; return;
})); });
t.SetApartmentState(ApartmentState.STA); t.SetApartmentState(ApartmentState.STA);
t.Start(); t.Start();
t.Join(); t.Join();
Program.config.setConfig("matrix_picture", fileName); if (fileName is not null)
SetMatrixPicture(fileName);
BeginInvoke(delegate
{ {
comboMatrixRunning.SelectedIndex = 2; Program.config.setConfig("matrix_picture", fileName);
}); SetMatrixPicture(fileName);
BeginInvoke(delegate
{
comboMatrixRunning.SelectedIndex = 2;
});
}
} }
@@ -234,6 +269,8 @@ namespace GHelper
StopMatrixTimer(); StopMatrixTimer();
mat.SetProvider();
if (brightness == 0 || (auto && Plugged != PowerLineStatus.Online)) if (brightness == 0 || (auto && Plugged != PowerLineStatus.Online))
{ {
mat.SetDisplayState(false); mat.SetDisplayState(false);
@@ -252,6 +289,7 @@ namespace GHelper
{ {
mat.SetBuiltInAnimation(true, animation); mat.SetBuiltInAnimation(true, animation);
} }
} }
} }
@@ -264,11 +302,6 @@ namespace GHelper
RefreshSensors(); RefreshSensors();
} }
private void LabelVersion_Click(object? sender, EventArgs e)
{
Process.Start(new ProcessStartInfo("http://github.com/seerge/g-helper/releases") { UseShellExecute = true });
}
private void PictureColor2_Click(object? sender, EventArgs e) private void PictureColor2_Click(object? sender, EventArgs e)
{ {
@@ -305,7 +338,7 @@ namespace GHelper
if (fans == null || fans.Text == "") if (fans == null || fans.Text == "")
{ {
fans = new Fans(); fans = new Fans();
Debug.WriteLine("Starting fans"); //Debug.WriteLine("Starting fans");
} }
if (fans.Visible) if (fans.Visible)
@@ -367,36 +400,26 @@ namespace GHelper
public void InitMatrix() public void InitMatrix()
{ {
matrixTimer = new System.Timers.Timer();
matrixTimer.Enabled = false;
matrixTimer.Interval = 100;
try try
{ {
matEnabled = true;
mat = new AnimeMatrixDevice(); mat = new AnimeMatrixDevice();
matrixTimer = new System.Timers.Timer(100);
matrixTimer.Elapsed += MatrixTimer_Elapsed; matrixTimer.Elapsed += MatrixTimer_Elapsed;
} }
catch catch
{
matEnabled = false;
Debug.WriteLine("Anime Matrix not detected");
}
if (!matEnabled)
{ {
panelMatrix.Visible = false; panelMatrix.Visible = false;
return;
} }
else
{
int brightness = Program.config.getConfig("matrix_brightness");
int running = Program.config.getConfig("matrix_running");
comboMatrix.SelectedIndex = (brightness != -1) ? brightness : 0; int brightness = Program.config.getConfig("matrix_brightness");
comboMatrixRunning.SelectedIndex = (running != -1) ? running : 0; int running = Program.config.getConfig("matrix_running");
comboMatrix.SelectedIndex = (brightness != -1) ? brightness : 0;
comboMatrixRunning.SelectedIndex = (running != -1) ? running : 0;
checkMatrix.Checked = (Program.config.getConfig("matrix_auto") == 1);
checkMatrix.Checked = (Program.config.getConfig("matrix_auto") == 1);
}
} }
@@ -462,19 +485,6 @@ namespace GHelper
SetAuraMode(cmb.SelectedIndex); SetAuraMode(cmb.SelectedIndex);
} }
private void CheckBoost_Click(object? sender, EventArgs e)
{
if (sender is null)
return;
CheckBox chk = (CheckBox)sender;
if (chk.Checked)
NativeMethods.SetCPUBoost(2);
else
NativeMethods.SetCPUBoost(0);
}
private void Button120Hz_Click(object? sender, EventArgs e) private void Button120Hz_Click(object? sender, EventArgs e)
{ {
SetScreen(1000, 1); SetScreen(1000, 1);
@@ -517,13 +527,6 @@ namespace GHelper
InitScreen(); InitScreen();
} }
public void InitBoost()
{
int boost = NativeMethods.GetCPUBoost();
checkBoost.Checked = (boost > 0);
}
public void InitScreen() public void InitScreen()
{ {
@@ -682,6 +685,42 @@ namespace GHelper
} }
} }
public void SetPower()
{
int limit_total = Program.config.getConfigPerf("limit_total");
int limit_cpu = Program.config.getConfigPerf("limit_cpu");
if (limit_total > ASUSWmi.MaxTotal) return;
if (limit_total < ASUSWmi.MinTotal) return;
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);
Debug.WriteLine(limit_total.ToString() + ", " + limit_cpu.ToString());
}
public void AutoFansAndPower()
{
if (Program.config.getConfigPerf("auto_apply") == 1)
{
Program.wmi.SetFanCurve(0, Program.config.getFanConfig(0));
Program.wmi.SetFanCurve(1, Program.config.getFanConfig(1));
}
if (Program.config.getConfigPerf("auto_apply_power") == 1)
{
SetPower();
}
}
public void SetPerformanceMode(int PerformanceMode = ASUSWmi.PerformanceBalanced, bool notify = false) public void SetPerformanceMode(int PerformanceMode = ASUSWmi.PerformanceBalanced, bool notify = false)
{ {
@@ -711,18 +750,7 @@ namespace GHelper
Program.config.setConfig("performance_mode", PerformanceMode); Program.config.setConfig("performance_mode", PerformanceMode);
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, PerformanceMode); Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, PerformanceMode);
Debug.WriteLine("Perf:" + PerformanceMode);
if (Program.config.getConfig("auto_apply_" + PerformanceMode) == 1)
{
Program.wmi.SetFanCurve(0, Program.config.getFanConfig(0));
Program.wmi.SetFanCurve(1, Program.config.getFanConfig(1));
}
if (fans != null && fans.Text != "")
{
fans.LoadFans();
fans.ResetApplyLabel();
}
if (notify && (oldMode != PerformanceMode)) if (notify && (oldMode != PerformanceMode))
{ {
@@ -736,6 +764,16 @@ namespace GHelper
} }
} }
AutoFansAndPower();
if (fans != null && fans.Text != "")
{
fans.InitFans();
fans.InitPower();
}
} }
@@ -954,20 +992,8 @@ namespace GHelper
{ {
checkStartup.Checked = status; checkStartup.Checked = status;
} }
private void checkStartup_CheckedChanged(object sender, EventArgs e)
{
CheckBox chk = (CheckBox)sender;
if (chk.Checked)
{
Startup.Schedule();
}
else
{
Startup.UnSchedule();
}
}
public void SetBatteryChargeLimit(int limit = 100) public void SetBatteryChargeLimit(int limit)
{ {
if (limit < 40 || limit > 100) return; if (limit < 40 || limit > 100) return;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.4 MiB