mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
Compare commits
31 Commits
hidsharp-m
...
v0.134
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e096699909 | ||
|
|
bf1ffddf15 | ||
|
|
fad7396c8f | ||
|
|
af4a5e8af7 | ||
|
|
3d2be97cf6 | ||
|
|
b6fe7c9ddf | ||
|
|
f2085b836b | ||
|
|
ccf2ae9eed | ||
|
|
e4bcc8f66c | ||
|
|
0f11ffe8f0 | ||
|
|
96cbcbaf7f | ||
|
|
0c1ababcf8 | ||
|
|
36eae610e8 | ||
|
|
69757ff460 | ||
|
|
744bce1819 | ||
|
|
fac145811e | ||
|
|
7eb6884aa4 | ||
|
|
f8df547afb | ||
|
|
6737af2da4 | ||
|
|
d859c56e27 | ||
|
|
0f56883c37 | ||
|
|
229255fbff | ||
|
|
786bb4eadf | ||
|
|
42847de055 | ||
|
|
6787d38678 | ||
|
|
8c0a0a2c92 | ||
|
|
8eaafcacb7 | ||
|
|
940993e1d5 | ||
|
|
5c4500315c | ||
|
|
dd52f8039c | ||
|
|
9f56aa9d3d |
@@ -355,7 +355,7 @@ public static class AppConfig
|
||||
|
||||
public static bool IsStrixLimitedRGB()
|
||||
{
|
||||
return ContainsModel("G614JV") || ContainsModel("G614JZ") || ContainsModel("G512LI");
|
||||
return ContainsModel("G614JV") || ContainsModel("G614JZ") || ContainsModel("G512LI") || ContainsModel("G513RS") || ContainsModel("G513RM") || ContainsModel("G713PV");
|
||||
}
|
||||
|
||||
public static bool IsZ13()
|
||||
@@ -441,4 +441,9 @@ public static class AppConfig
|
||||
return ContainsModel("GV301RA") || ContainsModel("GV302XA") || IsAlly();
|
||||
}
|
||||
|
||||
public static bool IsHardwareTouchpadToggle()
|
||||
{
|
||||
return ContainsModel("FA507");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
681
app/AsusUSB.cs
681
app/AsusUSB.cs
@@ -1,681 +0,0 @@
|
||||
using GHelper.Gpu;
|
||||
using GHelper.Helpers;
|
||||
using System.Text;
|
||||
using HidLibrary;
|
||||
|
||||
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);
|
||||
if (reportID == INPUT_HID_ID && device.Attributes.ProductId == 0x1a30) return input;
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
13
app/Extra.cs
13
app/Extra.cs
@@ -4,6 +4,7 @@ using GHelper.Helpers;
|
||||
using GHelper.Input;
|
||||
using GHelper.Mode;
|
||||
using GHelper.UI;
|
||||
using GHelper.USB;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace GHelper
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
|
||||
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||
<AssemblyVersion>0.130</AssemblyVersion>
|
||||
<AssemblyVersion>0.133</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" />
|
||||
|
||||
@@ -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.CustomRGB.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();
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
namespace GHelper.Helpers
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace GHelper.Helpers
|
||||
{
|
||||
public class ColorUtilities
|
||||
public class ColorUtils
|
||||
{
|
||||
// Method to get the weighted average between two colors
|
||||
public static Color GetWeightedAverage(Color color1, Color color2, float weight)
|
||||
@@ -16,6 +18,144 @@
|
||||
|
||||
return Color.FromArgb(red, green, blue);
|
||||
}
|
||||
|
||||
public static Color GetMidColor(Color color1, Color color2)
|
||||
{
|
||||
return Color.FromArgb((color1.R + color2.R) / 2,
|
||||
(color1.G + color2.G) / 2,
|
||||
(color1.B + color2.B) / 2);
|
||||
}
|
||||
|
||||
public class HSV
|
||||
{
|
||||
public double Hue { get; set; }
|
||||
public double Saturation { get; set; }
|
||||
public double Value { get; set; }
|
||||
|
||||
public Color ToRGB()
|
||||
{
|
||||
var hue = Hue * 6;
|
||||
var saturation = Saturation;
|
||||
var value = Value;
|
||||
|
||||
double red;
|
||||
double green;
|
||||
double blue;
|
||||
|
||||
if (saturation == 0)
|
||||
{
|
||||
red = green = blue = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
var i = Convert.ToInt32(Math.Floor(hue));
|
||||
var f = hue - i;
|
||||
var p = value * (1 - saturation);
|
||||
var q = value * (1 - saturation * f);
|
||||
var t = value * (1 - saturation * (1 - f));
|
||||
int mod = i % 6;
|
||||
|
||||
red = new[] { value, q, p, p, t, value }[mod];
|
||||
green = new[] { t, value, value, q, p, p }[mod];
|
||||
blue = new[] { p, p, t, value, value, q }[mod];
|
||||
}
|
||||
|
||||
return Color.FromArgb(Convert.ToInt32(red * 255), Convert.ToInt32(green * 255), Convert.ToInt32(blue * 255));
|
||||
}
|
||||
|
||||
public static HSV ToHSV(Color rgb)
|
||||
{
|
||||
double red = rgb.R / 255.0;
|
||||
double green = rgb.G / 255.0;
|
||||
double blue = rgb.B / 255.0;
|
||||
var min = Math.Min(red, Math.Min(green, blue));
|
||||
var max = Math.Max(red, Math.Max(green, blue));
|
||||
var delta = max - min;
|
||||
double hue;
|
||||
double saturation = 0;
|
||||
var value = max;
|
||||
|
||||
if (max != 0)
|
||||
saturation = delta / max;
|
||||
|
||||
if (delta == 0)
|
||||
hue = 0;
|
||||
else
|
||||
{
|
||||
if (red == max)
|
||||
hue = (green - blue) / delta + (green < blue ? 6 : 0);
|
||||
else if (green == max)
|
||||
hue = 2 + (blue - red) / delta;
|
||||
else
|
||||
hue = 4 + (red - green) / delta;
|
||||
|
||||
hue /= 6;
|
||||
}
|
||||
|
||||
return new HSV { Hue = hue, Saturation = saturation, Value = value };
|
||||
}
|
||||
|
||||
public static Color UpSaturation(Color rgb, float increse = 0.2f) //make color more colored
|
||||
{
|
||||
if (rgb.R == rgb.G && rgb.G == rgb.B)
|
||||
return rgb;
|
||||
var hsv_color = ToHSV(rgb);
|
||||
hsv_color.Saturation = Math.Min(hsv_color.Saturation + increse, 1.00f);
|
||||
return hsv_color.ToRGB();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class SmoothColor
|
||||
{
|
||||
public Color RGB
|
||||
{
|
||||
get { return Interpolate(); }
|
||||
set { clr = value; }
|
||||
}
|
||||
|
||||
Color Interpolate()
|
||||
{
|
||||
clr_ = ColorInterpolator.InterpolateBetween(clr, clr_, smooth);
|
||||
return clr_;
|
||||
}
|
||||
|
||||
private float smooth = 0.65f; //smooth
|
||||
private Color clr = new Color();
|
||||
private Color clr_ = new Color();
|
||||
|
||||
static class ColorInterpolator
|
||||
{
|
||||
delegate byte ComponentSelector(Color color);
|
||||
static ComponentSelector _redSelector = color => color.R;
|
||||
static ComponentSelector _greenSelector = color => color.G;
|
||||
static ComponentSelector _blueSelector = color => color.B;
|
||||
|
||||
public static Color InterpolateBetween(Color endPoint1, Color endPoint2, double lambda)
|
||||
{
|
||||
if (lambda < 0 || lambda > 1)
|
||||
throw new ArgumentOutOfRangeException("lambda");
|
||||
|
||||
if (endPoint1 != endPoint2)
|
||||
{
|
||||
return Color.FromArgb(
|
||||
InterpolateComponent(endPoint1, endPoint2, lambda, _redSelector),
|
||||
InterpolateComponent(endPoint1, endPoint2, lambda, _greenSelector),
|
||||
InterpolateComponent(endPoint1, endPoint2, lambda, _blueSelector)
|
||||
);
|
||||
}
|
||||
|
||||
return endPoint1;
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
static byte InterpolateComponent(Color end1, Color end2, double lambda, ComponentSelector selector)
|
||||
{
|
||||
return (byte)(selector(end1) + (selector(end2) - selector(end1)) * lambda);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
@@ -83,6 +84,9 @@ namespace GHelper.Input
|
||||
Logger.WriteLine("Optimization service is running");
|
||||
|
||||
InitBacklightTimer();
|
||||
|
||||
if (AppConfig.ContainsModel("VivoBook")) Program.acpi.DeviceSet(AsusACPI.FnLock, AppConfig.Is("fn_lock") ? 1 : 0, "FnLock");
|
||||
|
||||
}
|
||||
|
||||
public void InitBacklightTimer()
|
||||
@@ -190,7 +194,7 @@ namespace GHelper.Input
|
||||
KeyboardHook.KeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1]);
|
||||
break;
|
||||
case 3:
|
||||
KeyboardHook.KeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[3]);
|
||||
KeyboardHook.KeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[2]);
|
||||
break;
|
||||
default:
|
||||
LaunchProcess(command);
|
||||
@@ -302,13 +306,10 @@ namespace GHelper.Input
|
||||
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);
|
||||
break;
|
||||
case Keys.F10:
|
||||
HandleOptimizationEvent(107);
|
||||
ToggleTouchpadEvent(true);
|
||||
break;
|
||||
case Keys.F11:
|
||||
HandleOptimizationEvent(108);
|
||||
break;
|
||||
case Keys.F12:
|
||||
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.A);
|
||||
SleepEvent();
|
||||
break;
|
||||
case Keys.VolumeDown:
|
||||
KeyProcess("m1");
|
||||
@@ -476,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.LWin, Keys.LControlKey, 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()
|
||||
@@ -496,7 +509,7 @@ namespace GHelper.Input
|
||||
AppConfig.Set("fn_lock", fnLock);
|
||||
|
||||
if (AppConfig.ContainsModel("VivoBook"))
|
||||
Program.acpi.DeviceSet(AsusACPI.FnLock, fnLock == 1 ? 0 : 1, "FnLock");
|
||||
Program.acpi.DeviceSet(AsusACPI.FnLock, fnLock == 1 ? 1 : 0, "FnLock");
|
||||
else
|
||||
Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys);
|
||||
|
||||
@@ -619,12 +632,10 @@ namespace GHelper.Input
|
||||
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
|
||||
if (Control.ModifierKeys == Keys.Shift)
|
||||
@@ -654,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)
|
||||
@@ -678,7 +689,7 @@ namespace GHelper.Input
|
||||
|
||||
if (force || !OptimizationService.IsRunning())
|
||||
{
|
||||
AsusUSB.ApplyBrightness(backlight, "HotKey");
|
||||
Aura.ApplyBrightness(backlight, "HotKey");
|
||||
}
|
||||
|
||||
if (!OptimizationService.IsOSDRunning())
|
||||
|
||||
@@ -34,15 +34,20 @@ 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)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
if (sleep > 0)
|
||||
{
|
||||
Thread.Sleep(sleep);
|
||||
}
|
||||
|
||||
keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -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,7 @@ namespace GHelper.Input
|
||||
return;
|
||||
}
|
||||
|
||||
Logger.WriteLine($"Input: {input.DevicePath}");
|
||||
Logger.WriteLine($"Input: {input.Device.DevicePath}");
|
||||
|
||||
var task = Task.Run(() =>
|
||||
{
|
||||
@@ -35,14 +36,16 @@ 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)
|
||||
input.ReadTimeout = int.MaxValue;
|
||||
|
||||
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]);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using GHelper.Gpu.NVidia;
|
||||
using GHelper.Helpers;
|
||||
using GHelper.USB;
|
||||
using Ryzen;
|
||||
|
||||
namespace GHelper.Mode
|
||||
@@ -80,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);
|
||||
@@ -133,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;
|
||||
}
|
||||
|
||||
|
||||
@@ -239,6 +239,7 @@ namespace GHelper.Peripherals
|
||||
timer.Stop();
|
||||
Logger.WriteLine("HID Device Event: Checking for new ASUS Mice");
|
||||
DetectAllAsusMice();
|
||||
if (AppConfig.IsZ13()) Program.inputDispatcher.Init();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ namespace GHelper
|
||||
|
||||
gpuControl.InitXGM();
|
||||
|
||||
SetAutoModes(init : true);
|
||||
SetAutoModes(init: true);
|
||||
|
||||
// Subscribing for system power change events
|
||||
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
|
||||
|
||||
30
app/Properties/Resources.Designer.cs
generated
30
app/Properties/Resources.Designer.cs
generated
@@ -110,6 +110,36 @@ namespace GHelper.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon dot_eco {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("dot_eco", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon dot_standard {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("dot_standard", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
internal static System.Drawing.Icon dot_ultimate {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("dot_ultimate", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
|
||||
@@ -292,4 +292,13 @@
|
||||
<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>
|
||||
<data name="dot_eco" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\dot-eco.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="dot_standard" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\dot-standard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="dot_ultimate" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\dot-ultimate.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
BIN
app/Resources/dot-eco.ico
Normal file
BIN
app/Resources/dot-eco.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
BIN
app/Resources/dot-standard.ico
Normal file
BIN
app/Resources/dot-standard.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
BIN
app/Resources/dot-ultimate.ico
Normal file
BIN
app/Resources/dot-ultimate.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
@@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -1176,11 +1177,13 @@ namespace GHelper
|
||||
buttonOptimized.Activated = GPUAuto;
|
||||
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeEco;
|
||||
Program.trayIcon.Icon = Properties.Resources.eco;
|
||||
Icon = Properties.Resources.dot_eco;
|
||||
break;
|
||||
case AsusACPI.GPUModeUltimate:
|
||||
buttonUltimate.Activated = true;
|
||||
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeUltimate;
|
||||
Program.trayIcon.Icon = Properties.Resources.ultimate;
|
||||
Icon = Properties.Resources.dot_ultimate;
|
||||
break;
|
||||
default:
|
||||
buttonOptimized.BorderColor = colorStandard;
|
||||
@@ -1188,6 +1191,7 @@ namespace GHelper
|
||||
buttonOptimized.Activated = GPUAuto;
|
||||
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeStandard;
|
||||
Program.trayIcon.Icon = Properties.Resources.standard;
|
||||
Icon = Properties.Resources.dot_standard;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
118
app/USB/AsusHid.cs
Normal file
118
app/USB/AsusHid.cs
Normal file
@@ -0,0 +1,118 @@
|
||||
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 IEnumerable<HidDevice>? FindDevices(byte reportId)
|
||||
{
|
||||
HidDeviceLoader loader = new HidDeviceLoader();
|
||||
IEnumerable<HidDevice> deviceList;
|
||||
|
||||
try
|
||||
{
|
||||
deviceList = loader.GetDevices(ASUS_ID).Where(device => deviceIds.Contains(device.ProductID) && device.CanOpen && device.GetMaxFeatureReportLength() > 0);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine($"Error enumerating HID devices: {ex.Message}");
|
||||
yield break;
|
||||
}
|
||||
|
||||
foreach (var device in deviceList)
|
||||
if (device.GetReportDescriptor().TryGetReport(ReportType.Feature, reportId, out _))
|
||||
yield return device;
|
||||
}
|
||||
|
||||
public static HidStream? FindHidStream(byte reportId)
|
||||
{
|
||||
try
|
||||
{
|
||||
return FindDevices(reportId)?.FirstOrDefault()?.Open();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine($"Error accessing HID device: {ex.Message}");
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void WriteInput(byte[] data, string log = "USB")
|
||||
{
|
||||
foreach (var device in FindDevices(INPUT_ID))
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var stream = device.Open())
|
||||
{
|
||||
var payload = new byte[device.GetMaxFeatureReportLength()];
|
||||
Array.Copy(data, payload, data.Length);
|
||||
stream.SetFeature(payload);
|
||||
Logger.WriteLine($"{log} Feature {device.ProductID.ToString("X")}|{device.GetMaxFeatureReportLength()}: {BitConverter.ToString(data)}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine($"Error setting feature {device.GetMaxFeatureReportLength()} {device.DevicePath}: {BitConverter.ToString(data)} {ex.Message}");
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void Write(byte[] data, string log = "USB")
|
||||
{
|
||||
Write(new List<byte[]> { data }, log);
|
||||
}
|
||||
|
||||
public static void Write(List<byte[]> dataList, string log = "USB")
|
||||
{
|
||||
var devices = FindDevices(AURA_ID);
|
||||
if (devices is null) return;
|
||||
|
||||
try
|
||||
{
|
||||
foreach (var device in devices)
|
||||
using (var stream = device.Open())
|
||||
foreach (var data in dataList)
|
||||
{
|
||||
stream.Write(data);
|
||||
Logger.WriteLine($"{log} {device.ProductID.ToString("X")}: {BitConverter.ToString(data)}");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine($"Error writing {log}: {ex.Message} ");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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} {BitConverter.ToString(data)}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
793
app/USB/Aura.cs
Normal file
793
app/USB/Aura.cs
Normal file
@@ -0,0 +1,793 @@
|
||||
using GHelper.Gpu;
|
||||
using GHelper.Helpers;
|
||||
using GHelper.Input;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Runtime.InteropServices;
|
||||
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,
|
||||
AMBIENT = 22,
|
||||
}
|
||||
|
||||
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 };
|
||||
|
||||
static readonly int AURA_ZONES = 8;
|
||||
|
||||
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 bool isStrix4Zone = AppConfig.IsStrixLimitedRGB();
|
||||
|
||||
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" },
|
||||
{ AuraMode.AMBIENT, "Ambient"},
|
||||
};
|
||||
|
||||
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"},
|
||||
{ AuraMode.AMBIENT, "Ambient"},
|
||||
};
|
||||
|
||||
static Aura()
|
||||
{
|
||||
timer.Elapsed += Timer_Elapsed;
|
||||
isSingleColor = AppConfig.IsSingleColor(); // Mono Color
|
||||
|
||||
if (AppConfig.ContainsModel("GA402X") || AppConfig.ContainsModel("GA402N"))
|
||||
{
|
||||
var device = AsusHid.FindDevices(AsusHid.AURA_ID).FirstOrDefault();
|
||||
if (device is null) return;
|
||||
if (device.ReleaseNumberBcd == 22 || device.ReleaseNumberBcd == 23) isSingleColor = true;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
|
||||
{
|
||||
if (!InputDispatcher.backlightActivity)
|
||||
return;
|
||||
|
||||
if (Mode == AuraMode.HEATMAP)
|
||||
{
|
||||
CustomRGB.ApplyHeatmap();
|
||||
}
|
||||
else if (Mode == AuraMode.AMBIENT)
|
||||
{
|
||||
CustomRGB.ApplyAmbient();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
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 }, log);
|
||||
if (AppConfig.ContainsModel("GA503"))
|
||||
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xba, 0xc5, 0xc4, (byte)brightness }, 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);
|
||||
|
||||
}
|
||||
|
||||
static byte[] packetMap = new byte[]
|
||||
{
|
||||
/*00 ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 */
|
||||
21, 23, 24, 25, 26, 28, 29, 30, 31, 33,
|
||||
|
||||
/*10 F10 F11 F12 DEL ` 1 2 3 4 5 */
|
||||
34, 35, 36, 37, 42, 43, 44, 45, 46, 47,
|
||||
|
||||
/*20 6 7 8 9 0 - = BSP BSP BSP */
|
||||
48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
|
||||
|
||||
/*30 PLY TAB Q W E R T Y U I */
|
||||
58, 63, 64, 65, 66, 67, 68, 69, 70, 71,
|
||||
|
||||
/*40 O P [ ] \ STP CAP A S D */
|
||||
72, 73, 74, 75, 76, 79, 84, 85, 86, 87,
|
||||
|
||||
/*50 F G H J K L ; ' ENT PRV */
|
||||
88, 89, 90, 91, 92, 93, 94, 95, 98, 100,
|
||||
|
||||
/*60 LSH Z X C V B N M , . */
|
||||
105, 107, 108, 109, 110, 111, 112, 113, 114, 115,
|
||||
|
||||
/*70 / RSH UP NXT LCTL LFN LWIN LALT SPC RALT */
|
||||
116, 119, 139, 121, 126, 127, 128, 129, 131, 135,
|
||||
|
||||
/*80 RCTL LFT DWN RGT PRT KSTN VDN VUP MICM HPFN */
|
||||
137, 159, 160, 161, 142, 0, 2, 3, 4, 5,
|
||||
|
||||
/*90 ARMC LB1 LB2 LB3 LB4 LB5 LB6 LOGO LIDL LIDR */
|
||||
6, 174, 173, 172, 171, 170, 169, 167, 176, 177,
|
||||
|
||||
};
|
||||
|
||||
|
||||
static byte[] packetZone = new byte[]
|
||||
{
|
||||
/*00 ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 */
|
||||
0, 0, 0, 1, 1, 1, 1, 1, 2, 2,
|
||||
|
||||
/*10 F10 F11 F12 DEL ` 1 2 3 4 5 */
|
||||
2, 3, 3, 3, 0, 0, 0, 0, 1 , 1,
|
||||
|
||||
/*20 6 7 8 9 0 - = BSP BSP BSP */
|
||||
1, 2, 2, 2, 2, 2, 3, 3, 3, 3,
|
||||
|
||||
/*30 PLY TAB Q W E R T Y U I */
|
||||
3, 0, 0, 0, 1, 1, 1, 1, 2, 2,
|
||||
|
||||
/*40 O P [ ] \ STP CAP A S D */
|
||||
2, 2, 3, 3, 3, 3, 0, 0, 0, 1,
|
||||
|
||||
/*50 F G H J K L ; ' ENT PRV */
|
||||
1, 1, 1, 2, 2, 2, 2, 3, 3, 3,
|
||||
|
||||
/*60 LSH Z X C V B N M , . */
|
||||
0, 0, 0, 1, 1, 1, 1, 2, 2, 2,
|
||||
|
||||
/*70 / RSH UP NXT LCTL LFN LWIN LALT SPC RALT */
|
||||
3, 3, 3, 3, 0, 0, 0, 0, 1, 2,
|
||||
|
||||
/*80 RCTL LFT DWN RGT PRT KSTN VDN VUP MICM HPFN */
|
||||
2, 3, 3, 3, 3, 3, 0, 0, 1, 1,
|
||||
|
||||
/*90 ARMC LB1 LB2 LB3 LB4 LB5 LB6 LOGO LIDL LIDR */
|
||||
2, 4, 4, 5, 6, 7, 7, 0, 0, 3,
|
||||
|
||||
};
|
||||
|
||||
static byte[] packet4Zone = new byte[]
|
||||
{
|
||||
/*01 Z1 Z2 Z3 Z4 NA NA KeyZone */
|
||||
0, 1, 2, 3, 0, 0,
|
||||
|
||||
/*02 RR R RM LM L LL LighBar */
|
||||
7, 7, 6, 5, 4, 4,
|
||||
|
||||
};
|
||||
|
||||
|
||||
public static void ApplyDirect(Color[] color, bool init = false)
|
||||
{
|
||||
const byte keySet = 167;
|
||||
const byte ledCount = 178;
|
||||
const ushort mapSize = 3 * ledCount;
|
||||
const byte ledsPerPacket = 16;
|
||||
|
||||
byte[] buffer = new byte[64];
|
||||
byte[] keyBuf = new byte[mapSize];
|
||||
|
||||
buffer[0] = AsusHid.AURA_ID;
|
||||
buffer[1] = 0xbc;
|
||||
buffer[2] = 0;
|
||||
buffer[3] = 1;
|
||||
buffer[4] = 1;
|
||||
buffer[5] = 1;
|
||||
buffer[6] = 0;
|
||||
buffer[7] = 0x10;
|
||||
|
||||
if (init)
|
||||
{
|
||||
Init();
|
||||
AsusHid.WriteAura(new byte[] { AsusHid.AURA_ID, 0xbc });
|
||||
}
|
||||
|
||||
Array.Clear(keyBuf, 0, keyBuf.Length);
|
||||
|
||||
if (!isStrix4Zone) // per key
|
||||
{
|
||||
for (int ledIndex = 0; ledIndex < packetMap.Count(); ledIndex++)
|
||||
{
|
||||
ushort offset = (ushort)(3 * packetMap[ledIndex]);
|
||||
byte zone = packetZone[ledIndex];
|
||||
|
||||
keyBuf[offset] = color[zone].R;
|
||||
keyBuf[offset + 1] = color[zone].G;
|
||||
keyBuf[offset + 2] = color[zone].B;
|
||||
}
|
||||
|
||||
for (int i = 0; i < keySet; i += ledsPerPacket)
|
||||
{
|
||||
byte ledsRemaining = (byte)(keySet - i);
|
||||
|
||||
if (ledsRemaining < ledsPerPacket)
|
||||
{
|
||||
buffer[7] = ledsRemaining;
|
||||
}
|
||||
|
||||
buffer[6] = (byte)i;
|
||||
Buffer.BlockCopy(keyBuf, 3 * i, buffer, 9, 3 * buffer[7]);
|
||||
AsusHid.WriteAura(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
buffer[4] = 0x04;
|
||||
buffer[5] = 0x00;
|
||||
buffer[6] = 0x00;
|
||||
buffer[7] = 0x00;
|
||||
|
||||
if (isStrix4Zone) { // per zone
|
||||
var leds_4_zone = packet4Zone.Count();
|
||||
for (int ledIndex = 0; ledIndex < leds_4_zone; ledIndex++)
|
||||
{
|
||||
byte zone = packet4Zone[ledIndex];
|
||||
keyBuf[ledIndex * 3] = color[zone].R;
|
||||
keyBuf[ledIndex * 3 + 1] = color[zone].G;
|
||||
keyBuf[ledIndex * 3 + 2] = color[zone].B;
|
||||
}
|
||||
Buffer.BlockCopy(keyBuf, 0, buffer, 9, 3 * leds_4_zone);
|
||||
AsusHid.WriteAura(buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
Buffer.BlockCopy(keyBuf, 3 * keySet, buffer, 9, 3 * (ledCount - keySet));
|
||||
AsusHid.WriteAura(buffer);
|
||||
}
|
||||
|
||||
|
||||
public static void ApplyColor(Color color, bool init = false)
|
||||
{
|
||||
|
||||
if (isACPI)
|
||||
{
|
||||
Program.acpi.TUFKeyboardRGB(0, color, 0, null);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isStrix && !isOldHeatmap)
|
||||
{
|
||||
ApplyDirect(Enumerable.Repeat(color, AURA_ZONES).ToArray(), init);
|
||||
return;
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
AsusHid.WriteAura(AuraMessage(0, color, color, 0));
|
||||
AsusHid.WriteAura(MESSAGE_SET);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
CustomRGB.ApplyHeatmap(true);
|
||||
timer.Enabled = true;
|
||||
timer.Interval = 2000;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Mode == AuraMode.AMBIENT)
|
||||
{
|
||||
CustomRGB.ApplyAmbient(true);
|
||||
timer.Enabled = true;
|
||||
timer.Interval = 100;
|
||||
return;
|
||||
}
|
||||
|
||||
if (Mode == AuraMode.GPUMODE)
|
||||
{
|
||||
CustomRGB.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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static class CustomRGB
|
||||
{
|
||||
|
||||
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 ApplyHeatmap(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 = ColorUtils.GetWeightedAverage(Color.Blue, Color.Green, ((float)cpuTemp - freeze) / (cold - freeze));
|
||||
else if (cpuTemp < warm) color = ColorUtils.GetWeightedAverage(Color.Green, Color.Yellow, ((float)cpuTemp - cold) / (warm - cold));
|
||||
else if (cpuTemp < hot) color = ColorUtils.GetWeightedAverage(Color.Yellow, Color.Red, ((float)cpuTemp - warm) / (hot - warm));
|
||||
else color = Color.Red;
|
||||
|
||||
ApplyColor(color, init);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void ApplyAmbient(bool init = false)
|
||||
{
|
||||
var bound = Screen.GetBounds(Point.Empty);
|
||||
bound.Y += bound.Height / 3;
|
||||
bound.Height -= (int)Math.Round(bound.Height * (0.33f + 0.022f)); // cut 1/3 of the top screen + windows panel
|
||||
|
||||
Bitmap screen_low;
|
||||
Bitmap screeb_pxl;
|
||||
|
||||
int zones = AURA_ZONES;
|
||||
|
||||
if (isStrix) // laptop with lightbar
|
||||
{
|
||||
screen_low = AmbientData.CamptureScreen(bound, 512, 288); //quality decreases greatly if it is less 512
|
||||
screeb_pxl = AmbientData.ResizeImage(screen_low, 4, 2); // 4x2 zone. top for keyboard and bot for lightbar
|
||||
var mid_left = ColorUtils.GetMidColor(screeb_pxl.GetPixel(0, 1), screeb_pxl.GetPixel(1, 1));
|
||||
var mid_right = ColorUtils.GetMidColor(screeb_pxl.GetPixel(2, 1), screeb_pxl.GetPixel(3, 1));
|
||||
|
||||
AmbientData.Colors[4].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(1, 1)); // left bck
|
||||
AmbientData.Colors[5].RGB = ColorUtils.HSV.UpSaturation(mid_left); // center left
|
||||
AmbientData.Colors[6].RGB = ColorUtils.HSV.UpSaturation(mid_right); // center right
|
||||
AmbientData.Colors[7].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(3, 1)); // right bck
|
||||
|
||||
for (int i = 0; i < 4; i++) // keyboard
|
||||
AmbientData.Colors[i].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(i, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
zones = 1;
|
||||
screen_low = AmbientData.CamptureScreen(bound, 256, 144);
|
||||
screeb_pxl = AmbientData.ResizeImage(screen_low, 1, 1);
|
||||
AmbientData.Colors[0].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(0, 0), (float)0.3);
|
||||
}
|
||||
|
||||
|
||||
//screeb_pxl.Save("test.jpg", ImageFormat.Jpeg);
|
||||
screen_low.Dispose();
|
||||
screeb_pxl.Dispose();
|
||||
|
||||
bool is_fresh = false;
|
||||
|
||||
for (int i = 0; i < zones; i++)
|
||||
{
|
||||
if (AmbientData.result[i].ToArgb() != AmbientData.Colors[i].RGB.ToArgb()) is_fresh = true;
|
||||
AmbientData.result[i] = AmbientData.Colors[i].RGB;
|
||||
}
|
||||
|
||||
if (is_fresh)
|
||||
{
|
||||
if (isStrix) ApplyDirect(AmbientData.result, init);
|
||||
else ApplyColor(AmbientData.result[0], init);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static class AmbientData
|
||||
{
|
||||
|
||||
public enum StretchMode
|
||||
{
|
||||
STRETCH_ANDSCANS = 1,
|
||||
STRETCH_ORSCANS = 2,
|
||||
STRETCH_DELETESCANS = 3,
|
||||
STRETCH_HALFTONE = 4,
|
||||
}
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr GetDesktopWindow();
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr GetWindowDC(IntPtr hWnd);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern IntPtr CreateCompatibleDC(IntPtr hDC);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern bool DeleteDC(IntPtr hdc);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern bool DeleteObject(IntPtr hObject);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,
|
||||
int nWidthDest, int nHeightDest,
|
||||
IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, Int32 dwRop);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
static extern bool SetStretchBltMode(IntPtr hdc, StretchMode iStretchMode);
|
||||
|
||||
/// <summary>
|
||||
/// Captures a screenshot.
|
||||
/// </summary>
|
||||
public static Bitmap CamptureScreen(Rectangle rec, int out_w, int out_h)
|
||||
{
|
||||
IntPtr desktop = GetDesktopWindow();
|
||||
IntPtr hdc = GetWindowDC(desktop);
|
||||
IntPtr hdcMem = CreateCompatibleDC(hdc);
|
||||
|
||||
IntPtr hBitmap = CreateCompatibleBitmap(hdc, out_w, out_h);
|
||||
IntPtr hOld = SelectObject(hdcMem, hBitmap);
|
||||
SetStretchBltMode(hdcMem, StretchMode.STRETCH_DELETESCANS);
|
||||
StretchBlt(hdcMem, 0, 0, out_w, out_h, hdc, rec.X, rec.Y, rec.Width, rec.Height, 0x00CC0020);
|
||||
SelectObject(hdcMem, hOld);
|
||||
|
||||
DeleteDC(hdcMem);
|
||||
ReleaseDC(desktop, hdc);
|
||||
var result = Image.FromHbitmap(hBitmap, IntPtr.Zero);
|
||||
DeleteObject(hBitmap);
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Bitmap ResizeImage(Image image, int width, int height)
|
||||
{
|
||||
var destRect = new Rectangle(0, 0, width, height);
|
||||
var destImage = new Bitmap(width, height);
|
||||
|
||||
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
|
||||
|
||||
using (var graphics = Graphics.FromImage(destImage))
|
||||
{
|
||||
graphics.CompositingMode = CompositingMode.SourceCopy;
|
||||
graphics.CompositingQuality = CompositingQuality.HighQuality;
|
||||
graphics.InterpolationMode = InterpolationMode.Bicubic;
|
||||
graphics.SmoothingMode = SmoothingMode.None;
|
||||
graphics.PixelOffsetMode = PixelOffsetMode.None;
|
||||
|
||||
using (var wrapMode = new ImageAttributes())
|
||||
{
|
||||
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
|
||||
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
|
||||
}
|
||||
}
|
||||
|
||||
return destImage;
|
||||
}
|
||||
|
||||
static public Color[] result = new Color[AURA_ZONES];
|
||||
static public ColorUtils.SmoothColor[] Colors = Enumerable.Repeat(0, AURA_ZONES).
|
||||
Select(h => new ColorUtils.SmoothColor()).ToArray();
|
||||
|
||||
public static Color GetMostUsedColor(Bitmap bitMap)
|
||||
{
|
||||
var colorIncidence = new Dictionary<int, int>();
|
||||
for (var x = 0; x < bitMap.Size.Width; x++)
|
||||
for (var y = 0; y < bitMap.Size.Height; y++)
|
||||
{
|
||||
var pixelColor = bitMap.GetPixel(x, y).ToArgb();
|
||||
if (colorIncidence.Keys.Contains(pixelColor))
|
||||
colorIncidence[pixelColor]++;
|
||||
else
|
||||
colorIncidence.Add(pixelColor, 1);
|
||||
}
|
||||
return Color.FromArgb(colorIncidence.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value).First().Key);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
71
app/USB/XGM.cs
Normal file
71
app/USB/XGM.cs
Normal file
@@ -0,0 +1,71 @@
|
||||
// Reference : thanks to https://github.com/RomanYazvinsky/ for initial discovery of XGM payloads
|
||||
|
||||
using HidSharp;
|
||||
using System.Text;
|
||||
|
||||
namespace GHelper.USB
|
||||
{
|
||||
public static class XGM
|
||||
{
|
||||
const int XGM_ID = 0x1970;
|
||||
const int ASUS_ID = 0x0b05;
|
||||
|
||||
public static void Write(byte[] data)
|
||||
{
|
||||
HidDeviceLoader loader = new HidDeviceLoader();
|
||||
try
|
||||
{
|
||||
HidDevice device = loader.GetDevices(ASUS_ID, XGM_ID).Where(device => device.CanOpen && device.GetMaxFeatureReportLength() >= 300).FirstOrDefault();
|
||||
|
||||
if (device is null)
|
||||
{
|
||||
Logger.WriteLine("XGM SUB device not found");
|
||||
return;
|
||||
}
|
||||
|
||||
using (HidStream hidStream = device.Open())
|
||||
{
|
||||
var payload = new byte[300];
|
||||
Array.Copy(data, payload, data.Length);
|
||||
|
||||
hidStream.SetFeature(payload);
|
||||
Logger.WriteLine("XGM-" + device.ProductID + "|" + device.GetMaxFeatureReportLength() + ":" + BitConverter.ToString(data));
|
||||
|
||||
hidStream.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine($"Error accessing XGM device: {ex}");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -108,7 +108,9 @@ Ultimate mode is supported (by hardware) only on 2022+ models
|
||||
You don't have to, it's purely optional. From my experience built in (in BIOS) performance modes work well. Limit your power or apply custom fan curves only if you have issues. As soon as you click Apply in the ``Fans + Power`` section BIOS will consider your fan curve as "custom"! (no matter if you modified it or not)
|
||||
|
||||
#### How does G-helper control my fan speeds?
|
||||
**It doesn't.** Your BIOS does (same as in case with Armoury). What G-helper can do - is (optionally) set a custom fan profile to current performance mode consisting of 8 pairs of temperature + fan speed % via same endpoint armoury seem to use.
|
||||
**It doesn't.** Your firmware / BIOS controls them in real-time. Armoury also doesn't control fans in real time anyhow.
|
||||
|
||||
What G-helper can do - is (optionally) set a custom fan profile to the current performance mode consisting of 8 pairs of temperature + fan speed % via the same endpoint Armoury seems to use. How it will be interpreted - is still up to the firmware.
|
||||
|
||||
#### How do I change fan % to fan RPM?
|
||||
Click on them
|
||||
@@ -301,7 +303,7 @@ To disable automatic touchpad toggling when laptop enters / leaves tablet mode
|
||||
```
|
||||
|
||||
### Extra Keybindings
|
||||
- ``Ctrl + Shift + F5`` - Toggle Performance Modes
|
||||
- ``Ctrl + Shift + F5`` / ``Ctrl + Shift + Alt + F5`` - Toggle Performance Modes
|
||||
- ``Ctrl + Shift + F12`` - Open G-Helper window
|
||||
- ``Ctrl + M1 / M2`` - Screen brightness Down / Up
|
||||
- ``Shift + M1 / M2`` - Backlight brightness Down / Up
|
||||
|
||||
Reference in New Issue
Block a user