Compare commits

..

27 Commits

Author SHA1 Message Date
Serge
f326fa99cc Cleanup 2024-02-12 10:14:52 +01:00
Serge
ab44dbf2b4 More slash modes 2024-02-11 21:39:43 +01:00
Serge
6e88cd2304 Merge branch 'main' into slash_lightning 2024-02-11 16:23:51 +01:00
Serge
1d30699fa2 Merge branch 'main' of https://github.com/seerge/g-helper 2024-02-11 16:09:52 +01:00
Serge
060e3b7f7d Updates to RyzenControl to support Hawk Point CPUs 2024-02-11 16:09:51 +01:00
Serge
7639950843 Slash tweaks 2024-02-11 16:08:30 +01:00
Serge
2785bc6267 Update README.md 2024-02-11 14:03:11 +01:00
Serge
c4cd7748f6 UI tweaks 2024-02-11 12:06:54 +01:00
Serge
1adec8b6c9 Slash Interval settings 2024-02-11 12:03:11 +01:00
Serge
094fce0117 Backlight brightness tweak for G14 2024 2024-02-11 11:46:37 +01:00
Serge
ae298873ca Minor tweaks 2024-02-11 11:44:40 +01:00
Serge
773a5899d1 Slash Lightning tweaks 2024-02-10 23:11:31 +01:00
Serge
af9d3eb50e Skip airplane mode command for ancient devices https://github.com/seerge/g-helper/issues/2052 2024-02-10 22:53:22 +01:00
Serge
72888401b9 Slash lightning UI tweaks 2024-02-10 22:49:17 +01:00
Serge
6a44c42cbf Slash Lightning 2024-02-10 22:04:45 +01:00
Serge
03f7d717b6 Merge branch 'main' of https://github.com/seerge/g-helper 2024-02-10 17:19:06 +01:00
Serge
833b750227 Anime Matrix cleanup 2024-02-10 17:19:04 +01:00
Serge
b6dbc1ed25 New Crowdin updates (#2050)
* New translations strings.resx (French)

* New translations strings.resx (French)
2024-02-10 12:43:11 +01:00
Serge
103c65a43d Custom fan curves fix for GA503.317 https://github.com/seerge/g-helper/issues/2049 2024-02-09 22:15:25 +01:00
Serge
d19ff265ab Version bump 2024-02-09 21:52:56 +01:00
Serge
5d71a40987 Merge branch 'main' of https://github.com/seerge/g-helper 2024-02-09 21:52:06 +01:00
Serge
9b33a43b49 Swapped fans workaround for GA503.317 2024-02-09 21:52:03 +01:00
Serge
df5bcbc376 New translations strings.resx (Spanish) (#2048) 2024-02-09 21:21:09 +01:00
Serge
71b74801ba New translations strings.resx (Spanish) (#2047) 2024-02-09 20:10:00 +01:00
Serge
6bab2fc9cb Anime Matrix hibernate wake-up tweaks 2024-02-09 15:49:09 +01:00
Serge
428b624ec6 Anime Matrix hibernate wake-up tweak 2024-02-09 15:48:24 +01:00
Serge
af001b056a UI Fixes 2024-02-07 21:22:12 +01:00
18 changed files with 461 additions and 215 deletions

View File

@@ -1,6 +1,5 @@
using NAudio.CoreAudioApi;
using NAudio.Wave;
using Starlight.AnimeMatrix;
using System.Diagnostics;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
@@ -15,14 +14,17 @@ namespace GHelper.AnimeMatrix
SettingsForm settings;
System.Timers.Timer matrixTimer = default!;
public AnimeMatrixDevice? device;
public AnimeMatrixDevice? deviceMatrix;
public SlashDevice? deviceSlash;
double[]? AudioValues;
WasapiCapture? AudioDevice;
string? AudioDeviceId;
private MMDeviceEnumerator? AudioDeviceEnum;
public bool IsValid => device != null;
public bool IsValid => deviceMatrix != null || deviceSlash != null;
public bool IsSlash => deviceSlash != null;
private long lastPresent;
private List<double> maxes = new List<double>();
@@ -33,38 +35,82 @@ namespace GHelper.AnimeMatrix
try
{
device = new AnimeMatrixDevice();
Task.Run(device.WakeUp);
if (AppConfig.IsSlash())
deviceSlash = new SlashDevice();
else
deviceMatrix = new AnimeMatrixDevice();
matrixTimer = new System.Timers.Timer(100);
matrixTimer.Elapsed += MatrixTimer_Elapsed;
}
catch
catch (Exception ex)
{
device = null;
Logger.WriteLine(ex.Message);
}
}
public void SetDevice(bool wakeUp = false)
{
if (deviceMatrix is not null) SetMatrix(wakeUp);
if (deviceSlash is not null) SetSlash(wakeUp);
}
public void SetSlash(bool wakeUp = false)
{
if (deviceSlash is null) return;
int brightness = AppConfig.Get("matrix_brightness", 0);
int running = AppConfig.Get("matrix_running", 0);
int inteval = AppConfig.Get("matrix_interval", 0);
bool auto = AppConfig.Is("matrix_auto");
Task.Run(() =>
{
try
{
deviceSlash.SetProvider();
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
return;
}
if (wakeUp) deviceSlash.WakeUp();
if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online))
{
deviceSlash.Init();
deviceSlash.SetOptions(false, 0, 0);
}
else
{
deviceSlash.Init();
deviceSlash.SetMode((SlashMode)running);
deviceSlash.SetOptions(true, brightness, inteval);
deviceSlash.Save();
}
});
}
public void SetBatteryAuto()
{
if (deviceSlash is not null) deviceSlash.SetBatterySaver(AppConfig.Is("matrix_auto"));
if (deviceMatrix is not null) SetMatrix();
}
public void SetMatrix(bool wakeUp = false)
{
if (!IsValid) return;
int brightness = AppConfig.Get("matrix_brightness");
int running = AppConfig.Get("matrix_running");
if (deviceMatrix is null) return;
int brightness = AppConfig.Get("matrix_brightness", 0);
int running = AppConfig.Get("matrix_running", 0);
bool auto = AppConfig.Is("matrix_auto");
if (brightness < 0) brightness = 0;
if (running < 0) running = 0;
BuiltInAnimation animation = new BuiltInAnimation(
(BuiltInAnimation.Running)running,
BuiltInAnimation.Sleeping.Starfield,
BuiltInAnimation.Shutdown.SeeYa,
BuiltInAnimation.Startup.StaticEmergence
);
StopMatrixTimer();
StopMatrixAudio();
@@ -72,7 +118,7 @@ namespace GHelper.AnimeMatrix
{
try
{
device.SetProvider();
deviceMatrix.SetProvider();
}
catch (Exception ex)
{
@@ -80,18 +126,18 @@ namespace GHelper.AnimeMatrix
return;
}
if (wakeUp && AppConfig.ContainsModel("401")) device.WakeUp();
if (wakeUp) deviceMatrix.WakeUp();
if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online))
{
device.SetDisplayState(false);
device.SetDisplayState(false); // some devices are dumb
deviceMatrix.SetDisplayState(false);
deviceMatrix.SetDisplayState(false); // some devices are dumb
Logger.WriteLine("Matrix Off");
}
else
{
device.SetDisplayState(true);
device.SetBrightness((BrightnessMode)brightness);
deviceMatrix.SetDisplayState(true);
deviceMatrix.SetBrightness((BrightnessMode)brightness);
switch (running)
{
@@ -105,8 +151,7 @@ namespace GHelper.AnimeMatrix
SetMatrixAudio();
break;
default:
device.SetBuiltInAnimation(true, animation);
Logger.WriteLine("Matrix builtin " + animation.AsByte);
SetBuiltIn(running);
break;
}
@@ -115,6 +160,19 @@ namespace GHelper.AnimeMatrix
}
private void SetBuiltIn(int running)
{
BuiltInAnimation animation = new BuiltInAnimation(
(BuiltInAnimation.Running)running,
BuiltInAnimation.Sleeping.Starfield,
BuiltInAnimation.Shutdown.SeeYa,
BuiltInAnimation.Startup.StaticEmergence
);
deviceMatrix.SetBuiltInAnimation(true, animation);
Logger.WriteLine("Matrix builtin: " + animation.AsByte);
}
private void StartMatrixTimer(int interval = 100)
{
matrixTimer.Interval = interval;
@@ -129,15 +187,16 @@ namespace GHelper.AnimeMatrix
private void MatrixTimer_Elapsed(object? sender, ElapsedEventArgs e)
{
//if (!IsValid) return;
if (deviceMatrix is null) return;
switch (AppConfig.Get("matrix_running"))
{
case 2:
device.PresentNextFrame();
deviceMatrix.PresentNextFrame();
break;
case 3:
device.PresentClock();
deviceMatrix.PresentClock();
break;
}
@@ -146,7 +205,7 @@ namespace GHelper.AnimeMatrix
public void SetMatrixClock()
{
device.SetBuiltInAnimation(false);
deviceMatrix.SetBuiltInAnimation(false);
StartMatrixTimer(1000);
Logger.WriteLine("Matrix Clock");
}
@@ -177,9 +236,9 @@ namespace GHelper.AnimeMatrix
void SetMatrixAudio()
{
if (!IsValid) return;
if (deviceMatrix is null) return;
device.SetBuiltInAnimation(false);
deviceMatrix.SetBuiltInAnimation(false);
StopMatrixTimer();
StopMatrixAudio();
@@ -251,18 +310,20 @@ namespace GHelper.AnimeMatrix
for (int x = 0; x < 2 - (y % 2); x++)
{
//color = (byte)(Math.Min(1,(h - y - 2)*2) * 255);
device.SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
device.SetLedPlanar(x + dx, dy - y, 255);
deviceMatrix.SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
deviceMatrix.SetLedPlanar(x + dx, dy - y, 255);
}
}
void PresentAudio(double[] audio)
{
if (deviceMatrix is null) return;
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastPresent) < 70) return;
lastPresent = DateTimeOffset.Now.ToUnixTimeMilliseconds();
device.Clear();
deviceMatrix.Clear();
int size = 20;
double[] bars = new double[size];
@@ -280,7 +341,7 @@ namespace GHelper.AnimeMatrix
for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i] * 20 / maxAverage);
device.Present();
deviceMatrix.Present();
}
@@ -309,7 +370,7 @@ namespace GHelper.AnimeMatrix
AppConfig.Set("matrix_running", 2);
SetMatrixPicture(fileName);
settings.SetMatrixRunning(2);
settings.VisualiseMatrixRunning(2);
}
@@ -318,7 +379,8 @@ namespace GHelper.AnimeMatrix
public void SetMatrixPicture(string fileName, bool visualise = true)
{
if (!IsValid) return;
if (deviceMatrix is null) return;
StopMatrixTimer();
try
@@ -338,7 +400,7 @@ namespace GHelper.AnimeMatrix
}
fs.Close();
if (visualise) settings.VisualiseMatrix(fileName);
if (visualise) settings.VisualiseMatrixPicture(fileName);
}
}
catch
@@ -351,8 +413,8 @@ namespace GHelper.AnimeMatrix
protected void ProcessPicture(Image image)
{
device.SetBuiltInAnimation(false);
device.ClearFrames();
deviceMatrix.SetBuiltInAnimation(false);
deviceMatrix.ClearFrames();
int matrixX = AppConfig.Get("matrix_x", 0);
int matrixY = AppConfig.Get("matrix_y", 0);
@@ -380,11 +442,11 @@ namespace GHelper.AnimeMatrix
image.SelectActiveFrame(dimension, i);
if (rotation == MatrixRotation.Planar)
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
deviceMatrix.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
else
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
deviceMatrix.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
device.AddFrame();
deviceMatrix.AddFrame();
}
@@ -397,11 +459,11 @@ namespace GHelper.AnimeMatrix
else
{
if (rotation == MatrixRotation.Planar)
device.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
deviceMatrix.GenerateFrame(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
else
device.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
deviceMatrix.GenerateFrameDiagonal(image, matrixZoom, matrixX, matrixY, matrixQuality, matrixContrast);
device.Present();
deviceMatrix.Present();
}
}

View File

@@ -5,7 +5,7 @@ using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Text;
namespace Starlight.AnimeMatrix
namespace GHelper.AnimeMatrix
{
public class BuiltInAnimation
{
@@ -71,7 +71,6 @@ namespace Starlight.AnimeMatrix
}
public enum BrightnessMode : byte
{
Off = 0,
@@ -81,7 +80,6 @@ namespace Starlight.AnimeMatrix
}
public class AnimeMatrixDevice : Device
{
int UpdatePageLength = 490;
@@ -93,7 +91,6 @@ namespace Starlight.AnimeMatrix
public int MaxRows = 61;
public int MaxColumns = 34;
public int LedStart = 0;
public int FullRows = 11;
private int frameIndex = 0;
@@ -139,6 +136,56 @@ namespace Starlight.AnimeMatrix
}
public void WakeUp()
{
Set(Packet<AnimeMatrixPacket>(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")));
}
public void SetBrightness(BrightnessMode mode)
{
Set(Packet<AnimeMatrixPacket>(0xC0, 0x04, (byte)mode));
}
public void SetDisplayState(bool enable)
{
Set(Packet<AnimeMatrixPacket>(0xC3, 0x01, enable ? (byte)0x00 : (byte)0x80));
}
public void SetBuiltInAnimation(bool enable)
{
Set(Packet<AnimeMatrixPacket>(0xC4, 0x01, enable ? (byte)0x00 : (byte)0x80));
}
public void SetBuiltInAnimation(bool enable, BuiltInAnimation animation)
{
SetBuiltInAnimation(enable);
Set(Packet<AnimeMatrixPacket>(0xC5, animation.AsByte));
}
public void Present()
{
int page = 0;
int start, end;
while (page * UpdatePageLength < LedCount)
{
start = page * UpdatePageLength;
end = Math.Min(LedCount, (page + 1) * UpdatePageLength);
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
.AppendData(BitConverter.GetBytes((ushort)(start + 1)))
.AppendData(BitConverter.GetBytes((ushort)(end - start)))
.AppendData(_displayBuffer[start..end])
);
page++;
}
Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
}
private void LoadMFont()
{
byte[] fontData = GHelper.Properties.Resources.MFont;
@@ -151,10 +198,6 @@ namespace Starlight.AnimeMatrix
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontPtr);
}
public byte[] GetBuffer()
{
return _displayBuffer;
}
public void PresentNextFrame()
{
@@ -175,12 +218,6 @@ namespace Starlight.AnimeMatrix
frames.Add(_displayBuffer.ToArray());
}
public void SendRaw(params byte[] data)
{
Set(Packet<AnimeMatrixPacket>(data));
}
public int Width()
{
switch (_model)
@@ -294,99 +331,19 @@ namespace Starlight.AnimeMatrix
}
public void WakeUp()
{
Set(Packet<AnimeMatrixPacket>(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")));
}
public void SetLedLinear(int address, byte value)
{
if (!IsAddressableLed(address)) return;
_displayBuffer[address] = value;
}
public void SetLedLinearImmediate(int address, byte value)
{
if (!IsAddressableLed(address)) return;
_displayBuffer[address] = value;
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
.AppendData(BitConverter.GetBytes((ushort)(address + 1)))
.AppendData(BitConverter.GetBytes((ushort)0x0001))
.AppendData(value)
);
Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
}
public void Clear(bool present = false)
{
for (var i = 0; i < _displayBuffer.Length; i++)
_displayBuffer[i] = 0;
if (present)
Present();
for (var i = 0; i < _displayBuffer.Length; i++) _displayBuffer[i] = 0;
if (present) Present();
}
public void Present()
{
int page = 0;
int start, end;
while (page * UpdatePageLength < LedCount)
{
start = page * UpdatePageLength;
end = Math.Min(LedCount, (page + 1) * UpdatePageLength);
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
.AppendData(BitConverter.GetBytes((ushort)(start + 1)))
.AppendData(BitConverter.GetBytes((ushort)(end - start)))
.AppendData(_displayBuffer[start..end])
);
page++;
}
Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
}
public void SetDisplayState(bool enable)
{
if (enable)
{
Set(Packet<AnimeMatrixPacket>(0xC3, 0x01)
.AppendData(0x00));
}
else
{
Set(Packet<AnimeMatrixPacket>(0xC3, 0x01)
.AppendData(0x80));
}
}
public void SetBrightness(BrightnessMode mode)
{
Set(Packet<AnimeMatrixPacket>(0xC0, 0x04)
.AppendData((byte)mode)
);
}
public void SetBuiltInAnimation(bool enable)
{
var enabled = enable ? (byte)0x00 : (byte)0x80;
Set(Packet<AnimeMatrixPacket>(0xC4, 0x01, enabled));
}
public void SetBuiltInAnimation(bool enable, BuiltInAnimation animation)
{
SetBuiltInAnimation(enable);
Set(Packet<AnimeMatrixPacket>(0xC5, animation.AsByte));
}
private void SetBitmapDiagonal(Bitmap bmp, int deltaX = 0, int deltaY = 0, int contrast = 100)
{
for (int y = 0; y < bmp.Height; y++)

View File

@@ -36,11 +36,12 @@ namespace GHelper.AnimeMatrix.Communication.Platform
{
HidDevice = DeviceList.Local
.GetHidDevices(vendorId, productId)
.First(x => x.GetMaxFeatureReportLength() == maxFeatureReportLength);
.First(x => x.GetMaxFeatureReportLength() >= maxFeatureReportLength);
Logger.WriteLine("Matrix Device: " + HidDevice.DevicePath + " " + HidDevice.GetMaxFeatureReportLength());
}
catch
{
throw new IOException("AniMe Matrix control device was not found on your machine.");
throw new IOException("Matrix control device was not found on your machine.");
}
var config = new OpenConfiguration();

View File

@@ -0,0 +1,138 @@
using GHelper.AnimeMatrix.Communication;
using System.Text;
namespace GHelper.AnimeMatrix
{
public enum SlashMode
{
Bounce,
Slash,
Loading,
BitStream,
Transmission,
Flow,
Flux,
Phantom,
Spectrum,
Hazard,
Interfacing,
Ramp,
GameOver,
Start,
Buzzer
}
internal class SlashPacket : Packet
{
public SlashPacket(byte[] command) : base(0x5E, 128, command)
{
}
}
public class SlashDevice : Device
{
public static Dictionary<SlashMode, string> Modes = new Dictionary<SlashMode, string>
{
{ SlashMode.Bounce, "Bounce"},
{ SlashMode.Slash, "Slash"},
{ SlashMode.Loading, "Loading"},
{ SlashMode.BitStream, "Bit Stream"},
{ SlashMode.Transmission, "Transmission"},
{ SlashMode.Flow, "Flow"},
{ SlashMode.Flux, "Flux"},
{ SlashMode.Phantom, "Phantom"},
{ SlashMode.Spectrum, "Spectrum"},
{ SlashMode.Hazard, "Hazard"},
{ SlashMode.Interfacing, "Interfacing"},
{ SlashMode.Ramp, "Ramp"},
{ SlashMode.GameOver, "Game Over"},
{ SlashMode.Start, "Start"},
{ SlashMode.Buzzer, "Buzzer"},
};
private static Dictionary<SlashMode, byte> modeCodes = new Dictionary<SlashMode, byte>
{
{ SlashMode.Bounce, 0x10},
{ SlashMode.Slash, 0x12},
{ SlashMode.Loading, 0x13},
{ SlashMode.BitStream, 0x1D},
{ SlashMode.Transmission, 0x1A},
{ SlashMode.Flow, 0x19},
{ SlashMode.Flux, 0x25},
{ SlashMode.Phantom, 0x24},
{ SlashMode.Spectrum, 0x26},
{ SlashMode.Hazard, 0x32},
{ SlashMode.Interfacing, 0x33},
{ SlashMode.Ramp, 0x34},
{ SlashMode.GameOver, 0x42},
{ SlashMode.Start, 0x43},
{ SlashMode.Buzzer, 0x44},
};
public SlashDevice() : base(0x0B05, 0x193B, 128)
{
}
public void WakeUp()
{
Set(Packet<SlashPacket>(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")));
}
public void Init()
{
Set(Packet<SlashPacket>(0xD7, 0x00, 0x00, 0x01, 0xAC));
Set(Packet<SlashPacket>(0xD2, 0x02, 0x01, 0x08, 0xAB));
}
public void Save()
{
Set(Packet<SlashPacket>(0xD4, 0x00, 0x00, 0x01, 0xAB));
}
public void SetMode(SlashMode mode)
{
byte modeByte;
try
{
modeByte = modeCodes[mode];
}
catch (Exception)
{
modeByte = 0x00;
}
Set(Packet<SlashPacket>(0xD2, 0x03, 0x00, 0x0C));
Set(Packet<SlashPacket>(0xD3, 0x04, 0x00, 0x0C, 0x01, modeByte, 0x02, 0x19, 0x03, 0x13, 0x04, 0x11, 0x05, 0x12, 0x06, 0x13));
}
public void SetOptions(bool status, int brightness = 0, int interval = 0)
{
byte brightnessByte = (byte)(brightness * 85.333);
Set(Packet<SlashPacket>(0xD3, 0x03, 0x01, 0x08, 0xAB, 0xFF, 0x01, status ? (byte)0x01 : (byte)0x00, 0x06, brightnessByte, 0xFF, (byte)interval));
}
public void SetBatterySaver(bool status)
{
Set(Packet<SlashPacket>(0xD8, 0x01, 0x00, 0x01, status ? (byte)0x80 : (byte)0x00));
}
public void Set(Packet packet)
{
_usbProvider?.Set(packet.Data);
Logger.WriteLine("Slash:" + BitConverter.ToString(packet.Data));
}
}
}

View File

@@ -101,6 +101,8 @@ public static class AppConfig
}
}
//if (_model.Contains("GA402RK")) _model = "ROG Zephyrus G14 GA403UI"; // Debug Purposes
return _model;
}
@@ -377,6 +379,16 @@ public static class AppConfig
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13") || IsARCNM() || ContainsModel("GA502IU");
}
public static bool IsSlash()
{
return ContainsModel("GA403") || ContainsModel("GU605");
}
public static bool IsInputBacklight()
{
return ContainsModel("GA503") || IsSlash();
}
public static bool IsStrix()
{
return ContainsModel("Strix") || ContainsModel("Scar") || ContainsModel("G703G");
@@ -387,6 +399,11 @@ public static class AppConfig
return (ContainsModel("G614JV") || ContainsModel("G614JZ") || ContainsModel("G512LI") || ContainsModel("G513R") || ContainsModel("G713PV") || ContainsModel("G513IE") || ContainsModel("G713RC") || ContainsModel("G513QM") || ContainsModel("G531G")) && !Is("per_key_rgb");
}
public static bool IsNoAirplaneMode()
{
return ContainsModel("FX506");
}
public static bool IsNoDirectRGB()
{
return ContainsModel("GA503") || ContainsModel("G533Q");
@@ -465,6 +482,21 @@ public static class AppConfig
}
}
public static bool IsSwappedFans()
{
if (!ContainsModel("GA503R")) return false;
try
{
var (bios, model) = GetBiosAndModel();
return (Int32.Parse(bios) == 317);
}
catch
{
return false;
}
}
public static bool IsFanRequired()
{
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P");

View File

@@ -477,7 +477,11 @@ public class AsusACPI
if (fanScale != 100 && device == AsusFan.CPU) Logger.WriteLine("Custom fan scale: " + fanScale);
// it seems to be a bug, when some old model's bios can go nuts if fan is set to 100%
if (AppConfig.IsSwappedFans())
{
device = (device == AsusFan.CPU) ? AsusFan.GPU : AsusFan.CPU;
Logger.WriteLine("Swapped fan fix");
}
for (int i = 8; i < curve.Length; i++) curve[i] = (byte)(Math.Max((byte)0, Math.Min((byte)100, curve[i])) * fanScale / 100);

View File

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

View File

@@ -638,7 +638,7 @@ namespace GHelper.Input
KeyProcess("m6");
return;
case 136: // FN + F12
Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Airplane, "Airplane");
if (!AppConfig.IsNoAirplaneMode()) Program.acpi.DeviceSet(AsusACPI.UniversalControl, AsusACPI.Airplane, "Airplane");
return;
case 181: // FN + Numpad Enter
KeyProcess("fne");

View File

@@ -62,8 +62,8 @@ namespace GHelper
comboRotation.SelectedValueChanged += ComboRotation_SelectedValueChanged; ;
uiScale = panelPicture.Width / matrixControl.device.MaxColumns / 3;
panelPicture.Height = (int)(matrixControl.device.MaxRows * uiScale);
uiScale = panelPicture.Width / matrixControl.deviceMatrix.MaxColumns / 3;
panelPicture.Height = (int)(matrixControl.deviceMatrix.MaxRows * uiScale);
}

View File

@@ -229,7 +229,7 @@ namespace GHelper
BatteryControl.AutoBattery(init);
settingsForm.matrixControl.SetMatrix(true);
settingsForm.matrixControl.SetDevice(true);
if (AppConfig.IsAlly())
{
@@ -266,7 +266,7 @@ namespace GHelper
{
// If helper window is not on top, this just focuses on the app again
// Pressing the ghelper button again will hide the app
if (checkForFocus && !settingsForm.HasAnyFocus(trayClick))
if (checkForFocus && !settingsForm.HasAnyFocus(trayClick) && !AppConfig.Is("topmost"))
{
settingsForm.ShowAll();
}

View File

@@ -145,7 +145,7 @@
<value>¿Reiniciar ahora?</value>
</data>
<data name="AllyController" xml:space="preserve">
<value>Ally Controller</value>
<value>Mando Ally</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Velocidad</value>
@@ -274,13 +274,13 @@
<value>Cargar una vez al 100%</value>
</data>
<data name="Binding" xml:space="preserve">
<value>Binding</value>
<value>Emparejado</value>
</data>
<data name="BindingPrimary" xml:space="preserve">
<value>Primary</value>
<value>Primario</value>
</data>
<data name="BindingSecondary" xml:space="preserve">
<value>Secondary</value>
<value>Secundario</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Actualizaciones de BIOS y Drivers</value>
@@ -310,10 +310,10 @@
<value>Color</value>
</data>
<data name="Contrast" xml:space="preserve">
<value>Contrast</value>
<value>Contraste</value>
</data>
<data name="Controller" xml:space="preserve">
<value>Controller</value>
<value>Mando</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>CPU Boost</value>
@@ -328,7 +328,7 @@
<value>Por defecto</value>
</data>
<data name="DisableController" xml:space="preserve">
<value>Disable Controller</value>
<value>Deshabilitar mando</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Desactivar Overdrive</value>
@@ -349,7 +349,7 @@
<value>Eco</value>
</data>
<data name="EnableGPUOnShutdown" xml:space="preserve">
<value>Enable GPU on shutdown (prevents issue with Eco mode)</value>
<value>Habilitar GPU al apagar (evita problemas con el modo Eco)</value>
</data>
<data name="EnableOptimusText" xml:space="preserve">
<value>Deshabilitar la dGPU cambiando a modo Eco mientras el Modo de Pantalla en el Panel de Control de NVIDIA no está configurado en Optimus puede causar problemas con el control del brillo hasta después del próximo reinicio.
@@ -363,7 +363,7 @@
<value>Ajustes de energía</value>
</data>
<data name="Export" xml:space="preserve">
<value>Export Profile</value>
<value>Exportar perfil</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Adicional</value>
@@ -438,10 +438,10 @@
<value>Alto</value>
</data>
<data name="ImageRotation" xml:space="preserve">
<value>Image Rotation</value>
<value>Rotación de imagen</value>
</data>
<data name="Import" xml:space="preserve">
<value>Import Profile</value>
<value>Importar perfil</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Atajos de teclado</value>
@@ -477,10 +477,10 @@
<value>Bajo</value>
</data>
<data name="LSDeadzones" xml:space="preserve">
<value>Left Stick Deadzones</value>
<value>Punto muerto stick izquierdo</value>
</data>
<data name="LTDeadzones" xml:space="preserve">
<value>Left Trigger Deadzones</value>
<value>Punto muerto gatillo izquierdo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Visualizador de audio</value>
@@ -531,7 +531,7 @@
<value>Respuesta del botón</value>
</data>
<data name="MouseImportFailed" xml:space="preserve">
<value>Import failed. Selected file is not a valid mouse profile or corrutpted.</value>
<value>Importación fallida. El archivo seleccionado no es un perfil válido o está corrupto.</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Distancia de despegue (LOD)</value>
@@ -618,7 +618,7 @@
<value>Quitar</value>
</data>
<data name="Reset" xml:space="preserve">
<value>Reset</value>
<value>Reiniciar</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Algo está usando la dGPU e impide el modo Eco. ¿Reiniciar dGPU en el administrador de dispositivos? (Proceda bajo su propio riesgo)</value>
@@ -627,16 +627,16 @@
<value>RPM</value>
</data>
<data name="RSDeadzones" xml:space="preserve">
<value>Right Stick Deadzones</value>
<value>Punto muerto stick derecho</value>
</data>
<data name="RTDeadzones" xml:space="preserve">
<value>Right Trigger Deadzones</value>
<value>Punto muerto gatillo derecho</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Ejecutar al inicio</value>
</data>
<data name="ScalingQuality" xml:space="preserve">
<value>Scaling Quality</value>
<value>Calidad del escalado</value>
</data>
<data name="ScreenPadDown" xml:space="preserve">
<value>Bajar brillo ScreenPad</value>
@@ -717,7 +717,7 @@
<value>Versión</value>
</data>
<data name="VibrationStrength" xml:space="preserve">
<value>Vibration Strength</value>
<value>Intensidad de vibración</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Bajar volumen</value>

View File

@@ -199,7 +199,7 @@
<value>Rapide</value>
</data>
<data name="AuraLightingMode" xml:space="preserve">
<value>Mode dÉclairage</value>
<value>Effets d'éclairage</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
@@ -235,7 +235,7 @@
<value>Molette</value>
</data>
<data name="AuraZoneUnderglow" xml:space="preserve">
<value>Underglow</value>
<value>Led ROG</value>
</data>
<data name="AutoApply" xml:space="preserve">
<value>Appliquer automatiquement</value>
@@ -363,7 +363,7 @@ Voulez-vous continuer ?</value>
<value>Paramètres d'énergie</value>
</data>
<data name="Export" xml:space="preserve">
<value>Exporter un profil</value>
<value>Exporter profil</value>
</data>
<data name="Extra" xml:space="preserve">
<value>+ d'options</value>
@@ -441,7 +441,7 @@ Voulez-vous continuer ?</value>
<value>Rotation de l'image</value>
</data>
<data name="Import" xml:space="preserve">
<value>Importer un profil</value>
<value>Importer profil</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Raccourcis clavier</value>
@@ -522,7 +522,7 @@ Voulez-vous continuer ?</value>
<value>Minutes</value>
</data>
<data name="MouseAngleSnapping" xml:space="preserve">
<value>Angle Snapping</value>
<value>Correction d'angle</value>
</data>
<data name="MouseAutoPowerOff" xml:space="preserve">
<value>Arrêt automatique après</value>
@@ -534,7 +534,7 @@ Voulez-vous continuer ?</value>
<value>Échec de l'importation. Le fichier sélectionné n'est pas un profil de souris valide ou corrompu.</value>
</data>
<data name="MouseLiftOffDistance" xml:space="preserve">
<value>Lift Off Distance</value>
<value>Hauteur de détection</value>
</data>
<data name="MouseLowBatteryWarning" xml:space="preserve">
<value>Avertissement de batterie faible à</value>

View File

@@ -7,7 +7,6 @@
using GHelper.Helpers;
using System.Management;
using System.Net;
using System.Reflection;
namespace Ryzen
{
@@ -23,7 +22,6 @@ namespace Ryzen
public static int MinTemp => AppConfig.Get("min_temp", 75);
public const int MaxTemp = 98;
public static string[] FAM = { "RAVEN", "PICASSO", "DALI", "RENOIR/LUCIENNE", "MATISSE", "VANGOGH", "VERMEER", "CEZANNE/BARCELO", "REMBRANDT", "PHOENIX", "RAPHAEL/DRAGON RANGE" };
public static int FAMID { get; protected set; }
public static string CPUModel = "";
@@ -42,6 +40,7 @@ namespace Ryzen
//PHEONIX - 9
//RAPHAEL/DRAGON RANGE - 10
//MENDOCINO - 11
//HAWKPOINT - 12
public static void Init()
{
@@ -108,7 +107,7 @@ namespace Ryzen
FAMID = 8; //REMBRANDT
}
if (CPUModel.Contains("Model " + Convert.ToString(116)))
if (CPUModel.Contains("Model " + Convert.ToString(116)) || CPUModel.Contains("Model " + Convert.ToString(120)))
{
FAMID = 9; //PHEONIX
}
@@ -123,6 +122,11 @@ namespace Ryzen
FAMID = 11; //MENDOCINO
}
if (CPUModel.Contains("Model " + Convert.ToString(117)))
{
FAMID = 12; //HAWKPOINT
}
Logger.WriteLine($"CPU: {FAMID} - {CPUName} - {CPUModel}");
SetAddresses();
@@ -224,7 +228,7 @@ namespace Ryzen
Smu.PSMU_ADDR_RSP = 0x3B10A80;
Smu.PSMU_ADDR_ARG = 0x3B10A88;
}
else if (FAMID == 5 || FAMID == 8 || FAMID == 9 || FAMID == 11)
else if (FAMID == 5 || FAMID == 8 || FAMID == 9 || FAMID == 11 || FAMID == 12)
{
Smu.MP1_ADDR_MSG = 0x3B10528;
Smu.MP1_ADDR_RSP = 0x3B10578;

View File

@@ -65,6 +65,7 @@ namespace GHelper
panelGPU = new Panel();
labelTipGPU = new Label();
tableAMD = new TableLayoutPanel();
buttonOverlay = new RButton();
buttonFPS = new RButton();
tableGPU = new TableLayoutPanel();
buttonStopGPU = new RButton();
@@ -118,7 +119,7 @@ namespace GHelper
panelAllyTitle = new Panel();
pictureAlly = new PictureBox();
labelAlly = new Label();
buttonOverlay = new RButton();
comboInterval = new RComboBox();
panelMatrix.SuspendLayout();
tableLayoutMatrix.SuspendLayout();
panelMatrixTitle.SuspendLayout();
@@ -187,6 +188,7 @@ namespace GHelper
tableLayoutMatrix.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutMatrix.Controls.Add(comboMatrix, 0, 0);
tableLayoutMatrix.Controls.Add(comboMatrixRunning, 1, 0);
tableLayoutMatrix.Controls.Add(comboInterval, 2, 0);
tableLayoutMatrix.Controls.Add(buttonMatrix, 2, 0);
tableLayoutMatrix.Dock = DockStyle.Top;
tableLayoutMatrix.Location = new Point(20, 60);
@@ -194,7 +196,8 @@ namespace GHelper
tableLayoutMatrix.Name = "tableLayoutMatrix";
tableLayoutMatrix.RowCount = 1;
tableLayoutMatrix.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutMatrix.Size = new Size(787, 64);
tableLayoutMatrix.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
tableLayoutMatrix.Size = new Size(787, 84);
tableLayoutMatrix.TabIndex = 43;
//
// comboMatrix
@@ -707,6 +710,28 @@ namespace GHelper
tableAMD.TabIndex = 24;
tableAMD.Visible = false;
//
// buttonOverlay
//
buttonOverlay.Activated = false;
buttonOverlay.BackColor = SystemColors.ControlLightLight;
buttonOverlay.BorderColor = Color.Transparent;
buttonOverlay.BorderRadius = 5;
buttonOverlay.Dock = DockStyle.Fill;
buttonOverlay.FlatAppearance.BorderSize = 0;
buttonOverlay.FlatStyle = FlatStyle.Flat;
buttonOverlay.ForeColor = SystemColors.ControlText;
buttonOverlay.Image = Properties.Resources.icons8_heartbeat_32;
buttonOverlay.ImageAlign = ContentAlignment.MiddleRight;
buttonOverlay.Location = new Point(266, 4);
buttonOverlay.Margin = new Padding(4);
buttonOverlay.Name = "buttonOverlay";
buttonOverlay.Secondary = false;
buttonOverlay.Size = new Size(254, 72);
buttonOverlay.TabIndex = 12;
buttonOverlay.Text = "AMD Overlay";
buttonOverlay.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonOverlay.UseVisualStyleBackColor = false;
//
// buttonFPS
//
buttonFPS.Activated = false;
@@ -1586,27 +1611,20 @@ namespace GHelper
labelAlly.TabIndex = 26;
labelAlly.Text = "Ally Controller";
//
// buttonOverlay
// comboInterval
//
buttonOverlay.Activated = false;
buttonOverlay.BackColor = SystemColors.ControlLightLight;
buttonOverlay.BorderColor = Color.Transparent;
buttonOverlay.BorderRadius = 5;
buttonOverlay.Dock = DockStyle.Fill;
buttonOverlay.FlatAppearance.BorderSize = 0;
buttonOverlay.FlatStyle = FlatStyle.Flat;
buttonOverlay.ForeColor = SystemColors.ControlText;
buttonOverlay.Image = Properties.Resources.icons8_heartbeat_32;
buttonOverlay.ImageAlign = ContentAlignment.MiddleRight;
buttonOverlay.Location = new Point(266, 4);
buttonOverlay.Margin = new Padding(4);
buttonOverlay.Name = "buttonOverlay";
buttonOverlay.Secondary = false;
buttonOverlay.Size = new Size(254, 72);
buttonOverlay.TabIndex = 12;
buttonOverlay.Text = "AMD Overlay";
buttonOverlay.TextImageRelation = TextImageRelation.ImageBeforeText;
buttonOverlay.UseVisualStyleBackColor = false;
comboInterval.BorderColor = Color.White;
comboInterval.ButtonColor = Color.FromArgb(255, 255, 255);
comboInterval.Dock = DockStyle.Top;
comboInterval.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboInterval.FormattingEnabled = true;
comboInterval.ItemHeight = 32;
comboInterval.Location = new Point(7, 75);
comboInterval.Margin = new Padding(7, 11, 7, 8);
comboInterval.Name = "comboInterval";
comboInterval.Size = new Size(248, 40);
comboInterval.TabIndex = 19;
comboInterval.Visible = false;
//
// SettingsForm
//
@@ -1784,5 +1802,6 @@ namespace GHelper
private RButton buttonFPS;
private RButton buttonController;
private RButton buttonOverlay;
private RComboBox comboInterval;
}
}

View File

@@ -173,9 +173,11 @@ namespace GHelper
comboMatrix.DropDownStyle = ComboBoxStyle.DropDownList;
comboMatrixRunning.DropDownStyle = ComboBoxStyle.DropDownList;
comboInterval.DropDownStyle = ComboBoxStyle.DropDownList;
comboMatrix.DropDownClosed += ComboMatrix_SelectedValueChanged;
comboMatrixRunning.DropDownClosed += ComboMatrixRunning_SelectedValueChanged;
comboInterval.DropDownClosed += ComboInterval_DropDownClosed;
buttonMatrix.Click += ButtonMatrix_Click;
@@ -424,7 +426,7 @@ namespace GHelper
}
}
public void VisualiseMatrix(string image)
public void VisualiseMatrixPicture(string image)
{
if (matrixForm == null || matrixForm.Text == "") return;
matrixForm.VisualiseMatrix(image);
@@ -686,7 +688,7 @@ namespace GHelper
private void CheckMatrix_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_auto", checkMatrix.Checked ? 1 : 0);
matrixControl.SetMatrix();
matrixControl.SetBatteryAuto();
}
@@ -712,7 +714,7 @@ namespace GHelper
}
public void SetMatrixRunning(int mode)
public void VisualiseMatrixRunning(int mode)
{
Invoke(delegate
{
@@ -721,17 +723,23 @@ namespace GHelper
});
}
private void ComboInterval_DropDownClosed(object? sender, EventArgs e)
{
AppConfig.Set("matrix_interval", comboInterval.SelectedIndex);
matrixControl.SetDevice();
}
private void ComboMatrixRunning_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_running", comboMatrixRunning.SelectedIndex);
matrixControl.SetMatrix();
matrixControl.SetDevice();
}
private void ComboMatrix_SelectedValueChanged(object? sender, EventArgs e)
{
AppConfig.Set("matrix_brightness", comboMatrix.SelectedIndex);
matrixControl.SetMatrix();
matrixControl.SetDevice();
}
@@ -896,8 +904,26 @@ namespace GHelper
return;
}
if (matrixControl.IsSlash)
{
labelMatrix.Text = "Slash Lightning";
comboMatrixRunning.Items.Clear();
foreach (var item in SlashDevice.Modes)
{
comboMatrixRunning.Items.Add(item.Value);
}
comboInterval.Visible = true;
comboInterval.Items.Add($"Interval Off");
for (int i = 1; i <= 5; i++) comboInterval.Items.Add($"Interval {i}s");
buttonMatrix.Visible = false;
}
comboMatrix.SelectedIndex = Math.Min(AppConfig.Get("matrix_brightness", 0), comboMatrix.Items.Count - 1);
comboMatrixRunning.SelectedIndex = Math.Min(AppConfig.Get("matrix_running", 0), comboMatrixRunning.Items.Count - 1);
comboInterval.SelectedIndex = Math.Min(AppConfig.Get("matrix_interval", 0), comboInterval.Items.Count - 1);
checkMatrix.Checked = AppConfig.Is("matrix_auto");
checkMatrix.CheckedChanged += CheckMatrix_CheckedChanged;
@@ -909,7 +935,7 @@ namespace GHelper
{
comboMatrix.SelectedIndex = Math.Min(Math.Max(0, comboMatrix.SelectedIndex + delta), comboMatrix.Items.Count - 1);
AppConfig.Set("matrix_brightness", comboMatrix.SelectedIndex);
matrixControl.SetMatrix();
matrixControl.SetDevice();
Program.toast.RunToast(comboMatrix.GetItemText(comboMatrix.SelectedItem), delta > 0 ? ToastIcon.BacklightUp : ToastIcon.BacklightDown);
}

View File

@@ -34,6 +34,7 @@ namespace GHelper.UI
{
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
parms.ClassStyle &= ~0x00020000;
return parms;
}
}

View File

@@ -294,12 +294,13 @@ namespace GHelper.USB
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.IsInputBacklight())
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xBA, 0xC5, 0xC4, (byte)brightness }, log);
else
AsusHid.Write(new byte[] { AsusHid.AURA_ID, 0xBA, 0xC5, 0xC4, (byte)brightness }, log);
if (AppConfig.IsAlly()) ApplyAura();
if (AppConfig.ContainsModel("GA503"))
AsusHid.WriteInput(new byte[] { AsusHid.INPUT_ID, 0xBA, 0xC5, 0xC4, (byte)brightness }, log);
});

View File

@@ -107,6 +107,7 @@ Huge thanks to [@IceStormNG](https://github.com/IceStormNG) 👑 for contributio
### ⌨️ Keybindings
- ``Fn + F5 / Fn + Shift + F5`` - Toggle Performance Modes forwards / backwards
- ``Shift + Fn + F7 / F8`` - Set Anime Matrix / Slash Lightning brightness Down / Up
- ``Ctrl + Shift + F5 / Ctrl + Shift + Alt + F5`` - Toggle Performance Modes forwards / backwards
- ``Ctrl + Shift + F12`` - Open G-Helper window
- ``Ctrl + M1 / M2`` - Screen brightness Down / Up