Compare commits

...

128 Commits

Author SHA1 Message Date
Serge
4ba11f1f9f Version bump 2023-12-11 13:53:12 +01:00
Serge
382080922d White only keyboard detection for GA503R https://github.com/seerge/g-helper/issues/1714 2023-12-09 17:51:12 +01:00
Serge
d439d20c13 Merge branch 'main' of https://github.com/seerge/g-helper 2023-12-09 14:42:16 +01:00
Serge
24199b3036 Matrix Contrast slider https://github.com/seerge/g-helper/issues/1713 2023-12-09 14:42:14 +01:00
Serge
d45ce23d9a Update README.md 2023-12-09 00:58:00 +01:00
Serge
34ae2e536d New Crowdin updates (#1708)
* New translations strings.resx (French)

* New translations strings.resx (Chinese Simplified)
2023-12-08 13:44:42 +01:00
Serge
64e3b3bbd6 Added M16 2023 to the list of devices that support GPU enabling on shutdown https://www.reddit.com/r/ZephyrusM16/comments/18chukc/comment/kcd132i/?context=3 2023-12-07 14:31:05 +01:00
Serge
f3fd590be4 Version Bump 2023-12-07 11:25:08 +01:00
Serge
6a9d47a61d UI Fixes https://github.com/seerge/g-helper/issues/1701 2023-12-07 11:12:57 +01:00
Serge
3848ef9a43 New translations strings.resx (Polish) (#1692) 2023-12-03 21:55:37 +01:00
Serge
84c7fdb3bf Removed ACPI requirement for non-asus models https://github.com/seerge/g-helper/issues/1676 2023-12-03 12:17:07 +01:00
Serge
013c83fd60 Merge branch 'main' of https://github.com/seerge/g-helper 2023-12-03 11:23:17 +01:00
Serge
b31ed8338a G14 2023 white-only / RGB detection https://github.com/seerge/g-helper/issues/1686 2023-12-03 11:23:14 +01:00
Serge
6f9eb1e9c5 New translations strings.resx (Spanish) (#1681) 2023-12-01 22:56:15 +01:00
Hamza Rizwan
f19ea5eaf6 Update AppConfig.cs (#1682)
Added "G713RC" to the list of limited Strix RGB models
2023-12-01 22:56:01 +01:00
Serge
0db3665dd2 New Crowdin updates (#1680)
* New translations strings.resx (Portuguese)

* New translations strings.resx (Romanian)

* New translations strings.resx (French)

* New translations strings.resx (Spanish)

* New translations strings.resx (German)

* New translations strings.resx (Hungarian)

* New translations strings.resx (Italian)

* New translations strings.resx (Korean)

* New translations strings.resx (Lithuanian)

* New translations strings.resx (Polish)

* New translations strings.resx (Turkish)

* New translations strings.resx (Ukrainian)

* New translations strings.resx (Chinese Simplified)

* New translations strings.resx (Chinese Traditional)

* New translations strings.resx (Vietnamese)

* New translations strings.resx (Portuguese, Brazilian)

* New translations strings.resx (Indonesian)
2023-12-01 16:52:24 +01:00
Serge
68c17368f0 Version bump 2023-12-01 16:52:13 +01:00
Serge
12a2a147d4 Hide APU memory setting for non-ally models 2023-12-01 16:50:53 +01:00
Serge
1b10be93ed UI fix https://github.com/seerge/g-helper/issues/1669 2023-12-01 16:44:55 +01:00
Serge Samusya
1e29aeda17 APU Mem value fixes 2023-12-01 16:26:07 +01:00
Serge Samusya
32c4f6168c Rog Ally GPU Memory setting 2023-12-01 14:38:50 +01:00
Serge
5d945d6b7c New translations strings.resx (Portuguese) (#1664) 2023-11-28 17:02:59 +01:00
Serge
1c27eee293 Merge branch 'main' of https://github.com/seerge/g-helper 2023-11-27 20:17:52 +01:00
Serge
1efc722f93 Improved single-color keyboard detection for G14 https://github.com/seerge/g-helper/issues/1646 2023-11-27 20:17:50 +01:00
IceStormNG
4a1e585c69 Added support for ROG Chakram Core (P511) (#1662) 2023-11-27 15:10:54 +01:00
Serge
3bab1a271b Moved action block to prevent unnecessary actions on main window toggle https://github.com/seerge/g-helper/pull/1651 2023-11-25 19:53:54 +01:00
Serge
5b2017299c Hotkeys for Eco/Standard modes https://github.com/seerge/g-helper/issues/1637 2023-11-24 10:12:11 +01:00
Serge
f4cc4b4ac5 Added G513QM to the list of models with limited RGB https://github.com/seerge/g-helper/issues/1641 2023-11-23 18:02:27 +01:00
Serge
36d6d6af48 Stirx Numpad fixes https://github.com/seerge/g-helper/pull/1638 2023-11-23 12:28:52 +01:00
David
93d639fc6f fix: ulterior fixes from #1636 (#1638)
* fix: Ambient Mode for 17 inch keyboards

* fix: removed debugging keys, added "skip" for 15inch, refactor

---------

Co-authored-by: Serge <5920850+seerge@users.noreply.github.com>
2023-11-23 12:16:10 +01:00
Serge
1f6a2a9ac5 Enable dGPU on shutdown for X13 2022 https://github.com/seerge/g-helper/discussions/1042#discussioncomment-7646782 2023-11-23 09:42:19 +01:00
David
8bcac73824 fix: Ambient Mode for 17 inch keyboards (#1636) 2023-11-23 09:34:28 +01:00
DLdota
4e46a20eff Ambient 1 zone improve (#1635)
* ....

* Amvietn: improved color for 1-zone
2023-11-22 20:51:11 +01:00
Serge
1d2f1d3bb2 Removed unsupported RGB modes for G513IE https://github.com/seerge/g-helper/issues/1627 2023-11-22 09:58:28 +01:00
Serge
eeaa906749 Aura num-pad buttons mapping 2023-11-21 22:51:05 +01:00
Serge
22bfc77a7a Icon Helper 2023-11-21 13:13:29 +01:00
Serge
267cf6387f Icons cleanup 2023-11-21 13:07:03 +01:00
Siddiqui Abdul Rahman
45e7e5551e setting different icon for taskbar and title bar (#1614)
* setting different icon for taskbar and title bar

* fixing variables
2023-11-21 12:45:54 +01:00
Serge
bb796b8818 Aura init fix 2023-11-21 12:43:10 +01:00
Serge
d9b615ce2d Z13 fix https://github.com/seerge/g-helper/issues/1622 2023-11-20 16:16:38 +01:00
Serge
035c60da2e Version bump 2023-11-20 10:32:47 +01:00
Serge
e096699909 Update README.md 2023-11-20 09:01:40 +01:00
DLdota
bf1ffddf15 Added map for Strix 4-Zone RGB (#1619)
* ....

* Strix 4 Zone RGB
2023-11-20 09:00:22 +01:00
Serge
fad7396c8f Cleanup 2023-11-19 23:20:24 +01:00
Serge
af4a5e8af7 Fix 2023-11-19 21:51:11 +01:00
Serge
3d2be97cf6 Experimental Per-key Aura 2023-11-19 21:49:25 +01:00
Serge
b6fe7c9ddf OpenRGB pey-key Aura implementation 2023-11-19 19:24:59 +01:00
Serge
f2085b836b Aura HID fixes https://github.com/seerge/g-helper/issues/1616 2023-11-19 15:15:19 +01:00
Serge
ccf2ae9eed Asus HID fixes https://github.com/seerge/g-helper/issues/1616 2023-11-19 13:17:07 +01:00
Serge
e4bcc8f66c Removed F12 binding completely 2023-11-18 09:30:03 +01:00
Serge
0f11ffe8f0 AsusHID tweaks 2023-11-17 20:21:54 +01:00
Serge
96cbcbaf7f Version Bump 2023-11-17 17:57:36 +01:00
Serge
0c1ababcf8 Ambient Aura tweaks 2023-11-17 17:56:40 +01:00
Serge
36eae610e8 Triple-key binding fix https://github.com/seerge/g-helper/issues/1608 2023-11-17 17:41:55 +01:00
Serge
69757ff460 Remove unsupported RGB modes for G513RM https://github.com/seerge/g-helper/issues/1603 2023-11-17 11:03:42 +01:00
Serge
744bce1819 Hide icon 2023-11-17 10:48:15 +01:00
Serge
fac145811e XGM fix for HidSharp 2023-11-16 14:40:47 +01:00
Serge
7eb6884aa4 Fn-lock tweaks https://github.com/seerge/g-helper/issues/1596#issuecomment-1811379482 2023-11-15 14:12:08 +01:00
Serge
f8df547afb Init FnLock for vivobooks on startup https://github.com/seerge/g-helper/issues/1596 2023-11-14 19:01:49 +01:00
Serge
6737af2da4 Average ambient color 2023-11-13 23:25:17 +01:00
Serge
d859c56e27 Single color ambient tweaks 2023-11-13 23:05:34 +01:00
DLdota
0f56883c37 Ambient + Custom colors effect for ROG Strix (#1582)
* Added ambient effect.
Refact AsusUSB.cs

* merge

* Improved perfomance for Ambient effect.
Added AuraMsg.cs

* Fix leaked.
Decrease saturation.

* returned the old form formatting

* Fixed color size

* Removed visible colors for ambient effect

* Add comments

* Improved performance by 60%

* merge

* added "init = true" for effect
2023-11-13 22:05:33 +01:00
Serge
229255fbff Cleanup 2023-11-13 13:51:54 +01:00
Serge
786bb4eadf Listener tweaks 2023-11-13 10:32:36 +01:00
Serge
42847de055 Merge branch 'main' of https://github.com/seerge/g-helper 2023-11-13 10:28:49 +01:00
Serge
6787d38678 Main window icon 2023-11-13 10:28:45 +01:00
Serge
8c0a0a2c92 Update README.md 2023-11-13 10:08:31 +01:00
Oleg Yermolenko
8eaafcacb7 fix toggle touchpad (#1595) 2023-11-13 10:04:54 +01:00
Serge
940993e1d5 Adjust icon with GPU mode 2023-11-12 22:37:23 +01:00
Serge
5c4500315c Migrated Aura & XGM communication to HidSharp library to speed things up (#1594)
* Cleanup

* Touchpad toggle fix for FA507 https://github.com/seerge/g-helper/issues/1589

* Cleanup
2023-11-12 22:28:37 +01:00
Serge
dd52f8039c Version bump 2023-11-12 11:48:29 +01:00
Serge
9f56aa9d3d Detect Z13 keyboard reconnection https://github.com/seerge/g-helper/issues/1581 2023-11-12 11:48:06 +01:00
Serge
f6602fff3c Remove logo/lid backlight checkboxes for G512LI https://github.com/seerge/g-helper/issues/1575 2023-11-09 12:30:59 +01:00
Serge
5a7dc5c707 Merge branch 'main' of https://github.com/seerge/g-helper 2023-11-08 17:59:18 +01:00
Serge
e6d7a6f8b3 Removed RGB color selection for FX516P https://github.com/seerge/g-helper/issues/1571 2023-11-08 17:59:15 +01:00
Serge
5cd77249a7 Update README.md 2023-11-05 14:16:19 +01:00
Serge
d9e0045af5 ROG key binding for DUO models https://github.com/seerge/g-helper/discussions/1560 2023-11-03 21:55:35 +01:00
Serge
a66df0a394 Allow setting GPU clock limit when clock offsets are default https://github.com/seerge/g-helper/issues/1557 2023-11-03 21:54:41 +01:00
Serge
f7435b2789 More flexible GPU clock limit settings https://github.com/seerge/g-helper/discussions/1555#discussioncomment-7454925 2023-11-02 14:58:43 +01:00
Serge
f49e2ee1e8 Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-31 18:03:25 +01:00
Serge
f854c8e088 Fix for (someitmes) not working hotkeys on Z13 https://github.com/seerge/g-helper/issues/1547 2023-10-31 18:03:23 +01:00
Serge
bc6edcb38e New Crowdin updates (#1537)
* New translations strings.resx (French)

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

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

* New translations strings.resx (Indonesian)
https://github.com/seerge/g-helper/pull/1462 @aliazhar-id
2023-10-13 11:59:25 +02:00
Serge
8d8cfb0521 Merge pull request #1452 from seerge/l10n_main
New Crowdin updates
2023-10-12 15:40:25 +02:00
Serge
f021135f53 New translations strings.resx (German) 2023-10-12 13:49:12 +02:00
Serge
98670414d2 Merge pull request #1451 from IceStormNG/asus-mouse-support
TUF M5 has 3 profiles, not just 1
2023-10-12 12:21:20 +02:00
IceStormNG
a41595068e TUF M5 has 3 profiles, not just 1 2023-10-12 12:19:02 +02:00
Serge
d58c277733 Exception fix https://github.com/seerge/g-helper/issues/1447 2023-10-11 19:24:41 +02:00
Serge
5701a287aa Version bump 2023-10-10 13:28:26 +02:00
Serge
1968b6487c Merge pull request #1436 from IceStormNG/asus-mouse-support
Remove unsupported lighting modes for  Keris Wireless Aimpoint
2023-10-07 12:20:16 +02:00
IceStormNG
95103108f2 Remove unsupported modes from the keris wireless aimpoint 2023-10-07 12:09:52 +02:00
Serge
defb0790e5 Merge pull request #1434 from seerge/l10n_main
New Crowdin updates
2023-10-07 01:13:17 +02:00
Serge
9da45b43ea New translations strings.resx (Turkish) 2023-10-06 22:30:11 +02:00
Serge
32a20c3cce New translations strings.resx (Turkish) 2023-10-06 21:32:57 +02:00
Serge
763337aedd Keyboard label https://github.com/seerge/g-helper/issues/1428 2023-10-06 11:59:17 +02:00
Serge
f1b51a726b Added FX517Z to list of single-color RGB devices https://github.com/seerge/g-helper/issues/1425 2023-10-06 10:51:27 +02:00
Serge
a085615398 Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-06 10:48:36 +02:00
Serge
d32a3452f9 Swapped F7/F8 actions for FX506LH https://github.com/seerge/g-helper/issues/1429 2023-10-06 10:48:34 +02:00
Serge
433022b65d Removed unsupported RGB flags for G614J https://github.com/seerge/g-helper/issues/1428 2023-10-06 10:42:23 +02:00
Serge
460f921836 Removed unsupported RGB modes for G614J https://github.com/seerge/g-helper/issues/1420 2023-10-06 10:35:21 +02:00
Serge
1e2620c484 Merge pull request #1422 from seerge/l10n_main
New Crowdin updates
2023-10-05 21:57:40 +02:00
Serge
e774f704dd New translations strings.resx (Chinese Simplified) 2023-10-05 21:28:34 +02:00
Serge
aa327f563f New translations strings.resx (Chinese Simplified) 2023-10-05 19:29:35 +02:00
Serge
b9de97ecf4 Merge pull request #1419 from IceStormNG/asus-mouse-support
Support for ROG Chakram P704
2023-10-05 18:55:38 +02:00
IceStormNG
5d7af9bdcd Merge branch 'seerge:main' into asus-mouse-support 2023-10-05 18:23:47 +02:00
IceStormNG
c2ca761d99 Adds support for the ROG Chakram (P704) 2023-10-05 18:21:53 +02:00
Serge
e480ee6f12 Merge pull request #1416 from seerge/l10n_main
New Crowdin updates
2023-10-04 18:16:53 +02:00
nopeless
393cb3300c fix: breaking workflow and upload artifact (#1417)
* feat: allow manual executable build for github

* fix: manual dispatch behavior

* fix: use full sha
2023-10-04 18:14:31 +02:00
nopeless
ee90fe4a3d feat: allow manual executable build for github (#1415) 2023-10-04 17:35:04 +02:00
Serge
a0628ef368 New translations strings.resx (Polish) 2023-10-04 17:32:21 +02:00
Serge
701a7d99c4 Tray icon-click fix https://github.com/seerge/g-helper/pull/1407#issuecomment-1746823625 2023-10-04 15:03:07 +02:00
IceStormNG
667d365992 Merge branch 'seerge:main' into asus-mouse-support 2023-10-04 13:44:05 +02:00
IceStormNG
6232fb1cfb Support for TUF Gaming M5 Mouse. (#1414) 2023-10-04 13:10:26 +02:00
IceStormNG
a92924840b Support for TUF Gaming M5 Mouse. 2023-10-04 13:05:21 +02:00
61 changed files with 3351 additions and 1006 deletions

View File

@@ -3,6 +3,8 @@ name: Release
on:
release:
types: [ published ]
workflow_dispatch:
permissions:
contents: write

View File

@@ -347,7 +347,10 @@ namespace GHelper.AnimeMatrix
int matrixX = AppConfig.Get("matrix_x", 0);
int matrixY = AppConfig.Get("matrix_y", 0);
int matrixZoom = AppConfig.Get("matrix_zoom", 100);
int matrixContrast = AppConfig.Get("matrix_contrast", 100);
int matrixSpeed = AppConfig.Get("matrix_speed", 50);
MatrixRotation rotation = (MatrixRotation)AppConfig.Get("matrix_rotation", 0);
@@ -368,9 +371,9 @@ namespace GHelper.AnimeMatrix
image.SelectActiveFrame(dimension, i);
if (rotation == MatrixRotation.Planar)
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality);
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
else
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality);
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
device.AddFrame();
}
@@ -385,9 +388,9 @@ namespace GHelper.AnimeMatrix
else
{
if (rotation == MatrixRotation.Planar)
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality);
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
else
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality);
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
device.Present();
}

View File

@@ -399,21 +399,21 @@ namespace Starlight.AnimeMatrix
}
private void SetBitmapDiagonal(Bitmap bmp, int deltaX = 0, int deltaY = 0)
private void SetBitmapDiagonal(Bitmap bmp, int deltaX = 0, int deltaY = 0, int contrast = 100)
{
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
var color = Math.Min((pixel.R + pixel.G + pixel.B) * contrast / 300, 255);
if (color > 20)
SetLedDiagonal(x, y, (byte)color, deltaX + (FullRows / 2) + 1, deltaY - (FullRows / 2) - 1);
}
}
}
private void SetBitmapLinear(Bitmap bmp)
private void SetBitmapLinear(Bitmap bmp, int contrast = 100)
{
for (int y = 0; y < bmp.Height; y++)
{
@@ -421,7 +421,7 @@ namespace Starlight.AnimeMatrix
if (x % 2 == y % 2)
{
var pixel = bmp.GetPixel(x, y);
var color = (pixel.R + pixel.G + pixel.B) / 3;
var color = Math.Min((pixel.R + pixel.G + pixel.B) * contrast / 300, 255);
if (color > 20)
SetLedPlanar(x / 2, y, (byte)color);
}
@@ -468,7 +468,7 @@ namespace Starlight.AnimeMatrix
Present();
}
public void GenerateFrame(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
public void GenerateFrame(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default, int contrast = 100)
{
int width = MaxColumns / 2 * 6;
int height = MaxRows;
@@ -495,11 +495,11 @@ namespace Starlight.AnimeMatrix
}
Clear();
SetBitmapLinear(bmp);
SetBitmapLinear(bmp, contrast);
}
}
public void GenerateFrameDiagonal(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default)
public void GenerateFrameDiagonal(Image image, float zoom = 100, int panX = 0, int panY = 0, InterpolationMode quality = InterpolationMode.Default, int contrast = 100)
{
int width = MaxRows - FullRows;
int height = MaxRows - FullRows*2;
@@ -523,7 +523,7 @@ namespace Starlight.AnimeMatrix
}
Clear();
SetBitmapDiagonal(bmp, -panX, height + panY);
SetBitmapDiagonal(bmp, -panX, height + panY, contrast);
}
}

View File

@@ -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") || ContainsModel("FX506IC");
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,16 @@ public static class AppConfig
return ContainsModel("Strix") || ContainsModel("Scar");
}
public static bool IsStrixLimitedRGB()
{
return ContainsModel("G614JV") || ContainsModel("G614JZ") || ContainsModel("G512LI") || ContainsModel("G513RS") || ContainsModel("G513RM") || ContainsModel("G713PV") || ContainsModel("G513IE") || ContainsModel("G513QM") || ContainsModel("G713RC");
}
public static bool IsStrixNumpad()
{
return ContainsModel("G713R");
}
public static bool IsZ13()
{
return ContainsModel("Z13");
@@ -417,7 +428,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("GV301") || ContainsModel("GZ301") || ContainsModel("FX506") || ContainsModel("GU603") || ContainsModel("GU604") || ContainsModel("G614J");
}
public static bool IsGPUFix()
@@ -435,4 +446,13 @@ public static class AppConfig
return ContainsModel("GV301RA") || ContainsModel("GV302XA") || IsAlly();
}
public static bool IsHardwareTouchpadToggle()
{
return ContainsModel("FA507");
}
public static bool IsASUS()
{
return ContainsModel("ROG") || ContainsModel("TUF") || ContainsModel("Vivobook") || ContainsModel("Zenbook");
}
}

View File

@@ -1,4 +1,5 @@
using GHelper;
using GHelper.USB;
using System.Management;
using System.Runtime.InteropServices;
@@ -35,7 +36,7 @@ public class AsusACPI
const uint INIT = 0x54494E49;
public const uint UniversalControl = 0x00100021;
public const int KB_Light_Up = 0xc4;
public const int KB_Light_Down = 0xc5;
public const int Brightness_Down = 0x10;
@@ -93,6 +94,8 @@ public class AsusACPI
public const int PPT_APUC1 = 0x001200C1; // fPPT (fast boost limit)
public const int PPT_GPUC2 = 0x001200C2; // NVIDIA GPU Temp Target (75.. 87 C)
public const int APU_MEM = 0x000600C1;
public const int TUF_KB_BRIGHTNESS = 0x00050021;
public const int TUF_KB = 0x00100056;
public const int TUF_KB2 = 0x0010005a;
@@ -182,6 +185,7 @@ public class AsusACPI
private static extern bool WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);
private IntPtr eventHandle;
private bool _connected = false;
// still works only with asus optimization service on , if someone knows how to get ACPI events from asus without that - let me know
public void RunListener()
@@ -208,22 +212,33 @@ public class AsusACPI
}
}
public bool IsConnected()
{
return _connected;
}
public AsusACPI()
{
handle = CreateFile(
FILE_NAME,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
IntPtr.Zero
);
if (handle == new IntPtr(-1))
try
{
throw new Exception("Can't connect to ACPI");
handle = CreateFile(
FILE_NAME,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
IntPtr.Zero
);
//handle = new IntPtr(-1);
//throw new Exception("ERROR");
_connected = true;
}
catch (Exception ex)
{
Logger.WriteLine($"Can't connect to ACPI: {ex.Message}");
}
if (AppConfig.IsAdvantageEdition()) MaxTotal = 250;
@@ -386,7 +401,7 @@ public class AsusACPI
byte min = (byte)(curve[8] * 255 / 100);
byte max = (byte)(curve[15] * 255 / 100);
byte[] range = { min, max};
byte[] range = { min, max };
int result;
switch (device)
@@ -418,7 +433,7 @@ public class AsusACPI
// it seems to be a bug, when some old model's bios can go nuts if fan is set to 100%
for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)100, curve[i])) * fanScale / 100);
for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)100, curve[i])) * fanScale / 100);
switch (device)
{
@@ -524,6 +539,75 @@ public class AsusACPI
return DeviceGet(PPT_CPUB0) >= 0 && DeviceGet(PPT_GPUC0) < 0;
}
public void SetAPUMem(int memory = 4)
{
if (memory < 0 || memory > 8) return;
int mem = 0;
switch (memory)
{
case 0:
mem = 0;
break;
case 1:
mem = 258;
break;
case 2:
mem = 259;
break;
case 3:
mem = 260;
break;
case 4:
mem = 261;
break;
case 5:
mem = 263;
break;
case 6:
mem = 264;
break;
case 7:
mem = 265;
break;
case 8:
mem = 262;
break;
}
Program.acpi.DeviceSet(APU_MEM, mem, "APU Mem");
}
public int GetAPUMem()
{
int memory = Program.acpi.DeviceGet(APU_MEM);
if (memory < 0) return -1;
switch (memory)
{
case 256:
return 0;
case 258:
return 1;
case 259:
return 2;
case 260:
return 3;
case 261:
return 4;
case 262:
return 8;
case 263:
return 5;
case 264:
return 6;
case 265:
return 7;
default:
return 4;
}
}
public void ScanRange()
{
@@ -549,11 +633,11 @@ 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];
setting[0] = (byte)0xb4;
setting[1] = (byte)mode;
setting[2] = color.R;

View File

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

View File

@@ -1,690 +0,0 @@
using GHelper.Gpu;
using GHelper.Helpers;
using HidLibrary;
using NAudio.Gui;
using System.Diagnostics;
using System.Drawing;
using System.Text;
namespace GHelper
{
public class AuraPower
{
public bool BootLogo;
public bool BootKeyb;
public bool AwakeLogo;
public bool AwakeKeyb;
public bool SleepLogo;
public bool SleepKeyb;
public bool ShutdownLogo;
public bool ShutdownKeyb;
public bool BootBar;
public bool AwakeBar;
public bool SleepBar;
public bool ShutdownBar;
public bool BootLid;
public bool AwakeLid;
public bool SleepLid;
public bool ShutdownLid;
public bool BootRear;
public bool AwakeRear;
public bool SleepRear;
public bool ShutdownRear;
}
public static class AsusUSB
{
public const int HEATMAP = 20;
public const int GPUMODE = 21;
public const int ASUS_ID = 0x0b05;
public const byte INPUT_HID_ID = 0x5a;
public const byte AURA_HID_ID = 0x5d;
public static readonly byte[] LED_INIT1 = new byte[] { AURA_HID_ID, 0xb9 };
public static readonly byte[] LED_INIT2 = Encoding.ASCII.GetBytes("]ASUS Tech.Inc.");
public static readonly byte[] LED_INIT3 = new byte[] { AURA_HID_ID, 0x05, 0x20, 0x31, 0, 0x1a };
public static readonly byte[] LED_INIT4 = Encoding.ASCII.GetBytes("^ASUS Tech.Inc.");
public static readonly byte[] LED_INIT5 = new byte[] { 0x5e, 0x05, 0x20, 0x31, 0, 0x1a };
static byte[] MESSAGE_APPLY = { AURA_HID_ID, 0xb4 };
static byte[] MESSAGE_SET = { AURA_HID_ID, 0xb5, 0, 0, 0 };
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6, 0x1abe };
private static int mode = 0;
private static int speed = 1;
public static Color Color1 = Color.White;
public static Color Color2 = Color.Black;
static bool isTuf = AppConfig.IsTUF() || AppConfig.IsVivobook();
static bool isStrix = AppConfig.IsStrix();
static public bool isSingleColor = false;
static bool isOldHeatmap = AppConfig.Is("old_heatmap");
static System.Timers.Timer timer = new System.Timers.Timer(2000);
static HidDevice? auraDevice = null;
static byte[] AuraPowerMessage(AuraPower flags)
{
byte keyb = 0, bar = 0, lid = 0, rear = 0;
if (flags.BootLogo) keyb |= 1 << 0;
if (flags.BootKeyb) keyb |= 1 << 1;
if (flags.AwakeLogo) keyb |= 1 << 2;
if (flags.AwakeKeyb) keyb |= 1 << 3;
if (flags.SleepLogo) keyb |= 1 << 4;
if (flags.SleepKeyb) keyb |= 1 << 5;
if (flags.ShutdownLogo) keyb |= 1 << 6;
if (flags.ShutdownKeyb) keyb |= 1 << 7;
if (flags.BootBar) bar |= 1 << 1;
if (flags.AwakeBar) bar |= 1 << 2;
if (flags.SleepBar) bar |= 1 << 3;
if (flags.ShutdownBar) bar |= 1 << 4;
if (flags.BootLid) lid |= 1 << 0;
if (flags.AwakeLid) lid |= 1 << 1;
if (flags.SleepLid) lid |= 1 << 2;
if (flags.ShutdownLid) lid |= 1 << 3;
if (flags.BootLid) lid |= 1 << 4;
if (flags.AwakeLid) lid |= 1 << 5;
if (flags.SleepLid) lid |= 1 << 6;
if (flags.ShutdownLid) lid |= 1 << 7;
if (flags.BootRear) rear |= 1 << 0;
if (flags.AwakeRear) rear |= 1 << 1;
if (flags.SleepRear) rear |= 1 << 2;
if (flags.ShutdownRear) rear |= 1 << 3;
if (flags.BootRear) rear |= 1 << 4;
if (flags.AwakeRear) rear |= 1 << 5;
if (flags.SleepRear) rear |= 1 << 6;
if (flags.ShutdownRear) rear |= 1 << 7;
return new byte[] { 0x5d, 0xbd, 0x01, keyb, bar, lid, rear, 0xFF };
}
static AsusUSB()
{
timer.Elapsed += Timer_Elapsed;
isSingleColor = AppConfig.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);
}
}
}

View File

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

99
app/Extra.Designer.cs generated
View File

@@ -106,6 +106,7 @@ namespace GHelper
checkAutoToggleClamshellMode = new CheckBox();
checkTopmost = new CheckBox();
checkNoOverdrive = new CheckBox();
checkBootSound = new CheckBox();
checkUSBC = new CheckBox();
checkVariBright = new CheckBox();
checkGpuApps = new CheckBox();
@@ -115,7 +116,10 @@ namespace GHelper
labelHibernateAfter = new Label();
pictureHibernate = new PictureBox();
toolTip = new ToolTip(components);
checkBootSound = new CheckBox();
panelAPU = new Panel();
comboAPU = new RComboBox();
pictureAPUMem = new PictureBox();
labelAPUMem = new Label();
panelServices.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureService).BeginInit();
panelBindingsHeader.SuspendLayout();
@@ -138,6 +142,8 @@ namespace GHelper
panelPower.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericHibernateAfter).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureHibernate).BeginInit();
panelAPU.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureAPUMem).BeginInit();
SuspendLayout();
//
// panelServices
@@ -148,7 +154,7 @@ namespace GHelper
panelServices.Controls.Add(labelServices);
panelServices.Controls.Add(buttonServices);
panelServices.Dock = DockStyle.Top;
panelServices.Location = new Point(15, 1321);
panelServices.Location = new Point(15, 1378);
panelServices.Name = "panelServices";
panelServices.Size = new Size(983, 75);
panelServices.TabIndex = 5;
@@ -1072,7 +1078,7 @@ namespace GHelper
panelSettings.Controls.Add(checkGpuApps);
panelSettings.Controls.Add(checkGPUFix);
panelSettings.Dock = DockStyle.Top;
panelSettings.Location = new Point(15, 921);
panelSettings.Location = new Point(15, 978);
panelSettings.Name = "panelSettings";
panelSettings.Padding = new Padding(20, 5, 11, 5);
panelSettings.Size = new Size(983, 346);
@@ -1116,6 +1122,19 @@ namespace GHelper
checkNoOverdrive.Text = Strings.DisableOverdrive;
checkNoOverdrive.UseVisualStyleBackColor = true;
//
// checkBootSound
//
checkBootSound.AutoSize = true;
checkBootSound.Dock = DockStyle.Top;
checkBootSound.Location = new Point(20, 173);
checkBootSound.Margin = new Padding(4, 3, 4, 3);
checkBootSound.Name = "checkBootSound";
checkBootSound.Padding = new Padding(3);
checkBootSound.Size = new Size(952, 42);
checkBootSound.TabIndex = 10;
checkBootSound.Text = "Boot Sound";
checkBootSound.UseVisualStyleBackColor = true;
//
// checkUSBC
//
checkUSBC.AutoSize = true;
@@ -1174,7 +1193,7 @@ namespace GHelper
panelPower.Controls.Add(labelHibernateAfter);
panelPower.Controls.Add(pictureHibernate);
panelPower.Dock = DockStyle.Top;
panelPower.Location = new Point(15, 1267);
panelPower.Location = new Point(15, 1324);
panelPower.Name = "panelPower";
panelPower.Size = new Size(983, 54);
panelPower.TabIndex = 4;
@@ -1211,18 +1230,58 @@ namespace GHelper
pictureHibernate.TabIndex = 22;
pictureHibernate.TabStop = false;
//
// checkBootSound
// panelAPU
//
checkBootSound.AutoSize = true;
checkBootSound.Dock = DockStyle.Top;
checkBootSound.Location = new Point(20, 173);
checkBootSound.Margin = new Padding(4, 3, 4, 3);
checkBootSound.Name = "checkBootSound";
checkBootSound.Padding = new Padding(3);
checkBootSound.Size = new Size(952, 42);
checkBootSound.TabIndex = 10;
checkBootSound.Text = "Boot Sound";
checkBootSound.UseVisualStyleBackColor = true;
panelAPU.AutoSize = true;
panelAPU.Controls.Add(comboAPU);
panelAPU.Controls.Add(pictureAPUMem);
panelAPU.Controls.Add(labelAPUMem);
panelAPU.Dock = DockStyle.Top;
panelAPU.Location = new Point(15, 921);
panelAPU.Name = "panelAPU";
panelAPU.Padding = new Padding(11, 5, 11, 0);
panelAPU.Size = new Size(983, 57);
panelAPU.TabIndex = 46;
panelAPU.Visible = false;
panelAPU.Paint += panelAPU_Paint;
//
// comboAPU
//
comboAPU.AccessibleName = "Keyboard Animation Speed";
comboAPU.Anchor = AnchorStyles.Top | AnchorStyles.Right;
comboAPU.BorderColor = Color.White;
comboAPU.ButtonColor = SystemColors.ControlLight;
comboAPU.FlatStyle = FlatStyle.Flat;
comboAPU.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboAPU.FormattingEnabled = true;
comboAPU.ItemHeight = 32;
comboAPU.Items.AddRange(new object[] { "Auto", "1G", "2G", "3G", "4G", "5G", "6G", "7G", "8G" });
comboAPU.Location = new Point(663, 8);
comboAPU.Margin = new Padding(4, 12, 4, 9);
comboAPU.Name = "comboAPU";
comboAPU.Size = new Size(293, 40);
comboAPU.TabIndex = 12;
comboAPU.TabStop = false;
//
// pictureAPUMem
//
pictureAPUMem.BackgroundImage = Resources.icons8_video_48;
pictureAPUMem.BackgroundImageLayout = ImageLayout.Zoom;
pictureAPUMem.Location = new Point(20, 11);
pictureAPUMem.Name = "pictureAPUMem";
pictureAPUMem.Size = new Size(32, 32);
pictureAPUMem.TabIndex = 1;
pictureAPUMem.TabStop = false;
//
// labelAPUMem
//
labelAPUMem.AutoSize = true;
labelAPUMem.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelAPUMem.Location = new Point(56, 11);
labelAPUMem.Name = "labelAPUMem";
labelAPUMem.Size = new Size(309, 32);
labelAPUMem.TabIndex = 0;
labelAPUMem.Text = "Memory Assigned to GPU";
//
// Extra
//
@@ -1230,10 +1289,11 @@ namespace GHelper
AutoScaleMode = AutoScaleMode.Dpi;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(1013, 1467);
ClientSize = new Size(1013, 1515);
Controls.Add(panelServices);
Controls.Add(panelPower);
Controls.Add(panelSettings);
Controls.Add(panelAPU);
Controls.Add(panelSettingsHeader);
Controls.Add(panelBacklight);
Controls.Add(panelBacklightHeader);
@@ -1282,6 +1342,9 @@ namespace GHelper
panelPower.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericHibernateAfter).EndInit();
((System.ComponentModel.ISupportInitialize)pictureHibernate).EndInit();
panelAPU.ResumeLayout(false);
panelAPU.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureAPUMem).EndInit();
ResumeLayout(false);
PerformLayout();
}
@@ -1372,5 +1435,9 @@ namespace GHelper
private CheckBox checkGPUFix;
private ToolTip toolTip;
private CheckBox checkBootSound;
private Panel panelAPU;
private PictureBox pictureAPUMem;
private Label labelAPUMem;
private RComboBox comboAPU;
}
}

View File

@@ -4,6 +4,7 @@ using GHelper.Helpers;
using GHelper.Input;
using GHelper.Mode;
using GHelper.UI;
using GHelper.USB;
using System.Diagnostics;
namespace GHelper
@@ -12,6 +13,7 @@ namespace GHelper
{
ScreenControl screenControl = new ScreenControl();
ModeControl modeControl = new ModeControl();
ClamshellModeControl clamshellControl = new ClamshellModeControl();
const string EMPTY = "--------------";
@@ -137,6 +139,8 @@ namespace GHelper
checkGpuApps.Text = Properties.Strings.KillGpuApps;
labelHibernateAfter.Text = Properties.Strings.HibernateAfter;
labelAPUMem.Text = Properties.Strings.APUMemory;
Text = Properties.Strings.ExtraSettings;
if (AppConfig.IsARCNM())
@@ -146,14 +150,14 @@ namespace GHelper
labelM2.Visible = comboM2.Visible = textM2.Visible = false;
labelM4.Visible = comboM4.Visible = textM4.Visible = false;
labelFNF4.Visible = comboFNF4.Visible = textFNF4.Visible = false;
}
}
if (AppConfig.NoMKeys())
{
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;
}
@@ -194,6 +198,17 @@ namespace GHelper
SetKeyCombo(comboM4, textM4, "m4");
SetKeyCombo(comboFNF4, textFNF4, "paddle");
int apuMem = Program.acpi.GetAPUMem();
if (apuMem >= 0)
{
panelAPU.Visible = true;
comboAPU.DropDownStyle = ComboBoxStyle.DropDownList;
comboAPU.SelectedIndex = apuMem;
}
comboAPU.SelectedIndexChanged += ComboAPU_SelectedIndexChanged;
}
else
{
@@ -218,10 +233,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 +291,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();
@@ -342,6 +362,19 @@ namespace GHelper
InitHibernate();
}
private void ComboAPU_SelectedIndexChanged(object? sender, EventArgs e)
{
int mem = comboAPU.SelectedIndex;
Program.acpi.SetAPUMem(mem);
DialogResult dialogResult = MessageBox.Show(Properties.Strings.AlertAPUMemoryRestart, Properties.Strings.AlertAPUMemoryRestartTitle, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
Process.Start("shutdown", "/r /t 1");
}
}
private void CheckBootSound_CheckedChanged(object? sender, EventArgs e)
{
Program.acpi.DeviceSet(AsusACPI.BootSound, (checkBootSound.Checked ? 1 : 0), "BootSound");
@@ -395,7 +428,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 +543,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 +591,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();
}
@@ -598,5 +631,10 @@ namespace GHelper
}
}
private void panelAPU_Paint(object sender, PaintEventArgs e)
{
}
}
}

View File

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

View File

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

View File

@@ -1,6 +1,7 @@
using GHelper.Display;
using GHelper.Gpu.NVidia;
using GHelper.Helpers;
using GHelper.USB;
using System.Diagnostics;
namespace GHelper.Gpu
@@ -53,7 +54,7 @@ namespace GHelper.Gpu
AppConfig.Set("gpu_mode", gpuMode);
settings.VisualiseGPUMode(gpuMode);
AsusUSB.ApplyGPUColor();
Aura.CustomRGB.ApplyGPUColor();
}
@@ -180,6 +181,12 @@ namespace GHelper.Gpu
Program.modeControl.SetGPUClocks(false);
}
if (AppConfig.Is("mode_reapply"))
{
await Task.Delay(TimeSpan.FromMilliseconds(3000));
Program.modeControl.AutoPerformance();
}
});
@@ -284,7 +291,7 @@ namespace GHelper.Gpu
if (Program.acpi.IsXGConnected())
{
//Program.acpi.DeviceSet(AsusACPI.GPUXGInit, 1, "XG Init");
AsusUSB.InitXGM();
XGM.Init();
}
}
@@ -298,7 +305,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 +325,12 @@ namespace GHelper.Gpu
InitXGM();
AsusUSB.ApplyXGMLight(AppConfig.Is("xmg_light"));
XGM.Light(AppConfig.Is("xmg_light"));
await Task.Delay(TimeSpan.FromSeconds(15));
if (AppConfig.IsMode("auto_apply"))
AsusUSB.SetXGMFan(AppConfig.GetFanConfig(AsusFan.XGM));
XGM.SetFan(AppConfig.GetFanConfig(AsusFan.XGM));
HardwareControl.RecreateGpuControl();

View File

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

View File

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

View File

@@ -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);
}
}
}
}
}

View File

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

View File

@@ -1,6 +1,7 @@
using GHelper.Display;
using GHelper.Helpers;
using GHelper.Mode;
using GHelper.USB;
using Microsoft.Win32;
using System.Diagnostics;
using System.Management;
@@ -59,7 +60,7 @@ namespace GHelper.Input
if (backlightActivity && iddle.TotalSeconds > kb_timeout)
{
backlightActivity = false;
AsusUSB.ApplyBrightness(0, "Timeout");
Aura.ApplyBrightness(0, "Timeout");
}
if (!backlightActivity && iddle.TotalSeconds < kb_timeout)
@@ -68,7 +69,7 @@ namespace GHelper.Input
SetBacklightAuto();
}
//Debug.WriteLine(iddle.TotalSeconds);
//Logger.WriteLine("Iddle: " + iddle.TotalSeconds);
}
public void Init()
@@ -83,6 +84,9 @@ namespace GHelper.Input
Logger.WriteLine("Optimization service is running");
InitBacklightTimer();
if (AppConfig.ContainsModel("VivoBook")) Program.acpi.DeviceSet(AsusACPI.FnLock, AppConfig.Is("fn_lock") ? 1 : 0, "FnLock");
}
public void InitBacklightTimer()
@@ -112,6 +116,9 @@ namespace GHelper.Input
if (keyApp != Keys.None) hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, keyApp);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F14);
hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control | ModifierKeys.Alt, Keys.F15);
if (!AppConfig.Is("skip_hotkeys"))
{
hook.RegisterHotKey(ModifierKeys.Control, Keys.VolumeDown);
@@ -190,7 +197,7 @@ namespace GHelper.Input
KeyboardHook.KeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1]);
break;
case 3:
KeyboardHook.KeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[3]);
KeyboardHook.KeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[2]);
break;
default:
LaunchProcess(command);
@@ -302,13 +309,10 @@ namespace GHelper.Input
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);
break;
case Keys.F10:
HandleOptimizationEvent(107);
ToggleTouchpadEvent(true);
break;
case Keys.F11:
HandleOptimizationEvent(108);
break;
case Keys.F12:
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.A);
SleepEvent();
break;
case Keys.VolumeDown:
KeyProcess("m1");
@@ -344,8 +348,19 @@ namespace GHelper.Input
if (e.Modifier == (ModifierKeys.Control | ModifierKeys.Shift | ModifierKeys.Alt))
{
if (e.Key == keyProfile) modeControl.CyclePerformanceMode(true);
switch (e.Key)
{
case Keys.F14:
Program.settingsForm.gpuControl.SetGPUMode(AsusACPI.GPUModeEco);
break;
case Keys.F15:
Program.settingsForm.gpuControl.SetGPUMode(AsusACPI.GPUModeStandard);
break;
}
}
if (e.Modifier == (ModifierKeys.Control))
{
switch (e.Key)
@@ -475,9 +490,21 @@ namespace GHelper.Input
}
}
static void ToggleTouchpadEvent(bool hotkey = false)
{
if (hotkey || !AppConfig.IsHardwareTouchpadToggle()) ToggleTouchpad();
Thread.Sleep(200);
Program.toast.RunToast(GetTouchpadState() ? "On" : "Off", ToastIcon.Touchpad);
}
static void ToggleTouchpad()
{
KeyboardHook.KeyKeyKeyPress(Keys.ControlKey, Keys.LWin, Keys.F24);
KeyboardHook.KeyKeyKeyPress(Keys.LWin, Keys.LControlKey, Keys.F24, 50);
}
static void SleepEvent()
{
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.KB_Sleep, "Sleep");
}
public static void ToggleArrowLock()
@@ -495,7 +522,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);
@@ -513,7 +540,7 @@ namespace GHelper.Input
Logger.WriteLine("Tablet: " + tabletState + " Touchpad: " + touchpadState);
if (tabletState && touchpadState || !tabletState && !touchpadState) AsusUSB.TouchpadToggle();
if (tabletState && touchpadState || !tabletState && !touchpadState) ToggleTouchpad();
}
@@ -588,7 +615,8 @@ namespace GHelper.Input
case 199: // ON Z13 - FN+F11 - cycles backlight
SetBacklight(4);
return;
case 53: // FN+F6 on GA-502DU model
case 51: // Fn+F6 on old TUFs
case 53: // Fn+F6 on GA-502DU model
NativeMethods.TurnOffScreen();
return;
}
@@ -605,23 +633,28 @@ namespace GHelper.Input
switch (EventID)
{
case 16: // FN+F7
//ScreenBrightness.Adjust(-10);
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Down, "Brightness");
if (Control.ModifierKeys == Keys.Shift)
SetScreenpad(-10);
else
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Down, "Brightness");
break;
case 32: // FN+F8
//ScreenBrightness.Adjust(+10);
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Up, "Brightness");
if (Control.ModifierKeys == Keys.Shift)
SetScreenpad(10);
else
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Brightness_Up, "Brightness");
break;
case 107: // FN+F10
ToggleTouchpad();
Thread.Sleep(200);
Program.toast.RunToast(GetTouchpadState() ? "On" : "Off", ToastIcon.Touchpad);
ToggleTouchpadEvent();
break;
case 108: // FN+F11
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.KB_Sleep, "Sleep");
SleepEvent();
break;
case 106: // Screenpad button on DUO
SetScreenpad(100);
if (Control.ModifierKeys == Keys.Shift)
ToggleScreenpad();
else
SetScreenpad(100);
break;
@@ -645,8 +678,8 @@ namespace GHelper.Input
public static void SetBacklightAuto(bool init = false)
{
if (init) AsusUSB.Init();
AsusUSB.ApplyBrightness(GetBacklight(), "Auto", init);
if (init) Aura.Init();
Aura.ApplyBrightness(GetBacklight(), "Auto", init);
}
public static void SetBacklight(int delta, bool force = false)
@@ -669,7 +702,7 @@ namespace GHelper.Input
if (force || !OptimizationService.IsRunning())
{
AsusUSB.ApplyBrightness(backlight, "HotKey");
Aura.ApplyBrightness(backlight, "HotKey");
}
if (!OptimizationService.IsOSDRunning())
@@ -680,6 +713,16 @@ namespace GHelper.Input
}
public static void ToggleScreenpad()
{
int toggle = AppConfig.Is("screenpad_toggle") ? 0 : 1;
Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, toggle, "ScreenpadToggle");
AppConfig.Set("screenpad_toggle", toggle);
Program.toast.RunToast($"Screen Pad " + (toggle == 1 ? "On" : "Off"), toggle > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);
}
public static void SetScreenpad(int delta)
{
int brightness = AppConfig.Get("screenpad", 100);

View File

@@ -34,12 +34,17 @@ public sealed class KeyboardHook : IDisposable
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3)
public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3, int sleep = 0)
{
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
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);

View File

@@ -1,4 +1,5 @@
using HidLibrary;
using HidSharp;
using GHelper.USB;
namespace GHelper.Input
{
@@ -9,14 +10,14 @@ namespace GHelper.Input
public KeyboardListener(Action<int> KeyHandler)
{
HidDevice? input = AsusUSB.GetDevice();
HidStream? input = AsusHid.FindHidStream(AsusHid.INPUT_ID);
// Fallback
if (input == null)
{
AsusUSB.Init();
Aura.Init();
Thread.Sleep(1000);
input = AsusUSB.GetDevice();
input = input = AsusHid.FindHidStream(AsusHid.INPUT_ID);
}
if (input == null)
@@ -25,7 +26,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]);

149
app/Matrix.Designer.cs generated
View File

@@ -35,23 +35,29 @@
panelMain = new Panel();
panelButtons = new Panel();
buttonReset = new UI.RButton();
panelContrast = new Panel();
labelContrast = new Label();
labelContrastTitle = new Label();
trackContrast = new TrackBar();
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();
panelContrast.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackContrast).BeginInit();
panelRotation.SuspendLayout();
panelScaling.SuspendLayout();
panelZoom.SuspendLayout();
panelRotation.SuspendLayout();
SuspendLayout();
//
// pictureMatrix
@@ -109,7 +115,9 @@
//
// panelMain
//
panelMain.AutoSize = true;
panelMain.Controls.Add(panelButtons);
panelMain.Controls.Add(panelContrast);
panelMain.Controls.Add(panelRotation);
panelMain.Controls.Add(panelScaling);
panelMain.Controls.Add(panelZoom);
@@ -117,7 +125,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, 959);
panelMain.TabIndex = 5;
//
// panelButtons
@@ -125,7 +133,7 @@
panelButtons.Controls.Add(buttonReset);
panelButtons.Controls.Add(buttonPicture);
panelButtons.Dock = DockStyle.Top;
panelButtons.Location = new Point(0, 720);
panelButtons.Location = new Point(0, 865);
panelButtons.Name = "panelButtons";
panelButtons.Size = new Size(834, 94);
panelButtons.TabIndex = 6;
@@ -149,6 +157,87 @@
buttonReset.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonReset.UseVisualStyleBackColor = false;
//
// panelContrast
//
panelContrast.AutoSize = true;
panelContrast.Controls.Add(labelContrast);
panelContrast.Controls.Add(labelContrastTitle);
panelContrast.Controls.Add(trackContrast);
panelContrast.Dock = DockStyle.Top;
panelContrast.Location = new Point(0, 720);
panelContrast.Name = "panelContrast";
panelContrast.Size = new Size(834, 145);
panelContrast.TabIndex = 6;
//
// labelContrast
//
labelContrast.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelContrast.AutoSize = true;
labelContrast.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
labelContrast.Location = new Point(705, 17);
labelContrast.Name = "labelContrast";
labelContrast.Size = new Size(103, 32);
labelContrast.TabIndex = 4;
labelContrast.Text = "Contrast";
//
// labelContrastTitle
//
labelContrastTitle.AutoSize = true;
labelContrastTitle.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelContrastTitle.Location = new Point(16, 17);
labelContrastTitle.Name = "labelContrastTitle";
labelContrastTitle.Size = new Size(111, 32);
labelContrastTitle.TabIndex = 3;
labelContrastTitle.Text = "Contrast";
//
// trackContrast
//
trackContrast.LargeChange = 50;
trackContrast.Location = new Point(16, 52);
trackContrast.Maximum = 200;
trackContrast.Minimum = 10;
trackContrast.Name = "trackContrast";
trackContrast.Size = new Size(782, 90);
trackContrast.SmallChange = 10;
trackContrast.TabIndex = 2;
trackContrast.TickFrequency = 20;
trackContrast.TickStyle = TickStyle.TopLeft;
trackContrast.Value = 100;
//
// 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,46 +305,12 @@
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);
AutoScaleMode = AutoScaleMode.Dpi;
AutoSize = true;
ClientSize = new Size(874, 978);
ClientSize = new Size(874, 1006);
Controls.Add(panelMain);
MaximizeBox = false;
MinimizeBox = false;
@@ -271,13 +326,17 @@
panelMain.ResumeLayout(false);
panelMain.PerformLayout();
panelButtons.ResumeLayout(false);
panelContrast.ResumeLayout(false);
panelContrast.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackContrast).EndInit();
panelRotation.ResumeLayout(false);
panelRotation.PerformLayout();
panelScaling.ResumeLayout(false);
panelScaling.PerformLayout();
panelZoom.ResumeLayout(false);
panelZoom.PerformLayout();
panelRotation.ResumeLayout(false);
panelRotation.PerformLayout();
ResumeLayout(false);
PerformLayout();
}
#endregion
@@ -298,5 +357,9 @@
private Panel panelRotation;
private UI.RComboBox comboRotation;
private Label labelRotation;
private Panel panelContrast;
private Label labelContrast;
private Label labelContrastTitle;
private TrackBar trackContrast;
}
}

View File

@@ -37,9 +37,13 @@ namespace GHelper
trackZoom.MouseUp += TrackZoom_MouseUp;
trackZoom.ValueChanged += TrackZoom_Changed;
trackZoom.Value = Math.Min(trackZoom.Maximum, AppConfig.Get("matrix_zoom", 100));
VisualiseZoom();
trackContrast.MouseUp += TrackContrast_MouseUp; ;
trackContrast.ValueChanged += TrackContrast_ValueChanged; ;
trackContrast.Value = Math.Min(trackContrast.Maximum, AppConfig.Get("matrix_contrast", 100));
VisualiseMatrix();
comboScaling.DropDownStyle = ComboBoxStyle.DropDownList;
comboScaling.SelectedIndex = AppConfig.Get("matrix_quality", 0);
@@ -55,6 +59,17 @@ namespace GHelper
}
private void TrackContrast_ValueChanged(object? sender, EventArgs e)
{
VisualiseMatrix();
}
private void TrackContrast_MouseUp(object? sender, MouseEventArgs e)
{
AppConfig.Set("matrix_contrast", trackContrast.Value);
SetMatrixPicture();
}
private void ComboRotation_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_rotation", comboRotation.SelectedIndex);
@@ -77,18 +92,21 @@ namespace GHelper
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
}
private void VisualiseZoom()
private void VisualiseMatrix()
{
labelZoom.Text = trackZoom.Value + "%";
labelContrast.Text = trackContrast.Value + "%";
}
private void ButtonReset_Click(object? sender, EventArgs e)
{
AppConfig.Set("matrix_contrast", 100);
AppConfig.Set("matrix_zoom", 100);
AppConfig.Set("matrix_x", 0);
AppConfig.Set("matrix_y", 0);
trackZoom.Value = 100;
trackContrast.Value = 100;
SetMatrixPicture();
@@ -102,7 +120,7 @@ namespace GHelper
private void TrackZoom_Changed(object? sender, EventArgs e)
{
VisualiseZoom();
VisualiseMatrix();
}
@@ -195,7 +213,6 @@ namespace GHelper
int matrixY = AppConfig.Get("matrix_y", 0);
int matrixZoom = AppConfig.Get("matrix_zoom", 100);
float scale = Math.Min((float)panelPicture.Width / (float)width, (float)panelPicture.Height / (float)height) * matrixZoom / 100;
pictureMatrix.Width = (int)(width * scale);

View File

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

View File

@@ -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)";
}
}
}

View File

@@ -0,0 +1,211 @@
namespace GHelper.Peripherals.Mouse.Models
{
//P511
public class ChakramCore : AsusMouse
{
public ChakramCore() : base(0x0B05, 0x1958, "mi_00", false) {
}
public override int DPIProfileCount()
{
return 4;
}
public override string GetDisplayName()
{
return "ROG Chakram Core";
}
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 false;
}
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 };
}
public override bool IsLightingModeSupported(LightingMode lightingMode)
{
return lightingMode == LightingMode.Static
|| lightingMode == LightingMode.Breathing
|| lightingMode == LightingMode.ColorCycle
|| lightingMode == LightingMode.React;
}
//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 bool HasBattery()
{
return false;
}
public override bool HasAngleSnapping()
{
return true;
}
public override bool HasAngleTuning()
{
return false;
}
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;
}
protected override LiftOffDistance ParseLiftOffDistance(byte[] packet)
{
if (packet[1] != 0x12 || packet[2] != 0x06)
{
return LiftOffDistance.Low;
}
return (LiftOffDistance)packet[5];
}
protected override byte[] GetUpdateLiftOffDistancePacket(LiftOffDistance liftOffDistance)
{
return new byte[] { 0x00, 0x51, 0x35, 0x00, 0x00, ((byte)liftOffDistance) };
}
}
}

View File

@@ -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;

View 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];
}
}
}

View File

@@ -200,11 +200,15 @@ 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());
DetectMouse(new ChakramCore());
}
public static void DetectMouse(AsusMouse am)
@@ -236,6 +240,7 @@ namespace GHelper.Peripherals
timer.Stop();
Logger.WriteLine("HID Device Event: Checking for new ASUS Mice");
DetectAllAsusMice();
if (AppConfig.IsZ13()) Program.inputDispatcher.Init();
}
}
}

View File

@@ -64,11 +64,12 @@ namespace GHelper
ProcessHelper.CheckAlreadyRunning();
try
{
acpi = new AsusACPI();
}
catch
Logger.WriteLine("------------");
Logger.WriteLine("App launched: " + AppConfig.GetModel() + " :" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + CultureInfo.CurrentUICulture + (ProcessHelper.IsUserAdministrator() ? "." : ""));
acpi = new AsusACPI();
if (!acpi.IsConnected() && AppConfig.IsASUS())
{
DialogResult dialogResult = MessageBox.Show(Properties.Strings.ACPIError, Properties.Strings.StartupError, MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
@@ -80,9 +81,6 @@ namespace GHelper
return;
}
Logger.WriteLine("------------");
Logger.WriteLine("App launched: " + AppConfig.GetModel() + " :" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + CultureInfo.CurrentUICulture + (ProcessHelper.IsUserAdministrator() ? "." : ""));
Application.EnableVisualStyles();
HardwareControl.RecreateGpuControl();
@@ -97,7 +95,7 @@ namespace GHelper
gpuControl.InitXGM();
SetAutoModes();
SetAutoModes(init: true);
// Subscribing for system power change events
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
@@ -119,17 +117,46 @@ namespace GHelper
if (Environment.CurrentDirectory.Trim('\\') == Application.StartupPath.Trim('\\') || action.Length > 0)
{
SettingsToggle(action, false);
SettingsToggle(false);
}
switch (action)
{
case "cpu":
Startup.ReScheduleAdmin();
settingsForm.FansToggle();
break;
case "gpu":
Startup.ReScheduleAdmin();
settingsForm.FansToggle(1);
break;
case "gpurestart":
gpuControl.RestartGPU(false);
break;
case "services":
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;
}
Application.Run();
}
private static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
{
gpuControl.StandardModeFix();
BatteryControl.SetBatteryChargeLimit();
BatteryControl.AutoBattery();
}
private static void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
@@ -173,7 +200,7 @@ namespace GHelper
public static void SetAutoModes(bool powerChanged = false)
public static void SetAutoModes(bool powerChanged = false, bool init = false)
{
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastAuto) < 3000) return;
@@ -194,7 +221,7 @@ namespace GHelper
screenControl.AutoScreen();
}
BatteryControl.SetBatteryChargeLimit();
BatteryControl.AutoBattery(init);
settingsForm.AutoKeyboard();
settingsForm.matrixControl.SetMatrix(true);
@@ -213,13 +240,13 @@ namespace GHelper
SetAutoModes(true);
}
public static void SettingsToggle(string action = "", bool checkForFocus = true)
public static void SettingsToggle(bool checkForFocus = true, bool trayClick = false)
{
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())
if (checkForFocus && !settingsForm.HasAnyFocus(trayClick))
{
settingsForm.ShowAll();
}
@@ -241,41 +268,13 @@ namespace GHelper
settingsForm.Top = Screen.FromControl(settingsForm).WorkingArea.Height - 10 - settingsForm.Height;
settingsForm.VisualiseGPUMode();
switch (action)
{
case "cpu":
Startup.ReScheduleAdmin();
settingsForm.FansToggle();
break;
case "gpu":
Startup.ReScheduleAdmin();
settingsForm.FansToggle(1);
break;
case "gpurestart":
gpuControl.RestartGPU(false);
break;
case "services":
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;
}
}
}
static void TrayIcon_MouseClick(object? sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
SettingsToggle();
SettingsToggle(trayClick: true);
}

View File

@@ -110,6 +110,36 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap dot_eco {
get {
object obj = ResourceManager.GetObject("dot_eco", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap dot_standard {
get {
object obj = ResourceManager.GetObject("dot_standard", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap dot_ultimate {
get {
object obj = ResourceManager.GetObject("dot_ultimate", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>

View File

@@ -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.png;System.Drawing.Bitmap, 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.png;System.Drawing.Bitmap, 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.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -78,6 +78,24 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Restart your device to apply changes.
/// </summary>
internal static string AlertAPUMemoryRestart {
get {
return ResourceManager.GetString("AlertAPUMemoryRestart", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Restart now?.
/// </summary>
internal static string AlertAPUMemoryRestartTitle {
get {
return ResourceManager.GetString("AlertAPUMemoryRestartTitle", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Looks like GPU is in heavy use, disable it?.
/// </summary>
@@ -195,6 +213,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Memory Assigned to GPU.
/// </summary>
internal static string APUMemory {
get {
return ResourceManager.GetString("APUMemory", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Asus Services Running.
/// </summary>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Verbindung zu ASUS ACPI fehlgeschlagen. G-Helper kann nicht ausgeführt werden. Bitte installiere ASUS System Control Interface.</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Die GPU wird gerade verwendet. Trotzdem deaktivieren?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Windows Leistungsmodus automatisch anpassen</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>ASUS Dienste laufen</value>
</data>
@@ -253,7 +262,7 @@
<value>Batteriezustand</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Einmalig auf 100% aufladen</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS und Treiber Updates</value>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>No se pudo conectar con ASUS ACPI. La aplicación no puede funcionar sin el recurso. Instale Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Reinicia el dispositivo para aplicar los cambios</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>¿Reiniciar ahora?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Detectado uso intensivo de la GPU, ¿deshabilitarla?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Autoajustar plan de energía Windows</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memoria asignada a GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Servicios de Asus en ejecución</value>
</data>
@@ -253,7 +262,7 @@
<value>Salud de la batería</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Cargar una vez al 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Actualizaciones de BIOS y Drivers</value>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Connexion impossible avec ASUS ACPI. L'application ne peut fonctionner sans. Veuillez installer Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Le GPU semble être surchargé, voulez vous le désactiver ?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Ajustement auto des modes de gestion alim. Windows</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Services Asus actifs</value>
</data>
@@ -244,7 +253,7 @@
<value>Équilibré</value>
</data>
<data name="BatteryCharge" xml:space="preserve">
<value>Charge</value>
<value>Charge de la batterie</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limite de charge </value>
@@ -253,7 +262,7 @@
<value>Santé de la batterie</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Charge unique à 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Mise à jour BIOS et pilotes</value>
@@ -262,7 +271,7 @@
<value>Au démarrage</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
<value>Son au démarrage</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminosité</value>
@@ -274,7 +283,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>
@@ -405,7 +414,7 @@ Voulez-vous continuer ?</value>
<value>Arrêter toutes les applications utilisant la dGPU lors du passage au mode Eco</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Rétroéclairage de l'ordinateur</value>
<value>Rétroéclairage du clavier</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Clavier de l'ordinateur</value>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Nem sikerült csatlakozni az ASUS ACPI-hez, az alkalmazás nem működik enélkül. Próbáld meg telepíteni az ASUS rendszervezérlő interfész-t</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Úgy tűnik használatban van a GPU. Biztosan letiltod?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>A Windows energiagazdálkodási módok automatikus beállítása</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Asus szolgáltatások futnak</value>
</data>

View File

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

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Impossibile connettersi ad ASUS ACPI. Senza di essa l'applicazione non può funzionare. Prova ad installare Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Uso intensivo della GPU, disabilitare?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Regola Piano Energetico di Windows in automatico</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Servizi Asus in Esecuzione</value>
</data>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>ASUS ACPI에 연결할 수 없어 응용 프로그램이 작동하지 않습니다. Asus System Control Interface를 먼저 설치하십시오.</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>GPU 사용량이 높습니다. 비활성화 하시겠습니까?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>윈도우 전원 모드 자동조절</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>실행중인 Asus 서비스</value>
</data>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Nepavyko prisijungti prie ASUS ACPI. Programėlė be jo negali veikti. Pabandykite įdiegti Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Panašu, kad jūsų GPU yra intensyviai naudojamas. Išjungti jį?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Automatiškai derinti Windows energijos režimus</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Veikiančios Asus tarnybos</value>
</data>
@@ -253,7 +262,7 @@
<value>Sveikata</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Vienkartinė įkrova iki 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS ir tvarkyklių naujinimai</value>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Nie można odnaleźć sterownika ASUS ACPI. Aplikacja nie może bez niego funkcjonować. Spróbuj zainstalować Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Uruchom ponownie, aby zastosować ustawienia</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Uruchomić ponownie teraz?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Wygląda na to, że GPU jest mocno obciążone. Wyłączyć?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Dostosuj systemowy Tryb Zasilania</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Pamięć przypisana do GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Uruchomione usługi Asus</value>
</data>
@@ -253,7 +262,7 @@
<value>Stan baterii</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Jednorazowo naładuj do 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Aktualizacje BIOS i sterowników</value>

View File

@@ -118,11 +118,17 @@
<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>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Parece que o GPU está em uso pesado.</value>
</data>
@@ -151,7 +157,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>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Ajuste automático dos modos de energia do Windows</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Serviços da Asus em execução</value>
</data>
@@ -172,7 +181,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 +190,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 +205,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 +220,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 +235,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 +259,7 @@
<value>Limite de carga</value>
</data>
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
<value>Saúde da bateria</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
@@ -262,7 +271,7 @@
<value>Ao ligar</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
<value>Som de inicialização</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Nível do brilho</value>
@@ -289,7 +298,7 @@
<value>Personalizado</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
<value>Desaceleração</value>
</data>
<data name="Default" xml:space="preserve">
<value>Padrão</value>
@@ -301,7 +310,7 @@
<value>Descarregando</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download</value>
<value>Baixar</value>
</data>
<data name="DriverAndSoftware" xml:space="preserve">
<value>Drivers and Software</value>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Não foi possível conectar ao ASUS ACPI. O programa não funciona sem esse serviço. Tente instalar Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Parece que o GPU está em uso pesado, desativá-lo?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Ajuste automático dos modos de energia do Windows</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Serviços da Asus em execução</value>
</data>
@@ -253,7 +262,7 @@
<value>Estado da bateria</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Carregamento único até 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Atualizações de Drivers e da BIOS</value>
@@ -262,7 +271,7 @@
<value>Ao ligar</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
<value>Som de ligar</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Nível do brilho</value>
@@ -274,7 +283,7 @@
<value>Aumentar o brilho</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
<value>Calibrar</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Carregando</value>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Can't connect to ASUS ACPI. Application can't function without it. Try to install Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Looks like GPU is in heavy use, disable it?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Auto adjust Windows Power Modes</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Asus Services Running</value>
</data>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Nu se poate conecta la ASUS ACPI. Aplicația nu poate funcționa fără aceasta. Încercați să instalați Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Se pare că GPU-ul este folosit intens, dezactivați?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Reglare automată a modului de alimentare Windows</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Servicii Asus în derulare</value>
</data>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>ASUS ACPI'ye bağlanılamıyor. Uygulama o olmadan çalışamaz. Asus Sistem Kontrol Arayüzü'nü yüklemeyi deneyin.</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Görünüşe göre GPU yoğun bir şekilde kullanılıyor, devre dışı bırakılsın mı?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Windows Güç Modunu otomatik ayarla</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Çalışan Asus Hizmetleri</value>
</data>
@@ -235,7 +244,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>
@@ -253,7 +262,7 @@
<value>Pil Sağlığı</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Bir seferlik %100 şarj etme</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS ve Sürücü Güncellemeleri</value>
@@ -298,7 +307,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>
@@ -396,7 +405,7 @@ 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>
@@ -432,7 +441,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>
@@ -567,10 +576,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>
@@ -603,7 +612,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>
@@ -648,7 +657,7 @@ Yine de devam etmek istiyor musunuz?</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>

View File

@@ -118,11 +118,17 @@
<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>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Здається, що GPU використовується, вимкнути її?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Автоматично застосовувати Windows Power Modes</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Кількість запущених сервісів Asus</value>
</data>
@@ -253,7 +262,7 @@
<value>Стан батареї</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>Одноразовий заряд до 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Оновлення BIOS та драйверів</value>
@@ -262,7 +271,7 @@
<value>Старт</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sound</value>
<value>Звук завантаження</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Яскравість</value>
@@ -274,7 +283,7 @@
<value>Підвищити яскравість</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
<value>Калібрування</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Зарядка</value>
@@ -289,7 +298,7 @@
<value>Своє</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
<value>Уповільнення</value>
</data>
<data name="Default" xml:space="preserve">
<value>За замовчуванням</value>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>Không thể kết nối đến ASUS ACPI. Chương trình cần nó để có thể hoạt động. Hãy thử cài lại Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Có vẻ như GPU rời đang được sử dụng nhiều, tắt nó?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Tự động điều chỉnh Kế hoạch nguồn của Windows</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>Dịch vụ Asus đang chạy</value>
</data>

View File

@@ -118,11 +118,17 @@
<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>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>重新启动您的设备以应用更改</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>现在重启?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>看起来 GPU 正在被重度使用,是否禁用?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>自动调整Windows电源模式</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>分配给 GPU 的内存</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>正在运行的 Asus 服务</value>
</data>
@@ -223,7 +232,7 @@
<value>滚轮</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
<value>底灯</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>自动应用</value>
@@ -253,7 +262,7 @@
<value>电池健康</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
<value>一次性充电至 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS 和驱动程序更新</value>
@@ -274,7 +283,7 @@
<value>提高亮度</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Calibrate</value>
<value>校准</value>
</data>
<data name="Charging" xml:space="preserve">
<value>充电中</value>
@@ -289,7 +298,7 @@
<value>自定义设置</value>
</data>
<data name="Deceleration" xml:space="preserve">
<value>Deceleration</value>
<value>减速</value>
</data>
<data name="Default" xml:space="preserve">
<value>默认</value>
@@ -313,12 +322,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>
@@ -342,7 +351,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>
@@ -465,7 +474,7 @@
<value>分钟</value>
</data>
<data name="Minutes" xml:space="preserve">
<value>分</value>
<value>分</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>角度校正</value>
@@ -477,7 +486,7 @@
<value>按键响应</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>静默高度</value>
<value>响应高度</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>低于该电量时警告</value>

View File

@@ -123,6 +123,12 @@
<data name="ACPIError" xml:space="preserve">
<value>無法連結到華碩 ACPI。 没有它,應用程式將無法執行。 嘗試安裝Asus System Control Interface</value>
</data>
<data name="AlertAPUMemoryRestart" xml:space="preserve">
<value>Restart your device to apply changes</value>
</data>
<data name="AlertAPUMemoryRestartTitle" xml:space="preserve">
<value>Restart now?</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>看起来 GPU 正在大量使用,是否禁用它?</value>
</data>
@@ -162,6 +168,9 @@
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>自動調整Windows電源模式</value>
</data>
<data name="APUMemory" xml:space="preserve">
<value>Memory Assigned to GPU</value>
</data>
<data name="AsusServicesRunning" xml:space="preserve">
<value>執行中的華碩服務</value>
</data>

BIN
app/Resources/dot-eco.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 B

View File

@@ -206,10 +206,10 @@ namespace GHelper
comboMatrixRunning.FormattingEnabled = true;
comboMatrixRunning.ItemHeight = 32;
comboMatrixRunning.Items.AddRange(new object[] { Properties.Strings.MatrixBanner, Properties.Strings.MatrixLogo, Properties.Strings.MatrixPicture, Properties.Strings.MatrixClock, Properties.Strings.MatrixAudio });
comboMatrixRunning.Location = new Point(266, 11);
comboMatrixRunning.Margin = new Padding(4, 11, 4, 8);
comboMatrixRunning.Location = new Point(269, 11);
comboMatrixRunning.Margin = new Padding(7, 11, 7, 8);
comboMatrixRunning.Name = "comboMatrixRunning";
comboMatrixRunning.Size = new Size(254, 40);
comboMatrixRunning.Size = new Size(248, 40);
comboMatrixRunning.TabIndex = 17;
//
// buttonMatrix
@@ -319,7 +319,7 @@ namespace GHelper
sliderBattery.Max = 100;
sliderBattery.Min = 40;
sliderBattery.Name = "sliderBattery";
sliderBattery.Size = new Size(716, 40);
sliderBattery.Size = new Size(706, 40);
sliderBattery.Step = 5;
sliderBattery.TabIndex = 20;
sliderBattery.Text = "sliderBattery";
@@ -1439,7 +1439,6 @@ namespace GHelper
MinimumSize = new Size(822, 71);
Name = "SettingsForm";
Padding = new Padding(11);
ShowIcon = false;
StartPosition = FormStartPosition.CenterScreen;
Text = "G-Helper";
panelMatrix.ResumeLayout(false);
@@ -1574,4 +1573,4 @@ namespace GHelper
private RButton buttonFnLock;
private RButton buttonBatteryFull;
}
}
}

View File

@@ -10,19 +10,18 @@ using GHelper.Mode;
using GHelper.Peripherals;
using GHelper.Peripherals.Mouse;
using GHelper.UI;
using GHelper.USB;
using System.Diagnostics;
using System.Timers;
namespace GHelper
{
public partial class SettingsForm : RForm
{
ContextMenuStrip contextMenuStrip = new CustomContextMenu();
ToolStripMenuItem menuSilent, menuBalanced, menuTurbo, menuEco, menuStandard, menuUltimate, menuOptimized;
GPUModeControl gpuControl;
public GPUModeControl gpuControl;
ScreenControl screenControl = new ScreenControl();
AutoUpdateControl updateControl;
@@ -324,7 +323,7 @@ namespace GHelper
{
case 0:
Logger.WriteLine("Monitor Power Off");
AsusUSB.ApplyBrightness(0);
Aura.ApplyBrightness(0);
break;
case 1:
Logger.WriteLine("Monitor Power On");
@@ -698,16 +697,16 @@ namespace GHelper
public void InitAura()
{
AsusUSB.Mode = AppConfig.Get("aura_mode");
AsusUSB.Speed = AppConfig.Get("aura_speed");
AsusUSB.SetColor(AppConfig.Get("aura_color"));
AsusUSB.SetColor2(AppConfig.Get("aura_color2"));
Aura.Mode = (AuraMode)AppConfig.Get("aura_mode");
Aura.Speed = (AuraSpeed)AppConfig.Get("aura_speed");
Aura.SetColor(AppConfig.Get("aura_color"));
Aura.SetColor2(AppConfig.Get("aura_color2"));
comboKeyboard.DropDownStyle = ComboBoxStyle.DropDownList;
comboKeyboard.DataSource = new BindingSource(AsusUSB.GetModes(), null);
comboKeyboard.DataSource = new BindingSource(Aura.GetModes(), null);
comboKeyboard.DisplayMember = "Value";
comboKeyboard.ValueMember = "Key";
comboKeyboard.SelectedValue = AsusUSB.Mode;
comboKeyboard.SelectedValue = Aura.Mode;
comboKeyboard.SelectedValueChanged += ComboKeyboard_SelectedValueChanged;
@@ -729,7 +728,7 @@ namespace GHelper
{
Task.Run(() =>
{
AsusUSB.ApplyAura();
Aura.ApplyAura();
VisualiseAura();
});
}
@@ -738,9 +737,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();
});
}
@@ -882,14 +881,14 @@ namespace GHelper
/// Check if any of fans, keyboard, update, or itself has focus
/// </summary>
/// <returns>Focus state</returns>
public bool HasAnyFocus()
public bool HasAnyFocus(bool lostFocusCheck = false)
{
return (fansForm != null && fansForm.ContainsFocus) ||
(extraForm != null && extraForm.ContainsFocus) ||
return (fansForm != null && fansForm.ContainsFocus) ||
(extraForm != null && extraForm.ContainsFocus) ||
(updatesForm != null && updatesForm.ContainsFocus) ||
(matrixForm != null && matrixForm.ContainsFocus) ||
this.ContainsFocus ||
Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastLostFocus) < 300;
(lostFocusCheck && Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastLostFocus) < 300);
}
private void SettingsForm_FormClosing(object? sender, FormClosingEventArgs e)
@@ -1044,14 +1043,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();
@@ -1150,7 +1149,6 @@ namespace GHelper
});
}
public void VisualiseGPUMode(int GPUMode = -1)
{
ButtonEnabled(buttonOptimized, true);
@@ -1176,11 +1174,13 @@ namespace GHelper
buttonOptimized.Activated = GPUAuto;
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeEco;
Program.trayIcon.Icon = Properties.Resources.eco;
IconHelper.SetIcon(this, 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;
IconHelper.SetIcon(this, Properties.Resources.dot_ultimate);
break;
default:
buttonOptimized.BorderColor = colorStandard;
@@ -1188,6 +1188,7 @@ namespace GHelper
buttonOptimized.Activated = GPUAuto;
labelGPU.Text = Properties.Strings.GPUMode + ": " + Properties.Strings.GPUModeStandard;
Program.trayIcon.Icon = Properties.Resources.standard;
IconHelper.SetIcon(this, Properties.Resources.dot_standard);
break;
}

31
app/UI/IconHelper.cs Normal file
View File

@@ -0,0 +1,31 @@
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace GHelper.UI
{
public class IconHelper
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private const uint WM_SETICON = 0x80u;
private const int ICON_SMALL = 0;
private const int ICON_BIG = 1;
public static void SetIcon(Form form, Bitmap icon)
{
try
{
SendMessage(form.Handle, WM_SETICON, ICON_BIG, Icon.ExtractAssociatedIcon(Application.ExecutablePath)!.Handle);
SendMessage(form.Handle, WM_SETICON, ICON_SMALL, icon.GetHicon());
}
catch (Exception ex)
{
Debug.WriteLine($"Error setting icon {ex.Message}");
}
}
}
}

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

@@ -0,0 +1,125 @@
using HidSharp;
using HidSharp.Reports;
using System.Diagnostics;
namespace GHelper.USB;
public static class AsusHid
{
public const int ASUS_ID = 0x0b05;
public const byte INPUT_ID = 0x5a;
public const byte AURA_ID = 0x5d;
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6, 0x1abe };
static HidStream? auraStream;
public static IEnumerable<HidDevice>? FindDevices(byte reportId)
{
HidDeviceLoader loader = new HidDeviceLoader();
IEnumerable<HidDevice> deviceList;
try
{
deviceList = loader.GetDevices(ASUS_ID).Where(device => deviceIds.Contains(device.ProductID) && device.CanOpen && device.GetMaxFeatureReportLength() > 0);
}
catch (Exception ex)
{
Logger.WriteLine($"Error enumerating HID devices: {ex.Message}");
yield break;
}
foreach (var device in deviceList)
if (device.GetReportDescriptor().TryGetReport(ReportType.Feature, reportId, out _))
yield return device;
}
public static HidStream? FindHidStream(byte reportId)
{
try
{
var devices = FindDevices(reportId);
if (devices is null) return null;
if (AppConfig.IsZ13())
{
var z13 = devices.Where(device => device.ProductID == 0x1a30).FirstOrDefault();
if (z13 is not null) return z13.Open();
}
return devices.FirstOrDefault()?.Open();
}
catch (Exception ex)
{
Logger.WriteLine($"Error accessing HID device: {ex.Message}");
}
return null;
}
public static void WriteInput(byte[] data, string log = "USB")
{
foreach (var device in FindDevices(INPUT_ID))
{
try
{
using (var stream = device.Open())
{
var payload = new byte[device.GetMaxFeatureReportLength()];
Array.Copy(data, payload, data.Length);
stream.SetFeature(payload);
Logger.WriteLine($"{log} Feature {device.ProductID.ToString("X")}|{device.GetMaxFeatureReportLength()}: {BitConverter.ToString(data)}");
}
}
catch (Exception ex)
{
Logger.WriteLine($"Error setting feature {device.GetMaxFeatureReportLength()} {device.DevicePath}: {BitConverter.ToString(data)} {ex.Message}");
}
}
}
public static void Write(byte[] data, string log = "USB")
{
Write(new List<byte[]> { data }, log);
}
public static void Write(List<byte[]> dataList, string log = "USB")
{
var devices = FindDevices(AURA_ID);
if (devices is null) return;
foreach (var device in devices)
using (var stream = device.Open())
foreach (var data in dataList)
try
{
stream.Write(data);
Logger.WriteLine($"{log} {device.ProductID.ToString("X")}: {BitConverter.ToString(data)}");
}
catch (Exception ex)
{
Logger.WriteLine($"Error writing {log} {device.ProductID.ToString("X")}: {ex.Message} {BitConverter.ToString(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} {BitConverter.ToString(data)}");
}
}
}

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

@@ -0,0 +1,798 @@
using GHelper.Gpu;
using GHelper.Helpers;
using GHelper.Input;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Text;
namespace GHelper.USB
{
public class AuraPower
{
public bool BootLogo;
public bool BootKeyb;
public bool AwakeLogo;
public bool AwakeKeyb;
public bool SleepLogo;
public bool SleepKeyb;
public bool ShutdownLogo;
public bool ShutdownKeyb;
public bool BootBar;
public bool AwakeBar;
public bool SleepBar;
public bool ShutdownBar;
public bool BootLid;
public bool AwakeLid;
public bool SleepLid;
public bool ShutdownLid;
public bool BootRear;
public bool AwakeRear;
public bool SleepRear;
public bool ShutdownRear;
}
public enum AuraMode : int
{
AuraStatic = 0,
AuraBreathe = 1,
AuraColorCycle = 2,
AuraRainbow = 3,
Star = 4,
Rain = 5,
Highlight = 6,
Laser = 7,
Ripple = 8,
AuraStrobe = 10,
Comet = 11,
Flash = 12,
HEATMAP = 20,
GPUMODE = 21,
AMBIENT = 22,
}
public enum AuraSpeed : int
{
Slow = 0,
Normal = 1,
Fast = 2,
}
public static class Aura
{
static byte[] MESSAGE_APPLY = { AsusHid.AURA_ID, 0xb4 };
static byte[] MESSAGE_SET = { AsusHid.AURA_ID, 0xb5, 0, 0, 0 };
static readonly int AURA_ZONES = 8;
private static AuraMode mode = AuraMode.AuraStatic;
private static AuraSpeed speed = AuraSpeed.Normal;
public static Color Color1 = Color.White;
public static Color Color2 = Color.Black;
static bool isACPI = AppConfig.IsTUF() || AppConfig.IsVivobook();
static bool isStrix = AppConfig.IsStrix();
static bool isStrix4Zone = AppConfig.IsStrixLimitedRGB();
static bool isStrixNumpad = AppConfig.IsStrixNumpad();
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") || AppConfig.ContainsModel("GA503R"))
{
var device = AsusHid.FindDevices(AsusHid.AURA_ID).FirstOrDefault();
if (device is null) return;
Logger.WriteLine($"USB Version: {device.ReleaseNumberBcd} {device.ReleaseNumber}");
if (device.ReleaseNumberBcd >= 22 && device.ReleaseNumberBcd <= 25) isSingleColor = true;
if (AppConfig.ContainsModel("GA503R") && device.ReleaseNumberBcd == 3) isSingleColor = true;
}
}
public static Dictionary<AuraSpeed, string> GetSpeeds()
{
return new Dictionary<AuraSpeed, string>
{
{ AuraSpeed.Slow, Properties.Strings.AuraSlow },
{ AuraSpeed.Normal, Properties.Strings.AuraNormal },
{ AuraSpeed.Fast, Properties.Strings.AuraFast }
};
}
public static Dictionary<AuraMode, string> GetModes()
{
if (isACPI)
{
_modes.Remove(AuraMode.AuraRainbow);
}
if (isSingleColor)
{
return _modesSingleColor;
}
if (AppConfig.IsAdvantageEdition())
{
return _modes;
}
if (AppConfig.IsStrix() && !AppConfig.IsStrixLimitedRGB())
{
return _modesStrix;
}
return _modes;
}
public static AuraMode Mode
{
get { return mode; }
set
{
mode = GetModes().ContainsKey(value) ? value : AuraMode.AuraStatic;
}
}
public static AuraSpeed Speed
{
get { return speed; }
set
{
speed = GetSpeeds().ContainsKey(value) ? value : AuraSpeed.Normal;
}
}
public static void SetColor(int colorCode)
{
Color1 = Color.FromArgb(colorCode);
}
public static void SetColor2(int colorCode)
{
Color2 = Color.FromArgb(colorCode);
}
public static bool HasSecondColor()
{
return mode == AuraMode.AuraBreathe && !isACPI;
}
private static void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
if (!InputDispatcher.backlightActivity)
return;
if (Mode == AuraMode.HEATMAP)
{
CustomRGB.ApplyHeatmap();
}
else if (Mode == AuraMode.AMBIENT)
{
CustomRGB.ApplyAmbient();
}
}
public static byte[] AuraMessage(AuraMode mode, Color color, Color color2, int speed, bool mono = false)
{
byte[] msg = new byte[17];
msg[0] = AsusHid.AURA_ID;
msg[1] = 0xb3;
msg[2] = 0x00; // Zone
msg[3] = (byte)mode; // Aura Mode
msg[4] = color.R; // R
msg[5] = mono ? (byte)0 : color.G; // G
msg[6] = mono ? (byte)0 : color.B; // B
msg[7] = (byte)speed; // aura.speed as u8;
msg[8] = 0; // aura.direction as u8;
msg[9] = mode == AuraMode.AuraBreathe ? (byte)1 : (byte)0;
msg[10] = color2.R; // R
msg[11] = mono ? (byte)0 : color2.G; // G
msg[12] = mono ? (byte)0 : color2.B; // B
return msg;
}
public static void Init()
{
Task.Run(async () =>
{
AsusHid.Write(new List<byte[]> {
new byte[] { AsusHid.AURA_ID, 0xb9 },
Encoding.ASCII.GetBytes("]ASUS Tech.Inc."),
new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1a },
//Encoding.ASCII.GetBytes("^ASUS Tech.Inc."),
//new byte[] { 0x5e, 0x05, 0x20, 0x31, 0, 0x1a }
});
});
}
public static void ApplyBrightness(int brightness, string log = "Backlight", bool delay = false)
{
Task.Run(async () =>
{
if (delay) await Task.Delay(TimeSpan.FromSeconds(1));
if (isACPI) Program.acpi.TUFKeyboardBrightness(brightness);
AsusHid.Write(new byte[] { AsusHid.AURA_ID, 0xba, 0xc5, 0xc4, (byte)brightness }, log);
if (AppConfig.ContainsModel("GA503"))
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xba, 0xc5, 0xc4, (byte)brightness }, log);
});
}
static byte[] AuraPowerMessage(AuraPower flags)
{
byte keyb = 0, bar = 0, lid = 0, rear = 0;
if (flags.BootLogo) keyb |= 1 << 0;
if (flags.BootKeyb) keyb |= 1 << 1;
if (flags.AwakeLogo) keyb |= 1 << 2;
if (flags.AwakeKeyb) keyb |= 1 << 3;
if (flags.SleepLogo) keyb |= 1 << 4;
if (flags.SleepKeyb) keyb |= 1 << 5;
if (flags.ShutdownLogo) keyb |= 1 << 6;
if (flags.ShutdownKeyb) keyb |= 1 << 7;
if (flags.BootBar) bar |= 1 << 1;
if (flags.AwakeBar) bar |= 1 << 2;
if (flags.SleepBar) bar |= 1 << 3;
if (flags.ShutdownBar) bar |= 1 << 4;
if (flags.BootLid) lid |= 1 << 0;
if (flags.AwakeLid) lid |= 1 << 1;
if (flags.SleepLid) lid |= 1 << 2;
if (flags.ShutdownLid) lid |= 1 << 3;
if (flags.BootLid) lid |= 1 << 4;
if (flags.AwakeLid) lid |= 1 << 5;
if (flags.SleepLid) lid |= 1 << 6;
if (flags.ShutdownLid) lid |= 1 << 7;
if (flags.BootRear) rear |= 1 << 0;
if (flags.AwakeRear) rear |= 1 << 1;
if (flags.SleepRear) rear |= 1 << 2;
if (flags.ShutdownRear) rear |= 1 << 3;
if (flags.BootRear) rear |= 1 << 4;
if (flags.AwakeRear) rear |= 1 << 5;
if (flags.SleepRear) rear |= 1 << 6;
if (flags.ShutdownRear) rear |= 1 << 7;
return new byte[] { 0x5d, 0xbd, 0x01, keyb, bar, lid, rear, 0xFF };
}
public static void ApplyPower()
{
AuraPower flags = new();
// Keyboard
flags.AwakeKeyb = AppConfig.IsNotFalse("keyboard_awake");
flags.BootKeyb = AppConfig.IsNotFalse("keyboard_boot");
flags.SleepKeyb = AppConfig.IsNotFalse("keyboard_sleep");
flags.ShutdownKeyb = AppConfig.IsNotFalse("keyboard_shutdown");
// Logo
flags.AwakeLogo = AppConfig.IsNotFalse("keyboard_awake_logo");
flags.BootLogo = AppConfig.IsNotFalse("keyboard_boot_logo");
flags.SleepLogo = AppConfig.IsNotFalse("keyboard_sleep_logo");
flags.ShutdownLogo = AppConfig.IsNotFalse("keyboard_shutdown_logo");
// Lightbar
flags.AwakeBar = AppConfig.IsNotFalse("keyboard_awake_bar");
flags.BootBar = AppConfig.IsNotFalse("keyboard_boot_bar");
flags.SleepBar = AppConfig.IsNotFalse("keyboard_sleep_bar");
flags.ShutdownBar = AppConfig.IsNotFalse("keyboard_shutdown_bar");
// Lid
flags.AwakeLid = AppConfig.IsNotFalse("keyboard_awake_lid");
flags.BootLid = AppConfig.IsNotFalse("keyboard_boot_lid");
flags.SleepLid = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownLid = AppConfig.IsNotFalse("keyboard_shutdown_lid");
// Rear Bar
flags.AwakeRear = AppConfig.IsNotFalse("keyboard_awake_lid");
flags.BootRear = AppConfig.IsNotFalse("keyboard_boot_lid");
flags.SleepRear = AppConfig.IsNotFalse("keyboard_sleep_lid");
flags.ShutdownRear = AppConfig.IsNotFalse("keyboard_shutdown_lid");
AsusHid.Write(AuraPowerMessage(flags));
if (isACPI)
Program.acpi.TUFKeyboardPower(
flags.AwakeKeyb,
flags.BootKeyb,
flags.SleepKeyb,
flags.ShutdownKeyb);
}
static byte[] packetMap = new byte[]
{
/* VDN VUP MICM HPFN ARMC */
2, 3, 4, 5, 6,
/* ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 DEL15 DEL17 PAUS PRT HOME */
21, 23, 24, 25, 26, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41,
/* BKTK 1 2 3 4 5 6 7 8 9 0 - = BSPC BSPC BSPC PLY15 NMLK NMDV NMTM NMMI */
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
/* TAB Q W E R T Y U I O P [ ] \ STP15 NM7 NM8 NM9 NMPL */
63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 79, 80, 81, 82, 83,
/* CPLK A S D F G H J K L ; " # ENTR ENTR ENTR PRV15 NM4 NM5 NM6 NMPL */
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
/* LSFT ISO\ Z X C V B N M , . / RSFT RSFT RSFT ARWU NXT15 NM1 NM2 NM3 NMER */
105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 139, 121, 122, 123, 124, 125,
/* LCTL LFNC LWIN LALT SPC RALT RFNC RCTL ARWL ARWD ARWR PRT15 NM0 NMPD NMER */
126, 127, 128, 129, 131, 135, 136, 137, 159, 160, 161, 142, 144, 145, 146,
/* LB1 LB2 LB3 LB4 LB5 LB6 */
174, 173, 172, 171, 170, 169,
/* KSTN LOGO LIDL LIDR */
0, 167, 176, 177,
};
static byte[] packetZone = new byte[]
{
/* VDN VUP MICM HPFN ARMC */
0, 0, 1, 1, 1,
/* ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 DEL15 DEL17 PAUS PRT HOM */
0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
/* BKTK 1 2 3 4 5 6 7 8 9 0 - = BSPC BSPC BSPC PLY15 NMLK NMDV NMTM NMMI */
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
/* TAB Q W E R T Y U I O P [ ] \ STP15 NM7 NM8 NM9 NMPL */
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
/* CPLK A S D F G H J K L ; " # ENTR ENTR ENTR PRV15 NM4 NM5 NM6 NMPL */
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
/* LSFT ISO\ Z X C V B N M , . / RSFT RSFT RSFT ARWU NXT15 NM1 NM2 NM3 NMER */
0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
/* LCTL LFNC LWIN LALT SPC RALT RFNC RCTL ARWL ARWD ARWR PRT15 NM0 NMPD NMER */
0, 0, 0, 0, 1, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
/* LB1 LB1 LB3 LB4 LB5 LB6 */
5, 5, 4, 6, 7, 7,
/* KSTN LOGO LIDL LIDR */
3, 0, 0, 3,
};
static byte[] packetZoneNumpad = new byte[]
{
/* VDN VUP MICM HPFN ARMC */
0, 0, 0, 1, 1,
/* ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 DEL15 DEL17 PAUS PRT HOM */
0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3,
/* BKTK 1 2 3 4 5 6 7 8 9 0 - = BSPC BSPC BSPC PLY15 NMLK NMDV NMTM NMMI */
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
/* TAB Q W E R T Y U I O P [ ] \ STP15 NM7 NM8 NM9 NMPL */
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3,
/* CPLK A S D F G H J K L ; " # ENTR ENTR ENTR PRV15 NM4 NM5 NM6 NMPL */
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
/* LSFT ISO\ Z X C V B N M , . / RSFT RSFT RSFT ARWU NXT15 NM1 NM2 NM3 NMER */
0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
/* LCTL LFNC LWIN LALT SPC RALT RFNC RCTL ARWL ARWD ARWR PRT15 NM0 NMPD NMER */
0, 0, 0, 0, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3,
/* LB1 LB1 LB3 LB4 LB5 LB6 */
5, 5, 4, 6, 7, 7,
/* KSTN LOGO LIDL LIDR */
3, 0, 0, 3,
};
static byte[] packet4Zone = new byte[]
{
/*01 Z1 Z2 Z3 Z4 NA NA KeyZone */
0, 1, 2, 3, 0, 0,
/*02 RR R RM LM L LL LighBar */
7, 7, 6, 5, 4, 4,
};
public static void ApplyDirect(Color[] color, bool init = false)
{
const byte keySet = 167;
const byte ledCount = 178;
const ushort mapSize = 3 * ledCount;
const byte ledsPerPacket = 16;
byte[] buffer = new byte[64];
byte[] keyBuf = new byte[mapSize];
buffer[0] = AsusHid.AURA_ID;
buffer[1] = 0xbc;
buffer[2] = 0;
buffer[3] = 1;
buffer[4] = 1;
buffer[5] = 1;
buffer[6] = 0;
buffer[7] = 0x10;
if (init)
{
Init();
AsusHid.WriteAura(new byte[] { AsusHid.AURA_ID, 0xbc });
}
Array.Clear(keyBuf, 0, keyBuf.Length);
if (!isStrix4Zone) // per key
{
for (int ledIndex = 0; ledIndex < packetMap.Count(); ledIndex++)
{
ushort offset = (ushort)(3 * packetMap[ledIndex]);
byte zone = isStrixNumpad ? packetZoneNumpad[ledIndex] : packetZone[ledIndex];
keyBuf[offset] = color[zone].R;
keyBuf[offset + 1] = color[zone].G;
keyBuf[offset + 2] = color[zone].B;
}
for (int i = 0; i < keySet; i += ledsPerPacket)
{
byte ledsRemaining = (byte)(keySet - i);
if (ledsRemaining < ledsPerPacket)
{
buffer[7] = ledsRemaining;
}
buffer[6] = (byte)i;
Buffer.BlockCopy(keyBuf, 3 * i, buffer, 9, 3 * buffer[7]);
AsusHid.WriteAura(buffer);
}
}
buffer[4] = 0x04;
buffer[5] = 0x00;
buffer[6] = 0x00;
buffer[7] = 0x00;
if (isStrix4Zone) { // per zone
var leds_4_zone = packet4Zone.Count();
for (int ledIndex = 0; ledIndex < leds_4_zone; ledIndex++)
{
byte zone = packet4Zone[ledIndex];
keyBuf[ledIndex * 3] = color[zone].R;
keyBuf[ledIndex * 3 + 1] = color[zone].G;
keyBuf[ledIndex * 3 + 2] = color[zone].B;
}
Buffer.BlockCopy(keyBuf, 0, buffer, 9, 3 * leds_4_zone);
AsusHid.WriteAura(buffer);
return;
}
Buffer.BlockCopy(keyBuf, 3 * keySet, buffer, 9, 3 * (ledCount - keySet));
AsusHid.WriteAura(buffer);
}
public static void ApplyColor(Color color, bool init = false)
{
if (isACPI)
{
Program.acpi.TUFKeyboardRGB(0, color, 0, null);
return;
}
if (isStrix && !isOldHeatmap)
{
ApplyDirect(Enumerable.Repeat(color, AURA_ZONES).ToArray(), init);
return;
}
else
{
AsusHid.WriteAura(AuraMessage(0, color, color, 0));
AsusHid.WriteAura(MESSAGE_SET);
}
}
public static void ApplyAura()
{
Mode = (AuraMode)AppConfig.Get("aura_mode");
Speed = (AuraSpeed)AppConfig.Get("aura_speed");
SetColor(AppConfig.Get("aura_color"));
SetColor2(AppConfig.Get("aura_color2"));
timer.Enabled = false;
if (Mode == AuraMode.HEATMAP)
{
CustomRGB.ApplyHeatmap(true);
timer.Enabled = true;
timer.Interval = 2000;
return;
}
if (Mode == AuraMode.AMBIENT)
{
CustomRGB.ApplyAmbient(true);
timer.Enabled = true;
timer.Interval = 100;
return;
}
if (Mode == AuraMode.GPUMODE)
{
CustomRGB.ApplyGPUColor();
return;
}
int _speed = (Speed == AuraSpeed.Normal) ? 0xeb : (Speed == AuraSpeed.Fast) ? 0xf5 : 0xe1;
AsusHid.Write(new List<byte[]> { AuraMessage(Mode, Color1, Color2, _speed, isSingleColor), MESSAGE_APPLY, MESSAGE_SET });
if (isACPI)
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);
}
public static class CustomRGB
{
public static void ApplyGPUColor()
{
if ((AuraMode)AppConfig.Get("aura_mode") != AuraMode.GPUMODE) return;
switch (GPUModeControl.gpuMode)
{
case AsusACPI.GPUModeUltimate:
ApplyColor(Color.Red, true);
break;
case AsusACPI.GPUModeEco:
ApplyColor(Color.Green, true);
break;
default:
ApplyColor(Color.Yellow, true);
break;
}
}
public static void ApplyHeatmap(bool init = false)
{
float cpuTemp = (float)HardwareControl.GetCPUTemp();
int freeze = 20, cold = 40, warm = 65, hot = 90;
Color color;
//Debug.WriteLine(cpuTemp);
if (cpuTemp < cold) color = ColorUtils.GetWeightedAverage(Color.Blue, Color.Green, ((float)cpuTemp - freeze) / (cold - freeze));
else if (cpuTemp < warm) color = ColorUtils.GetWeightedAverage(Color.Green, Color.Yellow, ((float)cpuTemp - cold) / (warm - cold));
else if (cpuTemp < hot) color = ColorUtils.GetWeightedAverage(Color.Yellow, Color.Red, ((float)cpuTemp - warm) / (hot - warm));
else color = Color.Red;
ApplyColor(color, init);
}
public static void ApplyAmbient(bool init = false)
{
var bound = Screen.GetBounds(Point.Empty);
bound.Y += bound.Height / 3;
bound.Height -= (int)Math.Round(bound.Height * (0.33f + 0.022f)); // cut 1/3 of the top screen + windows panel
Bitmap screen_low = screen_low = AmbientData.CamptureScreen(bound, 512, 288); //quality decreases greatly if it is less 512 ;
Bitmap screeb_pxl;
int zones = AURA_ZONES;
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[4].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(1, 1)); // left bck
AmbientData.Colors[5].RGB = ColorUtils.HSV.UpSaturation(mid_left); // center left
AmbientData.Colors[6].RGB = ColorUtils.HSV.UpSaturation(mid_right); // center right
AmbientData.Colors[7].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(3, 1)); // right bck
for (int i = 0; i < 4; i++) // keyboard
AmbientData.Colors[i].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(i, 0));
}
else
{
zones = 1;
screeb_pxl = AmbientData.ResizeImage(screen_low, 1, 1);
AmbientData.Colors[0].RGB = ColorUtils.HSV.UpSaturation(screeb_pxl.GetPixel(0, 0), (float)0.3);
}
//screeb_pxl.Save("test.jpg", ImageFormat.Jpeg);
screen_low.Dispose();
screeb_pxl.Dispose();
bool is_fresh = false;
for (int i = 0; i < zones; i++)
{
if (AmbientData.result[i].ToArgb() != AmbientData.Colors[i].RGB.ToArgb()) is_fresh = true;
AmbientData.result[i] = AmbientData.Colors[i].RGB;
}
if (is_fresh)
{
if (isStrix) ApplyDirect(AmbientData.result, init);
else ApplyColor(AmbientData.result[0], init);
}
}
static class AmbientData
{
public enum StretchMode
{
STRETCH_ANDSCANS = 1,
STRETCH_ORSCANS = 2,
STRETCH_DELETESCANS = 3,
STRETCH_HALFTONE = 4,
}
[DllImport("user32.dll")]
private static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);
[DllImport("gdi32.dll")]
private static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport("gdi32.dll")]
private static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth, int nHeight);
[DllImport("gdi32.dll")]
private static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
[DllImport("user32.dll")]
private static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("gdi32.dll")]
private static extern bool DeleteDC(IntPtr hdc);
[DllImport("gdi32.dll")]
private static extern bool DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll")]
private static extern bool StretchBlt(IntPtr hdcDest, int nXOriginDest, int nYOriginDest,
int nWidthDest, int nHeightDest,
IntPtr hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, Int32 dwRop);
[DllImport("gdi32.dll")]
static extern bool SetStretchBltMode(IntPtr hdc, StretchMode iStretchMode);
/// <summary>
/// Captures a screenshot.
/// </summary>
public static Bitmap CamptureScreen(Rectangle rec, int out_w, int out_h)
{
IntPtr desktop = GetDesktopWindow();
IntPtr hdc = GetWindowDC(desktop);
IntPtr hdcMem = CreateCompatibleDC(hdc);
IntPtr hBitmap = CreateCompatibleBitmap(hdc, out_w, out_h);
IntPtr hOld = SelectObject(hdcMem, hBitmap);
SetStretchBltMode(hdcMem, StretchMode.STRETCH_DELETESCANS);
StretchBlt(hdcMem, 0, 0, out_w, out_h, hdc, rec.X, rec.Y, rec.Width, rec.Height, 0x00CC0020);
SelectObject(hdcMem, hOld);
DeleteDC(hdcMem);
ReleaseDC(desktop, hdc);
var result = Image.FromHbitmap(hBitmap, IntPtr.Zero);
DeleteObject(hBitmap);
return result;
}
public static Bitmap ResizeImage(Image image, int width, int height)
{
var destRect = new Rectangle(0, 0, width, height);
var destImage = new Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.Bicubic;
graphics.SmoothingMode = SmoothingMode.None;
graphics.PixelOffsetMode = PixelOffsetMode.None;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
static public Color[] result = new Color[AURA_ZONES];
static public ColorUtils.SmoothColor[] Colors = Enumerable.Repeat(0, AURA_ZONES).
Select(h => new ColorUtils.SmoothColor()).ToArray();
public static Color GetMostUsedColor(Bitmap bitMap)
{
var colorIncidence = new Dictionary<int, int>();
for (var x = 0; x < bitMap.Size.Width; x++)
for (var y = 0; y < bitMap.Size.Height; y++)
{
var pixelColor = bitMap.GetPixel(x, y).ToArgb();
if (colorIncidence.Keys.Contains(pixelColor))
colorIncidence[pixelColor]++;
else
colorIncidence.Add(pixelColor, 1);
}
return Color.FromArgb(colorIncidence.OrderByDescending(x => x.Value).ToDictionary(x => x.Key, x => x.Value).First().Key);
}
}
}
}
}

71
app/USB/XGM.cs Normal file
View 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);
}
}
}

View File

@@ -55,10 +55,10 @@ namespace GHelper
tableBios.AutoSize = true;
tableBios.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableBios.ColumnCount = 4;
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 23F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableBios.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 22F));
tableBios.Dock = DockStyle.Top;
tableBios.Location = new Point(20, 20);
tableBios.Margin = new Padding(4);
@@ -99,14 +99,14 @@ namespace GHelper
panelBiosTitle.Location = new Point(0, 0);
panelBiosTitle.Margin = new Padding(4);
panelBiosTitle.Name = "panelBiosTitle";
panelBiosTitle.Size = new Size(1256, 62);
panelBiosTitle.Size = new Size(1294, 62);
panelBiosTitle.TabIndex = 3;
//
// labelUpdates
//
labelUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelUpdates.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelUpdates.Location = new Point(810, 23);
labelUpdates.Location = new Point(848, 23);
labelUpdates.Name = "labelUpdates";
labelUpdates.Size = new Size(245, 32);
labelUpdates.TabIndex = 4;
@@ -122,7 +122,7 @@ namespace GHelper
buttonRefresh.FlatAppearance.BorderSize = 0;
buttonRefresh.FlatStyle = FlatStyle.Flat;
buttonRefresh.Image = Properties.Resources.icons8_refresh_32;
buttonRefresh.Location = new Point(1183, 14);
buttonRefresh.Location = new Point(1221, 14);
buttonRefresh.Name = "buttonRefresh";
buttonRefresh.Secondary = true;
buttonRefresh.Size = new Size(52, 46);
@@ -138,7 +138,7 @@ namespace GHelper
panelBios.Margin = new Padding(4);
panelBios.Name = "panelBios";
panelBios.Padding = new Padding(20);
panelBios.Size = new Size(1256, 40);
panelBios.Size = new Size(1294, 40);
panelBios.TabIndex = 4;
//
// panelDrivers
@@ -150,7 +150,7 @@ namespace GHelper
panelDrivers.Margin = new Padding(4);
panelDrivers.Name = "panelDrivers";
panelDrivers.Padding = new Padding(20);
panelDrivers.Size = new Size(1256, 40);
panelDrivers.Size = new Size(1294, 40);
panelDrivers.TabIndex = 6;
//
// tableDrivers
@@ -158,10 +158,10 @@ namespace GHelper
tableDrivers.AutoSize = true;
tableDrivers.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableDrivers.ColumnCount = 4;
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 23F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 15F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableDrivers.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 22F));
tableDrivers.Dock = DockStyle.Top;
tableDrivers.Location = new Point(20, 20);
tableDrivers.Margin = new Padding(4);
@@ -178,7 +178,7 @@ namespace GHelper
panelDriversTitle.Location = new Point(0, 102);
panelDriversTitle.Margin = new Padding(4);
panelDriversTitle.Name = "panelDriversTitle";
panelDriversTitle.Size = new Size(1256, 44);
panelDriversTitle.Size = new Size(1294, 44);
panelDriversTitle.TabIndex = 5;
//
// labelDrivers
@@ -208,7 +208,7 @@ namespace GHelper
AutoScaleDimensions = new SizeF(192F, 192F);
AutoScaleMode = AutoScaleMode.Dpi;
AutoScroll = true;
ClientSize = new Size(1256, 690);
ClientSize = new Size(1294, 690);
Controls.Add(panelDrivers);
Controls.Add(panelDriversTitle);
Controls.Add(panelBios);

View File

@@ -74,6 +74,22 @@ Each BIOS mode is paired with matching Windows Power Mode. You can adjust this s
![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)
### :mouse: Asus Mouse and other peripherals support
[Currently supported models](https://github.com/seerge/g-helper/discussions/900)
- ROG Harpe Ace Aim Lab Edition
- ROG Keris Wireless
- ROG Chakram X (P708)
- ROG Chakram Core (P511)
- 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,7 +109,9 @@ Ultimate mode is supported (by hardware) only on 2022+ models
You don't have to, it's purely optional. From my experience built in (in BIOS) performance modes work well. Limit your power or apply custom fan curves only if you have issues. As soon as you click Apply in the ``Fans + Power`` section BIOS will consider your fan curve as "custom"! (no matter if you modified it or not)
#### How does G-helper control my fan speeds?
**It doesn't.** Your BIOS does (same as in case with Armoury). What G-helper can do - is (optionally) set a custom fan profile to current performance mode consisting of 8 pairs of temperature + fan speed % via same endpoint armoury seem to use.
**It doesn't.** Your firmware / BIOS controls them in real-time. Armoury also doesn't control fans in real time anyhow.
What G-helper can do - is (optionally) set a custom fan profile to the current performance mode consisting of 8 pairs of temperature + fan speed % via the same endpoint Armoury seems to use. How it will be interpreted - is still up to the firmware.
#### How do I change fan % to fan RPM?
Click on them
@@ -286,7 +304,7 @@ To disable automatic touchpad toggling when laptop enters / leaves tablet mode
```
### Extra Keybindings
- ``Ctrl + Shift + F5`` - Toggle Performance Modes
- ``Ctrl + Shift + F5`` / ``Ctrl + Shift + Alt + F5`` - Toggle Performance Modes
- ``Ctrl + Shift + F12`` - Open G-Helper window
- ``Ctrl + M1 / M2`` - Screen brightness Down / Up
- ``Shift + M1 / M2`` - Backlight brightness Down / Up
@@ -298,7 +316,7 @@ If you don't want this bindings to work you can add
### Toggle Performance Mode or Toggle App Window key binding
To change binding for Toggle Performance Modes to ``Ctrl + Shift + KEY``
To change binding for Toggle Performance Modes forward / backward to ``Ctrl + Shift + KEY`` / ``Ctrl + Shift + Alt + KEY``
```
"keybind_profile": 116,
```