Compare commits

..

44 Commits

Author SHA1 Message Date
Serge
8f0e4431e6 Label 2023-09-08 21:45:17 +02:00
Serge
bff2676b64 Calibrate in turbo mode 2023-09-08 19:47:12 +02:00
Serge
e9e5fe1cc9 Simplification 2023-09-08 19:37:09 +02:00
Serge
e6a78fc8f7 Fan Calibration 2023-09-08 19:32:37 +02:00
Serge
0e3efcf547 Calibration 2023-09-08 19:12:57 +02:00
Serge
4ae3fb4e3d Boot Sound 2023-09-07 17:29:35 +02:00
Serge
20e7dd96a1 Cleanup 2023-09-07 17:07:34 +02:00
Serge
d36cd409a4 XGM Config Flag 2023-09-07 15:37:09 +02:00
Serge
082eceed9a Update checker 2023-09-07 13:44:31 +02:00
Serge
46c91d1956 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-07 10:06:58 +02:00
Serge
edfb829988 XGM activation https://github.com/seerge/g-helper/issues/729 2023-09-07 10:06:56 +02:00
Serge
83cb28e99c Update README.md 2023-09-06 22:11:38 +02:00
Serge
957916bfdf XGM Special Activation 2023-09-06 21:51:09 +02:00
Serge
2f98606a7d XG Mobile tweaks 2023-09-06 19:58:14 +02:00
Serge
c791421c3e Merge pull request #1264 from seerge/G14-2021-Matrix
Anime Matrix tweaks
2023-09-06 19:04:55 +02:00
Serge
fa79a72247 Anime Matrix tweaks 2023-09-06 19:03:27 +02:00
Serge
831f7b8989 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-06 16:01:20 +02:00
Serge
77800475cb Matrix Clock 2023-09-06 16:01:18 +02:00
Serge
96553a162c Merge pull request #1262 from seerge/l10n_main
New Crowdin updates
2023-09-06 13:56:27 +02:00
Serge
d1e987f4da New translations Strings.resx (Polish) 2023-09-06 13:54:28 +02:00
Serge
a1fb740c27 TUF Backlight for new models https://github.com/seerge/g-helper/issues/1250 2023-09-06 13:50:48 +02:00
Serge
cff47002e1 Matrix memory optimisations 2023-09-05 23:51:14 +02:00
Serge
c34ba9c620 Cleanup 2023-09-05 23:31:18 +02:00
Serge
3da2d042c8 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-05 21:39:00 +02:00
Serge
b93499c20d Anime Matrix Editor 2023-09-05 21:38:58 +02:00
Serge
feb7f1915e Update README.md 2023-09-04 22:37:53 +02:00
Serge
bd7f494830 Merge pull request #1247 from seerge/l10n_main
New Crowdin updates
2023-09-03 19:07:33 +02:00
Serge
1fc5095a65 New translations Strings.resx (Chinese Traditional) 2023-09-03 19:07:10 +02:00
Serge
920ed5e176 Update README.md 2023-09-03 18:33:26 +02:00
Serge
fce9cddd02 XGM for devices without dGPU https://github.com/seerge/g-helper/issues/1235 2023-09-03 15:53:43 +02:00
Serge
3332bd4b36 Merge branch 'main' of https://github.com/seerge/g-helper 2023-09-03 14:14:55 +02:00
Serge
56289abc36 Allow XGM connection from any dGPU mode for models w/o dGPU https://github.com/seerge/g-helper/issues/1235
Hide Backlight OSD if asus OSD is running
2023-09-03 14:14:54 +02:00
Serge
9be02a102d Merge pull request #1240 from seerge/l10n_main
New Crowdin updates
2023-09-02 17:52:56 +02:00
Serge
e1e94e1118 New translations Strings.resx (Portuguese) 2023-09-02 15:26:19 +02:00
Serge
2ffd08e754 Merge pull request #1236 from IceStormNG/asus-mouse-support
Pugio II (P705) Support
2023-09-02 00:56:42 +02:00
IceStormNG
0378b65763 Added Pugio II (P705) Mouse configuration 2023-09-02 00:54:16 +02:00
IceStormNG
5dd3760e90 Fixed mapping of animation speed values in the UI (how was that bug not found yet?) 2023-09-02 00:53:33 +02:00
IceStormNG
e7eb7fab8a Make low battery warning values configureable per mouse 2023-09-02 00:53:00 +02:00
IceStormNG
ce128adc4f Only open one Mouse settings window and also make it the topmost window. 2023-09-02 00:52:15 +02:00
Serge
a794f8ed5f Single color backlight for keyboard version 22/23 https://github.com/seerge/g-helper/issues/1230 2023-08-31 23:33:44 +02:00
Serge
9d30f2f83e Version bump 2023-08-31 12:09:27 +02:00
Serge
b93f1a385b Arrow lock for DUO https://github.com/seerge/g-helper/issues/1224 2023-08-30 23:49:32 +02:00
Serge
6bb4ba4119 Screenpad hotkey for DUO https://github.com/seerge/g-helper/issues/1215 2023-08-30 14:41:20 +02:00
Serge
178cb04002 Turn off display fix https://github.com/seerge/g-helper/issues/1218
Zephyrus DUO Screenpad hotkey https://github.com/seerge/g-helper/issues/1215
2023-08-30 12:45:07 +02:00
38 changed files with 1644 additions and 395 deletions

View File

@@ -2,7 +2,9 @@
using NAudio.Wave;
using Starlight.AnimeMatrix;
using System.Diagnostics;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Timers;
namespace GHelper.AnimeMatrix
@@ -14,12 +16,12 @@ namespace GHelper.AnimeMatrix
SettingsForm settings;
System.Timers.Timer matrixTimer = default!;
AnimeMatrixDevice? mat;
public AnimeMatrixDevice? device;
double[]? AudioValues;
WasapiCapture? AudioDevice;
public bool IsValid => mat != null;
public bool IsValid => device != null;
private long lastPresent;
private List<double> maxes = new List<double>();
@@ -30,14 +32,14 @@ namespace GHelper.AnimeMatrix
try
{
mat = new AnimeMatrixDevice();
Task.Run(mat.WakeUp);
device = new AnimeMatrixDevice();
Task.Run(device.WakeUp);
matrixTimer = new System.Timers.Timer(100);
matrixTimer.Elapsed += MatrixTimer_Elapsed;
}
catch
{
mat = null;
device = null;
}
}
@@ -67,24 +69,26 @@ namespace GHelper.AnimeMatrix
try
{
mat.SetProvider();
} catch (Exception ex) {
device.SetProvider();
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
return;
}
if (wakeUp && AppConfig.ContainsModel("401")) mat.WakeUp();
if (wakeUp && AppConfig.ContainsModel("401")) device.WakeUp();
if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online))
{
mat.SetDisplayState(false);
mat.SetDisplayState(false); // some devices are dumb
device.SetDisplayState(false);
device.SetDisplayState(false); // some devices are dumb
Logger.WriteLine("Matrix Off");
}
else
{
mat.SetDisplayState(true);
mat.SetBrightness((BrightnessMode)brightness);
device.SetDisplayState(true);
device.SetBrightness((BrightnessMode)brightness);
switch (running)
{
@@ -98,7 +102,7 @@ namespace GHelper.AnimeMatrix
SetMatrixAudio();
break;
default:
mat.SetBuiltInAnimation(true, animation);
device.SetBuiltInAnimation(true, animation);
Logger.WriteLine("Matrix builtin " + animation.AsByte);
break;
@@ -127,10 +131,10 @@ namespace GHelper.AnimeMatrix
switch (AppConfig.Get("matrix_running"))
{
case 2:
mat.PresentNextFrame();
device.PresentNextFrame();
break;
case 3:
mat.PresentClock();
device.PresentClock();
break;
}
@@ -139,7 +143,7 @@ namespace GHelper.AnimeMatrix
public void SetMatrixClock()
{
mat.SetBuiltInAnimation(false);
device.SetBuiltInAnimation(false);
StartMatrixTimer(1000);
Logger.WriteLine("Matrix Clock");
}
@@ -169,7 +173,7 @@ namespace GHelper.AnimeMatrix
{
if (!IsValid) return;
mat.SetBuiltInAnimation(false);
device.SetBuiltInAnimation(false);
StopMatrixTimer();
StopMatrixAudio();
@@ -238,8 +242,8 @@ namespace GHelper.AnimeMatrix
for (int x = 0; x < 2 - (y % 2); x++)
{
//color = (byte)(Math.Min(1,(h - y - 2)*2) * 255);
mat.SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
mat.SetLedPlanar(x + dx, dy - y, 255);
device.SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
device.SetLedPlanar(x + dx, dy - y, 255);
}
}
@@ -249,7 +253,7 @@ namespace GHelper.AnimeMatrix
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastPresent) < 70) return;
lastPresent = DateTimeOffset.Now.ToUnixTimeMilliseconds();
mat.Clear();
device.Clear();
int size = 20;
double[] bars = new double[size];
@@ -267,7 +271,7 @@ namespace GHelper.AnimeMatrix
for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i] * 20 / maxAverage);
mat.Present();
device.Present();
}
@@ -302,22 +306,30 @@ namespace GHelper.AnimeMatrix
}
public void SetMatrixPicture(string fileName)
public void SetMatrixPicture(string fileName, bool visualise = true)
{
if (!IsValid) return;
StopMatrixTimer();
Image image;
try
{
using (var fs = new FileStream(fileName, FileMode.Open))
//using (var ms = new MemoryStream())
{
var ms = new MemoryStream();
/*
ms.SetLength(0);
fs.CopyTo(ms);
ms.Position = 0;
image = Image.FromStream(ms);
*/
using (Image image = Image.FromStream(fs))
{
ProcessPicture(image);
Logger.WriteLine("Matrix " + fileName);
}
fs.Close();
if (visualise) settings.VisualiseMatrix(fileName);
}
}
catch
@@ -326,30 +338,49 @@ namespace GHelper.AnimeMatrix
return;
}
mat.SetBuiltInAnimation(false);
mat.ClearFrames();
}
protected void ProcessPicture(Image image)
{
device.SetBuiltInAnimation(false);
device.ClearFrames();
int matrixX = AppConfig.Get("matrix_x", 0);
int matrixY = AppConfig.Get("matrix_y", 0);
int matrixZoom = AppConfig.Get("matrix_zoom", 100);
int matrixSpeed = AppConfig.Get("matrix_speed", 50);
InterpolationMode matrixQuality = (InterpolationMode)AppConfig.Get("matrix_quality", 0);
FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]);
int frameCount = image.GetFrameCount(dimension);
if (frameCount > 1)
{
var delayPropertyBytes = image.GetPropertyItem(0x5100).Value;
var frameDelay = BitConverter.ToInt32(delayPropertyBytes) * 10;
for (int i = 0; i < frameCount; i++)
{
image.SelectActiveFrame(dimension, i);
mat.GenerateFrame(image);
mat.AddFrame();
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality);
device.AddFrame();
}
StartMatrixTimer();
Logger.WriteLine("Matrix GIF " + fileName);
Logger.WriteLine("GIF Delay:" + frameDelay);
StartMatrixTimer(Math.Max(matrixSpeed, frameDelay));
//image.SelectActiveFrame(dimension, 0);
}
else
{
mat.GenerateFrame(image);
mat.Present();
Logger.WriteLine("Matrix " + fileName);
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality);
device.Present();
}
}

View File

@@ -2,8 +2,8 @@
using GHelper.AnimeMatrix.Communication;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Globalization;
using System.Management;
using System.Text;
@@ -77,6 +77,7 @@ namespace Starlight.AnimeMatrix
}
public class AnimeMatrixDevice : Device
{
int UpdatePageLength = 490;
@@ -86,33 +87,36 @@ namespace Starlight.AnimeMatrix
List<byte[]> frames = new List<byte[]>();
public int MaxRows = 61;
//public int FullRows = 11;
//public int FullEvenRows = -1;
public int dx = 0;
public int MaxColumns = 34;
public int LedStart = 0;
public int TextShift = 8;
private int frameIndex = 0;
private static AnimeType _model = AnimeType.GA402;
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
private static extern IntPtr AddFontMemResourceEx(IntPtr pbFont, uint cbFont, IntPtr pdv, [System.Runtime.InteropServices.In] ref uint pcFonts);
private PrivateFontCollection fonts = new PrivateFontCollection();
public AnimeMatrixDevice()
: base(0x0B05, 0x193B, 640)
public AnimeMatrixDevice() : base(0x0B05, 0x193B, 640)
{
string model = GetModel();
if (model.Contains("401"))
{
_model = AnimeType.GA401;
MaxColumns = 33;
dx = 1;
MaxRows = 55;
LedCount = 1245;
UpdatePageLength = 410;
TextShift = 11;
LedStart = 1;
}
if (model.Contains("GU604"))
@@ -123,12 +127,35 @@ namespace Starlight.AnimeMatrix
MaxRows = 92;
LedCount = 1711;
UpdatePageLength = 630;
TextShift = 10;
}
_displayBuffer = new byte[LedCount];
/*
for (int i = 0; i < MaxRows; i++)
{
_model = AnimeType.GA401;
Logger.WriteLine(FirstX(i) + " " + Pitch(i));
}
*/
LoadMFont();
}
private void LoadMFont()
{
byte[] fontData = GHelper.Properties.Resources.MFont;
IntPtr fontPtr = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(fontData.Length);
System.Runtime.InteropServices.Marshal.Copy(fontData, 0, fontPtr, fontData.Length);
uint dummy = 0;
fonts.AddMemoryFont(fontPtr, GHelper.Properties.Resources.MFont.Length);
AddFontMemResourceEx(fontPtr, (uint)GHelper.Properties.Resources.MFont.Length, IntPtr.Zero, ref dummy);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
}
public string GetModel()
{
@@ -172,32 +199,7 @@ namespace Starlight.AnimeMatrix
}
public static int FirstX(int y)
{
switch (_model)
{
case AnimeType.GA401:
if (y < 5)
{
return 0;
}
else
{
return (y + 1) / 2 - 3;
}
case AnimeType.GU604:
if (y < 9 && y % 2 == 0)
{
return 1;
}
return (int)Math.Ceiling(Math.Max(0, y - 9) / 2F);
default:
return (int)Math.Ceiling(Math.Max(0, y - 11) / 2F);
}
}
public static int Width(int y)
public int Width()
{
switch (_model)
{
@@ -210,7 +212,30 @@ namespace Starlight.AnimeMatrix
}
}
public static int Pitch(int y)
public int FirstX(int y)
{
switch (_model)
{
case AnimeType.GA401:
if (y < 5 && y % 2 == 0)
{
return 1;
}
return (int)Math.Ceiling(Math.Max(0, y - 5) / 2F);
case AnimeType.GU604:
if (y < 9 && y % 2 == 0)
{
return 1;
}
return (int)Math.Ceiling(Math.Max(0, y - 9) / 2F);
default:
return (int)Math.Ceiling(Math.Max(0, y - 11) / 2F);
}
}
public int Pitch(int y)
{
switch (_model)
{
@@ -246,19 +271,19 @@ namespace Starlight.AnimeMatrix
return 39;
default:
return Width(y) - FirstX(y);
return Width() - FirstX(y);
}
default:
return Width(y) - FirstX(y);
return Width() - FirstX(y);
}
}
public int RowToLinearAddress(int y)
{
int ret = 0;
int ret = LedStart;
for (var i = 0; i < y; i++)
ret += Pitch(i);
@@ -269,8 +294,8 @@ namespace Starlight.AnimeMatrix
{
if (!IsRowInRange(y)) return;
if (x >= FirstX(y) && x < Width(y))
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x + dx, value);
if (x >= FirstX(y) && x < Width())
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x, value);
}
public void WakeUp()
@@ -368,20 +393,49 @@ namespace Starlight.AnimeMatrix
public void PresentClock()
{
int second = DateTime.Now.Second;
string time;
string second = (DateTime.Now.Second % 2 == 0) ? ":" : " ";
string time = DateTime.Now.ToString("HH" + second + "mm");
if (CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern.Contains("H"))
time = DateTime.Now.ToString("H" + ((second % 2 == 0) ? ":" : " ") + "mm");
else
time = DateTime.Now.ToString("h" + ((second % 2 == 0) ? ":" : " ") + "mmtt");
Clear();
TextDiagonal(time, 15, 12, TextShift + 11);
TextDiagonal(DateTime.Now.ToString("yy'. 'MM'. 'dd"), 11.5F, 3, TextShift);
Present();
if (_model == AnimeType.GA401)
PresentText(time);
else
PresentTextDiagonal(time);
}
public void TextDiagonal(string text, float fontSize = 10, int deltaX = 0, int deltaY = 10)
{
int maxX = (int)Math.Sqrt(MaxRows * MaxRows + MaxColumns * MaxColumns);
int textHeight;
using (Bitmap bmp = new Bitmap(maxX, MaxRows))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
using (Font font = new Font(fonts.Families[0], fontSize, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text, font);
textHeight = (int)textSize.Height;
g.DrawString(text, font, Brushes.White, 0, 0);
}
}
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
if (color > 100) SetLedDiagonal(x, y, (byte)color, deltaX, deltaY);
}
}
}
}
public void PresentText(string text1, string text2 = "")
@@ -392,8 +446,9 @@ namespace Starlight.AnimeMatrix
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
using (Font font = new Font("Consolas", 21F, FontStyle.Regular, GraphicsUnit.Pixel))
using (Font font = new Font("Consolas", 22F, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text1, font);
g.DrawString(text1, font, Brushes.White, (MaxColumns * 3 - textSize.Width) + 3, -4);
@@ -408,13 +463,15 @@ namespace Starlight.AnimeMatrix
}
GenerateFrame(bmp, InterpolationMode.Bicubic);
bmp.Save("test.bmp", ImageFormat.Bmp);
GenerateFrame(bmp);
Present();
}
}
public void GenerateFrame(Image image, InterpolationMode interpolation = InterpolationMode.High)
public void GenerateFrame(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
{
int width = MaxColumns / 2 * 6;
@@ -426,25 +483,25 @@ namespace Starlight.AnimeMatrix
using (Bitmap bmp = new Bitmap(targetWidth, height))
{
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height);
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height) * zoom / 100;
using (var graph = Graphics.FromImage(bmp))
{
var scaleWidth = (float)(image.Width * scale);
var scaleHeight = (float)(image.Height * scale);
graph.InterpolationMode = interpolation;
graph.InterpolationMode = quality;
graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, (float)Math.Round(targetWidth - scaleWidth * targetWidth / width), 0, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);
graph.DrawImage(image, (float)Math.Round(targetWidth - (scaleWidth + panX) * targetWidth / width), -panY, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);
}
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
if (x % 2 == (y + dx) % 2)
if (x % 2 == y % 2)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
@@ -456,68 +513,16 @@ namespace Starlight.AnimeMatrix
}
public void SetLedDiagonal(int x, int y, byte color, int delta = 10)
public void SetLedDiagonal(int x, int y, byte color, int deltaX = 0, int deltaY = 10)
{
//x+=delta;
y -= delta;
x += deltaX;
y -= deltaY;
int dx = (x - y) / 2;
int dy = x + y;
SetLedPlanar(dx, dy, color);
int plX = (x - y) / 2;
int plY = x + y;
SetLedPlanar(plX, plY, color);
}
public void PresentTextDiagonal(string text)
{
Clear();
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
string familyName;
string familyList = "";
FontFamily[] fontFamilies;
// Get the array of FontFamily objects.
fontFamilies = installedFontCollection.Families;
int count = fontFamilies.Length;
for (int j = 0; j < count; ++j)
{
familyName = fontFamilies[j].Name;
familyList = familyList + familyName;
familyList = familyList + ", ";
}
int maxX = (int)Math.Sqrt(MaxRows * MaxRows + MaxColumns * MaxColumns);
using (Bitmap bmp = new Bitmap(maxX, MaxRows))
{
using (Graphics g = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
using (Font font = new Font("Consolas", 13F, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text, font);
g.DrawString(text, font, Brushes.White, 4, 1);
}
}
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
SetLedDiagonal(x, y, (byte)color);
}
}
}
Present();
}
private bool IsRowInRange(int row)
{

View File

@@ -380,4 +380,10 @@ public static class AppConfig
{
return Is("gpu_mode_force_set") || ContainsModel("503");
}
public static bool IsNoGPUModes()
{
return ContainsModel("GV301RA") || ContainsModel("GV302XA") || IsAlly();
}
}

View File

@@ -1,4 +1,5 @@
using System.Management;
using GHelper;
using System.Management;
using System.Runtime.InteropServices;
public enum AsusFan
@@ -59,8 +60,10 @@ public class AsusACPI
public const uint VivoBookMode = 0x00110019; // Vivobook performance modes
public const uint GPUEco = 0x00090020;
public const uint GPUXGConnected = 0x00090018;
public const uint GPUXG = 0x00090019;
public const uint GPUMux = 0x00090016;
public const uint BatteryLimit = 0x00120057;
@@ -91,6 +94,7 @@ public class AsusACPI
public const int TUF_KB_BRIGHTNESS = 0x00050021;
public const int TUF_KB = 0x00100056;
public const int TUF_KB2 = 0x0010005a;
public const int TUF_KB_STATE = 0x00100057;
public const int MICMUTE_LED = 0x00040017;
@@ -101,6 +105,8 @@ public class AsusACPI
public const int ScreenPadToggle = 0x00050031;
public const int ScreenPadBrightness = 0x00050032;
public const int BootSound = 0x00130022;
public const int Tablet_Notebook = 0;
public const int Tablet_Tablet = 1;
public const int Tablet_Tent = 2;
@@ -341,6 +347,32 @@ public class AsusACPI
return -1;
}
public int GetFan(AsusFan device)
{
int fan = -1;
switch (device)
{
case AsusFan.GPU:
fan = Program.acpi.DeviceGet(GPU_Fan);
break;
case AsusFan.Mid:
fan = Program.acpi.DeviceGet(Mid_Fan);
break;
default:
fan = Program.acpi.DeviceGet(CPU_Fan);
break;
}
if (fan < 0)
{
fan += 65536;
if (fan <= 0 || fan > 100) fan = -1;
}
return fan;
}
public int SetFanRange(AsusFan device, byte[] curve)
{
byte min = (byte)(curve[8] * 255 / 100);
@@ -374,7 +406,7 @@ public class AsusACPI
// it seems to be a bug, when some old model's bios can go nuts if fan is set to 100%
for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)99, curve[i])) * fanScale / 100);
for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)100, curve[i])) * fanScale / 100);
switch (device)
{
@@ -508,16 +540,17 @@ public class AsusACPI
public void TUFKeyboardRGB(int mode, Color color, int speed)
{
byte[] setting = new byte[12];
setting[0] = (byte)0xB4;
byte[] setting = new byte[6];
setting[0] = (byte)0xb4;
setting[1] = (byte)mode;
setting[2] = color.R;
setting[3] = color.G;
setting[4] = color.B;
setting[5] = (byte)speed;
DeviceSet(TUF_KB, setting, "TUF RGB");
//Debug.WriteLine(BitConverter.ToString(setting));
int result = DeviceSet(TUF_KB, setting, "TUF RGB");
if (result != 1) DeviceSet(TUF_KB2, setting, "TUF RGB");
}

View File

@@ -301,8 +301,10 @@ namespace GHelper
private void ComboBoxAnimationSpeed_DropDownClosed(object? sender, EventArgs e)
{
LightingSetting? ls = mouse.LightingSettingForZone(visibleZone);
ls.AnimationSpeed = (AnimationSpeed)comboBoxAnimationSpeed.SelectedIndex;
// 0 => 0x9
// 1 => 0x7
// 2 => 0x5
ls.AnimationSpeed = (AnimationSpeed)(0x9 - (comboBoxAnimationSpeed.SelectedIndex * 0x2));
UpdateLightingSettings(ls, visibleZone);
}
@@ -602,6 +604,12 @@ namespace GHelper
labelLowBatteryWarningValue.Visible = false;
sliderLowBatteryWarning.Visible = false;
}
else
{
sliderLowBatteryWarning.Min = 0;
sliderLowBatteryWarning.Step = mouse.LowBatteryWarningStep();
sliderLowBatteryWarning.Max = mouse.LowBatteryWarningMax();
}
if (!mouse.HasAutoPowerOff() && !mouse.HasLowBatteryWarning())
{
@@ -824,8 +832,10 @@ namespace GHelper
else
pictureBoxLightingColor.BackColor = ls.RGBColor;
comboBoxAnimationSpeed.SelectedIndex = (((int)ls.AnimationSpeed) - 5) / 2;
//0x09 => 0
//0x07 => 1
//0x05 => 2
comboBoxAnimationSpeed.SelectedIndex = 2 - ((((int)ls.AnimationSpeed) - 5) / 2);
comboBoxAnimationDirection.SelectedIndex = (int)ls.AnimationDirection;
}

View File

@@ -124,7 +124,7 @@ namespace GHelper
isSingleColor = AppConfig.ContainsModel("GA401") || AppConfig.ContainsModel("X13"); // Mono Color
var device = GetDevice(AURA_HID_ID);
if (device is not null && device.Attributes.Version == 22 && AppConfig.ContainsModel("GA402X")) isSingleColor = true;
if (device is not null && (device.Attributes.Version == 22 || device.Attributes.Version == 23) && (AppConfig.ContainsModel("GA402X") || AppConfig.ContainsModel("GA402N"))) isSingleColor = true;
}
private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
@@ -641,11 +641,20 @@ namespace GHelper
public static void InitXGM()
{
SetXGM(LED_INIT1);
SetXGM(LED_INIT2);
SetXGM(LED_INIT3);
SetXGM(LED_INIT4);
SetXGM(LED_INIT5);
byte[] ASUS_INIT = Encoding.ASCII.GetBytes("^ASUS Tech.Inc.");
SetXGM(ASUS_INIT);
/*
SetXGM(new byte[] { 0x5e, 0xd0, 0x02 });
SetXGM(new byte[] { 0x5e, 0xd0, 0x03 });
SetXGM(ASUS_INIT);
SetXGM(new byte[] { 0x5e, 0xd1, 0x02 }); // reset fan
SetXGM(ASUS_INIT);
SetXGM(new byte[] { 0x5e, 0xce, 0x03 });
SetXGM(new byte[] { 0x5e, 0xd0, 0x04 });
SetXGM(new byte[] { 0x5e, 0xd0, 0x01 });
*/
}
public static void ApplyXGMLight(bool status)

View File

@@ -9,8 +9,8 @@
if (limit < 0) limit = AppConfig.Get("charge_limit");
if (limit < 40 || limit > 100) return;
Program.settingsForm.VisualiseBattery(limit);
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, limit, "BatteryLimit");
Program.settingsForm.VisualiseBattery(limit);
AppConfig.Set("charge_limit", limit);

28
app/Extra.Designer.cs generated
View File

@@ -115,6 +115,7 @@ namespace GHelper
labelHibernateAfter = new Label();
pictureHibernate = new PictureBox();
toolTip = new ToolTip(components);
checkBootSound = new CheckBox();
panelServices.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureService).BeginInit();
panelBindingsHeader.SuspendLayout();
@@ -147,7 +148,7 @@ namespace GHelper
panelServices.Controls.Add(labelServices);
panelServices.Controls.Add(buttonServices);
panelServices.Dock = DockStyle.Top;
panelServices.Location = new Point(15, 1279);
panelServices.Location = new Point(15, 1321);
panelServices.Name = "panelServices";
panelServices.Size = new Size(983, 75);
panelServices.TabIndex = 5;
@@ -1065,6 +1066,7 @@ namespace GHelper
panelSettings.Controls.Add(checkAutoToggleClamshellMode);
panelSettings.Controls.Add(checkTopmost);
panelSettings.Controls.Add(checkNoOverdrive);
panelSettings.Controls.Add(checkBootSound);
panelSettings.Controls.Add(checkUSBC);
panelSettings.Controls.Add(checkVariBright);
panelSettings.Controls.Add(checkGpuApps);
@@ -1073,14 +1075,14 @@ namespace GHelper
panelSettings.Location = new Point(15, 921);
panelSettings.Name = "panelSettings";
panelSettings.Padding = new Padding(20, 5, 11, 5);
panelSettings.Size = new Size(983, 304);
panelSettings.Size = new Size(983, 346);
panelSettings.TabIndex = 3;
//
// checkAutoToggleClamshellMode
//
checkAutoToggleClamshellMode.AutoSize = true;
checkAutoToggleClamshellMode.Dock = DockStyle.Top;
checkAutoToggleClamshellMode.Location = new Point(20, 257);
checkAutoToggleClamshellMode.Location = new Point(20, 299);
checkAutoToggleClamshellMode.Name = "checkAutoToggleClamshellMode";
checkAutoToggleClamshellMode.Padding = new Padding(3);
checkAutoToggleClamshellMode.Size = new Size(952, 42);
@@ -1092,7 +1094,7 @@ namespace GHelper
//
checkTopmost.AutoSize = true;
checkTopmost.Dock = DockStyle.Top;
checkTopmost.Location = new Point(20, 215);
checkTopmost.Location = new Point(20, 257);
checkTopmost.Margin = new Padding(4, 3, 4, 3);
checkTopmost.Name = "checkTopmost";
checkTopmost.Padding = new Padding(3);
@@ -1105,7 +1107,7 @@ namespace GHelper
//
checkNoOverdrive.AutoSize = true;
checkNoOverdrive.Dock = DockStyle.Top;
checkNoOverdrive.Location = new Point(20, 173);
checkNoOverdrive.Location = new Point(20, 215);
checkNoOverdrive.Margin = new Padding(4, 3, 4, 3);
checkNoOverdrive.Name = "checkNoOverdrive";
checkNoOverdrive.Padding = new Padding(3);
@@ -1172,7 +1174,7 @@ namespace GHelper
panelPower.Controls.Add(labelHibernateAfter);
panelPower.Controls.Add(pictureHibernate);
panelPower.Dock = DockStyle.Top;
panelPower.Location = new Point(15, 1225);
panelPower.Location = new Point(15, 1267);
panelPower.Name = "panelPower";
panelPower.Size = new Size(983, 54);
panelPower.TabIndex = 4;
@@ -1209,6 +1211,19 @@ namespace GHelper
pictureHibernate.TabIndex = 22;
pictureHibernate.TabStop = false;
//
// checkBootSound
//
checkBootSound.AutoSize = true;
checkBootSound.Dock = DockStyle.Top;
checkBootSound.Location = new Point(20, 173);
checkBootSound.Margin = new Padding(4, 3, 4, 3);
checkBootSound.Name = "checkBootSound";
checkBootSound.Padding = new Padding(3);
checkBootSound.Size = new Size(952, 42);
checkBootSound.TabIndex = 10;
checkBootSound.Text = "Boot Sound";
checkBootSound.UseVisualStyleBackColor = true;
//
// Extra
//
AutoScaleDimensions = new SizeF(192F, 192F);
@@ -1356,5 +1371,6 @@ namespace GHelper
private NumericUpDown numericHibernateAfter;
private CheckBox checkGPUFix;
private ToolTip toolTip;
private CheckBox checkBootSound;
}
}

View File

@@ -108,6 +108,7 @@ namespace GHelper
checkSleep.Text = Properties.Strings.Sleep;
checkBoot.Text = Properties.Strings.Boot;
checkShutdown.Text = Properties.Strings.Shutdown;
checkBootSound.Text = Properties.Strings.BootSound;
labelSpeed.Text = Properties.Strings.AnimationSpeed;
//labelBrightness.Text = Properties.Strings.Brightness;
@@ -311,6 +312,9 @@ namespace GHelper
checkGpuApps.Checked = AppConfig.Is("kill_gpu_apps");
checkGpuApps.CheckedChanged += CheckGpuApps_CheckedChanged;
checkBootSound.Checked = (Program.acpi.DeviceGet(AsusACPI.BootSound) == 1);
checkBootSound.CheckedChanged += CheckBootSound_CheckedChanged;
pictureHelp.Click += PictureHelp_Click;
buttonServices.Click += ButtonServices_Click;
@@ -327,6 +331,11 @@ namespace GHelper
InitHibernate();
}
private void CheckBootSound_CheckedChanged(object? sender, EventArgs e)
{
Program.acpi.DeviceSet(AsusACPI.BootSound, (checkBootSound.Checked ? 1 : 0), "BootSound");
}
private void CheckGPUFix_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.Set("gpu_fix", (checkGPUFix.Checked ? 1 : 0));

211
app/Fans.Designer.cs generated
View File

@@ -31,14 +31,14 @@ namespace GHelper
/// </summary>
private void InitializeComponent()
{
ChartArea chartArea9 = new ChartArea();
Title title9 = new Title();
ChartArea chartArea10 = new ChartArea();
Title title10 = new Title();
ChartArea chartArea11 = new ChartArea();
Title title11 = new Title();
ChartArea chartArea12 = new ChartArea();
Title title12 = 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();
@@ -55,6 +55,7 @@ namespace GHelper
picturePerf = new PictureBox();
labelFans = new Label();
panelApplyFans = new Panel();
buttonCalibrate = new RButton();
labelFansResult = new Label();
checkApplyFans = new RCheckBox();
buttonReset = new RButton();
@@ -128,6 +129,10 @@ namespace GHelper
labelGPUCore = new Label();
trackGPUCore = new TrackBar();
labelGPUCoreTitle = new Label();
panelGPUClockLimit = new Panel();
labelGPUClockLimit = new Label();
trackGPUClockLimit = new TrackBar();
labelGPUClockLimitTitle = new Label();
panelTitleGPU = new Panel();
pictureGPU = new PictureBox();
labelGPU = new Label();
@@ -136,10 +141,6 @@ namespace GHelper
buttonAdvanced = new RButton();
buttonGPU = new RButton();
buttonCPU = new RButton();
panelGPUClockLimit = new Panel();
labelGPUClockLimit = new Label();
trackGPUClockLimit = new TrackBar();
labelGPUClockLimitTitle = new Label();
panelFans.SuspendLayout();
tableFanCharts.SuspendLayout();
((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();
@@ -188,12 +189,12 @@ namespace GHelper
((System.ComponentModel.ISupportInitialize)trackGPUMemory).BeginInit();
panelGPUCore.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackGPUCore).BeginInit();
panelGPUClockLimit.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).BeginInit();
panelTitleGPU.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureGPU).BeginInit();
panelNav.SuspendLayout();
tableNav.SuspendLayout();
panelGPUClockLimit.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).BeginInit();
SuspendLayout();
//
// panelFans
@@ -239,7 +240,7 @@ namespace GHelper
tableFanCharts.Location = new Point(0, 66);
tableFanCharts.Margin = new Padding(4);
tableFanCharts.Name = "tableFanCharts";
tableFanCharts.Padding = new Padding(10, 0, 10, 10);
tableFanCharts.Padding = new Padding(10, 0, 10, 5);
tableFanCharts.RowCount = 2;
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
@@ -250,60 +251,60 @@ namespace GHelper
//
// chartGPU
//
chartArea9.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea9);
chartArea1.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea1);
chartGPU.Dock = DockStyle.Fill;
chartGPU.Location = new Point(12, 491);
chartGPU.Location = new Point(12, 493);
chartGPU.Margin = new Padding(2, 10, 2, 10);
chartGPU.Name = "chartGPU";
chartGPU.Size = new Size(782, 461);
chartGPU.Size = new Size(782, 463);
chartGPU.TabIndex = 17;
chartGPU.Text = "chartGPU";
title9.Name = "Title1";
chartGPU.Titles.Add(title9);
title1.Name = "Title1";
chartGPU.Titles.Add(title1);
//
// chartCPU
//
chartArea10.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea10);
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);
chartCPU.Name = "chartCPU";
chartCPU.Size = new Size(782, 461);
chartCPU.Size = new Size(782, 463);
chartCPU.TabIndex = 14;
chartCPU.Text = "chartCPU";
title10.Name = "Title1";
chartCPU.Titles.Add(title10);
title2.Name = "Title1";
chartCPU.Titles.Add(title2);
//
// chartXGM
//
chartArea11.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea11);
chartArea3.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea3);
chartXGM.Dock = DockStyle.Fill;
chartXGM.Location = new Point(12, 1453);
chartXGM.Location = new Point(12, 1459);
chartXGM.Margin = new Padding(2, 10, 2, 10);
chartXGM.Name = "chartXGM";
chartXGM.Size = new Size(782, 464);
chartXGM.Size = new Size(782, 463);
chartXGM.TabIndex = 14;
chartXGM.Text = "chartXGM";
title11.Name = "Title4";
chartXGM.Titles.Add(title11);
title3.Name = "Title4";
chartXGM.Titles.Add(title3);
chartXGM.Visible = false;
//
// chartMid
//
chartArea12.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea12);
chartArea4.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea4);
chartMid.Dock = DockStyle.Fill;
chartMid.Location = new Point(12, 972);
chartMid.Location = new Point(12, 976);
chartMid.Margin = new Padding(2, 10, 2, 10);
chartMid.Name = "chartMid";
chartMid.Size = new Size(782, 461);
chartMid.Size = new Size(782, 463);
chartMid.TabIndex = 14;
chartMid.Text = "chartMid";
title12.Name = "Title3";
chartMid.Titles.Add(title12);
title4.Name = "Title3";
chartMid.Titles.Add(title4);
chartMid.Visible = false;
//
// panelTitleFans
@@ -410,6 +411,7 @@ namespace GHelper
//
// panelApplyFans
//
panelApplyFans.Controls.Add(buttonCalibrate);
panelApplyFans.Controls.Add(labelFansResult);
panelApplyFans.Controls.Add(checkApplyFans);
panelApplyFans.Controls.Add(buttonReset);
@@ -420,16 +422,32 @@ namespace GHelper
panelApplyFans.Size = new Size(806, 116);
panelApplyFans.TabIndex = 43;
//
// buttonCalibrate
//
buttonCalibrate.Activated = false;
buttonCalibrate.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonCalibrate.BackColor = SystemColors.ControlLight;
buttonCalibrate.BorderColor = Color.Transparent;
buttonCalibrate.BorderRadius = 2;
buttonCalibrate.FlatStyle = FlatStyle.Flat;
buttonCalibrate.Location = new Point(239, 40);
buttonCalibrate.Margin = new Padding(4, 2, 4, 2);
buttonCalibrate.Name = "buttonCalibrate";
buttonCalibrate.Secondary = true;
buttonCalibrate.Size = new Size(141, 50);
buttonCalibrate.TabIndex = 43;
buttonCalibrate.Text = "Calibrate";
buttonCalibrate.UseVisualStyleBackColor = false;
//
// labelFansResult
//
labelFansResult.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
labelFansResult.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
labelFansResult.ForeColor = Color.Red;
labelFansResult.Location = new Point(24, 4);
labelFansResult.Location = new Point(18, 2);
labelFansResult.Margin = new Padding(4, 0, 4, 0);
labelFansResult.Name = "labelFansResult";
labelFansResult.Size = new Size(762, 32);
labelFansResult.Size = new Size(771, 32);
labelFansResult.TabIndex = 42;
labelFansResult.TextAlign = ContentAlignment.TopRight;
labelFansResult.Visible = false;
//
// checkApplyFans
@@ -458,7 +476,7 @@ namespace GHelper
buttonReset.Margin = new Padding(4, 2, 4, 2);
buttonReset.Name = "buttonReset";
buttonReset.Secondary = true;
buttonReset.Size = new Size(274, 50);
buttonReset.Size = new Size(216, 50);
buttonReset.TabIndex = 18;
buttonReset.Text = Properties.Strings.FactoryDefaults;
buttonReset.UseVisualStyleBackColor = false;
@@ -1337,6 +1355,56 @@ namespace GHelper
labelGPUCoreTitle.TabIndex = 17;
labelGPUCoreTitle.Text = "Core Clock Offset";
//
// panelGPUClockLimit
//
panelGPUClockLimit.AutoSize = true;
panelGPUClockLimit.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelGPUClockLimit.Controls.Add(labelGPUClockLimit);
panelGPUClockLimit.Controls.Add(trackGPUClockLimit);
panelGPUClockLimit.Controls.Add(labelGPUClockLimitTitle);
panelGPUClockLimit.Dock = DockStyle.Top;
panelGPUClockLimit.Location = new Point(0, 60);
panelGPUClockLimit.Margin = new Padding(4);
panelGPUClockLimit.MaximumSize = new Size(0, 124);
panelGPUClockLimit.Name = "panelGPUClockLimit";
panelGPUClockLimit.Size = new Size(520, 124);
panelGPUClockLimit.TabIndex = 48;
//
// labelGPUClockLimit
//
labelGPUClockLimit.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelGPUClockLimit.Location = new Point(326, 16);
labelGPUClockLimit.Margin = new Padding(4, 0, 4, 0);
labelGPUClockLimit.Name = "labelGPUClockLimit";
labelGPUClockLimit.Size = new Size(176, 32);
labelGPUClockLimit.TabIndex = 29;
labelGPUClockLimit.Text = "1500 MHz";
labelGPUClockLimit.TextAlign = ContentAlignment.TopRight;
//
// trackGPUClockLimit
//
trackGPUClockLimit.LargeChange = 100;
trackGPUClockLimit.Location = new Point(6, 48);
trackGPUClockLimit.Margin = new Padding(4, 2, 4, 2);
trackGPUClockLimit.Maximum = 3000;
trackGPUClockLimit.Name = "trackGPUClockLimit";
trackGPUClockLimit.RightToLeft = RightToLeft.No;
trackGPUClockLimit.Size = new Size(496, 90);
trackGPUClockLimit.SmallChange = 10;
trackGPUClockLimit.TabIndex = 18;
trackGPUClockLimit.TickFrequency = 50;
trackGPUClockLimit.TickStyle = TickStyle.TopLeft;
//
// labelGPUClockLimitTitle
//
labelGPUClockLimitTitle.AutoSize = true;
labelGPUClockLimitTitle.Location = new Point(10, 16);
labelGPUClockLimitTitle.Margin = new Padding(4, 0, 4, 0);
labelGPUClockLimitTitle.Name = "labelGPUClockLimitTitle";
labelGPUClockLimitTitle.Size = new Size(188, 32);
labelGPUClockLimitTitle.TabIndex = 17;
labelGPUClockLimitTitle.Text = "Core Clock Limit";
//
// panelTitleGPU
//
panelTitleGPU.AutoSize = true;
@@ -1459,56 +1527,6 @@ namespace GHelper
buttonCPU.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonCPU.UseVisualStyleBackColor = false;
//
// panelGPUClockLimit
//
panelGPUClockLimit.AutoSize = true;
panelGPUClockLimit.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelGPUClockLimit.Controls.Add(labelGPUClockLimit);
panelGPUClockLimit.Controls.Add(trackGPUClockLimit);
panelGPUClockLimit.Controls.Add(labelGPUClockLimitTitle);
panelGPUClockLimit.Dock = DockStyle.Top;
panelGPUClockLimit.Location = new Point(0, 60);
panelGPUClockLimit.Margin = new Padding(4);
panelGPUClockLimit.MaximumSize = new Size(0, 124);
panelGPUClockLimit.Name = "panelGPUClockLimit";
panelGPUClockLimit.Size = new Size(520, 124);
panelGPUClockLimit.TabIndex = 48;
//
// labelGPUClockLimit
//
labelGPUClockLimit.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelGPUClockLimit.Location = new Point(326, 16);
labelGPUClockLimit.Margin = new Padding(4, 0, 4, 0);
labelGPUClockLimit.Name = "labelGPUClockLimit";
labelGPUClockLimit.Size = new Size(176, 32);
labelGPUClockLimit.TabIndex = 29;
labelGPUClockLimit.Text = "1500 MHz";
labelGPUClockLimit.TextAlign = ContentAlignment.TopRight;
//
// trackGPUClockLimit
//
trackGPUClockLimit.LargeChange = 100;
trackGPUClockLimit.Location = new Point(6, 48);
trackGPUClockLimit.Margin = new Padding(4, 2, 4, 2);
trackGPUClockLimit.Maximum = 3000;
trackGPUClockLimit.Name = "trackGPUClockLimit";
trackGPUClockLimit.RightToLeft = RightToLeft.No;
trackGPUClockLimit.Size = new Size(496, 90);
trackGPUClockLimit.SmallChange = 10;
trackGPUClockLimit.TabIndex = 18;
trackGPUClockLimit.TickFrequency = 50;
trackGPUClockLimit.TickStyle = TickStyle.TopLeft;
//
// labelGPUClockLimitTitle
//
labelGPUClockLimitTitle.AutoSize = true;
labelGPUClockLimitTitle.Location = new Point(10, 16);
labelGPUClockLimitTitle.Margin = new Padding(4, 0, 4, 0);
labelGPUClockLimitTitle.Name = "labelGPUClockLimitTitle";
labelGPUClockLimitTitle.Size = new Size(188, 32);
labelGPUClockLimitTitle.TabIndex = 17;
labelGPUClockLimitTitle.Text = "Core Clock Limit";
//
// Fans
//
AutoScaleDimensions = new SizeF(192F, 192F);
@@ -1597,14 +1615,14 @@ namespace GHelper
panelGPUCore.ResumeLayout(false);
panelGPUCore.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackGPUCore).EndInit();
panelGPUClockLimit.ResumeLayout(false);
panelGPUClockLimit.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).EndInit();
panelTitleGPU.ResumeLayout(false);
panelTitleGPU.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureGPU).EndInit();
panelNav.ResumeLayout(false);
tableNav.ResumeLayout(false);
panelGPUClockLimit.ResumeLayout(false);
panelGPUClockLimit.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackGPUClockLimit).EndInit();
ResumeLayout(false);
PerformLayout();
}
@@ -1711,5 +1729,6 @@ namespace GHelper
private Label labelGPUClockLimit;
private TrackBar trackGPUClockLimit;
private Label labelGPUClockLimitTitle;
private RButton buttonCalibrate;
}
}

View File

@@ -18,8 +18,6 @@ namespace GHelper
Series seriesMid;
Series seriesXGM;
static int MinRPM, MaxRPM;
static bool gpuVisible = true;
static bool fanRpm = true;
@@ -28,6 +26,8 @@ namespace GHelper
NvidiaGpuControl? nvControl = null;
ModeControl modeControl = Program.modeControl;
public static System.Timers.Timer timer = default!;
public Fans()
{
@@ -57,10 +57,10 @@ namespace GHelper
buttonApplyAdvanced.Text = Properties.Strings.Apply;
checkApplyUV.Text = Properties.Strings.AutoApply;
buttonCalibrate.Text = Properties.Strings.Calibrate;
InitTheme(true);
MinRPM = 18;
MaxRPM = HardwareControl.fanMax;
labelTip.Visible = false;
labelTip.BackColor = Color.Transparent;
@@ -78,15 +78,19 @@ namespace GHelper
chartCPU.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.CPU);
chartCPU.MouseUp += ChartCPU_MouseUp;
chartCPU.MouseLeave += ChartCPU_MouseLeave;
chartGPU.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.GPU);
chartGPU.MouseUp += ChartCPU_MouseUp;
chartGPU.MouseLeave += ChartCPU_MouseLeave;
chartMid.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.Mid);
chartMid.MouseUp += ChartCPU_MouseUp;
chartMid.MouseLeave += ChartCPU_MouseLeave;
chartXGM.MouseMove += (sender, e) => ChartCPU_MouseMove(sender, e, AsusFan.XGM);
chartXGM.MouseUp += ChartCPU_MouseUp;
chartXGM.MouseLeave += ChartCPU_MouseLeave;
chartCPU.MouseClick += ChartCPU_MouseClick;
chartGPU.MouseClick += ChartCPU_MouseClick;
@@ -141,6 +145,7 @@ namespace GHelper
trackGPUMemory.MouseUp += TrackGPU_MouseUp;
trackGPUBoost.MouseUp += TrackGPU_MouseUp;
trackGPUTemp.MouseUp += TrackGPU_MouseUp;
trackGPUClockLimit.MouseUp += TrackGPU_MouseUp;
//labelInfo.MaximumSize = new Size(280, 0);
@@ -195,12 +200,98 @@ namespace GHelper
checkApplyUV.Click += CheckApplyUV_Click;
timer = new System.Timers.Timer(1000);
timer.Elapsed += Timer_Elapsed;
buttonCalibrate.Click += ButtonCalibrate_Click;
ToggleNavigation(0);
FormClosed += Fans_FormClosed;
}
const int FAN_COUNT = 3;
static int[] fanMax;
static int sameCount = 0;
private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
int fan;
bool same = true;
for (int i = 0; i < FAN_COUNT; i++)
{
fan = Program.acpi.GetFan((AsusFan)i);
if (fan > fanMax[i])
{
fanMax[i] = fan;
same = false;
}
}
if (same) sameCount++;
else sameCount = 0;
LabelFansResult("Max Speed - CPU: " + fanMax[(int)AsusFan.CPU] * 100 + ", GPU: " + fanMax[(int)AsusFan.GPU] * 100 + " (" + sameCount + "s)");
if (sameCount >= 15)
{
for (int i = 0; i < FAN_COUNT; i++)
{
if (fanMax[i] > 30 && fanMax[i] < 80) AppConfig.Set("fan_max_" + i, fanMax[i]);
}
sameCount = 0;
CalibrateNext();
}
}
private void CalibrateNext()
{
timer.Enabled = false;
modeControl.SetPerformanceMode();
string label = "Measured - CPU: " + AppConfig.Get("fan_max_" + (int)AsusFan.CPU) * 100;
if (AppConfig.Get("fan_max_" + (int)AsusFan.GPU) > 0)
label = label + ", GPU: " + AppConfig.Get("fan_max_" + (int)AsusFan.GPU) * 100;
if (AppConfig.Get("fan_max_" + (int)AsusFan.Mid) > 0)
label = label + ", Mid: " + AppConfig.Get("fan_max_" + (int)AsusFan.Mid) * 100;
LabelFansResult(label);
Invoke(delegate
{
buttonCalibrate.Enabled = true;
SetAxis(chartCPU, AsusFan.CPU);
SetAxis(chartGPU, AsusFan.GPU);
if (chartMid.Visible) SetAxis(chartMid, AsusFan.Mid);
});
}
private void ButtonCalibrate_Click(object? sender, EventArgs e)
{
fanMax = new int[] { 0, 0, 0 };
buttonCalibrate.Enabled = false;
timer.Enabled = true;
for (int i = 0; i < FAN_COUNT; i++)
{
AppConfig.Remove("fan_max_" + i);
}
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AsusACPI.PerformanceTurbo, "ModeCalibration");
for (int i = 0; i < FAN_COUNT; i++)
Program.acpi.SetFanCurve((AsusFan)i, new byte[] { 20, 30, 40, 50, 60, 70, 80, 90, 100, 100, 100, 100, 100, 100, 100, 100 });
}
private void ChartCPU_MouseClick(object? sender, MouseEventArgs e)
{
if (sender is null) return;
@@ -565,15 +656,17 @@ namespace GHelper
VisualiseGPUSettings();
}
static string ChartPercToRPM(int percentage, AsusFan device, string unit = "")
static string ChartYLabel(int percentage, AsusFan device, string unit = "")
{
if (percentage == 0) return "OFF";
int Max = MaxRPM;
int Min = HardwareControl.DEFAULT_FAN_MIN;
int Max = AppConfig.Get("fan_max_" + (int)device, HardwareControl.DEFAULT_FAN_MAX);
if (device == AsusFan.XGM) Max = 72;
if (fanRpm)
return (200 * Math.Round((float)(MinRPM * 100 + (Max - MinRPM) * percentage) / 200)).ToString() + unit;
return (200 * Math.Round((float)(Min * 100 + (Max - Min) * percentage) / 200)).ToString() + unit;
else
return percentage + "%";
}
@@ -583,12 +676,12 @@ namespace GHelper
chart.ChartAreas[0].AxisY.CustomLabels.Clear();
for (int i = 0; i <= fansMax - 10; i += 10)
for (int i = 0; i <= fansMax; i += 10)
{
chart.ChartAreas[0].AxisY.CustomLabels.Add(i - 2, i + 2, ChartPercToRPM(i, device));
chart.ChartAreas[0].AxisY.CustomLabels.Add(i - 2, i + 2, ChartYLabel(i, device));
}
chart.ChartAreas[0].AxisY.CustomLabels.Add(fansMax - 2, fansMax + 2, Properties.Strings.RPM);
//chart.ChartAreas[0].AxisY.CustomLabels.Add(fansMax -2, fansMax + 2, Properties.Strings.RPM);
chart.ChartAreas[0].AxisY.Interval = 10;
}
@@ -596,20 +689,21 @@ namespace GHelper
{
string title = "";
string scale = ", RPM/°C";
switch (device)
{
case AsusFan.CPU:
title = Properties.Strings.FanProfileCPU;
title = Properties.Strings.FanProfileCPU + scale;
break;
case AsusFan.GPU:
title = Properties.Strings.FanProfileGPU;
title = Properties.Strings.FanProfileGPU + scale;
break;
case AsusFan.Mid:
title = Properties.Strings.FanProfileMid;
title = Properties.Strings.FanProfileMid + scale;
break;
case AsusFan.XGM:
title = "XG Mobile";
title = "XG Mobile" + scale;
break;
}
@@ -718,8 +812,11 @@ namespace GHelper
public void LabelFansResult(string text)
{
labelFansResult.Text = text;
labelFansResult.Visible = (text.Length > 0);
Invoke(delegate
{
labelFansResult.Text = text;
labelFansResult.Visible = (text.Length > 0);
});
}
private void Fans_FormClosing(object? sender, FormClosingEventArgs e)
@@ -984,11 +1081,10 @@ namespace GHelper
}
private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)
private void Chart_Save()
{
curPoint = null;
curIndex = -1;
labelTip.Visible = false;
SaveProfile(seriesCPU, AsusFan.CPU);
@@ -1001,8 +1097,19 @@ namespace GHelper
SaveProfile(seriesXGM, AsusFan.XGM);
modeControl.AutoFans();
}
private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)
{
Chart_Save();
}
private void ChartCPU_MouseLeave(object? sender, EventArgs e)
{
curPoint = null;
curIndex = -1;
labelTip.Visible = false;
}
private void ChartCPU_MouseMove(object? sender, MouseEventArgs e, AsusFan device)
@@ -1066,7 +1173,7 @@ namespace GHelper
tip = true;
}
labelTip.Text = Math.Round(curPoint.XValue) + "C, " + ChartPercToRPM((int)curPoint.YValues[0], device, " " + Properties.Strings.RPM);
labelTip.Text = Math.Round(curPoint.XValue) + "C, " + ChartYLabel((int)curPoint.YValues[0], device, " " + Properties.Strings.RPM);
labelTip.Top = e.Y + ((Control)sender).Top;
labelTip.Left = e.X - 50;

View File

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

View File

@@ -44,16 +44,12 @@ namespace GHelper.Gpu
// GPU mode not supported
if (eco < 0 && mux < 0)
{
if (gpuExists is null)
gpuExists = HardwareControl.FormatFan(Program.acpi.DeviceGet(AsusACPI.GPU_Fan)) is not null;
if (gpuExists is null) gpuExists = Program.acpi.GetFan(AsusFan.GPU) >= 0;
settings.HideGPUModes((bool)gpuExists);
}
}
AppConfig.Set("gpu_mode", gpuMode);
InitXGM();
settings.VisualiseGPUMode(gpuMode);
AsusUSB.ApplyGPUColor();
@@ -280,9 +276,12 @@ namespace GHelper.Gpu
public void InitXGM()
{
bool connected = Program.acpi.IsXGConnected();
int activated = Program.acpi.DeviceGet(AsusACPI.GPUXG);
settings.VisualizeXGM(connected, activated == 1);
if (Program.acpi.IsXGConnected())
{
//Program.acpi.DeviceSet(AsusACPI.GPUXGInit, 1, "XG Init");
AsusUSB.InitXGM();
}
}
public void ToggleXGM()
@@ -306,9 +305,14 @@ namespace GHelper.Gpu
}
else
{
Program.acpi.DeviceSet(AsusACPI.GPUXG, 1, "GPU XGM");
AsusUSB.ResetXGM();
if (AppConfig.Is("xgm_special"))
Program.acpi.DeviceSet(AsusACPI.GPUXG, 0x101, "GPU XGM");
else
Program.acpi.DeviceSet(AsusACPI.GPUXG, 1, "GPU XGM");
InitXGM();
AsusUSB.ApplyXGMLight(AppConfig.Is("xmg_light"));
await Task.Delay(TimeSpan.FromSeconds(15));

View File

@@ -10,8 +10,10 @@ using System.Management;
public static class HardwareControl
{
const int DEFAULT_FAN_MAX = 58;
const int INADEQUATE_MAX = 80;
public const int DEFAULT_FAN_MIN = 18;
public const int DEFAULT_FAN_MAX = 58;
const int INADEQUATE_MAX = 72;
public static IGpuControl? GpuControl;
@@ -35,20 +37,17 @@ public static class HardwareControl
static long lastUpdate;
static int _fanMax = DEFAULT_FAN_MAX;
static int[] _fanMax = new int[3] { DEFAULT_FAN_MAX, DEFAULT_FAN_MAX, DEFAULT_FAN_MAX };
static bool _fanRpm = false;
public static int fanMax
public static int GetFanMax(AsusFan device)
{
get
{
return _fanMax;
}
set
{
AppConfig.Set("fan_max", value);
_fanMax = value;
}
return _fanMax[(int)device];
}
public static void SetFanMax(AsusFan device, int value)
{
AppConfig.Set("fan_max_" + (int)device, value);
}
public static bool fanRpm
@@ -66,32 +65,32 @@ public static class HardwareControl
static HardwareControl()
{
_fanMax = AppConfig.Get("fan_max");
if (_fanMax > INADEQUATE_MAX) _fanMax = -1; // skipping inadvequate settings
for (int i = 0; i < 3; i++)
{
_fanMax[i] = AppConfig.Get("fan_max_" + i);
if (_fanMax[i] > INADEQUATE_MAX) _fanMax[i] = -1; // skipping inadvequate settings
if (_fanMax[i] < 0 && AppConfig.ContainsModel("401")) _fanMax[i] = 72;
if (_fanMax[i] < 0 && AppConfig.ContainsModel("503")) _fanMax[i] = 68;
if (_fanMax[i] < 0) _fanMax[i] = DEFAULT_FAN_MAX;
}
if (_fanMax < 0 && AppConfig.ContainsModel("401")) _fanMax = 72;
if (_fanMax < 0 && AppConfig.ContainsModel("503")) _fanMax = 68;
if (_fanMax < 0) _fanMax = DEFAULT_FAN_MAX;
_fanRpm = AppConfig.IsNotFalse("fan_rpm");
}
public static string FormatFan(int fan)
public static string FormatFan(AsusFan device, int value)
{
// fix for old models
if (fan < 0)
{
fan += 65536;
if (fan <= 0 || fan > 100) return null; //nothing reasonable
}
if (value < 0) return null;
if (fan > fanMax && fan <= INADEQUATE_MAX) fanMax = fan;
if (value > GetFanMax(device) && value <= INADEQUATE_MAX) SetFanMax(device, value);
if (fanRpm)
return GHelper.Properties.Strings.FanSpeed + ": " + (fan * 100).ToString() + "RPM";
return GHelper.Properties.Strings.FanSpeed + ": " + (value * 100).ToString() + "RPM";
else
return GHelper.Properties.Strings.FanSpeed + ": " + Math.Min(Math.Round((float)fan / fanMax * 100), 100).ToString() + "%"; // relatively to 6000 rpm
return GHelper.Properties.Strings.FanSpeed + ": " + Math.Min(Math.Round((float)value / GetFanMax(device) * 100), 100).ToString() + "%"; // relatively to 6000 rpm
}
private static int GetGpuUse()
@@ -246,9 +245,9 @@ public static class HardwareControl
gpuTemp = -1;
gpuUse = -1;
cpuFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.CPU_Fan));
gpuFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.GPU_Fan));
midFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.Mid_Fan));
cpuFan = FormatFan(AsusFan.CPU, Program.acpi.GetFan(AsusFan.CPU));
gpuFan = FormatFan(AsusFan.GPU, Program.acpi.GetFan(AsusFan.GPU));
midFan = FormatFan(AsusFan.Mid, Program.acpi.GetFan(AsusFan.Mid));
cpuTemp = GetCPUTemp();

View File

@@ -55,6 +55,12 @@ namespace GHelper.Helpers
return Process.GetProcessesByName("AsusOptimization").Count() > 0;
}
public static bool IsOSDRunning()
{
return Process.GetProcessesByName("AsusOSD").Count() > 0;
}
public static int GetRunningCount()
{
int count = 0;

View File

@@ -131,6 +131,15 @@ namespace GHelper.Input
if (AppConfig.Is("fn_lock") && !AppConfig.ContainsModel("VivoBook"))
for (Keys i = Keys.F1; i <= Keys.F11; i++) hook.RegisterHotKey(ModifierKeys.None, i);
// Arrow-lock group
if (AppConfig.Is("arrow_lock") && AppConfig.IsDUO())
{
hook.RegisterHotKey(ModifierKeys.None, Keys.Left);
hook.RegisterHotKey(ModifierKeys.None, Keys.Right);
hook.RegisterHotKey(ModifierKeys.None, Keys.Up);
hook.RegisterHotKey(ModifierKeys.None, Keys.Down);
}
}
static void CustomKey(string configKey = "m3")
@@ -272,6 +281,18 @@ namespace GHelper.Input
case Keys.VolumeUp:
KeyProcess("m2");
break;
case Keys.Left:
KeyboardHook.KeyPress(Keys.Home);
break;
case Keys.Right:
KeyboardHook.KeyPress(Keys.End);
break;
case Keys.Up:
KeyboardHook.KeyPress(Keys.PageUp);
break;
case Keys.Down:
KeyboardHook.KeyPress(Keys.PageDown);
break;
default:
break;
}
@@ -355,7 +376,7 @@ namespace GHelper.Input
break;
case "screen":
Logger.WriteLine("Screen off toggle");
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
NativeMethods.TurnOffScreen();
break;
case "miniled":
screenControl.ToogleMiniled();
@@ -412,6 +433,15 @@ namespace GHelper.Input
}
}
public static void ToggleArrowLock()
{
int arLock = AppConfig.Is("arrow_lock") ? 0 : 1;
AppConfig.Set("arrow_lock", arLock);
Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys);
Program.toast.RunToast("Arrow-Lock " + (arLock == 1 ? "On" : "Off"), ToastIcon.FnLock);
}
public static void ToggleFnLock()
{
int fnLock = AppConfig.Is("fn_lock") ? 0 : 1;
@@ -477,6 +507,9 @@ namespace GHelper.Input
case 56: // M4 / Rog button
KeyProcess("m4");
return;
case 55: // Arconym
KeyProcess("m6");
return;
case 181: // FN + Numpad Enter
KeyProcess("fne");
return;
@@ -493,6 +526,9 @@ namespace GHelper.Input
case 78: // Fn + ESC
ToggleFnLock();
return;
case 75: // Fn + ESC
ToggleArrowLock();
return;
case 189: // Tablet mode
TabletMode();
return;
@@ -506,7 +542,7 @@ namespace GHelper.Input
SetBacklight(4);
return;
case 53: // FN+F6 on GA-502DU model
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
NativeMethods.TurnOffScreen();
return;
}
}
@@ -537,6 +573,11 @@ namespace GHelper.Input
case 108: // FN+F11
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.KB_Sleep, "Sleep");
break;
case 106: // Screenpad button on DUO
SetScreenpad(100);
break;
}
}
@@ -586,22 +627,44 @@ namespace GHelper.Input
AsusUSB.ApplyBrightness(backlight, "HotKey");
}
string[] backlightNames = new string[] { "Off", "Low", "Mid", "Max" };
Program.toast.RunToast(backlightNames[backlight], delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown);
if (!OptimizationService.IsOSDRunning())
{
string[] backlightNames = new string[] { "Off", "Low", "Mid", "Max" };
Program.toast.RunToast(backlightNames[backlight], delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown);
}
}
public static void SetScreenpad(int delta)
{
int brightness = AppConfig.Get("screenpad", 100);
brightness = Math.Max(Math.Min(100, brightness + delta), 0);
if (delta == 100)
{
if (brightness < 0) brightness = 100;
else if (brightness >= 100) brightness = 0;
else brightness = -10;
} else
{
brightness = Math.Max(Math.Min(100, brightness + delta), -10);
}
AppConfig.Set("screenpad", brightness);
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, (brightness * 255 / 100), "Screenpad");
if (brightness == 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, brightness, "ScreenpadToggle");
if (brightness >= 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 1, "ScreenpadOn");
Program.toast.RunToast($"Screen Pad {brightness}", delta > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, Math.Max(brightness * 255 / 100, 0 ), "Screenpad");
if (brightness < 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 0, "ScreenpadOff");
string toast;
if (brightness < 0) toast = "Off";
else if (brightness == 0) toast = "Hidden";
else toast = brightness.ToString() + "%";
Program.toast.RunToast($"Screen Pad {toast}", delta > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
}

258
app/Matrix.Designer.cs generated Normal file
View File

@@ -0,0 +1,258 @@
namespace GHelper
{
partial class Matrix
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
pictureMatrix = new PictureBox();
trackZoom = new TrackBar();
buttonPicture = new UI.RButton();
panelPicture = new Panel();
panelMain = new Panel();
panelButtons = new Panel();
buttonReset = new UI.RButton();
panelScaling = new Panel();
comboScaling = new UI.RComboBox();
labelScaling = new Label();
panelZoom = new Panel();
labelZoom = new Label();
labelZoomTitle = new Label();
((System.ComponentModel.ISupportInitialize)pictureMatrix).BeginInit();
((System.ComponentModel.ISupportInitialize)trackZoom).BeginInit();
panelPicture.SuspendLayout();
panelMain.SuspendLayout();
panelButtons.SuspendLayout();
panelScaling.SuspendLayout();
panelZoom.SuspendLayout();
SuspendLayout();
//
// pictureMatrix
//
pictureMatrix.BackColor = Color.Black;
pictureMatrix.Cursor = Cursors.SizeAll;
pictureMatrix.Location = new Point(731, 27);
pictureMatrix.Name = "pictureMatrix";
pictureMatrix.Size = new Size(81, 73);
pictureMatrix.TabIndex = 0;
pictureMatrix.TabStop = false;
//
// trackZoom
//
trackZoom.LargeChange = 50;
trackZoom.Location = new Point(16, 52);
trackZoom.Maximum = 200;
trackZoom.Minimum = 10;
trackZoom.Name = "trackZoom";
trackZoom.Size = new Size(782, 90);
trackZoom.SmallChange = 10;
trackZoom.TabIndex = 2;
trackZoom.TickFrequency = 20;
trackZoom.TickStyle = TickStyle.TopLeft;
trackZoom.Value = 100;
//
// buttonPicture
//
buttonPicture.Activated = false;
buttonPicture.BackColor = SystemColors.ControlLight;
buttonPicture.BorderColor = Color.Transparent;
buttonPicture.BorderRadius = 5;
buttonPicture.FlatAppearance.BorderSize = 0;
buttonPicture.FlatStyle = FlatStyle.Flat;
buttonPicture.Image = Properties.Resources.icons8_matrix_32;
buttonPicture.Location = new Point(16, 19);
buttonPicture.Name = "buttonPicture";
buttonPicture.Secondary = true;
buttonPicture.Size = new Size(258, 56);
buttonPicture.TabIndex = 3;
buttonPicture.Text = "Picture / Gif";
buttonPicture.TextAlign = ContentAlignment.MiddleRight;
buttonPicture.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonPicture.UseVisualStyleBackColor = false;
//
// panelPicture
//
panelPicture.BackColor = Color.Black;
panelPicture.Controls.Add(pictureMatrix);
panelPicture.Dock = DockStyle.Top;
panelPicture.Location = new Point(0, 0);
panelPicture.Name = "panelPicture";
panelPicture.Size = new Size(834, 419);
panelPicture.TabIndex = 4;
//
// panelMain
//
panelMain.Controls.Add(panelButtons);
panelMain.Controls.Add(panelScaling);
panelMain.Controls.Add(panelZoom);
panelMain.Controls.Add(panelPicture);
panelMain.Dock = DockStyle.Top;
panelMain.Location = new Point(20, 20);
panelMain.Name = "panelMain";
panelMain.Size = new Size(834, 924);
panelMain.TabIndex = 5;
//
// panelButtons
//
panelButtons.Controls.Add(buttonReset);
panelButtons.Controls.Add(buttonPicture);
panelButtons.Dock = DockStyle.Top;
panelButtons.Location = new Point(0, 642);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(834, 94);
panelButtons.TabIndex = 6;
//
// buttonReset
//
buttonReset.Activated = false;
buttonReset.BackColor = SystemColors.ControlLight;
buttonReset.BorderColor = Color.Transparent;
buttonReset.BorderRadius = 5;
buttonReset.FlatAppearance.BorderSize = 0;
buttonReset.FlatStyle = FlatStyle.Flat;
buttonReset.Image = Properties.Resources.icons8_refresh_32;
buttonReset.Location = new Point(290, 19);
buttonReset.Name = "buttonReset";
buttonReset.Secondary = true;
buttonReset.Size = new Size(258, 56);
buttonReset.TabIndex = 4;
buttonReset.Text = "Reset";
buttonReset.TextAlign = ContentAlignment.MiddleRight;
buttonReset.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonReset.UseVisualStyleBackColor = false;
//
// panelScaling
//
panelScaling.Controls.Add(comboScaling);
panelScaling.Controls.Add(labelScaling);
panelScaling.Dock = DockStyle.Top;
panelScaling.Location = new Point(0, 564);
panelScaling.Name = "panelScaling";
panelScaling.Size = new Size(834, 78);
panelScaling.TabIndex = 7;
//
// comboScaling
//
comboScaling.BorderColor = Color.White;
comboScaling.ButtonColor = Color.FromArgb(255, 255, 255);
comboScaling.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboScaling.FormattingEnabled = true;
comboScaling.ItemHeight = 32;
comboScaling.Items.AddRange(new object[] { "Default", "Low", "High", "Bilinear", "Bicubic", "NearestNeighbor", "HighQualityBilinear", "HighQualityBicubic" });
comboScaling.Location = new Point(229, 17);
comboScaling.Margin = new Padding(4, 11, 4, 8);
comboScaling.Name = "comboScaling";
comboScaling.Size = new Size(322, 40);
comboScaling.TabIndex = 17;
//
// labelScaling
//
labelScaling.AutoSize = true;
labelScaling.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelScaling.Location = new Point(16, 20);
labelScaling.Name = "labelScaling";
labelScaling.Size = new Size(185, 32);
labelScaling.TabIndex = 4;
labelScaling.Text = "Scaling Quality";
//
// panelZoom
//
panelZoom.AutoSize = true;
panelZoom.Controls.Add(labelZoom);
panelZoom.Controls.Add(labelZoomTitle);
panelZoom.Controls.Add(trackZoom);
panelZoom.Dock = DockStyle.Top;
panelZoom.Location = new Point(0, 419);
panelZoom.Name = "panelZoom";
panelZoom.Size = new Size(834, 145);
panelZoom.TabIndex = 5;
//
// labelZoom
//
labelZoom.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelZoom.AutoSize = true;
labelZoom.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
labelZoom.Location = new Point(731, 17);
labelZoom.Name = "labelZoom";
labelZoom.Size = new Size(77, 32);
labelZoom.TabIndex = 4;
labelZoom.Text = "Zoom";
//
// labelZoomTitle
//
labelZoomTitle.AutoSize = true;
labelZoomTitle.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelZoomTitle.Location = new Point(16, 17);
labelZoomTitle.Name = "labelZoomTitle";
labelZoomTitle.Size = new Size(81, 32);
labelZoomTitle.TabIndex = 3;
labelZoomTitle.Text = "Zoom";
//
// Matrix
//
AutoScaleDimensions = new SizeF(192F, 192F);
AutoScaleMode = AutoScaleMode.Dpi;
AutoSize = true;
ClientSize = new Size(874, 978);
Controls.Add(panelMain);
MaximizeBox = false;
MinimizeBox = false;
MinimumSize = new Size(900, 0);
Name = "Matrix";
Padding = new Padding(20);
ShowIcon = false;
ShowInTaskbar = false;
Text = "Matrix";
((System.ComponentModel.ISupportInitialize)pictureMatrix).EndInit();
((System.ComponentModel.ISupportInitialize)trackZoom).EndInit();
panelPicture.ResumeLayout(false);
panelMain.ResumeLayout(false);
panelMain.PerformLayout();
panelButtons.ResumeLayout(false);
panelScaling.ResumeLayout(false);
panelScaling.PerformLayout();
panelZoom.ResumeLayout(false);
panelZoom.PerformLayout();
ResumeLayout(false);
}
#endregion
private PictureBox pictureMatrix;
private TrackBar trackZoom;
private UI.RButton buttonPicture;
private Panel panelPicture;
private Panel panelMain;
private Panel panelZoom;
private Label labelZoom;
private Label labelZoomTitle;
private Panel panelButtons;
private UI.RButton buttonReset;
private Panel panelScaling;
private Label labelScaling;
private UI.RComboBox comboScaling;
}
}

211
app/Matrix.cs Normal file
View File

@@ -0,0 +1,211 @@
using GHelper.AnimeMatrix;
using GHelper.UI;
namespace GHelper
{
public partial class Matrix : RForm
{
public AniMatrixControl matrixControl = Program.settingsForm.matrixControl;
private bool Dragging;
private int xPos;
private int yPos;
private int baseX;
private int baseY;
private float uiScale;
Image picture;
MemoryStream ms = new MemoryStream();
public Matrix()
{
InitializeComponent();
InitTheme(true);
Shown += Matrix_Shown;
FormClosing += Matrix_FormClosed;
buttonPicture.Click += ButtonPicture_Click;
buttonReset.Click += ButtonReset_Click;
pictureMatrix.MouseUp += PictureMatrix_MouseUp;
pictureMatrix.MouseMove += PictureMatrix_MouseMove;
pictureMatrix.MouseDown += PictureMatrix_MouseDown;
trackZoom.MouseUp += TrackZoom_MouseUp;
trackZoom.ValueChanged += TrackZoom_Changed;
trackZoom.Value = Math.Min(trackZoom.Maximum, AppConfig.Get("matrix_zoom", 100));
VisualiseZoom();
comboScaling.DropDownStyle = ComboBoxStyle.DropDownList;
comboScaling.SelectedIndex = AppConfig.Get("matrix_quality", 0);
comboScaling.SelectedValueChanged += ComboScaling_SelectedValueChanged;
uiScale = panelPicture.Width / matrixControl.device.MaxColumns / 3;
panelPicture.Height = (int)(matrixControl.device.MaxRows * uiScale);
}
private void ComboScaling_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_quality", comboScaling.SelectedIndex);
SetMatrixPicture(false);
}
private void Matrix_FormClosed(object? sender, FormClosingEventArgs e)
{
if (picture is not null) picture.Dispose();
if (ms is not null) ms.Dispose();
pictureMatrix.Dispose();
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
}
private void VisualiseZoom()
{
labelZoom.Text = trackZoom.Value + "%";
}
private void ButtonReset_Click(object? sender, EventArgs e)
{
AppConfig.Set("matrix_zoom", 100);
AppConfig.Set("matrix_x", 0);
AppConfig.Set("matrix_y", 0);
trackZoom.Value = 100;
SetMatrixPicture();
}
private void TrackZoom_MouseUp(object? sender, EventArgs e)
{
AppConfig.Set("matrix_zoom", trackZoom.Value);
SetMatrixPicture();
}
private void TrackZoom_Changed(object? sender, EventArgs e)
{
VisualiseZoom();
}
private void PictureMatrix_MouseDown(object? sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Dragging = true;
xPos = e.X;
yPos = e.Y;
}
}
private void PictureMatrix_MouseMove(object? sender, MouseEventArgs e)
{
Control c = sender as Control;
if (Dragging && c != null)
{
c.Top = e.Y + c.Top - yPos;
c.Left = e.X + c.Left - xPos;
}
}
private void PictureMatrix_MouseUp(object? sender, MouseEventArgs e)
{
Dragging = false;
Control c = sender as Control;
int matrixX = (int)((baseX - c.Left) / uiScale);
int matrixY = (int)((baseY - c.Top) / uiScale);
AppConfig.Set("matrix_x", matrixX);
AppConfig.Set("matrix_y", matrixY);
SetMatrixPicture(false);
}
private void Matrix_Shown(object? sender, EventArgs e)
{
FormPosition();
SetMatrixPicture();
}
private void SetMatrixPicture(bool visualise = true)
{
matrixControl.SetMatrixPicture(AppConfig.GetString("matrix_picture"), visualise);
}
private void ButtonPicture_Click(object? sender, EventArgs e)
{
matrixControl.OpenMatrixPicture();
}
public void FormPosition()
{
if (Height > Program.settingsForm.Height)
{
Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;
}
else
{
Height = Program.settingsForm.Height;
Top = Program.settingsForm.Top;
}
Left = Program.settingsForm.Left - Width - 5;
}
public void VisualiseMatrix(string fileName)
{
if (picture is not null) picture.Dispose();
using (var fs = new FileStream(fileName, FileMode.Open))
{
ms.SetLength(0);
fs.CopyTo(ms);
ms.Position = 0;
fs.Close();
picture = Image.FromStream(ms);
int width = picture.Width;
int height = picture.Height;
int matrixX = AppConfig.Get("matrix_x", 0);
int matrixY = AppConfig.Get("matrix_y", 0);
int matrixZoom = AppConfig.Get("matrix_zoom", 100);
float scale = Math.Min((float)panelPicture.Width / (float)width, (float)panelPicture.Height / (float)height) * matrixZoom / 100;
pictureMatrix.Width = (int)(width * scale);
pictureMatrix.Height = (int)(height * scale);
baseX = panelPicture.Width - pictureMatrix.Width;
baseY = 0;
pictureMatrix.Left = baseX - (int)(matrixX * uiScale);
pictureMatrix.Top = baseY - (int)(matrixY * uiScale);
pictureMatrix.SizeMode = PictureBoxSizeMode.Zoom;
pictureMatrix.Image = picture;
}
}
}
}

120
app/Matrix.resx Normal file
View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -134,6 +134,7 @@ namespace GHelper.Mode
bool xgmFan = false;
if (AppConfig.Is("xgm_fan") && Program.acpi.IsXGConnected())
{
//AsusUSB.InitXGM();
AsusUSB.SetXGMFan(AppConfig.GetFanConfig(AsusFan.XGM));
xgmFan = true;
}

View File

@@ -32,9 +32,9 @@ public class NativeMethods
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, uint dwMessageId, uint dwLanguageId, out string lpBuffer, uint nSize, IntPtr Arguments);
public static void TurnOffScreen(IntPtr handle)
public static void TurnOffScreen()
{
IntPtr result = SendMessage(handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MONITOR_OFF);
IntPtr result = SendMessage(-1, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)MONITOR_OFF);
if (result == IntPtr.Zero)
{
int error = Marshal.GetLastWin32Error();

View File

@@ -445,6 +445,16 @@ namespace GHelper.Peripherals.Mouse
return false;
}
public virtual int LowBatteryWarningStep()
{
return 10;
}
public virtual int LowBatteryWarningMax()
{
return 50;
}
public virtual bool HasLowBatteryWarning()
{
return false;

View File

@@ -0,0 +1,209 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P705
public class PugioII : AsusMouse
{
public PugioII() : base(0x0B05, 0x1908, "mi_00", true)
{
}
protected PugioII(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless)
{
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Pugio II (Wireless)";
}
public override PollingRate[] SupportedPollingrates()
{
return new PollingRate[] {
PollingRate.PR125Hz,
PollingRate.PR250Hz,
PollingRate.PR500Hz,
PollingRate.PR1000Hz
};
}
public override int ProfileCount()
{
return 3;
}
public override int MaxDPI()
{
return 16_000;
}
public override bool HasDebounceSetting()
{
return true;
}
public override bool HasLiftOffSetting()
{
return true;
}
public override int DPIIncrements()
{
return 100;
}
public override bool HasRGB()
{
return true;
}
public override int MaxBrightness()
{
return 4;
}
public override LightingZone[] SupportedLightingZones()
{
return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };
}
public override bool HasAutoPowerOff()
{
return true;
}
public override bool HasAngleSnapping()
{
return true;
}
public override bool HasAngleTuning()
{
return false;
}
public override bool HasLowBatteryWarning()
{
return true;
}
public override int LowBatteryWarningStep()
{
return 25;
}
public override int LowBatteryWarningMax()
{
return 100;
}
protected override int ParseBattery(byte[] packet)
{
return base.ParseBattery(packet) * 25;
}
protected override int ParseLowBatteryWarning(byte[] packet)
{
return base.ParseLowBatteryWarning(packet) * 25;
}
protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)
{
return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);
}
protected override byte[] GetReadLightingModePacket(LightingZone zone)
{
return new byte[] { 0x00, 0x12, 0x03, 0x00 };
}
protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)
{
if (packet[1] != 0x12 || packet[2] != 0x03)
{
return null;
}
int offset = 5 + (((int)zone) * 5);
LightingSetting setting = new LightingSetting();
setting.LightingMode = LightingModeForIndex(packet[offset + 0]);
setting.Brightness = packet[offset + 1];
setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);
setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)
? (AnimationDirection)packet[21]
: AnimationDirection.Clockwise;
if (setting.AnimationDirection != AnimationDirection.Clockwise
&& setting.AnimationDirection != AnimationDirection.CounterClockwise)
{
setting.AnimationDirection = AnimationDirection.Clockwise;
}
setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[22] == 0x01;
setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)
? (AnimationSpeed)packet[23]
: AnimationSpeed.Medium;
//If the mouse reports an out of range value, which it does when the current setting has no speed option, chose medium as default
if (setting.AnimationSpeed != AnimationSpeed.Fast
&& setting.AnimationSpeed != AnimationSpeed.Medium
&& setting.AnimationSpeed != AnimationSpeed.Slow)
{
setting.AnimationSpeed = AnimationSpeed.Medium;
}
return setting;
}
public override void ReadLightingSetting()
{
if (!HasRGB())
{
return;
}
//Mouse sends all lighting zones in one response
//21: Direction
//22: Random
//23: Speed
// 20 21 22 23
//00 12 03 00 00 [03 04 00 00 ff] [03 04 00 00 ff] [03 04 00 00 ff] 00 04 00 00
//00 12 03 00 00 [05 02 ff 00 ff] [05 02 ff 00 ff] [05 02 ff 00 ff] 00 01 01 00
//00 12 03 00 00 [03 01 00 00 ff] [03 01 00 00 ff] [03 01 00 00 ff] 00 01 00 01
byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));
if (response is null) return;
LightingZone[] lz = SupportedLightingZones();
for (int i = 0; i < lz.Length; ++i)
{
LightingSetting? ls = ParseLightingSetting(response, lz[i]);
if (ls is null)
{
Logger.WriteLine(GetDisplayName() + ": Failed to read RGB Setting for Zone " + lz[i].ToString());
continue;
}
Logger.WriteLine(GetDisplayName() + ": Read RGB Setting for Zone " + lz[i].ToString() + ": " + ls.ToString());
LightingSetting[i] = ls;
}
}
public override bool CanChangeDPIProfile()
{
return false;
}
}
public class PugioIIWired : PugioII
{
public PugioIIWired() : base(0x1906, false)
{
}
public override string GetDisplayName()
{
return "ROG Pugio II (Wired)";
}
}
}

View File

@@ -202,6 +202,8 @@ namespace GHelper.Peripherals
DetectMouse(new TUFM3());
DetectMouse(new KerisWirelssAimpoint());
DetectMouse(new KerisWirelssAimpointWired());
DetectMouse(new PugioII());
DetectMouse(new PugioIIWired());
}
public static void DetectMouse(AsusMouse am)

View File

@@ -95,6 +95,7 @@ namespace GHelper
settingsForm.InitAura();
settingsForm.InitMatrix();
gpuControl.InitXGM();
SetAutoModes();
@@ -164,6 +165,8 @@ namespace GHelper
if (settingsForm.updates is not null && settingsForm.updates.Text != "")
settingsForm.updates.InitTheme();
if (settingsForm.matrix is not null && settingsForm.matrix.Text != "")
settingsForm.matrix.InitTheme();
break;
}
}
@@ -194,7 +197,7 @@ namespace GHelper
BatteryControl.SetBatteryChargeLimit();
settingsForm.AutoKeyboard();
settingsForm.matrix.SetMatrix(true);
settingsForm.matrixControl.SetMatrix(true);
}
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)

View File

@@ -610,6 +610,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] MFont {
get {
object obj = ResourceManager.GetObject("MFont", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>

View File

@@ -130,6 +130,9 @@
<data name="icons8_mute_unmute_96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-mute-unmute-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-hibernate-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-hibernate-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-quit-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-quit-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -286,7 +289,7 @@
<data name="icons8_rocket_32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-rocket-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-hibernate-32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-hibernate-32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="MFont" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\Font.otf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@@ -483,6 +483,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Boot Sound.
/// </summary>
internal static string BootSound {
get {
return ResourceManager.GetString("BootSound", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Brightness.
/// </summary>
@@ -510,6 +519,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Calibrate.
/// </summary>
internal static string Calibrate {
get {
return ResourceManager.GetString("Calibrate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Charging.
/// </summary>

View File

@@ -235,7 +235,7 @@
<value>Automatycznie ustaw odświeżanie 60 Hz w czasie pracy na baterii</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Aktywność</value>
<value>Włączone</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Limit czasu podłączonego / na baterii (0 - Włączony)</value>
@@ -256,7 +256,7 @@
<value>Aktualizacje BIOS i sterowników</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Podczas uruchamiania</value>
<value>Uruchamianie</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Jasność</value>

View File

@@ -357,10 +357,10 @@ Quer prosseguir?</value>
<value>Carregando</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Aumento da frequência básica</value>
<value>Frequência da GPU</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Aumento da frequência da memória</value>
<value>Frequência da Memória</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>Modo da GPU</value>

View File

@@ -258,6 +258,9 @@
<data name="Boot" xml:space="preserve">
<value>Boot</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Brightness</value>
</data>
@@ -267,6 +270,9 @@
<data name="BrightnessUp" xml:space="preserve">
<value>Brightness Up</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Charging</value>
</data>

View File

@@ -118,7 +118,7 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Acceleration" xml:space="preserve">
<value>Acceleration</value>
<value>滑鼠加速</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>無法連結到華碩 ACPI。 没有它,應用程式將無法執行。 嘗試安裝Asus System Control Interface</value>
@@ -175,7 +175,7 @@
<value>順時針</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>循環</value>
<value>彩色循環</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>彗星</value>
@@ -205,7 +205,7 @@
<value>慢</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>靜態</value>
<value>靜態恆亮</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>閃爍</value>
@@ -280,7 +280,7 @@
<value>自定義設置</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
<value>滑鼠減速</value>
</data>
<data name="Default" xml:space="preserve">
<value>預設</value>

BIN
app/Resources/Font.otf Normal file

Binary file not shown.

View File

@@ -25,10 +25,13 @@ namespace GHelper
ScreenControl screenControl = new ScreenControl();
AutoUpdateControl updateControl;
public AniMatrixControl matrix;
AsusMouseSettings? mouseSettings;
public AniMatrixControl matrixControl;
public static System.Timers.Timer sensorTimer = default!;
public Matrix? matrix;
public Fans? fans;
public Extra? keyb;
public Updates? updates;
@@ -47,7 +50,7 @@ namespace GHelper
gpuControl = new GPUModeControl(this);
updateControl = new AutoUpdateControl(this);
matrix = new AniMatrixControl(this);
matrixControl = new AniMatrixControl(this);
buttonSilent.Text = Properties.Strings.Silent;
buttonBalanced.Text = Properties.Strings.Balanced;
@@ -242,7 +245,8 @@ namespace GHelper
if (this.Visible)
{
screenControl.InitScreen();
gpuControl.InitXGM();
VisualizeXGM();
Task.Run((Action)RefreshPeripheralsBattery);
updateControl.CheckForUpdates();
}
@@ -266,6 +270,12 @@ namespace GHelper
}
}
public void VisualiseMatrix(string image)
{
if (matrix == null || matrix.Text == "") return;
matrix.VisualiseMatrix(image);
}
protected override void WndProc(ref Message m)
{
@@ -503,14 +513,29 @@ namespace GHelper
private void CheckMatrix_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_auto", checkMatrix.Checked ? 1 : 0);
matrix.SetMatrix();
matrixControl.SetMatrix();
}
private void ButtonMatrix_Click(object? sender, EventArgs e)
{
matrix.OpenMatrixPicture();
if (matrix == null || matrix.Text == "")
{
matrix = new Matrix();
}
if (matrix.Visible)
{
matrix.Close();
}
else
{
matrix.FormPosition();
matrix.Show();
}
}
public void SetMatrixRunning(int mode)
@@ -518,20 +543,21 @@ namespace GHelper
Invoke(delegate
{
comboMatrixRunning.SelectedIndex = mode;
if (comboMatrix.SelectedIndex == 0) comboMatrix.SelectedIndex = 3;
});
}
private void ComboMatrixRunning_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_running", comboMatrixRunning.SelectedIndex);
matrix.SetMatrix();
matrixControl.SetMatrix();
}
private void ComboMatrix_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_brightness", comboMatrix.SelectedIndex);
matrix.SetMatrix();
matrixControl.SetMatrix();
}
@@ -679,7 +705,7 @@ namespace GHelper
public void InitMatrix()
{
if (!matrix.IsValid)
if (!matrixControl.IsValid)
{
panelMatrix.Visible = false;
return;
@@ -783,7 +809,7 @@ namespace GHelper
private void ButtonQuit_Click(object? sender, EventArgs e)
{
matrix.Dispose();
matrixControl.Dispose();
Close();
Program.trayIcon.Visible = false;
Application.Exit();
@@ -964,15 +990,24 @@ namespace GHelper
}
public void VisualizeXGM(bool connected, bool activated)
public void VisualizeXGM(int GPUMode = -1)
{
bool connected = Program.acpi.IsXGConnected();
buttonXGM.Enabled = buttonXGM.Visible = connected;
if (!connected) return;
buttonXGM.Activated = activated;
if (GPUMode != -1)
ButtonEnabled(buttonXGM, AppConfig.IsNoGPUModes() || GPUMode != AsusACPI.GPUModeEco);
if (activated)
int activated = Program.acpi.DeviceGet(AsusACPI.GPUXG);
Logger.WriteLine("XGM Activated flag: " + activated);
buttonXGM.Activated = activated == 1;
if (activated == 1)
{
ButtonEnabled(buttonOptimized, false);
ButtonEnabled(buttonEco, false);
@@ -1057,7 +1092,6 @@ namespace GHelper
buttonOptimized.Activated = GPUAuto;
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeEco;
Program.trayIcon.Icon = Properties.Resources.eco;
ButtonEnabled(buttonXGM, false);
break;
case AsusACPI.GPUModeUltimate:
buttonUltimate.Activated = true;
@@ -1070,10 +1104,12 @@ namespace GHelper
buttonOptimized.Activated = GPUAuto;
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeStandard;
Program.trayIcon.Icon = Properties.Resources.standard;
ButtonEnabled(buttonXGM, true);
break;
}
VisualizeXGM(GPUMode);
if (isGpuSection)
{
menuEco.Checked = buttonEco.Activated;
@@ -1187,6 +1223,12 @@ namespace GHelper
private void ButtonPeripheral_Click(object? sender, EventArgs e)
{
if (mouseSettings is not null)
{
mouseSettings.Close();
return;
}
int index = 0;
if (sender == buttonPeripheral2) index = 1;
if (sender == buttonPeripheral3) index = 2;
@@ -1207,16 +1249,30 @@ namespace GHelper
//Should not happen if all device classes are implemented correctly. But better safe than sorry.
return;
}
AsusMouseSettings s = new AsusMouseSettings(am);
if (!s.IsDisposed)
mouseSettings = new AsusMouseSettings(am);
mouseSettings.TopMost = true;
mouseSettings.FormClosed += MouseSettings_FormClosed;
mouseSettings.Disposed += MouseSettings_Disposed;
if (!mouseSettings.IsDisposed)
{
s.Show();
mouseSettings.Show();
}
else
{
mouseSettings = null;
}
}
}
private void MouseSettings_Disposed(object? sender, EventArgs e)
{
mouseSettings = null;
}
private void MouseSettings_FormClosed(object? sender, FormClosedEventArgs e)
{
mouseSettings = null;
}
public void VisualiseFnLock()

View File

@@ -54,16 +54,17 @@ namespace GHelper
//
tableBios.AutoSize = true;
tableBios.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableBios.ColumnCount = 3;
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableBios.ColumnCount = 4;
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableBios.Dock = DockStyle.Top;
tableBios.Location = new Point(20, 20);
tableBios.Margin = new Padding(4);
tableBios.MinimumSize = new Size(1100, 0);
tableBios.MinimumSize = new Size(1300, 0);
tableBios.Name = "tableBios";
tableBios.Size = new Size(1216, 0);
tableBios.Size = new Size(1300, 0);
tableBios.TabIndex = 0;
//
// labelBIOS
@@ -105,7 +106,7 @@ namespace GHelper
//
labelUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelUpdates.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelUpdates.Location = new Point(941, 23);
labelUpdates.Location = new Point(810, 23);
labelUpdates.Name = "labelUpdates";
labelUpdates.Size = new Size(245, 32);
labelUpdates.TabIndex = 4;
@@ -156,16 +157,17 @@ namespace GHelper
//
tableDrivers.AutoSize = true;
tableDrivers.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableDrivers.ColumnCount = 3;
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
tableDrivers.ColumnCount = 4;
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableDrivers.Dock = DockStyle.Top;
tableDrivers.Location = new Point(20, 20);
tableDrivers.Margin = new Padding(4);
tableDrivers.MinimumSize = new Size(1100, 0);
tableDrivers.MinimumSize = new Size(1300, 0);
tableDrivers.Name = "tableDrivers";
tableDrivers.Size = new Size(1216, 0);
tableDrivers.Size = new Size(1300, 0);
tableDrivers.TabIndex = 0;
//
// panelDriversTitle

View File

@@ -9,6 +9,9 @@ namespace GHelper
public partial class Updates : RForm
{
const int DRIVER_NOT_FOUND = 2;
const int DRIVER_NEWER = 1;
//static int rowCount = 0;
static string model;
static string bios;
@@ -21,6 +24,7 @@ namespace GHelper
public string title;
public string version;
public string downloadUrl;
public string date;
public JsonElement hardwares;
}
private void LoadUpdates(bool force = false)
@@ -156,7 +160,8 @@ namespace GHelper
table.RowStyles.Add(new RowStyle(SizeType.AutoSize));
table.Controls.Add(new Label { Text = driver.categoryName, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 0, table.RowCount);
table.Controls.Add(new Label { Text = driver.title, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 1, table.RowCount);
table.Controls.Add(versionLabel, 2, table.RowCount);
table.Controls.Add(new Label { Text = driver.date, Anchor = AnchorStyles.Left, Dock = DockStyle.Fill, Padding = new Padding(5, 5, 5, 5) }, 2, table.RowCount);
table.Controls.Add(versionLabel, 3, table.RowCount);
table.RowCount++;
});
}
@@ -171,15 +176,21 @@ namespace GHelper
});
}
public void VisualiseNewDriver(int position, TableLayoutPanel table)
public void VisualiseNewDriver(int position, int newer, TableLayoutPanel table)
{
var label = table.GetControlFromPosition(2, position) as Label;
var label = table.GetControlFromPosition(3, position) as Label;
if (label != null)
{
Invoke(delegate
{
label.Font = new Font(label.Font, FontStyle.Underline | FontStyle.Bold);
label.ForeColor = colorTurbo;
if (newer == DRIVER_NEWER)
{
label.Font = new Font(label.Font, FontStyle.Underline | FontStyle.Bold);
label.ForeColor = colorTurbo;
}
if (newer == DRIVER_NOT_FOUND) label.ForeColor = Color.Gray;
});
}
}
@@ -237,6 +248,7 @@ namespace GHelper
driver.version = file.GetProperty("Version").ToString().Replace("V", "");
driver.downloadUrl = file.GetProperty("DownloadUrl").GetProperty("Global").ToString();
driver.hardwares = file.GetProperty("HardwareInfoList");
driver.date = file.GetProperty("ReleaseDate").ToString();
drivers.Add(driver);
VisualiseDriver(driver, table);
@@ -257,26 +269,28 @@ namespace GHelper
int count = 0;
foreach (var driver in drivers)
{
int newer = -2;
int newer = DRIVER_NOT_FOUND;
if (type == 0 && driver.hardwares.ToString().Length > 0)
for (int k = 0; k < driver.hardwares.GetArrayLength(); k++)
{
var deviceID = driver.hardwares[k].GetProperty("hardwareid").ToString();
var localVersion = devices.Where(p => p.Key.Contains(deviceID)).Select(p => p.Value).FirstOrDefault();
if (localVersion is not null)
var localVersions = devices.Where(p => p.Key.Contains(deviceID)).Select(p => p.Value);
foreach (var localVersion in localVersions)
{
newer = new Version(driver.version).CompareTo(new Version(localVersion));
break;
newer = Math.Min(newer, new Version(driver.version).CompareTo(new Version(localVersion)));
Logger.WriteLine(driver.title + " " + deviceID + " "+ driver.version + " vs " + localVersion + " = " + newer);
}
}
if (type == 1)
newer = Int32.Parse(driver.version) > Int32.Parse(bios) ? 1 : -1;
if (newer > 0)
VisualiseNewDriver(count, newer, table);
if (newer == DRIVER_NEWER)
{
updatesCount++;
VisualiseNewDriver(count, table);
VisualiseNewCount(updatesCount, table);
}

View File

@@ -18,7 +18,7 @@
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>

View File

@@ -72,6 +72,8 @@ Each BIOS mode is paired with matching Windows Power Mode. You can adjust this s
![Screenshot 2023-08-05 170159](https://github.com/seerge/g-helper/assets/5920850/84a5beb3-2463-40f1-9188-930d3099aad9)
![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)
## :question: FAQ
#### How do I stop the Armoury Crate install popup appearing every time I press the M4 / Rog key?
@@ -247,6 +249,13 @@ Example (for default windows "balanced" power plan):
"scheme_2": "381b4222-f694-41f0-9685-ff5bb260df2e",
```
### Alternative Activation for XG Mobile 6850XT
If you experience situation when your XG Mobile doesn't work on full power when Activated. It's possible it needs "alternative" command to get activated.
To turn it on, add following line to config :
```
"xgm_special" : 1,
```
### Override UI theme
By default app would set UI theme from "app" theme in windows setting. You can override it to specific theme, or general windows theme