mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
Compare commits
109 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fac145811e | ||
|
|
7eb6884aa4 | ||
|
|
f8df547afb | ||
|
|
6737af2da4 | ||
|
|
d859c56e27 | ||
|
|
0f56883c37 | ||
|
|
229255fbff | ||
|
|
786bb4eadf | ||
|
|
42847de055 | ||
|
|
6787d38678 | ||
|
|
8c0a0a2c92 | ||
|
|
8eaafcacb7 | ||
|
|
940993e1d5 | ||
|
|
5c4500315c | ||
|
|
dd52f8039c | ||
|
|
9f56aa9d3d | ||
|
|
f6602fff3c | ||
|
|
5a7dc5c707 | ||
|
|
e6d7a6f8b3 | ||
|
|
5cd77249a7 | ||
|
|
d9e0045af5 | ||
|
|
a66df0a394 | ||
|
|
f7435b2789 | ||
|
|
f49e2ee1e8 | ||
|
|
f854c8e088 | ||
|
|
bc6edcb38e | ||
|
|
dac7c86f1b | ||
|
|
369c89cb8d | ||
|
|
65e0065234 | ||
|
|
3fa8c04afa | ||
|
|
162514a8f9 | ||
|
|
b51c68572e | ||
|
|
ed5ec6b576 | ||
|
|
8c1885c2ae | ||
|
|
168b751795 | ||
|
|
3e93a93ab3 | ||
|
|
8a12e84423 | ||
|
|
c978c94d59 | ||
|
|
fc83e0e824 | ||
|
|
389fc41722 | ||
|
|
509817f442 | ||
|
|
8d8cfb0521 | ||
|
|
f021135f53 | ||
|
|
98670414d2 | ||
|
|
a41595068e | ||
|
|
d58c277733 | ||
|
|
5701a287aa | ||
|
|
1968b6487c | ||
|
|
95103108f2 | ||
|
|
defb0790e5 | ||
|
|
9da45b43ea | ||
|
|
32a20c3cce | ||
|
|
763337aedd | ||
|
|
f1b51a726b | ||
|
|
a085615398 | ||
|
|
d32a3452f9 | ||
|
|
433022b65d | ||
|
|
460f921836 | ||
|
|
1e2620c484 | ||
|
|
e774f704dd | ||
|
|
aa327f563f | ||
|
|
b9de97ecf4 | ||
|
|
5d7af9bdcd | ||
|
|
c2ca761d99 | ||
|
|
e480ee6f12 | ||
|
|
393cb3300c | ||
|
|
ee90fe4a3d | ||
|
|
a0628ef368 | ||
|
|
701a7d99c4 | ||
|
|
667d365992 | ||
|
|
6232fb1cfb | ||
|
|
a92924840b | ||
|
|
7a4d885e1b | ||
|
|
1c5e46131f | ||
|
|
49d5df9bac | ||
|
|
b8870ba3d5 | ||
|
|
2d7009d8fb | ||
|
|
46bfda3ad5 | ||
|
|
72b1842520 | ||
|
|
2f7b008557 | ||
|
|
97361e010e | ||
|
|
a30920ed70 | ||
|
|
4509b67ed9 | ||
|
|
e6fd618900 | ||
|
|
9a48e442d5 | ||
|
|
9e3afe73c6 | ||
|
|
d90da6571e | ||
|
|
19e1014f07 | ||
|
|
cd5806ed22 | ||
|
|
0c63e96d0f | ||
|
|
2271df172c | ||
|
|
5995079e17 | ||
|
|
49e6412c3c | ||
|
|
3316e88d38 | ||
|
|
5501c9c587 | ||
|
|
1d0bb67227 | ||
|
|
2dd5e93a7c | ||
|
|
31f19303ec | ||
|
|
eaa1df636d | ||
|
|
2c07a1922c | ||
|
|
0d4fc5d94a | ||
|
|
b641a87455 | ||
|
|
773be3cfd1 | ||
|
|
2b7a89b27f | ||
|
|
ba1607686f | ||
|
|
6375586ff9 | ||
|
|
17da3c7a5c | ||
|
|
9f836ff356 | ||
|
|
35355f6cb7 |
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -3,6 +3,8 @@ name: Release
|
||||
on:
|
||||
release:
|
||||
types: [ published ]
|
||||
workflow_dispatch:
|
||||
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
@@ -9,6 +9,7 @@ public static class AppConfig
|
||||
private static string configFile;
|
||||
|
||||
private static string? _model;
|
||||
private static string? _modelShort;
|
||||
private static string? _bios;
|
||||
|
||||
private static Dictionary<string, object> config = new Dictionary<string, object>();
|
||||
@@ -73,7 +74,7 @@ public static class AppConfig
|
||||
|
||||
public static (string, string) GetBiosAndModel()
|
||||
{
|
||||
if (_bios is not null && _model is not null) return (_bios, _model);
|
||||
if (_bios is not null && _modelShort is not null) return (_bios, _modelShort);
|
||||
|
||||
using (ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(@"SELECT * FROM Win32_BIOS"))
|
||||
{
|
||||
@@ -85,16 +86,16 @@ public static class AppConfig
|
||||
string[] results = obj["SMBIOSBIOSVersion"].ToString().Split(".");
|
||||
if (results.Length > 1)
|
||||
{
|
||||
_model = results[0];
|
||||
_modelShort = results[0];
|
||||
_bios = results[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
_model = obj["SMBIOSBIOSVersion"].ToString();
|
||||
_modelShort = obj["SMBIOSBIOSVersion"].ToString();
|
||||
}
|
||||
}
|
||||
|
||||
return (_bios, _model);
|
||||
return (_bios, _modelShort);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -327,7 +328,7 @@ public static class AppConfig
|
||||
// Devices with bugged bios command to change brightness
|
||||
public static bool SwappedBrightness()
|
||||
{
|
||||
return ContainsModel("FA506IH") || ContainsModel("FX506LU");
|
||||
return ContainsModel("FA506IH") || ContainsModel("FA506IC") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH");
|
||||
}
|
||||
|
||||
|
||||
@@ -344,7 +345,7 @@ public static class AppConfig
|
||||
|
||||
public static bool IsSingleColor()
|
||||
{
|
||||
return ContainsModel("GA401");
|
||||
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13");
|
||||
}
|
||||
|
||||
public static bool IsStrix()
|
||||
@@ -352,6 +353,11 @@ public static class AppConfig
|
||||
return ContainsModel("Strix") || ContainsModel("Scar");
|
||||
}
|
||||
|
||||
public static bool IsStrixLimitedRGB()
|
||||
{
|
||||
return ContainsModel("G614JV") || ContainsModel("G614JZ") || ContainsModel("G512LI") || ContainsModel("G513RS");
|
||||
}
|
||||
|
||||
public static bool IsZ13()
|
||||
{
|
||||
return ContainsModel("Z13");
|
||||
@@ -417,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()
|
||||
@@ -435,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];
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
690
app/AsusUSB.cs
690
app/AsusUSB.cs
@@ -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.ContainsModel("GA401") || AppConfig.ContainsModel("X13"); // 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())
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,6 +3,31 @@
|
||||
internal class BatteryControl
|
||||
{
|
||||
|
||||
public static void ToggleBatteryLimitFull()
|
||||
{
|
||||
if (AppConfig.Is("charge_full")) SetBatteryChargeLimit();
|
||||
else SetBatteryLimitFull();
|
||||
}
|
||||
|
||||
public static void SetBatteryLimitFull()
|
||||
{
|
||||
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)
|
||||
{
|
||||
|
||||
@@ -10,10 +35,11 @@
|
||||
if (limit < 40 || limit > 100) return;
|
||||
|
||||
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, limit, "BatteryLimit");
|
||||
Program.settingsForm.VisualiseBattery(limit);
|
||||
|
||||
AppConfig.Set("charge_limit", limit);
|
||||
AppConfig.Set("charge_full", 0);
|
||||
|
||||
Program.settingsForm.VisualiseBattery(limit);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -160,9 +160,11 @@ namespace GHelper.Display
|
||||
device.monitorFriendlyDeviceName == internalName)
|
||||
{
|
||||
if (log) Logger.WriteLine(device.monitorDevicePath + " " + device.outputTechnology);
|
||||
|
||||
AppConfig.Set("internal_display", device.monitorFriendlyDeviceName);
|
||||
var names = device.monitorDevicePath.Split("#");
|
||||
if (names.Length > 0) return names[1];
|
||||
|
||||
if (names.Length > 1) return names[1];
|
||||
else return "";
|
||||
}
|
||||
}
|
||||
|
||||
48
app/Extra.cs
48
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
|
||||
@@ -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
|
||||
@@ -276,22 +277,27 @@ namespace GHelper
|
||||
checkSleepBar.Visible = false;
|
||||
checkShutdownBar.Visible = false;
|
||||
|
||||
if (!AppConfig.IsZ13())
|
||||
{
|
||||
labelBacklightLid.Visible = false;
|
||||
checkAwakeLid.Visible = false;
|
||||
checkBootLid.Visible = false;
|
||||
checkSleepLid.Visible = false;
|
||||
checkShutdownLid.Visible = false;
|
||||
}
|
||||
|
||||
labelBacklightLogo.Visible = false;
|
||||
checkAwakeLogo.Visible = false;
|
||||
checkBootLogo.Visible = false;
|
||||
checkSleepLogo.Visible = false;
|
||||
checkShutdownLogo.Visible = false;
|
||||
if ((!AppConfig.IsStrix() && !AppConfig.IsZ13()) || AppConfig.IsStrixLimitedRGB())
|
||||
{
|
||||
labelBacklightLid.Visible = false;
|
||||
checkAwakeLid.Visible = false;
|
||||
checkBootLid.Visible = false;
|
||||
checkSleepLid.Visible = false;
|
||||
checkShutdownLid.Visible = false;
|
||||
|
||||
labelBacklightKeyboard.Visible = false;
|
||||
}
|
||||
labelBacklightLogo.Visible = false;
|
||||
checkAwakeLogo.Visible = false;
|
||||
checkBootLogo.Visible = false;
|
||||
checkSleepLogo.Visible = false;
|
||||
checkShutdownLogo.Visible = false;
|
||||
|
||||
}
|
||||
|
||||
if (!AppConfig.IsStrix() && !AppConfig.IsZ13())
|
||||
{
|
||||
labelBacklightKeyboard.Visible = false;
|
||||
}
|
||||
|
||||
//checkAutoToggleClamshellMode.Visible = clamshellControl.IsExternalDisplayConnected();
|
||||
@@ -395,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()
|
||||
@@ -510,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)
|
||||
@@ -558,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.127</AssemblyVersion>
|
||||
<AssemblyVersion>0.132</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();
|
||||
|
||||
}
|
||||
|
||||
@@ -165,7 +166,7 @@ namespace GHelper.Gpu
|
||||
|
||||
if (status == 0 && eco == 1 && hardWay) RestartGPU();
|
||||
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(100));
|
||||
await Task.Delay(TimeSpan.FromMilliseconds(AppConfig.Get("refresh_delay", 500)));
|
||||
|
||||
settings.Invoke(delegate
|
||||
{
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -10,8 +10,8 @@ public class Startup
|
||||
|
||||
public static bool IsScheduled()
|
||||
{
|
||||
TaskService taskService = new TaskService();
|
||||
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
|
||||
using (TaskService taskService = new TaskService())
|
||||
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
|
||||
}
|
||||
|
||||
public static void ReScheduleAdmin()
|
||||
@@ -23,6 +23,26 @@ public class Startup
|
||||
}
|
||||
}
|
||||
|
||||
public static void StartupCheck()
|
||||
{
|
||||
using (TaskService taskService = new TaskService())
|
||||
{
|
||||
var task = taskService.RootFolder.AllTasks.FirstOrDefault(t => t.Name == taskName);
|
||||
if (task != null)
|
||||
{
|
||||
string strExeFilePath = Application.ExecutablePath.Trim();
|
||||
string action = task.Definition.Actions.FirstOrDefault()!.ToString().Trim();
|
||||
if (!strExeFilePath.Equals(action, StringComparison.OrdinalIgnoreCase) && !File.Exists(action))
|
||||
{
|
||||
Logger.WriteLine("File doesn't exist: " + action);
|
||||
Logger.WriteLine("Rescheduling to: " + strExeFilePath);
|
||||
UnSchedule();
|
||||
Schedule();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void Schedule()
|
||||
{
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
using GHelper.Display;
|
||||
using GHelper.Helpers;
|
||||
using GHelper.Mode;
|
||||
using GHelper.USB;
|
||||
using Microsoft.Win32;
|
||||
using System.Diagnostics;
|
||||
using System.Management;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace GHelper.Input
|
||||
{
|
||||
@@ -58,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)
|
||||
@@ -67,7 +69,7 @@ namespace GHelper.Input
|
||||
SetBacklightAuto();
|
||||
}
|
||||
|
||||
//Debug.WriteLine(iddle.TotalSeconds);
|
||||
//Logger.WriteLine("Iddle: " + iddle.TotalSeconds);
|
||||
}
|
||||
|
||||
public void Init()
|
||||
@@ -82,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()
|
||||
@@ -142,25 +147,59 @@ namespace GHelper.Input
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static int[] ParseHexValues(string input)
|
||||
{
|
||||
string pattern = @"\b(0x[0-9A-Fa-f]{1,2}|[0-9A-Fa-f]{1,2})\b";
|
||||
|
||||
if (!Regex.IsMatch(input, $"^{pattern}(\\s+{pattern})*$")) return new int[0];
|
||||
|
||||
MatchCollection matches = Regex.Matches(input, pattern);
|
||||
|
||||
int[] hexValues = new int[matches.Count];
|
||||
|
||||
for (int i = 0; i < matches.Count; i++)
|
||||
{
|
||||
string hexValueStr = matches[i].Value;
|
||||
int hexValue = int.Parse(hexValueStr.StartsWith("0x", StringComparison.OrdinalIgnoreCase)
|
||||
? hexValueStr.Substring(2)
|
||||
: hexValueStr, System.Globalization.NumberStyles.HexNumber);
|
||||
|
||||
hexValues[i] = hexValue;
|
||||
}
|
||||
|
||||
return hexValues;
|
||||
}
|
||||
|
||||
|
||||
static void CustomKey(string configKey = "m3")
|
||||
{
|
||||
string command = AppConfig.GetString(configKey + "_custom");
|
||||
int intKey;
|
||||
int[] hexKeys = new int[0];
|
||||
|
||||
try
|
||||
{
|
||||
intKey = Convert.ToInt32(command, 16);
|
||||
hexKeys = ParseHexValues(command);
|
||||
}
|
||||
catch
|
||||
{
|
||||
intKey = -1;
|
||||
}
|
||||
|
||||
|
||||
if (intKey > 0)
|
||||
KeyboardHook.KeyPress((Keys)intKey);
|
||||
else
|
||||
LaunchProcess(command);
|
||||
switch (hexKeys.Length)
|
||||
{
|
||||
case 1:
|
||||
KeyboardHook.KeyPress((Keys)hexKeys[0]);
|
||||
break;
|
||||
case 2:
|
||||
KeyboardHook.KeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1]);
|
||||
break;
|
||||
case 3:
|
||||
KeyboardHook.KeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[3]);
|
||||
break;
|
||||
default:
|
||||
LaunchProcess(command);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -264,16 +303,16 @@ namespace GHelper.Input
|
||||
SetBrightness(+10);
|
||||
break;
|
||||
case Keys.F9:
|
||||
KeyboardHook.KeyWinPress(Keys.P);
|
||||
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.KeyWinPress(Keys.A);
|
||||
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.A);
|
||||
break;
|
||||
case Keys.VolumeDown:
|
||||
KeyProcess("m1");
|
||||
@@ -311,6 +350,7 @@ namespace GHelper.Input
|
||||
if (e.Key == keyProfile) modeControl.CyclePerformanceMode(true);
|
||||
}
|
||||
|
||||
|
||||
if (e.Modifier == (ModifierKeys.Control))
|
||||
{
|
||||
switch (e.Key)
|
||||
@@ -440,9 +480,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.KeyCtrlWinPress(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()
|
||||
@@ -460,7 +512,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);
|
||||
|
||||
@@ -478,7 +530,7 @@ namespace GHelper.Input
|
||||
|
||||
Logger.WriteLine("Tablet: " + tabletState + " Touchpad: " + touchpadState);
|
||||
|
||||
if (tabletState && touchpadState || !tabletState && !touchpadState) AsusUSB.TouchpadToggle();
|
||||
if (tabletState && touchpadState || !tabletState && !touchpadState) ToggleTouchpad();
|
||||
|
||||
}
|
||||
|
||||
@@ -553,7 +605,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;
|
||||
}
|
||||
@@ -570,23 +623,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;
|
||||
|
||||
|
||||
@@ -610,8 +668,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)
|
||||
@@ -634,7 +692,7 @@ namespace GHelper.Input
|
||||
|
||||
if (force || !OptimizationService.IsRunning())
|
||||
{
|
||||
AsusUSB.ApplyBrightness(backlight, "HotKey");
|
||||
Aura.ApplyBrightness(backlight, "HotKey");
|
||||
}
|
||||
|
||||
if (!OptimizationService.IsOSDRunning())
|
||||
@@ -645,6 +703,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);
|
||||
|
||||
@@ -26,23 +26,28 @@ public sealed class KeyboardHook : IDisposable
|
||||
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
|
||||
}
|
||||
|
||||
public static void KeyWinPress(Keys key)
|
||||
public static void KeyKeyPress(Keys key, Keys key2)
|
||||
{
|
||||
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
|
||||
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
|
||||
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
|
||||
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
}
|
||||
|
||||
public static void KeyCtrlWinPress(Keys key)
|
||||
public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3, int sleep = 0)
|
||||
{
|
||||
keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
|
||||
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
|
||||
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);
|
||||
|
||||
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);
|
||||
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
|
||||
keybd_event(VK_LCONTROL, 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]);
|
||||
|
||||
84
app/Matrix.Designer.cs
generated
84
app/Matrix.Designer.cs
generated
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
209
app/Peripherals/Mouse/Models/Chakram.cs
Normal file
209
app/Peripherals/Mouse/Models/Chakram.cs
Normal file
@@ -0,0 +1,209 @@
|
||||
|
||||
namespace GHelper.Peripherals.Mouse.Models
|
||||
{
|
||||
//P704
|
||||
public class Chakram : AsusMouse
|
||||
{
|
||||
public Chakram() : base(0x0B05, 0x18E5, "mi_00", true) {
|
||||
|
||||
}
|
||||
|
||||
protected Chakram(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless)
|
||||
{
|
||||
}
|
||||
public override int DPIProfileCount()
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
|
||||
public override string GetDisplayName()
|
||||
{
|
||||
return "ROG Chakram (Wireless)";
|
||||
}
|
||||
|
||||
public override PollingRate[] SupportedPollingrates()
|
||||
{
|
||||
return new PollingRate[] {
|
||||
PollingRate.PR125Hz,
|
||||
PollingRate.PR250Hz,
|
||||
PollingRate.PR500Hz,
|
||||
PollingRate.PR1000Hz
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public override int ProfileCount()
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
public override int MaxDPI()
|
||||
{
|
||||
return 16_000;
|
||||
}
|
||||
|
||||
public override bool HasDebounceSetting()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override bool HasLiftOffSetting()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override int DPIIncrements()
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
|
||||
public override bool HasRGB()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public override int MaxBrightness()
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
|
||||
public override LightingZone[] SupportedLightingZones()
|
||||
{
|
||||
return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow };
|
||||
}
|
||||
|
||||
public override bool HasAutoPowerOff()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool HasAngleSnapping()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool HasAngleTuning()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool HasLowBatteryWarning()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override int LowBatteryWarningStep()
|
||||
{
|
||||
return 25;
|
||||
}
|
||||
|
||||
public override int LowBatteryWarningMax()
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
|
||||
protected override int ParseBattery(byte[] packet)
|
||||
{
|
||||
return base.ParseBattery(packet) * 25;
|
||||
}
|
||||
protected override int ParseLowBatteryWarning(byte[] packet)
|
||||
{
|
||||
return base.ParseLowBatteryWarning(packet) * 25;
|
||||
}
|
||||
protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)
|
||||
{
|
||||
return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff);
|
||||
}
|
||||
protected override byte[] GetReadLightingModePacket(LightingZone zone)
|
||||
{
|
||||
return new byte[] { 0x00, 0x12, 0x03, 0x00 };
|
||||
}
|
||||
|
||||
protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone)
|
||||
{
|
||||
if (packet[1] != 0x12 || packet[2] != 0x03)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
int offset = 5 + (((int)zone) * 5);
|
||||
|
||||
LightingSetting setting = new LightingSetting();
|
||||
|
||||
setting.LightingMode = LightingModeForIndex(packet[offset + 0]);
|
||||
setting.Brightness = packet[offset + 1];
|
||||
|
||||
setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]);
|
||||
|
||||
setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode)
|
||||
? (AnimationDirection)packet[21]
|
||||
: AnimationDirection.Clockwise;
|
||||
|
||||
if (setting.AnimationDirection != AnimationDirection.Clockwise
|
||||
&& setting.AnimationDirection != AnimationDirection.CounterClockwise)
|
||||
{
|
||||
setting.AnimationDirection = AnimationDirection.Clockwise;
|
||||
}
|
||||
|
||||
setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[22] == 0x01;
|
||||
setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode)
|
||||
? (AnimationSpeed)packet[23]
|
||||
: AnimationSpeed.Medium;
|
||||
|
||||
//If the mouse reports an out of range value, which it does when the current setting has no speed option, chose medium as default
|
||||
if (setting.AnimationSpeed != AnimationSpeed.Fast
|
||||
&& setting.AnimationSpeed != AnimationSpeed.Medium
|
||||
&& setting.AnimationSpeed != AnimationSpeed.Slow)
|
||||
{
|
||||
setting.AnimationSpeed = AnimationSpeed.Medium;
|
||||
}
|
||||
return setting;
|
||||
}
|
||||
|
||||
public override void ReadLightingSetting()
|
||||
{
|
||||
if (!HasRGB())
|
||||
{
|
||||
return;
|
||||
}
|
||||
//Mouse sends all lighting zones in one response
|
||||
//21: Direction
|
||||
//22: Random
|
||||
//23: Speed
|
||||
// 20 21 22 23
|
||||
//00 12 03 00 00 [03 04 00 00 ff] [03 04 00 00 ff] [03 04 00 00 ff] 00 04 00 00
|
||||
//00 12 03 00 00 [05 02 ff 00 ff] [05 02 ff 00 ff] [05 02 ff 00 ff] 00 01 01 00
|
||||
//00 12 03 00 00 [03 01 00 00 ff] [03 01 00 00 ff] [03 01 00 00 ff] 00 01 00 01
|
||||
byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All));
|
||||
if (response is null) return;
|
||||
|
||||
LightingZone[] lz = SupportedLightingZones();
|
||||
for (int i = 0; i < lz.Length; ++i)
|
||||
{
|
||||
LightingSetting? ls = ParseLightingSetting(response, lz[i]);
|
||||
if (ls is null)
|
||||
{
|
||||
Logger.WriteLine(GetDisplayName() + ": Failed to read RGB Setting for Zone " + lz[i].ToString());
|
||||
continue;
|
||||
}
|
||||
|
||||
Logger.WriteLine(GetDisplayName() + ": Read RGB Setting for Zone " + lz[i].ToString() + ": " + ls.ToString());
|
||||
LightingSetting[i] = ls;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool CanChangeDPIProfile()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class ChakramWired : Chakram
|
||||
{
|
||||
public ChakramWired() : base(0x18E3, false)
|
||||
{
|
||||
}
|
||||
|
||||
public override string GetDisplayName()
|
||||
{
|
||||
return "ROG Chakram (Wired)";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -66,6 +66,15 @@
|
||||
return new LightingZone[] { LightingZone.Logo };
|
||||
}
|
||||
|
||||
public override bool IsLightingModeSupported(LightingMode lightingMode)
|
||||
{
|
||||
return lightingMode == LightingMode.Static
|
||||
|| lightingMode == LightingMode.Breathing
|
||||
|| lightingMode == LightingMode.ColorCycle
|
||||
|| lightingMode == LightingMode.BatteryState
|
||||
|| lightingMode == LightingMode.React;
|
||||
}
|
||||
|
||||
public override bool HasAutoPowerOff()
|
||||
{
|
||||
return true;
|
||||
|
||||
170
app/Peripherals/Mouse/Models/TUFM5.cs
Normal file
170
app/Peripherals/Mouse/Models/TUFM5.cs
Normal file
@@ -0,0 +1,170 @@
|
||||
namespace GHelper.Peripherals.Mouse.Models
|
||||
{
|
||||
//P304
|
||||
public class TUFM5 : AsusMouse
|
||||
{
|
||||
public TUFM5() : base(0x0B05, 0x1898, "mi_02", false)
|
||||
{
|
||||
}
|
||||
|
||||
public override int DPIProfileCount()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
public override string GetDisplayName()
|
||||
{
|
||||
return "TUF GAMING M5";
|
||||
}
|
||||
|
||||
|
||||
public override PollingRate[] SupportedPollingrates()
|
||||
{
|
||||
return new PollingRate[] {
|
||||
PollingRate.PR125Hz,
|
||||
PollingRate.PR250Hz,
|
||||
PollingRate.PR500Hz,
|
||||
PollingRate.PR1000Hz
|
||||
};
|
||||
}
|
||||
|
||||
//Mouse has React mapped to 0x03 instead of 0x04 like other mice
|
||||
protected override byte IndexForLightingMode(LightingMode lightingMode)
|
||||
{
|
||||
if (lightingMode == LightingMode.React)
|
||||
{
|
||||
return 0x03;
|
||||
}
|
||||
return ((byte)lightingMode);
|
||||
}
|
||||
|
||||
//Mouse has React mapped to 0x03 instead of 0x04 like other mice
|
||||
protected override LightingMode LightingModeForIndex(byte lightingMode)
|
||||
{
|
||||
if (lightingMode == 0x03)
|
||||
{
|
||||
return LightingMode.React;
|
||||
}
|
||||
return base.LightingModeForIndex(lightingMode);
|
||||
|
||||
}
|
||||
|
||||
public override int ProfileCount()
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
public override int MaxDPI()
|
||||
{
|
||||
return 6_200;
|
||||
}
|
||||
public override bool HasBattery()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool HasLiftOffSetting()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
public override LightingZone[] SupportedLightingZones()
|
||||
{
|
||||
return new LightingZone[] { LightingZone.Logo };
|
||||
}
|
||||
|
||||
public override bool HasRGB()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool HasAngleSnapping()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override int DPIIncrements()
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
|
||||
public override bool CanChangeDPIProfile()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool HasDebounceSetting()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override int MaxBrightness()
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
|
||||
public override bool IsLightingModeSupported(LightingMode lightingMode)
|
||||
{
|
||||
return lightingMode == LightingMode.Static
|
||||
|| lightingMode == LightingMode.Breathing
|
||||
|| lightingMode == LightingMode.ColorCycle
|
||||
|| lightingMode == LightingMode.React;
|
||||
}
|
||||
|
||||
|
||||
protected override byte[] GetUpdatePollingRatePacket(PollingRate pollingRate)
|
||||
{
|
||||
return new byte[] { reportId, 0x51, 0x31, 0x02, 0x00, (byte)pollingRate };
|
||||
}
|
||||
|
||||
protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)
|
||||
{
|
||||
return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };
|
||||
}
|
||||
|
||||
protected override PollingRate ParsePollingRate(byte[] packet)
|
||||
{
|
||||
|
||||
if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)
|
||||
{
|
||||
return (PollingRate)packet[9];
|
||||
}
|
||||
|
||||
return PollingRate.PR125Hz;
|
||||
}
|
||||
|
||||
protected override bool ParseAngleSnapping(byte[] packet)
|
||||
{
|
||||
|
||||
if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)
|
||||
{
|
||||
return packet[13] == 0x01;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce)
|
||||
{
|
||||
return new byte[] { reportId, 0x51, 0x31, 0x03, 0x00, ((byte)debounce) };
|
||||
}
|
||||
|
||||
protected override DebounceTime ParseDebounce(byte[] packet)
|
||||
{
|
||||
if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00)
|
||||
{
|
||||
return DebounceTime.MS12;
|
||||
}
|
||||
|
||||
if (packet[11] < 0x02)
|
||||
{
|
||||
return DebounceTime.MS12;
|
||||
}
|
||||
|
||||
if (packet[11] > 0x07)
|
||||
{
|
||||
return DebounceTime.MS32;
|
||||
}
|
||||
|
||||
return (DebounceTime)packet[11];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -200,11 +200,14 @@ namespace GHelper.Peripherals
|
||||
DetectMouse(new HarpeAceAimLabEditionWired());
|
||||
DetectMouse(new HarpeAceAimLabEditionOmni());
|
||||
DetectMouse(new TUFM3());
|
||||
DetectMouse(new TUFM5());
|
||||
DetectMouse(new KerisWirelssAimpoint());
|
||||
DetectMouse(new KerisWirelssAimpointWired());
|
||||
DetectMouse(new PugioII());
|
||||
DetectMouse(new PugioIIWired());
|
||||
DetectMouse(new StrixImpactII());
|
||||
DetectMouse(new Chakram());
|
||||
DetectMouse(new ChakramWired());
|
||||
}
|
||||
|
||||
public static void DetectMouse(AsusMouse am)
|
||||
@@ -236,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();
|
||||
SetAutoModes(init: true);
|
||||
|
||||
// Subscribing for system power change events
|
||||
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
|
||||
@@ -119,7 +119,7 @@ namespace GHelper
|
||||
|
||||
if (Environment.CurrentDirectory.Trim('\\') == Application.StartupPath.Trim('\\') || action.Length > 0)
|
||||
{
|
||||
SettingsToggle(action);
|
||||
SettingsToggle(action, false);
|
||||
}
|
||||
|
||||
Application.Run();
|
||||
@@ -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)
|
||||
@@ -156,24 +156,24 @@ namespace GHelper
|
||||
lastTheme = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
||||
}
|
||||
|
||||
if (settingsForm.fans is not null && settingsForm.fans.Text != "")
|
||||
settingsForm.fans.InitTheme();
|
||||
if (settingsForm.fansForm is not null && settingsForm.fansForm.Text != "")
|
||||
settingsForm.fansForm.InitTheme();
|
||||
|
||||
if (settingsForm.keyb is not null && settingsForm.keyb.Text != "")
|
||||
settingsForm.keyb.InitTheme();
|
||||
if (settingsForm.extraForm is not null && settingsForm.extraForm.Text != "")
|
||||
settingsForm.extraForm.InitTheme();
|
||||
|
||||
if (settingsForm.updates is not null && settingsForm.updates.Text != "")
|
||||
settingsForm.updates.InitTheme();
|
||||
if (settingsForm.updatesForm is not null && settingsForm.updatesForm.Text != "")
|
||||
settingsForm.updatesForm.InitTheme();
|
||||
|
||||
if (settingsForm.matrix is not null && settingsForm.matrix.Text != "")
|
||||
settingsForm.matrix.InitTheme();
|
||||
if (settingsForm.matrixForm is not null && settingsForm.matrixForm.Text != "")
|
||||
settingsForm.matrixForm.InitTheme();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
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);
|
||||
@@ -213,11 +213,21 @@ namespace GHelper
|
||||
SetAutoModes(true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void SettingsToggle(string action = "")
|
||||
public static void SettingsToggle(string action = "", bool checkForFocus = true, bool trayClick = false)
|
||||
{
|
||||
if (settingsForm.Visible) settingsForm.HideAll();
|
||||
if (settingsForm.Visible)
|
||||
{
|
||||
// If helper window is not on top, this just focuses on the app again
|
||||
// Pressing the ghelper button again will hide the app
|
||||
if (checkForFocus && !settingsForm.HasAnyFocus(trayClick))
|
||||
{
|
||||
settingsForm.ShowAll();
|
||||
}
|
||||
else
|
||||
{
|
||||
settingsForm.HideAll();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -246,15 +256,18 @@ namespace GHelper
|
||||
gpuControl.RestartGPU(false);
|
||||
break;
|
||||
case "services":
|
||||
settingsForm.keyb = new Extra();
|
||||
settingsForm.keyb.Show();
|
||||
settingsForm.keyb.ServiesToggle();
|
||||
settingsForm.extraForm = new Extra();
|
||||
settingsForm.extraForm.Show();
|
||||
settingsForm.extraForm.ServiesToggle();
|
||||
break;
|
||||
case "uv":
|
||||
Startup.ReScheduleAdmin();
|
||||
settingsForm.FansToggle(2);
|
||||
modeControl.SetRyzen();
|
||||
break;
|
||||
default:
|
||||
Startup.StartupCheck();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -262,7 +275,7 @@ namespace GHelper
|
||||
static void TrayIcon_MouseClick(object? sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Left)
|
||||
SettingsToggle();
|
||||
SettingsToggle(trayClick: true);
|
||||
|
||||
}
|
||||
|
||||
@@ -279,5 +292,4 @@ namespace GHelper
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
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>
|
||||
9
app/Properties/Strings.Designer.cs
generated
9
app/Properties/Strings.Designer.cs
generated
@@ -465,6 +465,15 @@ namespace GHelper.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to One time charge to 100%.
|
||||
/// </summary>
|
||||
internal static string BatteryLimitFull {
|
||||
get {
|
||||
return ResourceManager.GetString("BatteryLimitFull", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to BIOS and Driver Updates.
|
||||
/// </summary>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Batteriezustand</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>Einmalig auf 100% aufladen</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>BIOS und Treiber Updates</value>
|
||||
</data>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Salud de la batería</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>Cargar una vez al 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>Actualizaciones de BIOS y Drivers</value>
|
||||
</data>
|
||||
|
||||
@@ -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>
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Santé de la batterie</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>Charge unique à 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>Mise à jour BIOS et pilotes</value>
|
||||
</data>
|
||||
@@ -259,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>
|
||||
@@ -271,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>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Akku állapot</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>One time charge to 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>BIOS és illesztőprogram frissítések</value>
|
||||
</data>
|
||||
|
||||
656
app/Properties/Strings.id.resx
Normal file
656
app/Properties/Strings.id.resx
Normal 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>
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Salute Batteria</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>One time charge to 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>Aggiornamenti Driver e BIOS</value>
|
||||
</data>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>배터리 수명</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>One time charge to 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>바이오스/드라이버 업데이트</value>
|
||||
</data>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Sveikata</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>Vienkartinė įkrova iki 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>BIOS ir tvarkyklių naujinimai</value>
|
||||
</data>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Stan baterii</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>Jednorazowo naładuj do 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>Aktualizacje BIOS i sterowników</value>
|
||||
</data>
|
||||
|
||||
@@ -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,10 @@
|
||||
<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>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>BIOS and Driver Updates</value>
|
||||
@@ -259,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>
|
||||
@@ -286,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>
|
||||
@@ -298,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>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Estado da bateria</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>One time charge to 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>Atualizações de Drivers e da BIOS</value>
|
||||
</data>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Battery Health</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>One time charge to 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>BIOS and Driver Updates</value>
|
||||
</data>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Sănătatea bateriei</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>One time charge to 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>Actualizări BIOS și Driver</value>
|
||||
</data>
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
<value>Pil tasarrufu için 60Hz kullanılır ve şarja takıldığında eski haline getirir</value>
|
||||
</data>
|
||||
<data name="Awake" xml:space="preserve">
|
||||
<value>Uyanık</value>
|
||||
<value>Uyanırken</value>
|
||||
</data>
|
||||
<data name="BacklightTimeout" xml:space="preserve">
|
||||
<value>Pildeyken klavye ışığının kapanma süresi</value>
|
||||
@@ -252,11 +252,14 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Pil Sağlığı</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>Bir seferlik %100 şarj etme</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>BIOS ve Sürücü Güncellemeleri</value>
|
||||
</data>
|
||||
<data name="Boot" xml:space="preserve">
|
||||
<value>Önyükleme</value>
|
||||
<value>Boot</value>
|
||||
</data>
|
||||
<data name="BootSound" xml:space="preserve">
|
||||
<value>Boot Sesi</value>
|
||||
@@ -295,7 +298,7 @@
|
||||
<value>Ekran overdrive özelliğini devre dışı bırak</value>
|
||||
</data>
|
||||
<data name="Discharging" xml:space="preserve">
|
||||
<value>Pil boşalıyor</value>
|
||||
<value>Şarj azalıyor</value>
|
||||
</data>
|
||||
<data name="DownloadUpdate" xml:space="preserve">
|
||||
<value>İndir</value>
|
||||
@@ -393,16 +396,16 @@ Yine de devam etmek istiyor musunuz?</value>
|
||||
<value>Yüksek</value>
|
||||
</data>
|
||||
<data name="KeyBindings" xml:space="preserve">
|
||||
<value>Tuş Bağlantıları</value>
|
||||
<value>Tuş Atamaları</value>
|
||||
</data>
|
||||
<data name="Keyboard" xml:space="preserve">
|
||||
<value>Klavye</value>
|
||||
</data>
|
||||
<data name="KillGpuApps" xml:space="preserve">
|
||||
<value>Eco'ya geçerken dGPU kullanan tüm uygulamaları durdur</value>
|
||||
<value>Eco'ya geçerken harici GPU'yu kullanan tüm uygulamaları durdur</value>
|
||||
</data>
|
||||
<data name="LaptopBacklight" xml:space="preserve">
|
||||
<value>Aydınlatması</value>
|
||||
<value>Laptop Aydınlatması</value>
|
||||
</data>
|
||||
<data name="LaptopKeyboard" xml:space="preserve">
|
||||
<value>Laptop Klavyesi</value>
|
||||
@@ -429,7 +432,7 @@ Yine de devam etmek istiyor musunuz?</value>
|
||||
<value>Ses Görselleştirici</value>
|
||||
</data>
|
||||
<data name="MatrixBanner" xml:space="preserve">
|
||||
<value>Matrix Banner</value>
|
||||
<value>Binary Banner</value>
|
||||
</data>
|
||||
<data name="MatrixBright" xml:space="preserve">
|
||||
<value>Parlak</value>
|
||||
@@ -498,7 +501,7 @@ Yine de devam etmek istiyor musunuz?</value>
|
||||
<value>Yeni güncellemeler</value>
|
||||
</data>
|
||||
<data name="NoNewUpdates" xml:space="preserve">
|
||||
<value>Yeni güncelleme yok</value>
|
||||
<value>Güncelleme yok</value>
|
||||
</data>
|
||||
<data name="NotConnected" xml:space="preserve">
|
||||
<value>Bağlantı Yok</value>
|
||||
@@ -552,7 +555,7 @@ Yine de devam etmek istiyor musunuz?</value>
|
||||
<value>Çıkış Yap</value>
|
||||
</data>
|
||||
<data name="RestartGPU" xml:space="preserve">
|
||||
<value>Bir şey harici GPU'yu kullanıyor ve Eco modunu engelliyor. G-Helper aygıt yöneticisinde harici Gpu'yu yeniden başlatmayı denesin mi? (Kendi sorumluluğunuzdadır)</value>
|
||||
<value>Bir şey harici GPU'yu kullanıyor ve Eco modunu engelliyor. G-Helper aygıt yöneticisinde harici GPU'yu yeniden başlatmayı denesin mi? (Kendi sorumluluğunuzdadır)</value>
|
||||
</data>
|
||||
<data name="RPM" xml:space="preserve">
|
||||
<value>RPM</value>
|
||||
@@ -564,10 +567,10 @@ Yine de devam etmek istiyor musunuz?</value>
|
||||
<value>Screenpad Parlaklığını Azalt</value>
|
||||
</data>
|
||||
<data name="ScreenPadUp" xml:space="preserve">
|
||||
<value>Screenpad Parlaklığını Arttır</value>
|
||||
<value>Screenpad Parlaklığını Artır</value>
|
||||
</data>
|
||||
<data name="Shutdown" xml:space="preserve">
|
||||
<value>Kapalı</value>
|
||||
<value>Kapatma</value>
|
||||
</data>
|
||||
<data name="Silent" xml:space="preserve">
|
||||
<value>Sessiz</value>
|
||||
@@ -600,7 +603,7 @@ Yine de devam etmek istiyor musunuz?</value>
|
||||
<value>Hizmetler Durduruluyor</value>
|
||||
</data>
|
||||
<data name="ToggleAura" xml:space="preserve">
|
||||
<value>Aura'yı Değiştir</value>
|
||||
<value>Aura'yı Kullan</value>
|
||||
</data>
|
||||
<data name="ToggleClamshellMode" xml:space="preserve">
|
||||
<value>Otomatik Clamshell Modunu Aç</value>
|
||||
@@ -642,10 +645,10 @@ Yine de devam etmek istiyor musunuz?</value>
|
||||
<value>Sesi Azalt</value>
|
||||
</data>
|
||||
<data name="VolumeMute" xml:space="preserve">
|
||||
<value>Ses Kısma</value>
|
||||
<value>Sesi Kapat</value>
|
||||
</data>
|
||||
<data name="VolumeUp" xml:space="preserve">
|
||||
<value>Sesi Arttır</value>
|
||||
<value>Sesi Artır</value>
|
||||
</data>
|
||||
<data name="WindowTop" xml:space="preserve">
|
||||
<value>Uygulama penceresini her zaman en üstte tut</value>
|
||||
|
||||
@@ -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>
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Стан батареї</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>Одноразовий заряд до 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>Оновлення BIOS та драйверів</value>
|
||||
</data>
|
||||
@@ -259,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>
|
||||
@@ -271,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>
|
||||
@@ -286,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>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>Sức khoẻ pin</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>One time charge to 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>Cập nhật BIOS và driver</value>
|
||||
</data>
|
||||
|
||||
@@ -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>
|
||||
@@ -223,7 +223,7 @@
|
||||
<value>滚轮</value>
|
||||
</data>
|
||||
<data name="AuraZoneUnderglow" xml:space="preserve">
|
||||
<value>Underglow</value>
|
||||
<value>底灯</value>
|
||||
</data>
|
||||
<data name="AutoApply" xml:space="preserve">
|
||||
<value>自动应用</value>
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>电池健康</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>一次性充电至 100%</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>BIOS 和驱动程序更新</value>
|
||||
</data>
|
||||
@@ -271,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>
|
||||
@@ -286,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>
|
||||
@@ -310,12 +313,12 @@
|
||||
<value>集显模式</value>
|
||||
</data>
|
||||
<data name="EnableOptimusText" xml:space="preserve">
|
||||
<value>若未在nVIDIA控制面板的混合显示模式中设置为Optimus,关闭独立显卡可能会导致亮度控制在系统重启前都不可用。
|
||||
<value>NVIDIA 控制面板中的显示模式未设置为 Optimus 时,通过集显模式禁用独立显卡可能会使亮度控制出现问题,直到下次重启后才能恢复。
|
||||
|
||||
确定还要继续吗?</value>
|
||||
</data>
|
||||
<data name="EnableOptimusTitle" xml:space="preserve">
|
||||
<value>NVIDIA 显示模式未设置为自动切换</value>
|
||||
<value>NVIDIA 显示模式未设置为 Optimus</value>
|
||||
</data>
|
||||
<data name="EnergySettings" xml:space="preserve">
|
||||
<value>电源设置</value>
|
||||
@@ -339,7 +342,7 @@
|
||||
<value>GPU 风扇配置文件</value>
|
||||
</data>
|
||||
<data name="FanProfileMid" xml:space="preserve">
|
||||
<value>中等风扇配置</value>
|
||||
<value>Mid 风扇配置文件</value>
|
||||
</data>
|
||||
<data name="FanProfiles" xml:space="preserve">
|
||||
<value>风扇配置</value>
|
||||
@@ -462,7 +465,7 @@
|
||||
<value>分钟</value>
|
||||
</data>
|
||||
<data name="Minutes" xml:space="preserve">
|
||||
<value>分组</value>
|
||||
<value>分钟</value>
|
||||
</data>
|
||||
<data name="MouseAngleSnapping" xml:space="preserve">
|
||||
<value>角度校正</value>
|
||||
@@ -474,7 +477,7 @@
|
||||
<value>按键响应</value>
|
||||
</data>
|
||||
<data name="MouseLiftOffDistance" xml:space="preserve">
|
||||
<value>静默高度</value>
|
||||
<value>响应高度</value>
|
||||
</data>
|
||||
<data name="MouseLowBatteryWarning" xml:space="preserve">
|
||||
<value>低于该电量时警告</value>
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
<data name="BatteryHealth" xml:space="preserve">
|
||||
<value>電池健康度</value>
|
||||
</data>
|
||||
<data name="BatteryLimitFull" xml:space="preserve">
|
||||
<value>僅本次將電力充滿</value>
|
||||
</data>
|
||||
<data name="BiosAndDriverUpdates" xml:space="preserve">
|
||||
<value>BIOS與驅動程式更新 Updates</value>
|
||||
</data>
|
||||
|
||||
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 |
37
app/Settings.Designer.cs
generated
37
app/Settings.Designer.cs
generated
@@ -40,6 +40,7 @@ namespace GHelper
|
||||
labelMatrix = new Label();
|
||||
checkMatrix = new CheckBox();
|
||||
panelBattery = new Panel();
|
||||
buttonBatteryFull = new RButton();
|
||||
sliderBattery = new Slider();
|
||||
panelBatteryTitle = new Panel();
|
||||
labelBattery = new Label();
|
||||
@@ -278,6 +279,7 @@ namespace GHelper
|
||||
//
|
||||
panelBattery.AutoSize = true;
|
||||
panelBattery.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
panelBattery.Controls.Add(buttonBatteryFull);
|
||||
panelBattery.Controls.Add(sliderBattery);
|
||||
panelBattery.Controls.Add(panelBatteryTitle);
|
||||
panelBattery.Dock = DockStyle.Top;
|
||||
@@ -285,19 +287,39 @@ namespace GHelper
|
||||
panelBattery.Margin = new Padding(0);
|
||||
panelBattery.Name = "panelBattery";
|
||||
panelBattery.Padding = new Padding(20, 20, 20, 10);
|
||||
panelBattery.Size = new Size(827, 114);
|
||||
panelBattery.Size = new Size(827, 119);
|
||||
panelBattery.TabIndex = 5;
|
||||
//
|
||||
// buttonBatteryFull
|
||||
//
|
||||
buttonBatteryFull.Activated = false;
|
||||
buttonBatteryFull.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||
buttonBatteryFull.BackColor = SystemColors.ControlLight;
|
||||
buttonBatteryFull.BorderColor = Color.Transparent;
|
||||
buttonBatteryFull.BorderRadius = 2;
|
||||
buttonBatteryFull.FlatAppearance.BorderSize = 0;
|
||||
buttonBatteryFull.FlatStyle = FlatStyle.Flat;
|
||||
buttonBatteryFull.Font = new Font("Segoe UI", 7.125F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
buttonBatteryFull.ForeColor = SystemColors.ControlDark;
|
||||
buttonBatteryFull.Location = new Point(730, 66);
|
||||
buttonBatteryFull.Margin = new Padding(0);
|
||||
buttonBatteryFull.Name = "buttonBatteryFull";
|
||||
buttonBatteryFull.Secondary = true;
|
||||
buttonBatteryFull.Size = new Size(73, 36);
|
||||
buttonBatteryFull.TabIndex = 41;
|
||||
buttonBatteryFull.Text = "100%";
|
||||
buttonBatteryFull.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// sliderBattery
|
||||
//
|
||||
sliderBattery.AccessibleName = "Battery Charge Limit";
|
||||
sliderBattery.Dock = DockStyle.Top;
|
||||
sliderBattery.Location = new Point(20, 64);
|
||||
sliderBattery.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||
sliderBattery.Location = new Point(20, 65);
|
||||
sliderBattery.Margin = new Padding(4);
|
||||
sliderBattery.Max = 100;
|
||||
sliderBattery.Min = 40;
|
||||
sliderBattery.Name = "sliderBattery";
|
||||
sliderBattery.Size = new Size(787, 40);
|
||||
sliderBattery.Size = new Size(706, 40);
|
||||
sliderBattery.Step = 5;
|
||||
sliderBattery.TabIndex = 20;
|
||||
sliderBattery.Text = "sliderBattery";
|
||||
@@ -354,7 +376,7 @@ namespace GHelper
|
||||
panelFooter.AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
panelFooter.Controls.Add(tableButtons);
|
||||
panelFooter.Dock = DockStyle.Top;
|
||||
panelFooter.Location = new Point(11, 1435);
|
||||
panelFooter.Location = new Point(11, 1440);
|
||||
panelFooter.Margin = new Padding(0);
|
||||
panelFooter.Name = "panelFooter";
|
||||
panelFooter.Padding = new Padding(20);
|
||||
@@ -1232,7 +1254,7 @@ namespace GHelper
|
||||
panelVersion.Controls.Add(labelCharge);
|
||||
panelVersion.Controls.Add(checkStartup);
|
||||
panelVersion.Dock = DockStyle.Top;
|
||||
panelVersion.Location = new Point(11, 1379);
|
||||
panelVersion.Location = new Point(11, 1384);
|
||||
panelVersion.Margin = new Padding(4);
|
||||
panelVersion.Name = "panelVersion";
|
||||
panelVersion.Size = new Size(827, 56);
|
||||
@@ -1417,7 +1439,7 @@ namespace GHelper
|
||||
MinimumSize = new Size(822, 71);
|
||||
Name = "SettingsForm";
|
||||
Padding = new Padding(11);
|
||||
ShowIcon = false;
|
||||
ShowIcon = true;
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "G-Helper";
|
||||
panelMatrix.ResumeLayout(false);
|
||||
@@ -1550,5 +1572,6 @@ namespace GHelper
|
||||
private RButton buttonUpdates;
|
||||
private Label labelCharge;
|
||||
private RButton buttonFnLock;
|
||||
private RButton buttonBatteryFull;
|
||||
}
|
||||
}
|
||||
187
app/Settings.cs
187
app/Settings.cs
@@ -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;
|
||||
|
||||
@@ -32,16 +33,19 @@ namespace GHelper
|
||||
|
||||
public static System.Timers.Timer sensorTimer = default!;
|
||||
|
||||
public Matrix? matrix;
|
||||
public Fans? fans;
|
||||
public Extra? keyb;
|
||||
public Updates? updates;
|
||||
public Matrix? matrixForm;
|
||||
public Fans? fansForm;
|
||||
public Extra? extraForm;
|
||||
public Updates? updatesForm;
|
||||
|
||||
static long lastRefresh;
|
||||
static long lastBatteryRefresh;
|
||||
static long lastLostFocus;
|
||||
|
||||
bool isGpuSection = true;
|
||||
|
||||
bool batteryMouseOver = false;
|
||||
bool batteryFullMouseOver = false;
|
||||
|
||||
public SettingsForm()
|
||||
{
|
||||
@@ -86,6 +90,7 @@ namespace GHelper
|
||||
buttonUpdates.Text = Properties.Strings.Updates;
|
||||
|
||||
FormClosing += SettingsForm_FormClosing;
|
||||
Deactivate += SettingsForm_LostFocus;
|
||||
|
||||
buttonSilent.BorderColor = colorEco;
|
||||
buttonBalanced.BorderColor = colorStandard;
|
||||
@@ -193,6 +198,10 @@ namespace GHelper
|
||||
buttonPeripheral2.MouseEnter += ButtonPeripheral_MouseEnter;
|
||||
buttonPeripheral3.MouseEnter += ButtonPeripheral_MouseEnter;
|
||||
|
||||
buttonBatteryFull.MouseEnter += ButtonBatteryFull_MouseEnter;
|
||||
buttonBatteryFull.MouseLeave += ButtonBatteryFull_MouseLeave;
|
||||
buttonBatteryFull.Click += ButtonBatteryFull_Click;
|
||||
|
||||
Text = "G-Helper " + (ProcessHelper.IsUserAdministrator() ? "—" : "-") + " " + AppConfig.GetModelShort();
|
||||
TopMost = AppConfig.Is("topmost");
|
||||
|
||||
@@ -206,6 +215,27 @@ namespace GHelper
|
||||
panelPerformance.Focus();
|
||||
}
|
||||
|
||||
private void SettingsForm_LostFocus(object? sender, EventArgs e)
|
||||
{
|
||||
lastLostFocus = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
||||
}
|
||||
|
||||
private void ButtonBatteryFull_Click(object? sender, EventArgs e)
|
||||
{
|
||||
BatteryControl.ToggleBatteryLimitFull();
|
||||
}
|
||||
|
||||
private void ButtonBatteryFull_MouseLeave(object? sender, EventArgs e)
|
||||
{
|
||||
batteryFullMouseOver = false;
|
||||
RefreshSensors(true);
|
||||
}
|
||||
|
||||
private void ButtonBatteryFull_MouseEnter(object? sender, EventArgs e)
|
||||
{
|
||||
batteryFullMouseOver = true;
|
||||
labelCharge.Text = Properties.Strings.BatteryLimitFull;
|
||||
}
|
||||
|
||||
private void SettingsForm_Resize(object? sender, EventArgs e)
|
||||
{
|
||||
@@ -260,21 +290,26 @@ namespace GHelper
|
||||
|
||||
private void ButtonUpdates_Click(object? sender, EventArgs e)
|
||||
{
|
||||
if (updates == null || updates.Text == "")
|
||||
if (updatesForm == null || updatesForm.Text == "")
|
||||
{
|
||||
updates = new Updates();
|
||||
updates.Show();
|
||||
updatesForm = new Updates();
|
||||
AddOwnedForm(updatesForm);
|
||||
}
|
||||
|
||||
if (updatesForm.Visible)
|
||||
{
|
||||
updatesForm.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
updates.Close();
|
||||
updatesForm.Show();
|
||||
}
|
||||
}
|
||||
|
||||
public void VisualiseMatrix(string image)
|
||||
{
|
||||
if (matrix == null || matrix.Text == "") return;
|
||||
matrix.VisualiseMatrix(image);
|
||||
if (matrixForm == null || matrixForm.Text == "") return;
|
||||
matrixForm.VisualiseMatrix(image);
|
||||
}
|
||||
|
||||
protected override void WndProc(ref Message m)
|
||||
@@ -290,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");
|
||||
@@ -522,19 +557,20 @@ namespace GHelper
|
||||
private void ButtonMatrix_Click(object? sender, EventArgs e)
|
||||
{
|
||||
|
||||
if (matrix == null || matrix.Text == "")
|
||||
if (matrixForm == null || matrixForm.Text == "")
|
||||
{
|
||||
matrix = new Matrix();
|
||||
matrixForm = new Matrix();
|
||||
AddOwnedForm(matrixForm);
|
||||
}
|
||||
|
||||
if (matrix.Visible)
|
||||
if (matrixForm.Visible)
|
||||
{
|
||||
matrix.Close();
|
||||
matrixForm.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
matrix.FormPosition();
|
||||
matrix.Show();
|
||||
matrixForm.FormPosition();
|
||||
matrixForm.Show();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -589,14 +625,19 @@ namespace GHelper
|
||||
|
||||
private void ButtonKeyboard_Click(object? sender, EventArgs e)
|
||||
{
|
||||
if (keyb == null || keyb.Text == "")
|
||||
if (extraForm == null || extraForm.Text == "")
|
||||
{
|
||||
keyb = new Extra();
|
||||
keyb.Show();
|
||||
extraForm = new Extra();
|
||||
AddOwnedForm(extraForm);
|
||||
}
|
||||
|
||||
if (extraForm.Visible)
|
||||
{
|
||||
extraForm.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
keyb.Close();
|
||||
extraForm.Show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -604,7 +645,7 @@ namespace GHelper
|
||||
{
|
||||
Invoke(delegate
|
||||
{
|
||||
if (fans != null && fans.Text != "") fans.InitAll();
|
||||
if (fansForm != null && fansForm.Text != "") fansForm.InitAll();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -612,26 +653,27 @@ namespace GHelper
|
||||
{
|
||||
Invoke(delegate
|
||||
{
|
||||
if (fans != null && fans.Text != "") fans.InitGPU();
|
||||
if (fansForm != null && fansForm.Text != "") fansForm.InitGPU();
|
||||
});
|
||||
}
|
||||
|
||||
public void FansToggle(int index = 0)
|
||||
{
|
||||
if (fans == null || fans.Text == "")
|
||||
if (fansForm == null || fansForm.Text == "")
|
||||
{
|
||||
fans = new Fans();
|
||||
fansForm = new Fans();
|
||||
AddOwnedForm(fansForm);
|
||||
}
|
||||
|
||||
if (fans.Visible)
|
||||
if (fansForm.Visible)
|
||||
{
|
||||
fans.Close();
|
||||
fansForm.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
fans.FormPosition();
|
||||
fans.Show();
|
||||
fans.ToggleNavigation(index);
|
||||
fansForm.FormPosition();
|
||||
fansForm.Show();
|
||||
fansForm.ToggleNavigation(index);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -657,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;
|
||||
|
||||
|
||||
@@ -688,7 +730,7 @@ namespace GHelper
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
AsusUSB.ApplyAura();
|
||||
Aura.ApplyAura();
|
||||
VisualiseAura();
|
||||
});
|
||||
}
|
||||
@@ -697,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();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -817,14 +859,39 @@ namespace GHelper
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes all forms except the settings. Hides the settings
|
||||
/// </summary>
|
||||
public void HideAll()
|
||||
{
|
||||
this.Hide();
|
||||
if (fans != null && fans.Text != "") fans.Close();
|
||||
if (keyb != null && keyb.Text != "") keyb.Close();
|
||||
if (updates != null && updates.Text != "") updates.Close();
|
||||
if (fansForm != null && fansForm.Text != "") fansForm.Close();
|
||||
if (extraForm != null && extraForm.Text != "") extraForm.Close();
|
||||
if (updatesForm != null && updatesForm.Text != "") updatesForm.Close();
|
||||
if (matrixForm != null && matrixForm.Text != "") matrixForm.Close();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Brings all visible windows to the top, with settings being the focus
|
||||
/// </summary>
|
||||
public void ShowAll()
|
||||
{
|
||||
this.Activate();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Check if any of fans, keyboard, update, or itself has focus
|
||||
/// </summary>
|
||||
/// <returns>Focus state</returns>
|
||||
public bool HasAnyFocus(bool lostFocusCheck = false)
|
||||
{
|
||||
return (fansForm != null && fansForm.ContainsFocus) ||
|
||||
(extraForm != null && extraForm.ContainsFocus) ||
|
||||
(updatesForm != null && updatesForm.ContainsFocus) ||
|
||||
(matrixForm != null && matrixForm.ContainsFocus) ||
|
||||
this.ContainsFocus ||
|
||||
(lostFocusCheck && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastLostFocus) < 300);
|
||||
}
|
||||
|
||||
private void SettingsForm_FormClosing(object? sender, FormClosingEventArgs e)
|
||||
{
|
||||
@@ -906,7 +973,7 @@ namespace GHelper
|
||||
labelMidFan.Text = "Mid " + HardwareControl.midFan;
|
||||
|
||||
labelBattery.Text = battery;
|
||||
if (!batteryMouseOver) labelCharge.Text = charge;
|
||||
if (!batteryMouseOver && !batteryFullMouseOver) labelCharge.Text = charge;
|
||||
|
||||
//panelPerformance.AccessibleName = labelPerf.Text + " " + trayTip;
|
||||
});
|
||||
@@ -918,8 +985,8 @@ namespace GHelper
|
||||
|
||||
public void LabelFansResult(string text)
|
||||
{
|
||||
if (fans != null && fans.Text != "")
|
||||
fans.LabelFansResult(text);
|
||||
if (fansForm != null && fansForm.Text != "")
|
||||
fansForm.LabelFansResult(text);
|
||||
}
|
||||
|
||||
public void ShowMode(int mode)
|
||||
@@ -978,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();
|
||||
|
||||
@@ -1035,7 +1102,8 @@ namespace GHelper
|
||||
buttonStopGPU.Visible = true;
|
||||
tableGPU.ColumnCount = 3;
|
||||
tableScreen.ColumnCount = 3;
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
buttonStopGPU.Visible = false;
|
||||
}
|
||||
@@ -1109,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;
|
||||
@@ -1121,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;
|
||||
}
|
||||
|
||||
@@ -1164,6 +1235,22 @@ namespace GHelper
|
||||
{
|
||||
labelBatteryTitle.Text = Properties.Strings.BatteryChargeLimit + ": " + limit.ToString() + "%";
|
||||
sliderBattery.Value = limit;
|
||||
VisualiseBatteryFull();
|
||||
}
|
||||
|
||||
public void VisualiseBatteryFull()
|
||||
{
|
||||
if (AppConfig.Is("charge_full"))
|
||||
{
|
||||
buttonBatteryFull.BackColor = colorStandard;
|
||||
buttonBatteryFull.ForeColor = SystemColors.ControlLightLight;
|
||||
}
|
||||
else
|
||||
{
|
||||
buttonBatteryFull.BackColor = buttonSecond;
|
||||
buttonBatteryFull.ForeColor = SystemColors.ControlDark;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
96
app/USB/AsusHid.cs
Normal file
96
app/USB/AsusHid.cs
Normal 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}");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
678
app/USB/Aura.cs
Normal file
678
app/USB/Aura.cs
Normal file
@@ -0,0 +1,678 @@
|
||||
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 = 0x12;
|
||||
|
||||
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" },
|
||||
{ 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"))
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
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 }, 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)
|
||||
{
|
||||
Color[] color_list = Enumerable.Repeat(color, 0x12).ToArray();
|
||||
ApplyColor(color_list, init);
|
||||
}
|
||||
|
||||
public static void ApplyColor(Color[] color, bool init = false)
|
||||
{
|
||||
|
||||
if (isACPI)
|
||||
{
|
||||
Program.acpi.TUFKeyboardRGB(0, color[0], 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 < AURA_ZONES; i++)
|
||||
{
|
||||
msg[start + i * 3] = color[i].R; // R
|
||||
msg[start + 1 + i * 3] = color[i].G; // G
|
||||
msg[start + 2 + i * 3] = color[i].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[0], color[0], 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 = 120;
|
||||
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
|
||||
|
||||
var screen_low = AmbientData.CamptureScreen(bound, 512, 288);
|
||||
Bitmap screeb_pxl;
|
||||
|
||||
if (isStrix) //laptop with lightbar
|
||||
{
|
||||
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[6].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(3, 1)); // right bck
|
||||
AmbientData.Colors[11].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(1, 1)); // left bck
|
||||
|
||||
AmbientData.Colors[7].RGB = AmbientData.Colors[6].RGB; // right
|
||||
AmbientData.Colors[10].RGB = AmbientData.Colors[11].RGB; // left
|
||||
|
||||
AmbientData.Colors[8].RGB = ColorUtils.HSV.UpSaturation(mid_right); // center right
|
||||
AmbientData.Colors[9].RGB = ColorUtils.HSV.UpSaturation(mid_left); // center left
|
||||
|
||||
for (int i = 0; i < 4; i++) // keyboard
|
||||
AmbientData.Colors[i].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(i, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
screeb_pxl = AmbientData.ResizeImage(screen_low, 1, 1);
|
||||
var average = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(0, 0), (float)0.3);
|
||||
for (int i = 0; i < 4; i++) //just color transfer from the bottom screen on keyboard
|
||||
AmbientData.Colors[i].RGB = average;
|
||||
}
|
||||
|
||||
|
||||
//screeb_pxl.Save("test.jpg", ImageFormat.Jpeg);
|
||||
screen_low.Dispose();
|
||||
screeb_pxl.Dispose();
|
||||
|
||||
bool is_fresh = false;
|
||||
|
||||
for (int i = 0; i < AURA_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)
|
||||
ApplyColor(AmbientData.result, 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -74,6 +74,21 @@ Each BIOS mode is paired with matching Windows Power Mode. You can adjust this s
|
||||
|
||||

|
||||
|
||||
### :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?
|
||||
@@ -93,13 +108,15 @@ 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
|
||||
|
||||
#### When I try to apply a custom fan curve I get "BIOS rejected fan curve"
|
||||
TUF models from 2021 and older don't support custom fan curves at all. Most probably you didn't have them in Armoury as well?
|
||||
TUF models from 2021 and older don't support custom fan curves at all. Most probably you didn't have them in the Armoury as well?
|
||||
|
||||
#### I don't see a GPU temperature in G-helper
|
||||
Most probably either you are using Eco / Optimized mode and your dGPU is simply off, or your windows has put the dGPU into sleep to preserve power.
|
||||
@@ -110,7 +127,7 @@ Please check the system tray for a ``(G)`` icon. By default Windows is keen to h
|
||||
#### App crashes or doesn't work properly
|
||||
Open "Event Viewer" from the start menu, go to Windows Logs -> Application and check for recent Errors mentioning G-Helper. If you see one - please post a [new issue](https://github.com/seerge/g-helper/issues) with all details from this error.
|
||||
|
||||
#### Can I use MyASUS app along with G-Helper?
|
||||
#### Can I use the MyASUS app along with G-Helper?
|
||||
You can, the only problem is that MyASUS may override the battery charge limit that you set before. My advice in such a situation would be to set the same limit (i.e. 80%) in both MyASUS and G-Helper.
|
||||
|
||||
#### How do I set Mute Microphone to M3?
|
||||
@@ -123,7 +140,7 @@ Personally, I'm not a big fan of them, as they make colors very inaccurate. But
|
||||
Make sure that your dGPU is enabled (i.e. it's not in Eco mode). Open Fans + Power section and adjust core / memory clock offsets. They work the same as in armoury's manual mode. Please keep in mind that (unfortunately) you need admin permissions for that, and the app will ask you for them. (*)
|
||||
|
||||
#### How to Undervolt GPU
|
||||
Due to the way of how Core Clock offset works for GPU. When you increase clock offset you undervolt it at the same time (see picture)
|
||||
Due to the way the Core Clock offset works for the GPU. When you increase clock offset you undervolt it at the same time (see picture)
|
||||
1. Increase ``Core Clock Offset`` under ``Fans + Power -> GPU`` until your 3dmark / furmark / game runs stable. Start with +100, +150, +200 ... This should make your **scores / fps better within same power** / heat as before.
|
||||
2. Set ``Core Clock Limit`` to a certain value (it really depends on application / game that you use) **to lower your power** / heat consumption
|
||||
|
||||
@@ -250,7 +267,7 @@ Example (for default windows "balanced" power plan):
|
||||
```
|
||||
|
||||
### Alternative Activation for XG Mobile 6850XT
|
||||
If you experience situation when your XG Mobile doesn't work on full power when Activated. It's possible it needs "alternative" command to get activated.
|
||||
If you experience a situation when your XG Mobile doesn't work on full power when Activated. It's possible it needs an "alternative" command to get activated.
|
||||
To turn it on, add following line to config :
|
||||
```
|
||||
"xgm_special" : 1,
|
||||
@@ -258,7 +275,7 @@ To turn it on, add following line to config :
|
||||
|
||||
### Override UI theme
|
||||
|
||||
By default app would set UI theme from "app" theme in windows setting. You can override it to specific theme, or general windows theme
|
||||
By default the app would set the UI theme from the "app" theme in Windows setting. You can override it to specific theme, or general windows theme
|
||||
|
||||
```
|
||||
"ui_mode" : "dark",
|
||||
@@ -267,7 +284,7 @@ By default app would set UI theme from "app" theme in windows setting. You can o
|
||||
```
|
||||
|
||||
### Skip keyboard Aura initialisation on startup
|
||||
By default app would set last remembered RGB mode for keyboard on each launch. To disable it completely
|
||||
By default the app would set the last remembered RGB mode for the keyboard on each launch. To disable it completely
|
||||
|
||||
```
|
||||
"skip_aura" : 1,
|
||||
@@ -280,7 +297,7 @@ Disable app's OSD (for performance modes, keyboard backlight, etc.)
|
||||
```
|
||||
|
||||
### Disable "Tablet mode" on X13/X16
|
||||
To disable automatic touchpad toggling when laptop enteres / leaves tablet mode
|
||||
To disable automatic touchpad toggling when laptop enters / leaves tablet mode
|
||||
```
|
||||
"disable_tablet": 1,
|
||||
```
|
||||
@@ -296,20 +313,24 @@ If you don't want this bindings to work you can add
|
||||
"skip_hotkeys":1,
|
||||
```
|
||||
|
||||
### Toggle Performance Mode key binding
|
||||
|
||||
To change binding for Toggle Performance Modes to ``Ctrl + Shift + KEY``
|
||||
### Toggle Performance Mode or Toggle App Window key binding
|
||||
|
||||
To change binding for Toggle Performance Modes forward / backward to ``Ctrl + Shift + KEY`` / ``Ctrl + Shift + Alt + KEY``
|
||||
```
|
||||
"keybind_profile": 116,
|
||||
```
|
||||
|
||||
To change binding for Toggle App Window to ``Ctrl + Shift + KEY``
|
||||
```
|
||||
"keybind_app": 123,
|
||||
```
|
||||
|
||||
Where 116 is [numerical code for desired key](https://www.oreilly.com/library/view/javascript-dhtml/9780596514082/apb.html). Put 0 to completely disable this binding.
|
||||
|
||||
|
||||
### Higher Maximum GPU Clock / Memory Offsets
|
||||
|
||||
By default under GPU section you can set up to +250/+250 for Core and Memory Clock Offset. To increase this value:
|
||||
By default under the GPU section you can set up to +250/+250 for Core and Memory Clock Offset. To increase this value:
|
||||
```
|
||||
"max_gpu_core": 300,
|
||||
"max_gpu_memory": 1500,
|
||||
@@ -322,7 +343,9 @@ Select ``Custom`` next to appropriate hotkey under ``Extra`` settings and do one
|
||||
1. To run any custom application - put a full path to exe into "action" text field, for example:
|
||||
``C:\Program Files\EA Games\Battlefield 2042\BF2042.exe``
|
||||
|
||||
2. To simulate any windows key - put appropriate keycode into the "action" field, for example ``0x2C`` for Print Screen.
|
||||
2. To simulate any windows key or key-combination - put appropriate keycode(s) into the "action" field separated by space.
|
||||
For example ``0x2C`` for ``Print Screen`` or ``0x11 0xA0 0x31`` for ``Ctrl+Shift+1``
|
||||
|
||||
Full list of keycodes https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
|
||||
|
||||

|
||||
|
||||
Reference in New Issue
Block a user