Compare commits

...

33 Commits

Author SHA1 Message Date
Serge
435ddbb951 Cleanup 2023-11-12 22:26:33 +01:00
Serge
96ade7c9a0 Touchpad toggle fix for FA507 https://github.com/seerge/g-helper/issues/1589 2023-11-12 20:27:50 +01:00
Serge
3249072ee5 Cleanup 2023-11-12 19:12:58 +01:00
Serge
f6602fff3c Remove logo/lid backlight checkboxes for G512LI https://github.com/seerge/g-helper/issues/1575 2023-11-09 12:30:59 +01:00
Serge
5a7dc5c707 Merge branch 'main' of https://github.com/seerge/g-helper 2023-11-08 17:59:18 +01:00
Serge
e6d7a6f8b3 Removed RGB color selection for FX516P https://github.com/seerge/g-helper/issues/1571 2023-11-08 17:59:15 +01:00
Serge
5cd77249a7 Update README.md 2023-11-05 14:16:19 +01:00
Serge
d9e0045af5 ROG key binding for DUO models https://github.com/seerge/g-helper/discussions/1560 2023-11-03 21:55:35 +01:00
Serge
a66df0a394 Allow setting GPU clock limit when clock offsets are default https://github.com/seerge/g-helper/issues/1557 2023-11-03 21:54:41 +01:00
Serge
f7435b2789 More flexible GPU clock limit settings https://github.com/seerge/g-helper/discussions/1555#discussioncomment-7454925 2023-11-02 14:58:43 +01:00
Serge
f49e2ee1e8 Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-31 18:03:25 +01:00
Serge
f854c8e088 Fix for (someitmes) not working hotkeys on Z13 https://github.com/seerge/g-helper/issues/1547 2023-10-31 18:03:23 +01:00
Serge
bc6edcb38e New Crowdin updates (#1537)
* New translations strings.resx (French)

* New translations strings.resx (Portuguese, Brazilian)
2023-10-29 11:39:11 +01:00
Serge
dac7c86f1b Update README.md 2023-10-25 22:35:34 +02:00
Serge
369c89cb8d New translations strings.resx (Ukrainian) (#1524) 2023-10-25 14:04:11 +02:00
Serge
65e0065234 Update release.yml 2023-10-23 13:20:23 +02:00
Serge
3fa8c04afa Update release.yml 2023-10-23 13:14:10 +02:00
Serge
162514a8f9 Version Bump 2023-10-22 12:34:21 +02:00
Serge
b51c68572e Touchpad toggle tweaks https://github.com/seerge/g-helper/discussions/1504 2023-10-22 12:33:42 +02:00
Serge
ed5ec6b576 Sceenpad toggle https://github.com/seerge/g-helper/issues/1450 2023-10-20 10:57:15 +02:00
Serge
8c1885c2ae Auto turn off 100% charge option when battery is fully charged https://github.com/seerge/g-helper/issues/1485 2023-10-19 14:36:19 +02:00
Serge
168b751795 Shift + Fn + F7/F8 for screenpad control https://github.com/seerge/g-helper/issues/1491 2023-10-19 14:30:54 +02:00
Serge
3e93a93ab3 AutoBattery charge limiter https://github.com/seerge/g-helper/issues/1481 2023-10-18 11:45:57 +02:00
Serge
8a12e84423 Fn+F6 binding for old TUFs https://github.com/seerge/g-helper/issues/1480 2023-10-18 11:18:53 +02:00
Serge
c978c94d59 Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-13 21:23:42 +02:00
Serge
fc83e0e824 Added FA506IC to the list of models with swapped brightness 2023-10-13 21:23:39 +02:00
Serge
389fc41722 New Crowdin updates (#1465)
* New translations strings.resx (Indonesian)

* New translations strings.resx (Indonesian)
2023-10-13 19:26:01 +02:00
Serge
509817f442 New Crowdin updates (#1463)
* Updated translations strings.resx (Spanish)
* Updated translations strings.resx (Lithuanian)

* New translations strings.resx (Indonesian)
https://github.com/seerge/g-helper/pull/1462 @aliazhar-id
2023-10-13 11:59:25 +02:00
Serge
8d8cfb0521 Merge pull request #1452 from seerge/l10n_main
New Crowdin updates
2023-10-12 15:40:25 +02:00
Serge
f021135f53 New translations strings.resx (German) 2023-10-12 13:49:12 +02:00
Serge
98670414d2 Merge pull request #1451 from IceStormNG/asus-mouse-support
TUF M5 has 3 profiles, not just 1
2023-10-12 12:21:20 +02:00
IceStormNG
a41595068e TUF M5 has 3 profiles, not just 1 2023-10-12 12:19:02 +02:00
Serge
d58c277733 Exception fix https://github.com/seerge/g-helper/issues/1447 2023-10-11 19:24:41 +02:00
33 changed files with 1520 additions and 852 deletions

View File

@@ -22,18 +22,9 @@ jobs:
- name: Publish
run: |
dotnet publish app/GHelper.sln --configuration Release --runtime win-x64 -p:PublishSingleFile=true --no-self-contained
powershell Compress-Archive app/bin/x64/Release/net7.0-windows/win-x64/publish/* GHelper-${{ github.sha }}.zip
powershell Compress-Archive app/bin/x64/Release/net7.0-windows/win-x64/publish/* GHelper.zip
- name: Upload
if: github.event_name != 'workflow_dispatch'
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release upload ${{ github.ref_name }} GHelper.zip
- name: Artifact
if: github.event_name == 'workflow_dispatch'
uses: actions/upload-artifact@v3
with:
name: GHelper-release-${{ github.sha }}
path: GHelper-*.zip

View File

@@ -328,7 +328,7 @@ public static class AppConfig
// Devices with bugged bios command to change brightness
public static bool SwappedBrightness()
{
return ContainsModel("FA506IH") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH");
return ContainsModel("FA506IH") || ContainsModel("FA506IC") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH");
}
@@ -345,7 +345,7 @@ public static class AppConfig
public static bool IsSingleColor()
{
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("X13");
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13");
}
public static bool IsStrix()
@@ -355,7 +355,7 @@ public static class AppConfig
public static bool IsStrixLimitedRGB()
{
return ContainsModel("G614JV") || ContainsModel("G614JZ");
return ContainsModel("G614JV") || ContainsModel("G614JZ") || ContainsModel("G512LI") || ContainsModel("G513RS");
}
public static bool IsZ13()
@@ -423,7 +423,7 @@ public static class AppConfig
public static bool IsGPUFixNeeded()
{
return ContainsModel("GA402X") || ContainsModel("GV302") || ContainsModel("GZ301") || ContainsModel("FX506") || ContainsModel("GU603V");
return ContainsModel("GA402X") || ContainsModel("GV302") || ContainsModel("GZ301") || ContainsModel("FX506") || ContainsModel("GU603V") || ContainsModel("GU603Z");
}
public static bool IsGPUFix()
@@ -441,4 +441,9 @@ public static class AppConfig
return ContainsModel("GV301RA") || ContainsModel("GV302XA") || IsAlly();
}
public static bool IsHardwareTouchpadToggle()
{
return ContainsModel("FA507");
}
}

View File

@@ -1,4 +1,5 @@
using GHelper;
using GHelper.USB;
using System.Management;
using System.Runtime.InteropServices;
@@ -549,7 +550,7 @@ public class AsusACPI
DeviceSet(TUF_KB_BRIGHTNESS, param, "TUF Brightness");
}
public void TUFKeyboardRGB(int mode, Color color, int speed, string? log = "TUF RGB")
public void TUFKeyboardRGB(AuraMode mode, Color color, int speed, string? log = "TUF RGB")
{
byte[] setting = new byte[6];

View File

@@ -671,7 +671,8 @@ namespace GHelper
private void VisualizeMouseSettings()
{
comboProfile.SelectedIndex = mouse.Profile;
if (mouse.Profile < comboProfile.Items.Count)
comboProfile.SelectedIndex = mouse.Profile;
if (mouse.HasRGB())
{

View File

@@ -1,690 +0,0 @@
using GHelper.Gpu;
using GHelper.Helpers;
using HidLibrary;
using NAudio.Gui;
using System.Diagnostics;
using System.Drawing;
using System.Text;
namespace GHelper
{
public class AuraPower
{
public bool BootLogo;
public bool BootKeyb;
public bool AwakeLogo;
public bool AwakeKeyb;
public bool SleepLogo;
public bool SleepKeyb;
public bool ShutdownLogo;
public bool ShutdownKeyb;
public bool BootBar;
public bool AwakeBar;
public bool SleepBar;
public bool ShutdownBar;
public bool BootLid;
public bool AwakeLid;
public bool SleepLid;
public bool ShutdownLid;
public bool BootRear;
public bool AwakeRear;
public bool SleepRear;
public bool ShutdownRear;
}
public static class AsusUSB
{
public const int HEATMAP = 20;
public const int GPUMODE = 21;
public const int ASUS_ID = 0x0b05;
public const byte INPUT_HID_ID = 0x5a;
public const byte AURA_HID_ID = 0x5d;
public static readonly byte[] LED_INIT1 = new byte[] { AURA_HID_ID, 0xb9 };
public static readonly byte[] LED_INIT2 = Encoding.ASCII.GetBytes("]ASUS Tech.Inc.");
public static readonly byte[] LED_INIT3 = new byte[] { AURA_HID_ID, 0x05, 0x20, 0x31, 0, 0x1a };
public static readonly byte[] LED_INIT4 = Encoding.ASCII.GetBytes("^ASUS Tech.Inc.");
public static readonly byte[] LED_INIT5 = new byte[] { 0x5e, 0x05, 0x20, 0x31, 0, 0x1a };
static byte[] MESSAGE_APPLY = { AURA_HID_ID, 0xb4 };
static byte[] MESSAGE_SET = { AURA_HID_ID, 0xb5, 0, 0, 0 };
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6, 0x1abe };
private static int mode = 0;
private static int speed = 1;
public static Color Color1 = Color.White;
public static Color Color2 = Color.Black;
static bool isTuf = AppConfig.IsTUF() || AppConfig.IsVivobook();
static bool isStrix = AppConfig.IsStrix();
static public bool isSingleColor = false;
static bool isOldHeatmap = AppConfig.Is("old_heatmap");
static System.Timers.Timer timer = new System.Timers.Timer(2000);
static HidDevice? auraDevice = null;
static byte[] AuraPowerMessage(AuraPower flags)
{
byte keyb = 0, bar = 0, lid = 0, rear = 0;
if (flags.BootLogo) keyb |= 1 << 0;
if (flags.BootKeyb) keyb |= 1 << 1;
if (flags.AwakeLogo) keyb |= 1 << 2;
if (flags.AwakeKeyb) keyb |= 1 << 3;
if (flags.SleepLogo) keyb |= 1 << 4;
if (flags.SleepKeyb) keyb |= 1 << 5;
if (flags.ShutdownLogo) keyb |= 1 << 6;
if (flags.ShutdownKeyb) keyb |= 1 << 7;
if (flags.BootBar) bar |= 1 << 1;
if (flags.AwakeBar) bar |= 1 << 2;
if (flags.SleepBar) bar |= 1 << 3;
if (flags.ShutdownBar) bar |= 1 << 4;
if (flags.BootLid) lid |= 1 << 0;
if (flags.AwakeLid) lid |= 1 << 1;
if (flags.SleepLid) lid |= 1 << 2;
if (flags.ShutdownLid) lid |= 1 << 3;
if (flags.BootLid) lid |= 1 << 4;
if (flags.AwakeLid) lid |= 1 << 5;
if (flags.SleepLid) lid |= 1 << 6;
if (flags.ShutdownLid) lid |= 1 << 7;
if (flags.BootRear) rear |= 1 << 0;
if (flags.AwakeRear) rear |= 1 << 1;
if (flags.SleepRear) rear |= 1 << 2;
if (flags.ShutdownRear) rear |= 1 << 3;
if (flags.BootRear) rear |= 1 << 4;
if (flags.AwakeRear) rear |= 1 << 5;
if (flags.SleepRear) rear |= 1 << 6;
if (flags.ShutdownRear) rear |= 1 << 7;
return new byte[] { 0x5d, 0xbd, 0x01, keyb, bar, lid, rear, 0xFF };
}
static AsusUSB()
{
timer.Elapsed += Timer_Elapsed;
isSingleColor = AppConfig.IsSingleColor(); // Mono Color
var device = GetDevice(AURA_HID_ID);
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)
{
SetHeatmap();
}
static void SetHeatmap(bool init = false)
{
float cpuTemp = (float)HardwareControl.GetCPUTemp();
int freeze = 20, cold = 40, warm = 65, hot = 90;
Color color;
//Debug.WriteLine(cpuTemp);
if (cpuTemp < cold) color = ColorUtilities.GetWeightedAverage(Color.Blue, Color.Green, ((float)cpuTemp - freeze) / (cold - freeze));
else if (cpuTemp < warm) color = ColorUtilities.GetWeightedAverage(Color.Green, Color.Yellow, ((float)cpuTemp - cold) / (warm - cold));
else if (cpuTemp < hot) color = ColorUtilities.GetWeightedAverage(Color.Yellow, Color.Red, ((float)cpuTemp - warm) / (hot - warm));
else color = Color.Red;
ApplyColor(color, init);
}
public static Dictionary<int, string> GetSpeeds()
{
return new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraSlow },
{ 1, Properties.Strings.AuraNormal },
{ 2, Properties.Strings.AuraFast }
};
}
static Dictionary<int, string> _modesSingleColor = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 10, Properties.Strings.AuraStrobe },
};
static Dictionary<int, string> _modes = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 10, Properties.Strings.AuraStrobe },
{ HEATMAP, "Heatmap"},
{ GPUMODE, "GPU Mode" }
};
static Dictionary<int, string> _modesStrix = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 4, "Star" },
{ 5, "Rain" },
{ 6, "Highlight" },
{ 7, "Laser" },
{ 8, "Ripple" },
{ 10, Properties.Strings.AuraStrobe},
{ 11, "Comet" },
{ 12, "Flash" },
{ HEATMAP, "Heatmap"}
};
public static Dictionary<int, string> GetModes()
{
if (isTuf)
{
_modes.Remove(3);
}
if (isSingleColor)
{
return _modesSingleColor;
}
if (AppConfig.IsAdvantageEdition())
{
return _modes;
}
if (AppConfig.IsStrix() && !AppConfig.IsStrixLimitedRGB())
{
return _modesStrix;
}
return _modes;
}
public static int Mode
{
get { return mode; }
set
{
if (GetModes().ContainsKey(value))
mode = value;
else
mode = 0;
}
}
public static bool HasSecondColor()
{
return (mode == 1 && !isTuf);
}
public static int Speed
{
get { return speed; }
set
{
if (GetSpeeds().ContainsKey(value))
speed = value;
else
speed = 1;
}
}
public static void SetColor(int colorCode)
{
Color1 = Color.FromArgb(colorCode);
}
public static void SetColor2(int colorCode)
{
Color2 = Color.FromArgb(colorCode);
}
private static IEnumerable<HidDevice> GetHidDevices(int[] deviceIds, int minFeatures = 1)
{
HidDevice[] HidDeviceList = HidDevices.Enumerate(ASUS_ID, deviceIds).ToArray();
foreach (HidDevice device in HidDeviceList)
if (device.IsConnected && device.Capabilities.FeatureReportByteLength >= minFeatures)
yield return device;
}
public static HidDevice? GetDevice(byte reportID = INPUT_HID_ID)
{
HidDevice[] HidDeviceList = HidDevices.Enumerate(ASUS_ID, deviceIds).ToArray();
HidDevice input = null;
foreach (HidDevice device in HidDeviceList)
if (device.ReadFeatureData(out byte[] data, reportID))
{
input = device;
//Logger.WriteLine("HID Device("+ reportID + ")" + + device.Capabilities.FeatureReportByteLength + "|" + device.Capabilities.InputReportByteLength + device.DevicePath);
}
return input;
}
public static bool TouchpadToggle()
{
HidDevice? input = GetDevice();
if (input != null) return input.WriteFeatureData(new byte[] { INPUT_HID_ID, 0xf4, 0x6b });
return false;
}
public static byte[] AuraMessage(int mode, Color color, Color color2, int speed, bool mono = false)
{
byte[] msg = new byte[17];
msg[0] = AURA_HID_ID;
msg[1] = 0xb3;
msg[2] = 0x00; // Zone
msg[3] = (byte)mode; // Aura Mode
msg[4] = color.R; // R
msg[5] = mono ? (byte)0 : color.G; // G
msg[6] = mono ? (byte)0 : color.B; // B
msg[7] = (byte)speed; // aura.speed as u8;
msg[8] = 0; // aura.direction as u8;
msg[9] = (mode == 1) ? (byte)1 : (byte)0;
msg[10] = color2.R; // R
msg[11] = mono ? (byte)0 : color2.G; // G
msg[12] = mono ? (byte)0 : color2.B; // B
return msg;
}
public static void Init()
{
Task.Run(async () =>
{
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
device.WriteFeatureData(LED_INIT1);
device.WriteFeatureData(LED_INIT2);
device.WriteFeatureData(LED_INIT3);
device.WriteFeatureData(LED_INIT4);
device.WriteFeatureData(LED_INIT5);
device.CloseDevice();
}
});
}
public static void ApplyBrightness(int brightness, string log = "Backlight", bool delay = false)
{
Task.Run(async () =>
{
if (delay) await Task.Delay(TimeSpan.FromSeconds(1));
if (isTuf) Program.acpi.TUFKeyboardBrightness(brightness);
byte[] msg = { AURA_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
byte[] msgBackup = { INPUT_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
device.WriteFeatureData(msg);
Logger.WriteLine(log + ":" + BitConverter.ToString(msg));
}
if (AppConfig.ContainsModel("GA503") && device.ReadFeatureData(out byte[] dataBackkup, INPUT_HID_ID))
{
device.WriteFeatureData(msgBackup);
Logger.WriteLine(log + ":" + BitConverter.ToString(msgBackup));
}
device.CloseDevice();
}
// Backup payload for old models
/*
if (AppConfig.ContainsModel("GA503RW"))
{
byte[] msgBackup = { INPUT_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
var devicesBackup = GetHidDevices(deviceIds);
foreach (HidDevice device in devicesBackup)
{
device.OpenDevice();
device.WriteFeatureData(msgBackup);
device.CloseDevice();
}
}
*/
});
}
public static void ApplyAuraPower()
{
AuraPower flags = new();
// Keyboard
flags.AwakeKeyb = AppConfig.IsNotFalse("keyboard_awake");
flags.BootKeyb = AppConfig.IsNotFalse("keyboard_boot");
flags.SleepKeyb = AppConfig.IsNotFalse("keyboard_sleep");
flags.ShutdownKeyb = AppConfig.IsNotFalse("keyboard_shutdown");
// Logo
flags.AwakeLogo = AppConfig.IsNotFalse("keyboard_awake_logo");
flags.BootLogo = AppConfig.IsNotFalse("keyboard_boot_logo");
flags.SleepLogo = AppConfig.IsNotFalse("keyboard_sleep_logo");
flags.ShutdownLogo = AppConfig.IsNotFalse("keyboard_shutdown_logo");
// Lightbar
flags.AwakeBar = AppConfig.IsNotFalse("keyboard_awake_bar");
flags.BootBar = AppConfig.IsNotFalse("keyboard_boot_bar");
flags.SleepBar = AppConfig.IsNotFalse("keyboard_sleep_bar");
flags.ShutdownBar = AppConfig.IsNotFalse("keyboard_shutdown_bar");
// Lid
flags.AwakeLid = AppConfig.IsNotFalse("keyboard_awake_lid");
flags.BootLid = AppConfig.IsNotFalse("keyboard_boot_lid");
flags.SleepLid = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownLid = AppConfig.IsNotFalse("keyboard_shutdown_lid");
// Rear Bar
flags.AwakeRear = AppConfig.IsNotFalse("keyboard_awake_lid");
flags.BootRear = AppConfig.IsNotFalse("keyboard_boot_lid");
flags.SleepRear = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownRear = AppConfig.IsNotFalse("keyboard_shutdown_lid");
var devices = GetHidDevices(deviceIds);
byte[] msg = AuraPowerMessage(flags);
foreach (HidDevice device in devices)
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
device.WriteFeatureData(msg);
Logger.WriteLine("USB-KB " + device.Attributes.ProductHexId + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
if (isTuf)
Program.acpi.TUFKeyboardPower(
flags.AwakeKeyb,
flags.BootKeyb,
flags.SleepKeyb,
flags.ShutdownKeyb);
}
static void GetAuraDevice()
{
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
Logger.WriteLine("Aura Device:" + device.DevicePath);
auraDevice = device;
return;
}
else
{
device.CloseDevice();
}
}
}
public static void ApplyColor(Color color, bool init = false)
{
if (isTuf)
{
Program.acpi.TUFKeyboardRGB(0, color, 0, null);
return;
}
if (auraDevice is null || !auraDevice.IsConnected) GetAuraDevice();
if (auraDevice is null || !auraDevice.IsConnected) return;
if (isStrix && !isOldHeatmap)
{
byte[] msg = new byte[0x40];
byte start = 9;
byte maxLeds = 0x93;
msg[0] = AURA_HID_ID;
msg[1] = 0xbc;
msg[2] = 0;
msg[3] = 1;
msg[4] = 1;
msg[5] = 1;
msg[6] = 0;
msg[7] = 0x10;
for (byte i = 0; i < 0x12; i++)
{
msg[start + i * 3] = color.R; // R
msg[start + 1 + i * 3] = color.G; // G
msg[start + 2 + i * 3] = color.B; // B
}
if (init)
{
auraDevice.Write(LED_INIT1);
auraDevice.Write(LED_INIT2);
auraDevice.Write(LED_INIT3);
auraDevice.Write(LED_INIT4);
auraDevice.Write(LED_INIT5);
auraDevice.Write(new byte[] { AURA_HID_ID, 0xbc });
}
for (byte b = 0; b < maxLeds; b += 0x10)
{
msg[6] = b;
auraDevice.Write(msg);
}
msg[6] = maxLeds;
auraDevice.Write(msg);
msg[4] = 4;
msg[5] = 0;
msg[6] = 0;
msg[7] = 0;
auraDevice.Write(msg);
}
else
{
//Debug.WriteLine(color.ToString());
auraDevice.Write(AuraMessage(0, color, color, 0));
auraDevice.Write(MESSAGE_SET);
}
}
public static void ApplyGPUColor()
{
if (AppConfig.Get("aura_mode") != GPUMODE) return;
Logger.WriteLine(GPUModeControl.gpuMode.ToString());
switch (GPUModeControl.gpuMode)
{
case AsusACPI.GPUModeUltimate:
ApplyColor(Color.Red, true);
break;
case AsusACPI.GPUModeEco:
ApplyColor(Color.Green, true);
break;
default:
ApplyColor(Color.Yellow, true);
break;
}
}
public static void ApplyAura()
{
Mode = AppConfig.Get("aura_mode");
Speed = AppConfig.Get("aura_speed");
SetColor(AppConfig.Get("aura_color"));
SetColor2(AppConfig.Get("aura_color2"));
timer.Enabled = false;
if (Mode == HEATMAP)
{
SetHeatmap(true);
timer.Enabled = true;
return;
}
if (Mode == GPUMODE)
{
ApplyGPUColor();
return;
}
int _speed;
switch (Speed)
{
case 1:
_speed = 0xeb;
break;
case 2:
_speed = 0xf5;
break;
default:
_speed = 0xe1;
break;
}
byte[] msg;
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
if (device.ReadFeatureData(out byte[] data, AURA_HID_ID))
{
msg = AuraMessage(Mode, Color1, Color2, _speed, isSingleColor);
device.WriteFeatureData(msg);
device.WriteFeatureData(MESSAGE_APPLY);
device.WriteFeatureData(MESSAGE_SET);
Logger.WriteLine("USB-KB " + device.Attributes.Version + device.Description + device.DevicePath + ":" + BitConverter.ToString(msg));
}
device.CloseDevice();
}
if (isTuf)
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);
}
// Reference : thanks to https://github.com/RomanYazvinsky/ for initial discovery of XGM payloads
public static int SetXGM(byte[] msg)
{
//Logger.WriteLine("XGM Payload :" + BitConverter.ToString(msg));
var payload = new byte[300];
Array.Copy(msg, payload, msg.Length);
foreach (HidDevice device in GetHidDevices(new int[] { 0x1970 }, 300))
{
device.OpenDevice();
Logger.WriteLine("XGM " + device.Attributes.ProductHexId + "|" + device.Capabilities.FeatureReportByteLength + ":" + BitConverter.ToString(msg));
device.WriteFeatureData(payload);
device.CloseDevice();
//return 1;
}
return 0;
}
public static void InitXGM()
{
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)
{
SetXGM(new byte[] { 0x5e, 0xc5, status ? (byte)0x50 : (byte)0 });
}
public static int ResetXGM()
{
return SetXGM(new byte[] { 0x5e, 0xd1, 0x02 });
}
public static int SetXGMFan(byte[] curve)
{
if (AsusACPI.IsInvalidCurve(curve)) return -1;
//InitXGM();
byte[] msg = new byte[19];
Array.Copy(new byte[] { 0x5e, 0xd1, 0x01 }, msg, 3);
Array.Copy(curve, 0, msg, 3, curve.Length);
return SetXGM(msg);
}
}
}

View File

@@ -13,10 +13,20 @@
{
AppConfig.Set("charge_full", 1);
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, 100, "BatteryLimit");
Program.settingsForm.VisualiseBatteryFull();
}
public static void UnSetBatteryLimitFull()
{
AppConfig.Set("charge_full", 0);
Program.settingsForm.VisualiseBatteryFull();
}
public static void AutoBattery(bool init = false)
{
if (AppConfig.Is("charge_full") && !init) SetBatteryLimitFull();
else SetBatteryChargeLimit();
}
public static void SetBatteryChargeLimit(int limit = -1)
{

View File

@@ -4,6 +4,7 @@ using GHelper.Helpers;
using GHelper.Input;
using GHelper.Mode;
using GHelper.UI;
using GHelper.USB;
using System.Diagnostics;
namespace GHelper
@@ -153,7 +154,7 @@ namespace GHelper
labelM1.Text = "FN+F2";
labelM2.Text = "FN+F3";
labelM3.Text = "FN+F4";
labelM4.Visible = comboM4.Visible = textM4.Visible = false;
labelM4.Visible = comboM4.Visible = textM4.Visible = AppConfig.IsDUO();
labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;
}
@@ -218,10 +219,10 @@ namespace GHelper
Shown += Keyboard_Shown;
comboKeyboardSpeed.DropDownStyle = ComboBoxStyle.DropDownList;
comboKeyboardSpeed.DataSource = new BindingSource(AsusUSB.GetSpeeds(), null);
comboKeyboardSpeed.DataSource = new BindingSource(Aura.GetSpeeds(), null);
comboKeyboardSpeed.DisplayMember = "Value";
comboKeyboardSpeed.ValueMember = "Key";
comboKeyboardSpeed.SelectedValue = AsusUSB.Speed;
comboKeyboardSpeed.SelectedValue = Aura.Speed;
comboKeyboardSpeed.SelectedValueChanged += ComboKeyboardSpeed_SelectedValueChanged;
// Keyboard
@@ -400,7 +401,7 @@ namespace GHelper
else
AppConfig.Set("keyboard_brightness", sliderBrightness.Value);
AsusUSB.ApplyBrightness(sliderBrightness.Value, "Slider");
Aura.ApplyBrightness(sliderBrightness.Value, "Slider");
}
private void InitServices()
@@ -515,7 +516,7 @@ namespace GHelper
private void CheckXMG_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.Set("xmg_light", (checkXMG.Checked ? 1 : 0));
AsusUSB.ApplyXGMLight(checkXMG.Checked);
XGM.Light(checkXMG.Checked);
}
private void CheckUSBC_CheckedChanged(object? sender, EventArgs e)
@@ -563,14 +564,14 @@ namespace GHelper
AppConfig.Set("keyboard_sleep_logo", (checkSleepLogo.Checked ? 1 : 0));
AppConfig.Set("keyboard_shutdown_logo", (checkShutdownLogo.Checked ? 1 : 0));
AsusUSB.ApplyAuraPower();
Aura.ApplyPower();
}
private void ComboKeyboardSpeed_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("aura_speed", (int)comboKeyboardSpeed.SelectedValue);
AsusUSB.ApplyAura();
Aura.ApplyAura();
}

View File

@@ -2,6 +2,7 @@
using GHelper.Gpu.NVidia;
using GHelper.Mode;
using GHelper.UI;
using GHelper.USB;
using Ryzen;
using System.Diagnostics;
using System.Windows.Forms.DataVisualization.Charting;
@@ -1004,7 +1005,7 @@ namespace GHelper
InitPowerPlan();
if (Program.acpi.IsXGConnected()) AsusUSB.ResetXGM();
if (Program.acpi.IsXGConnected()) XGM.Reset();
if (gpuVisible)

View File

@@ -15,7 +15,7 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<AssemblyVersion>0.129</AssemblyVersion>
<AssemblyVersion>0.131</AssemblyVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -59,7 +59,6 @@
<ItemGroup>
<PackageReference Include="FftSharp" Version="2.0.0" />
<PackageReference Include="hidlibrary" Version="3.3.40" />
<PackageReference Include="HidSharpCore" Version="1.2.1.1" />
<PackageReference Include="NAudio" Version="2.1.0" />
<PackageReference Include="NvAPIWrapper.Net" Version="0.8.1.101" />

View File

@@ -1,6 +1,7 @@
using GHelper.Display;
using GHelper.Gpu.NVidia;
using GHelper.Helpers;
using GHelper.USB;
using System.Diagnostics;
namespace GHelper.Gpu
@@ -53,7 +54,7 @@ namespace GHelper.Gpu
AppConfig.Set("gpu_mode", gpuMode);
settings.VisualiseGPUMode(gpuMode);
AsusUSB.ApplyGPUColor();
Aura.ApplyGPUColor();
}
@@ -284,7 +285,7 @@ namespace GHelper.Gpu
if (Program.acpi.IsXGConnected())
{
//Program.acpi.DeviceSet(AsusACPI.GPUXGInit, 1, "XG Init");
AsusUSB.InitXGM();
XGM.Init();
}
}
@@ -298,7 +299,7 @@ namespace GHelper.Gpu
if (Program.acpi.DeviceGet(AsusACPI.GPUXG) == 1)
{
AsusUSB.ResetXGM();
XGM.Reset();
HardwareControl.KillGPUApps();
DialogResult dialogResult = MessageBox.Show("Did you close all applications running on XG Mobile?", "Disabling XG Mobile", MessageBoxButtons.YesNo);
@@ -318,12 +319,12 @@ namespace GHelper.Gpu
InitXGM();
AsusUSB.ApplyXGMLight(AppConfig.Is("xmg_light"));
XGM.Light(AppConfig.Is("xmg_light"));
await Task.Delay(TimeSpan.FromSeconds(15));
if (AppConfig.IsMode("auto_apply"))
AsusUSB.SetXGMFan(AppConfig.GetFanConfig(AsusFan.XGM));
XGM.SetFan(AppConfig.GetFanConfig(AsusFan.XGM));
HardwareControl.RecreateGpuControl();

View File

@@ -15,10 +15,10 @@ public class NvidiaGpuControl : IGpuControl
public static int MaxCoreOffset => AppConfig.Get("max_gpu_core", 250);
public static int MaxMemoryOffset => AppConfig.Get("max_gpu_memory", 250);
public const int MinCoreOffset = -250;
public const int MinMemoryOffset = -250;
public static int MinCoreOffset = AppConfig.Get("min_gpu_core", -250);
public static int MinMemoryOffset = AppConfig.Get("min_gpu_memory", -250);
public const int MinClockLimit = 1000;
public const int MinClockLimit = 400;
public const int MaxClockLimit = 3000;
private static PhysicalGPU? _internalGpu;

View File

@@ -7,6 +7,7 @@ using GHelper.Gpu.AMD;
using GHelper.Helpers;
using System.Diagnostics;
using System.Management;
using GHelper.Battery;
public static class HardwareControl
{
@@ -211,6 +212,7 @@ public static class HardwareControl
if (fullCapacity > 0 && chargeCapacity > 0)
{
batteryCapacity = Math.Min(100, ((decimal)chargeCapacity / (decimal)fullCapacity) * 100);
if (batteryCapacity > 99) BatteryControl.UnSetBatteryLimitFull();
}

View File

@@ -133,9 +133,10 @@ namespace GHelper.Helpers
cmd.StartInfo.Arguments = args;
cmd.Start();
Logger.WriteLine(args);
string result = cmd.StandardOutput.ReadToEnd().Replace(Environment.NewLine, " ").Trim(' ');
Logger.WriteLine(args);
Logger.WriteLine(result);
cmd.WaitForExit();

View File

@@ -1,6 +1,7 @@
using GHelper.Display;
using GHelper.Helpers;
using GHelper.Mode;
using GHelper.USB;
using Microsoft.Win32;
using System.Diagnostics;
using System.Management;
@@ -59,7 +60,7 @@ namespace GHelper.Input
if (backlightActivity && iddle.TotalSeconds > kb_timeout)
{
backlightActivity = false;
AsusUSB.ApplyBrightness(0, "Timeout");
Aura.ApplyBrightness(0, "Timeout");
}
if (!backlightActivity && iddle.TotalSeconds < kb_timeout)
@@ -68,7 +69,7 @@ namespace GHelper.Input
SetBacklightAuto();
}
//Debug.WriteLine(iddle.TotalSeconds);
//Logger.WriteLine("Iddle: " + iddle.TotalSeconds);
}
public void Init()
@@ -302,10 +303,10 @@ namespace GHelper.Input
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);
break;
case Keys.F10:
HandleOptimizationEvent(107);
ToggleTouchpadEvent(true);
break;
case Keys.F11:
HandleOptimizationEvent(108);
SleepEvent();
break;
case Keys.F12:
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.A);
@@ -346,6 +347,7 @@ namespace GHelper.Input
if (e.Key == keyProfile) modeControl.CyclePerformanceMode(true);
}
if (e.Modifier == (ModifierKeys.Control))
{
switch (e.Key)
@@ -475,9 +477,21 @@ namespace GHelper.Input
}
}
static void ToggleTouchpadEvent(bool hotkey = false)
{
if (hotkey || !AppConfig.IsHardwareTouchpadToggle()) ToggleTouchpad();
Thread.Sleep(200);
Program.toast.RunToast(GetTouchpadState() ? "On" : "Off", ToastIcon.Touchpad);
}
static void ToggleTouchpad()
{
KeyboardHook.KeyKeyKeyPress(Keys.ControlKey, Keys.LWin, Keys.F24);
KeyboardHook.KeyKeyKeyPress(Keys.LWin, Keys.LControlKey, Keys.F24, 50);
}
static void SleepEvent()
{
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.KB_Sleep, "Sleep");
}
public static void ToggleArrowLock()
@@ -513,7 +527,7 @@ namespace GHelper.Input
Logger.WriteLine("Tablet: " + tabletState + " Touchpad: " + touchpadState);
if (tabletState && touchpadState || !tabletState && !touchpadState) AsusUSB.TouchpadToggle();
if (tabletState && touchpadState || !tabletState && !touchpadState) ToggleTouchpad();
}
@@ -588,7 +602,8 @@ namespace GHelper.Input
case 199: // ON Z13 - FN+F11 - cycles backlight
SetBacklight(4);
return;
case 53: // FN+F6 on GA-502DU model
case 51: // Fn+F6 on old TUFs
case 53: // Fn+F6 on GA-502DU model
NativeMethods.TurnOffScreen();
return;
}
@@ -605,23 +620,28 @@ namespace GHelper.Input
switch (EventID)
{
case 16: // FN+F7
//ScreenBrightness.Adjust(-10);
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Down, "Brightness");
if (Control.ModifierKeys == Keys.Shift)
SetScreenpad(-10);
else
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Down, "Brightness");
break;
case 32: // FN+F8
//ScreenBrightness.Adjust(+10);
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Up, "Brightness");
if (Control.ModifierKeys == Keys.Shift)
SetScreenpad(10);
else
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Up, "Brightness");
break;
case 107: // FN+F10
ToggleTouchpad();
Thread.Sleep(200);
Program.toast.RunToast(GetTouchpadState() ? "On" : "Off", ToastIcon.Touchpad);
ToggleTouchpadEvent();
break;
case 108: // FN+F11
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.KB_Sleep, "Sleep");
SleepEvent();
break;
case 106: // Screenpad button on DUO
SetScreenpad(100);
if (Control.ModifierKeys == Keys.Shift)
ToggleScreenpad();
else
SetScreenpad(100);
break;
@@ -645,8 +665,8 @@ namespace GHelper.Input
public static void SetBacklightAuto(bool init = false)
{
if (init) AsusUSB.Init();
AsusUSB.ApplyBrightness(GetBacklight(), "Auto", init);
if (init) Aura.Init();
Aura.ApplyBrightness(GetBacklight(), "Auto", init);
}
public static void SetBacklight(int delta, bool force = false)
@@ -669,7 +689,7 @@ namespace GHelper.Input
if (force || !OptimizationService.IsRunning())
{
AsusUSB.ApplyBrightness(backlight, "HotKey");
Aura.ApplyBrightness(backlight, "HotKey");
}
if (!OptimizationService.IsOSDRunning())
@@ -680,6 +700,16 @@ namespace GHelper.Input
}
public static void ToggleScreenpad()
{
int toggle = AppConfig.Is("screenpad_toggle") ? 0 : 1;
Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, toggle, "ScreenpadToggle");
AppConfig.Set("screenpad_toggle", toggle);
Program.toast.RunToast($"Screen Pad " + (toggle == 1 ? "On" : "Off"), toggle > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
}
public static void SetScreenpad(int delta)
{
int brightness = AppConfig.Get("screenpad", 100);

View File

@@ -34,14 +34,16 @@ public sealed class KeyboardHook : IDisposable
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3)
public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3, int sleep = 0)
{
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
if (sleep > 0) Thread.Sleep(sleep);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
if (sleep > 0) Thread.Sleep(sleep);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}

View File

@@ -1,4 +1,5 @@
using HidLibrary;
using HidSharp;
using GHelper.USB;
namespace GHelper.Input
{
@@ -9,14 +10,14 @@ namespace GHelper.Input
public KeyboardListener(Action<int> KeyHandler)
{
HidDevice? input = AsusUSB.GetDevice();
HidStream? input = AsusHid.FindHidStream(AsusHid.INPUT_ID);
// Fallback
if (input == null)
{
AsusUSB.Init();
Aura.Init();
Thread.Sleep(1000);
input = AsusUSB.GetDevice();
input = input = AsusHid.FindHidStream(AsusHid.INPUT_ID);
}
if (input == null)
@@ -25,7 +26,9 @@ namespace GHelper.Input
return;
}
Logger.WriteLine($"Input: {input.DevicePath}");
input.ReadTimeout = int.MaxValue;
Logger.WriteLine($"Input: {input.Device.DevicePath}");
var task = Task.Run(() =>
{
@@ -35,14 +38,15 @@ namespace GHelper.Input
{
// Emergency break
if (input == null || !input.IsConnected)
if (input == null || !input.CanRead)
{
Logger.WriteLine("Listener terminated");
break;
}
var data = input.Read().Data;
if (data.Length > 1 && data[0] == AsusUSB.INPUT_HID_ID && data[1] > 0 && data[1] != 236)
var data = input.Read();
if (data.Length > 1 && data[0] == AsusHid.INPUT_ID && data[1] > 0 && data[1] != 236)
{
Logger.WriteLine($"Key: {data[1]}");
KeyHandler(data[1]);

84
app/Matrix.Designer.cs generated
View File

@@ -35,23 +35,23 @@
panelMain = new Panel();
panelButtons = new Panel();
buttonReset = new UI.RButton();
panelRotation = new Panel();
comboRotation = new UI.RComboBox();
labelRotation = new Label();
panelScaling = new Panel();
comboScaling = new UI.RComboBox();
labelScaling = new Label();
panelZoom = new Panel();
labelZoom = new Label();
labelZoomTitle = new Label();
panelRotation = new Panel();
comboRotation = new UI.RComboBox();
labelRotation = new Label();
((System.ComponentModel.ISupportInitialize)pictureMatrix).BeginInit();
((System.ComponentModel.ISupportInitialize)trackZoom).BeginInit();
panelPicture.SuspendLayout();
panelMain.SuspendLayout();
panelButtons.SuspendLayout();
panelRotation.SuspendLayout();
panelScaling.SuspendLayout();
panelZoom.SuspendLayout();
panelRotation.SuspendLayout();
SuspendLayout();
//
// pictureMatrix
@@ -109,6 +109,7 @@
//
// panelMain
//
panelMain.AutoSize = true;
panelMain.Controls.Add(panelButtons);
panelMain.Controls.Add(panelRotation);
panelMain.Controls.Add(panelScaling);
@@ -117,7 +118,7 @@
panelMain.Dock = DockStyle.Top;
panelMain.Location = new Point(20, 20);
panelMain.Name = "panelMain";
panelMain.Size = new Size(834, 924);
panelMain.Size = new Size(834, 814);
panelMain.TabIndex = 5;
//
// panelButtons
@@ -149,6 +150,40 @@
buttonReset.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonReset.UseVisualStyleBackColor = false;
//
// panelRotation
//
panelRotation.Controls.Add(comboRotation);
panelRotation.Controls.Add(labelRotation);
panelRotation.Dock = DockStyle.Top;
panelRotation.Location = new Point(0, 642);
panelRotation.Name = "panelRotation";
panelRotation.Size = new Size(834, 78);
panelRotation.TabIndex = 8;
//
// comboRotation
//
comboRotation.BorderColor = Color.White;
comboRotation.ButtonColor = Color.FromArgb(255, 255, 255);
comboRotation.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboRotation.FormattingEnabled = true;
comboRotation.ItemHeight = 32;
comboRotation.Items.AddRange(new object[] { "Straight", "Diagonal" });
comboRotation.Location = new Point(229, 17);
comboRotation.Margin = new Padding(4, 11, 4, 8);
comboRotation.Name = "comboRotation";
comboRotation.Size = new Size(322, 40);
comboRotation.TabIndex = 17;
//
// labelRotation
//
labelRotation.AutoSize = true;
labelRotation.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelRotation.Location = new Point(16, 20);
labelRotation.Name = "labelRotation";
labelRotation.Size = new Size(190, 32);
labelRotation.TabIndex = 4;
labelRotation.Text = "Image Rotation";
//
// panelScaling
//
panelScaling.Controls.Add(comboScaling);
@@ -216,40 +251,6 @@
labelZoomTitle.TabIndex = 3;
labelZoomTitle.Text = "Zoom";
//
// panelRotation
//
panelRotation.Controls.Add(comboRotation);
panelRotation.Controls.Add(labelRotation);
panelRotation.Dock = DockStyle.Top;
panelRotation.Location = new Point(0, 642);
panelRotation.Name = "panelRotation";
panelRotation.Size = new Size(834, 78);
panelRotation.TabIndex = 8;
//
// comboRotation
//
comboRotation.BorderColor = Color.White;
comboRotation.ButtonColor = Color.FromArgb(255, 255, 255);
comboRotation.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboRotation.FormattingEnabled = true;
comboRotation.ItemHeight = 32;
comboRotation.Items.AddRange(new object[] { "Straight", "Diagonal" });
comboRotation.Location = new Point(229, 17);
comboRotation.Margin = new Padding(4, 11, 4, 8);
comboRotation.Name = "comboRotation";
comboRotation.Size = new Size(322, 40);
comboRotation.TabIndex = 17;
//
// labelRotation
//
labelRotation.AutoSize = true;
labelRotation.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelRotation.Location = new Point(16, 20);
labelRotation.Name = "labelRotation";
labelRotation.Size = new Size(190, 32);
labelRotation.TabIndex = 4;
labelRotation.Text = "Image Rotation";
//
// Matrix
//
AutoScaleDimensions = new SizeF(192F, 192F);
@@ -271,13 +272,14 @@
panelMain.ResumeLayout(false);
panelMain.PerformLayout();
panelButtons.ResumeLayout(false);
panelRotation.ResumeLayout(false);
panelRotation.PerformLayout();
panelScaling.ResumeLayout(false);
panelScaling.PerformLayout();
panelZoom.ResumeLayout(false);
panelZoom.PerformLayout();
panelRotation.ResumeLayout(false);
panelRotation.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion

View File

@@ -1,6 +1,6 @@
using GHelper.Battery;
using GHelper.Gpu.NVidia;
using GHelper.Gpu.NVidia;
using GHelper.Helpers;
using GHelper.USB;
using Ryzen;
namespace GHelper.Mode
@@ -71,7 +71,7 @@ namespace GHelper.Mode
Modes.SetCurrent(mode);
int status = Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.IsManualModeRequired() ? AsusACPI.PerformanceManual : Modes.GetBase(mode), "Mode");
// Vivobook fallback
if (status != 1)
{
@@ -81,7 +81,7 @@ namespace GHelper.Mode
Program.acpi.DeviceSet(AsusACPI.VivoBookMode, vivoMode, "VivoMode");
}
if (AppConfig.Is("xgm_fan") && Program.acpi.IsXGConnected()) AsusUSB.ResetXGM();
if (AppConfig.Is("xgm_fan") && Program.acpi.IsXGConnected()) XGM.Reset();
if (notify)
Program.toast.RunToast(Modes.GetCurrentName(), SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online ? ToastIcon.Charger : ToastIcon.Battery);
@@ -134,8 +134,7 @@ namespace GHelper.Mode
bool xgmFan = false;
if (AppConfig.Is("xgm_fan") && Program.acpi.IsXGConnected())
{
//AsusUSB.InitXGM();
AsusUSB.SetXGMFan(AppConfig.GetFanConfig(AsusFan.XGM));
XGM.SetFan(AppConfig.GetFanConfig(AsusFan.XGM));
xgmFan = true;
}
@@ -311,13 +310,13 @@ namespace GHelper.Mode
int memory = AppConfig.GetMode("gpu_memory");
int clock_limit = AppConfig.GetMode("gpu_clock_limit");
if (core == -1 && memory == -1) return;
if (core == -1 && memory == -1 && clock_limit == -1) return;
//if ((gpu_core > -5 && gpu_core < 5) && (gpu_memory > -5 && gpu_memory < 5)) launchAsAdmin = false;
if (Program.acpi.DeviceGet(AsusACPI.GPUEco) == 1) return;
if (HardwareControl.GpuControl is null) return;
if (!HardwareControl.GpuControl!.IsNvidia) return;
if (Program.acpi.DeviceGet(AsusACPI.GPUEco) == 1) { Logger.WriteLine("Clocks: Eco"); return; }
if (HardwareControl.GpuControl is null) { Logger.WriteLine("Clocks: NoGPUControl"); return; }
if (!HardwareControl.GpuControl!.IsNvidia) { Logger.WriteLine("Clocks: NotNvidia"); return; }
using NvidiaGpuControl nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;
try
@@ -328,7 +327,7 @@ namespace GHelper.Mode
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
Logger.WriteLine("Clocks Error:" + ex.ToString());
}
settings.GPUInit();

View File

@@ -51,7 +51,7 @@
public override int ProfileCount()
{
return 1;
return 3;
}
public override int MaxDPI()
{

View File

@@ -97,7 +97,7 @@ namespace GHelper
gpuControl.InitXGM();
SetAutoModes();
SetAutoModes(init : true);
// Subscribing for system power change events
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
@@ -129,7 +129,7 @@ namespace GHelper
private static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
gpuControl.StandardModeFix();
BatteryControl.SetBatteryChargeLimit();
BatteryControl.AutoBattery();
}
private static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
@@ -173,7 +173,7 @@ namespace GHelper
public static void SetAutoModes(bool powerChanged = false)
public static void SetAutoModes(bool powerChanged = false, bool init = false)
{
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastAuto) < 3000) return;
@@ -194,7 +194,7 @@ namespace GHelper
screenControl.AutoScreen();
}
BatteryControl.SetBatteryChargeLimit();
BatteryControl.AutoBattery(init);
settingsForm.AutoKeyboard();
settingsForm.matrixControl.SetMatrix(true);

View File

@@ -253,7 +253,7 @@
<value>Batteriezustand</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Einmalig auf 100% aufladen</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS und Treiber Updates</value>

View File

@@ -253,7 +253,7 @@
<value>Salud de la batería</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Cargar una vez al 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Actualizaciones de BIOS y Drivers</value>

View File

@@ -244,7 +244,7 @@
<value>Équilibré</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
<value>Charge de la batterie</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limite de charge </value>
@@ -253,7 +253,7 @@
<value>Santé de la batterie</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Charge unique à 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Mise à jour BIOS et pilotes</value>
@@ -262,7 +262,7 @@
<value>Au démarrage</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
<value>Son au démarrage</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminosité</value>
@@ -274,7 +274,7 @@
<value>Augmenter la luminosité</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
<value>Calibrer</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Chargement en cours</value>

View File

@@ -0,0 +1,656 @@
<?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 xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="root">
<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>
<data name="Acceleration" xml:space="preserve">
<value>Akselerasi</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Tidak dapat terhubung ke ASUS ACPI. tanpanya aplikasi tidak dapat berfungsi. Cobalah untuk menginstal Asus System Control Interface</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Tampaknya GPU sedang digunakan intensif, nonaktifkan?</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<value>Mode Eco</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Mematikan Mode Ultimate memerlukan restart.</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<value>Mode Ultimate memerlukan restart</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Mulai ulang sekarang?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Kecepatan Animasi</value>
</data>
<data name="AnimeMatrix" xml:space="preserve">
<value>Anime Matrix</value>
</data>
<data name="AppAlreadyRunning" xml:space="preserve">
<value>Aplikasi sudah berjalan</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper sudah berjalan. Periksa system tray untuk menemukan ikonnya.</value>
</data>
<data name="Apply" xml:space="preserve">
<value>Terapkan</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Terapkan Custom Fan Curve</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Terapkan Batas Daya</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Otomatis sesuaikan Mode Daya Windows</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Layanan Asus Berjalan</value>
</data>
<data name="AuraBatteryState" xml:space="preserve">
<value>Status Baterai</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Bernapas</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Searah Jarum Jam</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Siklus Warna</value>
</data>
<data name="AuraComet" xml:space="preserve">
<value>Komet</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Berlawanan Jarum Jam</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Cepat</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Mode Pencahayaan</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<value>Pelangi</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Acak</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>Reaksi</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Pelan</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>Statis</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>Berkedip</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>Semua</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dok</value>
</data>
<data name="AuraZoneLogo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="AuraZoneScroll" xml:space="preserve">
<value>Roda Gulir</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Cahaya Bawah</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Terapkan Secara Otomatis</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Otomatis</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Atur ke 60Hz untuk menghemat baterai, dan kembalikan saat mengisi daya</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Bangun</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Waktu tunggu dicolokan / menggunakan baterai (0 - Hidup)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Seimbang</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Baterai</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Batas Pengisian Baterai</value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Kesehatan Baterai</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>Isi daya sekali hingga mencapai 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Pembaruan BIOS dan Driver</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Boot</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Suara Boot</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Kecerahan</value>
</data>
<data name="BrightnessDown" xml:space="preserve">
<value>Kurangi Kecerahan</value>
</data>
<data name="BrightnessUp" xml:space="preserve">
<value>Tingkatkan Kecerahan</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Kalibrasi</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Mengisi Daya</value>
</data>
<data name="Color" xml:space="preserve">
<value>Warna</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>CPU Boost</value>
</data>
<data name="Custom" xml:space="preserve">
<value>Kustom</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Perlambatan</value>
</data>
<data name="Default" xml:space="preserve">
<value>Standar</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Nonaktifkan screen overdrive</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Discharging</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Unduh</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Driver dan Software</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Menonaktikan dGPU untuk menghemat baterai</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Eco</value>
</data>
<data name="EnableOptimusText" xml:space="preserve">
<value>Menonaktikan dGPU dengan masuk ke mode Eco saat Mode Tampilan di Panel Kontrol NVIDIA tidak diatur ke Optimus mungkin dapat menyebabkan masalah dengan kontrol kecerahan hingga mulai ulang berikutnya.
Apakah Anda masih ingin melanjutkan?</value>
</data>
<data name="EnableOptimusTitle" xml:space="preserve">
<value>Mode Tampilan NVIDIA tidak diatur ke Optimus</value>
</data>
<data name="EnergySettings" xml:space="preserve">
<value>Pengaturan Energi</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Ekstra</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<value>Pengaturan Ekstra</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<value>Setelan Pabrik</value>
</data>
<data name="FanCurves" xml:space="preserve">
<value>Kurva Kipas</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<value>Profil Kipas CPU</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<value>Profil Kipas GPU</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>Profil Kipas Sedang</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>Profil Kipas</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<value>Kipas dan Daya</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value>Kipas</value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Kipas + Daya</value>
</data>
<data name="FnLock" xml:space="preserve">
<value>Proses tombol pintas Fn+F tanpa Fn</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Mengubah</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Core Clock Offset</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Memory Clock Offset</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>Mode GPU</value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<value>Hanya iGPU</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<value>iGPU + dGPU</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<value>dGPU eksklusif</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>Pengaturan GPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Target Suhu</value>
</data>
<data name="HibernateAfter" xml:space="preserve">
<value>Menit hingga Hibernasi dalam mode tidur saat menggunakan baterai (0 - Mati)</value>
</data>
<data name="High" xml:space="preserve">
<value>Tinggi</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Pintasan Keyboard</value>
</data>
<data name="Keyboard" xml:space="preserve">
<value>Keyboard</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>Hentikan semua aplikasi yang menggunakan GPU saat beralih ke mode Eco</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Laptop Backlight</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Laptop Keyboard</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<value>Layar Laptop</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Lid</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Lightbar</value>
</data>
<data name="Lighting" xml:space="preserve">
<value>Lighting</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="Low" xml:space="preserve">
<value>Rendah</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Visualisasi Audio</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Binary Banner</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Terang</value>
</data>
<data name="MatrixClock" xml:space="preserve">
<value>Jam</value>
</data>
<data name="MatrixDim" xml:space="preserve">
<value>Redup</value>
</data>
<data name="MatrixLogo" xml:space="preserve">
<value>Logo Rog</value>
</data>
<data name="MatrixMedium" xml:space="preserve">
<value>Sedang</value>
</data>
<data name="MatrixOff" xml:space="preserve">
<value>Mati</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<value>Gambar</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>Maks refresh rate untuk mengurangi latensi</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>60Hz refresh rate untuk menghemat baterai</value>
</data>
<data name="Minute" xml:space="preserve">
<value>Menit</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>Menit</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Mati Otomatis Setelah</value>
</data>
<data name="MouseButtonResponse" xml:space="preserve">
<value>Respon Tombol</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Jarak Angkat</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Peringatan Baterai Rendah pada</value>
</data>
<data name="MousePerformance" xml:space="preserve">
<value>Performa</value>
</data>
<data name="MouseSynchronize" xml:space="preserve">
<value>Sinkronkan dengan mouse</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multizona</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Bisukan Mic</value>
</data>
<data name="Never" xml:space="preserve">
<value>Jangan Pernah</value>
</data>
<data name="NewUpdates" xml:space="preserve">
<value>Pembaruan Terbaru</value>
</data>
<data name="NoNewUpdates" xml:space="preserve">
<value>Tidak ada pembaruan</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Tidak Tersambung</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Buka Jendela G-Helper</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>Dioptimalkan</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Beralih ke Mode Eco saat menggunakan baterai dan ke Mode Standar saat mengisi daya.</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Tetap matikan GPU pada pengisi daya USB-C dalam mode Dioptimalkan</value>
</data>
<data name="Other" xml:space="preserve">
<value>Lainnya</value>
</data>
<data name="Overdrive" xml:space="preserve">
<value>Overdrive</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<value>Mode</value>
</data>
<data name="Peripherals" xml:space="preserve">
<value>Periferal</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Gambar / Gif</value>
</data>
<data name="PlayPause" xml:space="preserve">
<value>Putar / Jeda</value>
</data>
<data name="PollingRate" xml:space="preserve">
<value>Polling Rate</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Batas Daya</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<value>Batas Daya adalah fitur eksperimental. Gunakan dengan hati-hati dan atas risiko Anda sendiri!</value>
</data>
<data name="PrintScreen" xml:space="preserve">
<value>PrintScreen</value>
</data>
<data name="Profile" xml:space="preserve">
<value>Profil</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Keluar</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Ada yang menggunakan dGPU dan mencegah mode Eco. Biarkan G-Helper mencoba memulai ulang dGPU di pengelola perangkat? (Silakan lanjutkan dengan risiko Anda sendiri)</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Jalankan di Startup</value>
</data>
<data name="ScreenPadDown" xml:space="preserve">
<value>Kurangi Kecerahan Screenpad</value>
</data>
<data name="ScreenPadUp" xml:space="preserve">
<value>Tingkatkan Kecerahan Screenpad</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Matikan</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Diam</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>Tidur</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Mengaktifkan dGPU untuk penggunaan standar</value>
</data>
<data name="StandardMode" xml:space="preserve">
<value>Standar</value>
</data>
<data name="Start" xml:space="preserve">
<value>Mulai</value>
</data>
<data name="StartingServices" xml:space="preserve">
<value>Memulai Services</value>
</data>
<data name="StartupError" xml:space="preserve">
<value>Startup Error</value>
</data>
<data name="Stop" xml:space="preserve">
<value>Berhenti</value>
</data>
<data name="StopGPUApps" xml:space="preserve">
<value>Hentikan Aplikasi GPU</value>
</data>
<data name="StoppingServices" xml:space="preserve">
<value>Menghentikan Services</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Hidupkan/Matikan Aura</value>
</data>
<data name="ToggleClamshellMode" xml:space="preserve">
<value>Otomatis Hidupkan/Matikan Mode Clamshell</value>
</data>
<data name="ToggleFnLock" xml:space="preserve">
<value>Hidupkan/Matikan Fn-Lock</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Toggle Miniled (jika didukung)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Hidupkan/Matikan Layar</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
</data>
<data name="TurnedOff" xml:space="preserve">
<value>Dimatikan</value>
</data>
<data name="TurnOffOnBattery" xml:space="preserve">
<value>Matikan saat menggunakan baterai</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>Merutekan layar laptop ke dGPU, memaksimalkan FPS</value>
</data>
<data name="UltimateMode" xml:space="preserve">
<value>Ultimate</value>
</data>
<data name="UndervoltingRisky" xml:space="preserve">
<value>Undervolting adalah fitur eksperimental dan berisiko. Jika nilai yang diterapkan terlalu rendah untuk perangkat keras Anda, ini dapat menjadi tidak stabil, mati mendadak, atau menyebabkan kerusakan data. Jika Anda ingin mencobanya, mulailah dengan nilai kecil terlebih dahulu, klik Terapkan, dan uji apa yang cocok untuk Anda.</value>
</data>
<data name="Updates" xml:space="preserve">
<value>Pembaruan</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Versi</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Volume Turun</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Volume Bisu</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Volume Naik</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Jaga agar jendela aplikasi selalu di atas</value>
</data>
</root>

View File

@@ -253,7 +253,7 @@
<value>Sveikata</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Vienkartinė įkrova iki 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS ir tvarkyklių naujinimai</value>

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>Aceleração</value>
</data>
<data name="ACPIError" xml:space="preserve">
<value>Não foi possível conectar ao ASUS ACPI. O aplicativo não pode funcionar sem isso. Tente instalar Asus System Controle Interface</value>
@@ -151,7 +151,7 @@
<value>G-Helper já está em execução. Verifique a barra de sistema</value>
</data>
<data name="Apply" xml:space="preserve">
<value>Apply</value>
<value>Aplicar</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Aplicar a curva personalizada</value>
@@ -172,7 +172,7 @@
<value>Repiração</value>
</data>
<data name="AuraClockwise" xml:space="preserve">
<value>Clockwise</value>
<value>Sentido horário</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Ciclo de cores</value>
@@ -181,7 +181,7 @@
<value>Comet</value>
</data>
<data name="AuraCounterClockwise" xml:space="preserve">
<value>Counterclockwise</value>
<value>Sentido anti-horário</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Rápido</value>
@@ -196,7 +196,7 @@
<value>Arco-íris</value>
</data>
<data name="AuraRandomColor" xml:space="preserve">
<value>Random</value>
<value>Aleatório</value>
</data>
<data name="AuraReact" xml:space="preserve">
<value>React</value>
@@ -211,7 +211,7 @@
<value>Estroboscópio</value>
</data>
<data name="AuraZoneAll" xml:space="preserve">
<value>All</value>
<value>Tudo</value>
</data>
<data name="AuraZoneDock" xml:space="preserve">
<value>Dock</value>
@@ -226,7 +226,7 @@
<value>Underglow</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Auto Apply</value>
<value>Aplicar automaticamente</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Automático</value>
@@ -250,7 +250,7 @@
<value>Limite de carga</value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
<value>Saúde da bateria</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
@@ -262,7 +262,7 @@
<value>Ao ligar</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
<value>Som de inicialização</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Nível do brilho</value>
@@ -289,7 +289,7 @@
<value>Personalizado</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
<value>Desaceleração</value>
</data>
<data name="Default" xml:space="preserve">
<value>Padrão</value>
@@ -301,7 +301,7 @@
<value>Descarregando</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>Baixar</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Drivers and Software</value>

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>Не вдається під'єднатися до ASUS ACPI. Програма не може працювати без нього. Спробуйте встановити Asus System Control Interface</value>
@@ -253,7 +253,7 @@
<value>Стан батареї</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Одноразовий заряд до 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Оновлення BIOS та драйверів</value>
@@ -262,7 +262,7 @@
<value>Старт</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
<value>Звук завантаження</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Яскравість</value>
@@ -274,7 +274,7 @@
<value>Підвищити яскравість</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
<value>Калібрування</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Зарядка</value>
@@ -289,7 +289,7 @@
<value>Своє</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
<value>Уповільнення</value>
</data>
<data name="Default" xml:space="preserve">
<value>За замовчуванням</value>

View File

@@ -319,7 +319,7 @@ namespace GHelper
sliderBattery.Max = 100;
sliderBattery.Min = 40;
sliderBattery.Name = "sliderBattery";
sliderBattery.Size = new Size(716, 40);
sliderBattery.Size = new Size(706, 40);
sliderBattery.Step = 5;
sliderBattery.TabIndex = 20;
sliderBattery.Text = "sliderBattery";

View File

@@ -10,6 +10,7 @@ using GHelper.Mode;
using GHelper.Peripherals;
using GHelper.Peripherals.Mouse;
using GHelper.UI;
using GHelper.USB;
using System.Diagnostics;
using System.Timers;
@@ -324,7 +325,7 @@ namespace GHelper
{
case 0:
Logger.WriteLine("Monitor Power Off");
AsusUSB.ApplyBrightness(0);
Aura.ApplyBrightness(0);
break;
case 1:
Logger.WriteLine("Monitor Power On");
@@ -698,16 +699,16 @@ namespace GHelper
public void InitAura()
{
AsusUSB.Mode = AppConfig.Get("aura_mode");
AsusUSB.Speed = AppConfig.Get("aura_speed");
AsusUSB.SetColor(AppConfig.Get("aura_color"));
AsusUSB.SetColor2(AppConfig.Get("aura_color2"));
Aura.Mode = (AuraMode)AppConfig.Get("aura_mode");
Aura.Speed = (AuraSpeed)AppConfig.Get("aura_speed");
Aura.SetColor(AppConfig.Get("aura_color"));
Aura.SetColor2(AppConfig.Get("aura_color2"));
comboKeyboard.DropDownStyle = ComboBoxStyle.DropDownList;
comboKeyboard.DataSource = new BindingSource(AsusUSB.GetModes(), null);
comboKeyboard.DataSource = new BindingSource(Aura.GetModes(), null);
comboKeyboard.DisplayMember = "Value";
comboKeyboard.ValueMember = "Key";
comboKeyboard.SelectedValue = AsusUSB.Mode;
comboKeyboard.SelectedValue = Aura.Mode;
comboKeyboard.SelectedValueChanged += ComboKeyboard_SelectedValueChanged;
@@ -729,7 +730,7 @@ namespace GHelper
{
Task.Run(() =>
{
AsusUSB.ApplyAura();
Aura.ApplyAura();
VisualiseAura();
});
}
@@ -738,9 +739,9 @@ namespace GHelper
{
Invoke(delegate
{
pictureColor.BackColor = AsusUSB.Color1;
pictureColor2.BackColor = AsusUSB.Color2;
pictureColor2.Visible = AsusUSB.HasSecondColor();
pictureColor.BackColor = Aura.Color1;
pictureColor2.BackColor = Aura.Color2;
pictureColor2.Visible = Aura.HasSecondColor();
});
}
@@ -884,8 +885,8 @@ namespace GHelper
/// <returns>Focus state</returns>
public bool HasAnyFocus(bool lostFocusCheck = false)
{
return (fansForm != null && fansForm.ContainsFocus) ||
(extraForm != null && extraForm.ContainsFocus) ||
return (fansForm != null && fansForm.ContainsFocus) ||
(extraForm != null && extraForm.ContainsFocus) ||
(updatesForm != null && updatesForm.ContainsFocus) ||
(matrixForm != null && matrixForm.ContainsFocus) ||
this.ContainsFocus ||
@@ -1044,14 +1045,14 @@ namespace GHelper
if (!AppConfig.Is("skip_aura"))
{
AsusUSB.ApplyAuraPower();
AsusUSB.ApplyAura();
Aura.ApplyPower();
Aura.ApplyAura();
}
InputDispatcher.SetBacklightAuto(true);
if (Program.acpi.IsXGConnected())
AsusUSB.ApplyXGMLight(AppConfig.Is("xmg_light"));
XGM.Light(AppConfig.Is("xmg_light"));
if (AppConfig.HasTabletMode()) InputDispatcher.TabletMode();

96
app/USB/AsusHid.cs Normal file
View File

@@ -0,0 +1,96 @@
using HidSharp;
using HidSharp.Reports;
using System.Diagnostics;
namespace GHelper.USB;
public static class AsusHid
{
public const int ASUS_ID = 0x0b05;
public const byte INPUT_ID = 0x5a;
public const byte AURA_ID = 0x5d;
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6, 0x1abe };
static HidStream auraStream;
public static HidStream FindHidStream(byte reportId, int minFeatureLength = 1)
{
HidDeviceLoader loader = new HidDeviceLoader();
var deviceList = loader.GetDevices(ASUS_ID).Where(device => deviceIds.Contains(device.ProductID));
foreach (var device in deviceList) if (device.CanOpen)
{
try
{
var config = new OpenConfiguration();
config.SetOption(OpenOption.Interruptible, false);
config.SetOption(OpenOption.Exclusive, false);
config.SetOption(OpenOption.Priority, 10);
HidStream hidStream = device.Open();
if (device.GetMaxFeatureReportLength() >= minFeatureLength)
{
var reportDescriptor = device.GetReportDescriptor();
if (reportDescriptor.TryGetReport(ReportType.Feature, reportId, out _))
{
return hidStream;
}
}
hidStream.Close();
hidStream.Dispose();
}
catch (Exception ex)
{
Debug.WriteLine($"Error accessing HID device: {ex.Message}");
}
}
return null;
}
static void WriteData(HidStream stream, byte[] data, string log = "USB")
{
try
{
stream.Write(data);
Logger.WriteLine($"{log} " + stream.Device.ProductID + ": " + BitConverter.ToString(data));
}
catch (Exception ex)
{
Debug.WriteLine($"Error writing {log} to HID device: {ex.Message} {BitConverter.ToString(data)}");
}
}
public static void Write(byte[] data, byte reportId = AURA_ID, string log = "USB")
{
using (var stream = FindHidStream(reportId))
WriteData(stream, data, log);
}
public static void Write(List<byte[]> dataList, byte reportId = AURA_ID)
{
using (var stream = FindHidStream(reportId))
foreach (var data in dataList)
WriteData(stream, data);
}
public static void WriteAura(byte[] data)
{
if (auraStream == null) auraStream = FindHidStream(AURA_ID);
if (auraStream == null) return;
try
{
auraStream.Write(data);
}
catch (Exception ex)
{
auraStream.Dispose();
Debug.WriteLine($"Error writing data to HID device: {ex.Message}");
}
}
}

475
app/USB/Aura.cs Normal file
View File

@@ -0,0 +1,475 @@
using GHelper.Gpu;
using GHelper.Helpers;
using System.Text;
namespace GHelper.USB
{
public class AuraPower
{
public bool BootLogo;
public bool BootKeyb;
public bool AwakeLogo;
public bool AwakeKeyb;
public bool SleepLogo;
public bool SleepKeyb;
public bool ShutdownLogo;
public bool ShutdownKeyb;
public bool BootBar;
public bool AwakeBar;
public bool SleepBar;
public bool ShutdownBar;
public bool BootLid;
public bool AwakeLid;
public bool SleepLid;
public bool ShutdownLid;
public bool BootRear;
public bool AwakeRear;
public bool SleepRear;
public bool ShutdownRear;
}
public enum AuraMode : int
{
AuraStatic = 0,
AuraBreathe = 1,
AuraColorCycle = 2,
AuraRainbow = 3,
Star = 4,
Rain = 5,
Highlight = 6,
Laser = 7,
Ripple = 8,
AuraStrobe = 10,
Comet = 11,
Flash = 12,
HEATMAP = 20,
GPUMODE = 21,
}
public enum AuraSpeed : int
{
Slow = 0,
Normal = 1,
Fast = 2,
}
public static class Aura
{
static byte[] MESSAGE_APPLY = { AsusHid.AURA_ID, 0xb4 };
static byte[] MESSAGE_SET = { AsusHid.AURA_ID, 0xb5, 0, 0, 0 };
private static AuraMode mode = AuraMode.AuraStatic;
private static AuraSpeed speed = AuraSpeed.Normal;
public static Color Color1 = Color.White;
public static Color Color2 = Color.Black;
static bool isACPI = AppConfig.IsTUF() || AppConfig.IsVivobook();
static bool isStrix = AppConfig.IsStrix();
static public bool isSingleColor = false;
static bool isOldHeatmap = AppConfig.Is("old_heatmap");
static System.Timers.Timer timer = new System.Timers.Timer(1000);
private static Dictionary<AuraMode, string> _modesSingleColor = new Dictionary<AuraMode, string>
{
{ AuraMode.AuraStatic, Properties.Strings.AuraStatic },
{ AuraMode.AuraBreathe, Properties.Strings.AuraBreathe },
{ AuraMode.AuraStrobe, Properties.Strings.AuraStrobe },
};
private static Dictionary<AuraMode, string> _modes = new Dictionary<AuraMode, string>
{
{ AuraMode.AuraStatic, Properties.Strings.AuraStatic },
{ AuraMode.AuraBreathe, Properties.Strings.AuraBreathe },
{ AuraMode.AuraColorCycle, Properties.Strings.AuraColorCycle },
{ AuraMode.AuraRainbow, Properties.Strings.AuraRainbow },
{ AuraMode.AuraStrobe, Properties.Strings.AuraStrobe },
{ AuraMode.HEATMAP, "Heatmap"},
{ AuraMode.GPUMODE, "GPU Mode" }
};
private static Dictionary<AuraMode, string> _modesStrix = new Dictionary<AuraMode, string>
{
{ AuraMode.AuraStatic, Properties.Strings.AuraStatic },
{ AuraMode.AuraBreathe, Properties.Strings.AuraBreathe },
{ AuraMode.AuraColorCycle, Properties.Strings.AuraColorCycle },
{ AuraMode.AuraRainbow, Properties.Strings.AuraRainbow },
{ AuraMode.Star, "Star" },
{ AuraMode.Rain, "Rain" },
{ AuraMode.Highlight, "Highlight" },
{ AuraMode.Laser, "Laser" },
{ AuraMode.Ripple, "Ripple" },
{ AuraMode.AuraStrobe, Properties.Strings.AuraStrobe},
{ AuraMode.Comet, "Comet" },
{ AuraMode.Flash, "Flash" },
{ AuraMode.HEATMAP, "Heatmap"},
};
static Aura()
{
timer.Elapsed += Timer_Elapsed;
isSingleColor = AppConfig.IsSingleColor(); // Mono Color
if (AppConfig.ContainsModel("GA402X") || AppConfig.ContainsModel("GA402N"))
using (var stream = AsusHid.FindHidStream(AsusHid.AURA_ID))
{
if (stream is null) return;
if (stream.Device.ReleaseNumberBcd == 22 || stream.Device.ReleaseNumberBcd == 23) isSingleColor = true;
stream.Close();
}
}
private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
SetHeatmap();
}
static void SetHeatmap(bool init = false)
{
float cpuTemp = (float)HardwareControl.GetCPUTemp();
int freeze = 20, cold = 40, warm = 65, hot = 90;
Color color;
//Debug.WriteLine(cpuTemp);
if (cpuTemp < cold) color = ColorUtilities.GetWeightedAverage(Color.Blue, Color.Green, ((float)cpuTemp - freeze) / (cold - freeze));
else if (cpuTemp < warm) color = ColorUtilities.GetWeightedAverage(Color.Green, Color.Yellow, ((float)cpuTemp - cold) / (warm - cold));
else if (cpuTemp < hot) color = ColorUtilities.GetWeightedAverage(Color.Yellow, Color.Red, ((float)cpuTemp - warm) / (hot - warm));
else color = Color.Red;
ApplyColor(color, init);
}
public static Dictionary<AuraSpeed, string> GetSpeeds()
{
return new Dictionary<AuraSpeed, string>
{
{ AuraSpeed.Slow, Properties.Strings.AuraSlow },
{ AuraSpeed.Normal, Properties.Strings.AuraNormal },
{ AuraSpeed.Fast, Properties.Strings.AuraFast }
};
}
public static Dictionary<AuraMode, string> GetModes()
{
if (isACPI)
{
_modes.Remove(AuraMode.AuraRainbow);
}
if (isSingleColor)
{
return _modesSingleColor;
}
if (AppConfig.IsAdvantageEdition())
{
return _modes;
}
if (AppConfig.IsStrix() && !AppConfig.IsStrixLimitedRGB())
{
return _modesStrix;
}
return _modes;
}
public static AuraMode Mode
{
get { return mode; }
set
{
mode = GetModes().ContainsKey(value) ? value : AuraMode.AuraStatic;
}
}
public static AuraSpeed Speed
{
get { return speed; }
set
{
speed = GetSpeeds().ContainsKey(value) ? value : AuraSpeed.Normal;
}
}
public static void SetColor(int colorCode)
{
Color1 = Color.FromArgb(colorCode);
}
public static void SetColor2(int colorCode)
{
Color2 = Color.FromArgb(colorCode);
}
public static bool HasSecondColor()
{
return mode == AuraMode.AuraBreathe && !isACPI;
}
public static byte[] AuraMessage(AuraMode mode, Color color, Color color2, int speed, bool mono = false)
{
byte[] msg = new byte[17];
msg[0] = AsusHid.AURA_ID;
msg[1] = 0xb3;
msg[2] = 0x00; // Zone
msg[3] = (byte)mode; // Aura Mode
msg[4] = color.R; // R
msg[5] = mono ? (byte)0 : color.G; // G
msg[6] = mono ? (byte)0 : color.B; // B
msg[7] = (byte)speed; // aura.speed as u8;
msg[8] = 0; // aura.direction as u8;
msg[9] = mode == AuraMode.AuraBreathe ? (byte)1 : (byte)0;
msg[10] = color2.R; // R
msg[11] = mono ? (byte)0 : color2.G; // G
msg[12] = mono ? (byte)0 : color2.B; // B
return msg;
}
public static void Init()
{
Task.Run(async () =>
{
AsusHid.Write(new List<byte[]> {
new byte[] { AsusHid.AURA_ID, 0xb9 },
Encoding.ASCII.GetBytes("]ASUS Tech.Inc."),
new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1a },
Encoding.ASCII.GetBytes("^ASUS Tech.Inc."),
new byte[] { 0x5e, 0x05, 0x20, 0x31, 0, 0x1a }
});
});
}
public static void ApplyBrightness(int brightness, string log = "Backlight", bool delay = false)
{
Task.Run(async () =>
{
if (delay) await Task.Delay(TimeSpan.FromSeconds(1));
if (isACPI) Program.acpi.TUFKeyboardBrightness(brightness);
AsusHid.Write(new byte[] { AsusHid.AURA_ID, 0xba, 0xc5, 0xc4, (byte)brightness }, AsusHid.AURA_ID, log);
if (AppConfig.ContainsModel("GA503"))
AsusHid.Write(new byte[] { AsusHid.INPUT_ID, 0xba, 0xc5, 0xc4, (byte)brightness }, AsusHid.INPUT_ID, log);
});
}
static byte[] AuraPowerMessage(AuraPower flags)
{
byte keyb = 0, bar = 0, lid = 0, rear = 0;
if (flags.BootLogo) keyb |= 1 << 0;
if (flags.BootKeyb) keyb |= 1 << 1;
if (flags.AwakeLogo) keyb |= 1 << 2;
if (flags.AwakeKeyb) keyb |= 1 << 3;
if (flags.SleepLogo) keyb |= 1 << 4;
if (flags.SleepKeyb) keyb |= 1 << 5;
if (flags.ShutdownLogo) keyb |= 1 << 6;
if (flags.ShutdownKeyb) keyb |= 1 << 7;
if (flags.BootBar) bar |= 1 << 1;
if (flags.AwakeBar) bar |= 1 << 2;
if (flags.SleepBar) bar |= 1 << 3;
if (flags.ShutdownBar) bar |= 1 << 4;
if (flags.BootLid) lid |= 1 << 0;
if (flags.AwakeLid) lid |= 1 << 1;
if (flags.SleepLid) lid |= 1 << 2;
if (flags.ShutdownLid) lid |= 1 << 3;
if (flags.BootLid) lid |= 1 << 4;
if (flags.AwakeLid) lid |= 1 << 5;
if (flags.SleepLid) lid |= 1 << 6;
if (flags.ShutdownLid) lid |= 1 << 7;
if (flags.BootRear) rear |= 1 << 0;
if (flags.AwakeRear) rear |= 1 << 1;
if (flags.SleepRear) rear |= 1 << 2;
if (flags.ShutdownRear) rear |= 1 << 3;
if (flags.BootRear) rear |= 1 << 4;
if (flags.AwakeRear) rear |= 1 << 5;
if (flags.SleepRear) rear |= 1 << 6;
if (flags.ShutdownRear) rear |= 1 << 7;
return new byte[] { 0x5d, 0xbd, 0x01, keyb, bar, lid, rear, 0xFF };
}
public static void ApplyPower()
{
AuraPower flags = new();
// Keyboard
flags.AwakeKeyb = AppConfig.IsNotFalse("keyboard_awake");
flags.BootKeyb = AppConfig.IsNotFalse("keyboard_boot");
flags.SleepKeyb = AppConfig.IsNotFalse("keyboard_sleep");
flags.ShutdownKeyb = AppConfig.IsNotFalse("keyboard_shutdown");
// Logo
flags.AwakeLogo = AppConfig.IsNotFalse("keyboard_awake_logo");
flags.BootLogo = AppConfig.IsNotFalse("keyboard_boot_logo");
flags.SleepLogo = AppConfig.IsNotFalse("keyboard_sleep_logo");
flags.ShutdownLogo = AppConfig.IsNotFalse("keyboard_shutdown_logo");
// Lightbar
flags.AwakeBar = AppConfig.IsNotFalse("keyboard_awake_bar");
flags.BootBar = AppConfig.IsNotFalse("keyboard_boot_bar");
flags.SleepBar = AppConfig.IsNotFalse("keyboard_sleep_bar");
flags.ShutdownBar = AppConfig.IsNotFalse("keyboard_shutdown_bar");
// Lid
flags.AwakeLid = AppConfig.IsNotFalse("keyboard_awake_lid");
flags.BootLid = AppConfig.IsNotFalse("keyboard_boot_lid");
flags.SleepLid = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownLid = AppConfig.IsNotFalse("keyboard_shutdown_lid");
// Rear Bar
flags.AwakeRear = AppConfig.IsNotFalse("keyboard_awake_lid");
flags.BootRear = AppConfig.IsNotFalse("keyboard_boot_lid");
flags.SleepRear = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownRear = AppConfig.IsNotFalse("keyboard_shutdown_lid");
AsusHid.Write(AuraPowerMessage(flags));
if (isACPI)
Program.acpi.TUFKeyboardPower(
flags.AwakeKeyb,
flags.BootKeyb,
flags.SleepKeyb,
flags.ShutdownKeyb);
}
public static void ApplyColor(Color color, bool init = false)
{
if (isACPI)
{
Program.acpi.TUFKeyboardRGB(0, color, 0, null);
return;
}
if (isStrix && !isOldHeatmap)
{
byte[] msg = new byte[0x40];
byte start = 9;
byte maxLeds = 0x93;
msg[0] = AsusHid.AURA_ID;
msg[1] = 0xbc;
msg[2] = 0;
msg[3] = 1;
msg[4] = 1;
msg[5] = 1;
msg[6] = 0;
msg[7] = 0x10;
for (byte i = 0; i < 0x12; i++)
{
msg[start + i * 3] = color.R; // R
msg[start + 1 + i * 3] = color.G; // G
msg[start + 2 + i * 3] = color.B; // B
}
if (init)
{
Init();
AsusHid.WriteAura(new byte[] { AsusHid.AURA_ID, 0xbc });
}
for (byte b = 0; b < maxLeds; b += 0x10)
{
msg[6] = b;
AsusHid.WriteAura(msg);
}
msg[6] = maxLeds;
AsusHid.WriteAura(msg);
msg[4] = 4;
msg[5] = 0;
msg[6] = 0;
msg[7] = 0;
AsusHid.WriteAura(msg);
}
else
{
AsusHid.WriteAura(AuraMessage(0, color, color, 0));
AsusHid.WriteAura(MESSAGE_SET);
}
}
public static void ApplyGPUColor()
{
if ((AuraMode)AppConfig.Get("aura_mode") != AuraMode.GPUMODE) return;
switch (GPUModeControl.gpuMode)
{
case AsusACPI.GPUModeUltimate:
ApplyColor(Color.Red, true);
break;
case AsusACPI.GPUModeEco:
ApplyColor(Color.Green, true);
break;
default:
ApplyColor(Color.Yellow, true);
break;
}
}
public static void ApplyAura()
{
Mode = (AuraMode)AppConfig.Get("aura_mode");
Speed = (AuraSpeed)AppConfig.Get("aura_speed");
SetColor(AppConfig.Get("aura_color"));
SetColor2(AppConfig.Get("aura_color2"));
timer.Enabled = false;
if (Mode == AuraMode.HEATMAP)
{
SetHeatmap(true);
timer.Enabled = true;
return;
}
if (Mode == AuraMode.GPUMODE)
{
ApplyGPUColor();
return;
}
int _speed = (Speed == AuraSpeed.Normal) ? 0xeb : (Speed == AuraSpeed.Fast) ? 0xf5 : 0xe1;
AsusHid.Write(new List<byte[]> { AuraMessage(Mode, Color1, Color2, _speed, isSingleColor), MESSAGE_APPLY, MESSAGE_SET });
if (isACPI)
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);
}
}
}

65
app/USB/XGM.cs Normal file
View File

@@ -0,0 +1,65 @@
// Reference : thanks to https://github.com/RomanYazvinsky/ for initial discovery of XGM payloads
using HidSharp;
using System.Diagnostics;
using System.Text;
namespace GHelper.USB
{
public static class XGM
{
const int XGM_ID = 0x1970;
public const int ASUS_ID = 0x0b05;
public static void Write(byte[] data)
{
HidDeviceLoader loader = new HidDeviceLoader();
HidDevice device = loader.GetDevices(ASUS_ID, XGM_ID).Where(device => device.GetMaxFeatureReportLength() >= 300).FirstOrDefault();
if (device is null) return;
try
{
using (HidStream hidStream = device.Open())
{
var payload = new byte[300];
Array.Copy(data, payload, data.Length);
hidStream.Write(payload);
Logger.WriteLine("XGM " + device.ProductID + "|" + device.GetMaxFeatureReportLength() + ":" + BitConverter.ToString(data));
hidStream.Close();
}
}
catch (Exception ex)
{
Debug.WriteLine($"Error accessing HID device: {ex.Message}");
}
}
public static void Init()
{
Write(Encoding.ASCII.GetBytes("^ASUS Tech.Inc."));
}
public static void Light(bool status)
{
Write(new byte[] { 0x5e, 0xc5, status ? (byte)0x50 : (byte)0 });
}
public static void Reset()
{
Write(new byte[] { 0x5e, 0xd1, 0x02 });
}
public static void SetFan(byte[] curve)
{
if (AsusACPI.IsInvalidCurve(curve)) return;
byte[] msg = new byte[19];
Array.Copy(new byte[] { 0x5e, 0xd1, 0x01 }, msg, 3);
Array.Copy(curve, 0, msg, 3, curve.Length);
Write(msg);
}
}
}

View File

@@ -74,6 +74,21 @@ Each BIOS mode is paired with matching Windows Power Mode. You can adjust this s
![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)
### :mouse: Asus Mouse and other peripherals support
[Currently supported models](https://github.com/seerge/g-helper/discussions/900)
- ROG Harpe Ace Aim Lab Edition
- ROG Keris Wireless
- ROG Chakram X (P708)
- ROG Strix III Gladius III Aimpoint Wireless (P711)
- ROG Gladius III
- ROG Gladius III Wireless
- ROG Strix Impact II Wireless
- TUF Gaming M4 Wireless (P306)
- TUF Gaming M3
Huge thanks to [@IceStormNG](https://github.com/IceStormNG) 👑 for contribution and research (!).
## :question: FAQ
#### How do I stop the Armoury Crate install popup appearing every time I press the M4 / Rog key?
@@ -298,7 +313,7 @@ If you don't want this bindings to work you can add
### Toggle Performance Mode or Toggle App Window key binding
To change binding for Toggle Performance Modes to ``Ctrl + Shift + KEY``
To change binding for Toggle Performance Modes forward / backward to ``Ctrl + Shift + KEY`` / ``Ctrl + Shift + Alt + KEY``
```
"keybind_profile": 116,
```