Added animatrix control thanks to https://github.com/vddCore/Starlight

This commit is contained in:
seerge
2023-03-04 00:11:59 +01:00
parent e9fa181d4e
commit 43d2ed656a
14 changed files with 742 additions and 73 deletions

View File

@@ -1,6 +1,6 @@
using System.Management;
using System.Diagnostics;
using System.Management;
using System.Runtime.InteropServices;
using System.Diagnostics;
public class ASUSWmi
{
@@ -30,7 +30,7 @@ public class ASUSWmi
public const int PPT_CPUB0 = 0x001200B0;
public const int PPT_CPUB1 = 0x001200B1;
public const int PPT_CPUA2 = 0x001200A2;
public const int PPT_CPUA2 = 0x001200A2;
public const int PerformanceBalanced = 0;
public const int PerformanceTurbo = 1;
@@ -174,9 +174,9 @@ public class ASUSWmi
Debug.WriteLine(BitConverter.ToString(curve));
if (device == 1)
if (device == 1)
DeviceSet(DevsGPUFanCurve, curve);
else
else
DeviceSet(DevsCPUFanCurve, curve);
}
@@ -187,14 +187,14 @@ public class ASUSWmi
// because it's asus, and modes are swapped here
switch (mode)
{
case 1:fan_mode = 2; break;
case 1: fan_mode = 2; break;
case 2: fan_mode = 1; break;
default: fan_mode = 0; break;
}
if (device == 1)
if (device == 1)
return DeviceGetBuffer(DevsGPUFanCurve, fan_mode);
else
else
return DeviceGetBuffer(DevsCPUFanCurve, fan_mode);
}

View File

@@ -0,0 +1,230 @@
// Source thanks to https://github.com/vddCore/Starlight :)
using System.Text;
using Starlight.Communication;
namespace Starlight.AnimeMatrix
{
public class BuiltInAnimation
{
public enum Startup
{
GlitchConstruction,
StaticEmergence
}
public enum Shutdown
{
GlitchOut,
SeeYa
}
public enum Sleeping
{
BannerSwipe,
Starfield
}
public enum Running
{
BinaryBannerScroll,
RogLogoGlitch
}
public byte AsByte { get; }
public BuiltInAnimation(
Running running,
Sleeping sleeping,
Shutdown shutdown,
Startup startup
)
{
AsByte |= (byte)(((int)running & 0x01) << 0);
AsByte |= (byte)(((int)sleeping & 0x01) << 1);
AsByte |= (byte)(((int)shutdown & 0x01) << 2);
AsByte |= (byte)(((int)startup & 0x01) << 3);
}
}
internal class AnimeMatrixPacket : Packet
{
public AnimeMatrixPacket(byte[] command)
: base(0x5E, 640, command)
{
}
}
public enum BrightnessMode : byte
{
Off = 0,
Dim = 1,
Medium = 2,
Full = 3
}
public class AnimeMatrixDevice : Device
{
private const int UpdatePageLength = 0x0278;
public int LedCount => 1450;
public int Rows => 61;
private readonly byte[] _displayBuffer = new byte[UpdatePageLength * 3];
public AnimeMatrixDevice()
: base(0x0B05, 0x193B, 640)
{
}
public void SendRaw(params byte[] data)
{
Set(Packet<AnimeMatrixPacket>(data));
}
public int EmptyColumns(int row)
{
return (int)Math.Ceiling(Math.Max(0, row - 11) / 2.0);
}
public int Columns(int row)
{
EnsureRowInRange(row);
return 34 - EmptyColumns(row);
}
public int RowToLinearAddress(int row)
{
EnsureRowInRange(row);
var ret = 0;
if (row > 0)
{
for (var i = 0; i < row; i++)
ret += Columns(i);
}
return ret;
}
public void WakeUp()
{
Set(Packet<AnimeMatrixPacket>(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")));
}
public void SetLedLinear(int address, byte value)
{
EnsureAddressableLed(address);
_displayBuffer[address] = value;
}
public void SetLedLinearImmediate(int address, byte value)
{
EnsureAddressableLed(address);
_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 SetLedPlanar(int x, int y, byte value)
{
EnsureRowInRange(y);
var ledsInRow = Columns(y);
var start = RowToLinearAddress(y) - EmptyColumns(y);
if (x > EmptyColumns(y))
SetLedLinear(start + x, value);
}
public void Clear(bool present = false)
{
for (var i = 0; i < _displayBuffer.Length; i++)
_displayBuffer[i] = 0;
if (present)
Present();
}
public void Present()
{
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
.AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 0 + 1)))
.AppendData(BitConverter.GetBytes((ushort)UpdatePageLength))
.AppendData(_displayBuffer[(UpdatePageLength * 0)..(UpdatePageLength * 1)])
);
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
.AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 1 + 1)))
.AppendData(BitConverter.GetBytes((ushort)UpdatePageLength))
.AppendData(_displayBuffer[(UpdatePageLength * 1)..(UpdatePageLength * 2)])
);
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
.AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 2 + 1)))
.AppendData(BitConverter.GetBytes((ushort)(LedCount - UpdatePageLength * 2)))
.AppendData(
_displayBuffer[(UpdatePageLength * 2)..(UpdatePageLength * 2 + (LedCount - UpdatePageLength * 2))])
);
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 EnsureRowInRange(int row)
{
if (row < 0 || row >= Rows)
{
throw new IndexOutOfRangeException($"Y-coordinate should fall in range of [0, {Rows - 1}].");
}
}
private void EnsureAddressableLed(int address)
{
if (address < 0 || address >= LedCount)
{
throw new IndexOutOfRangeException($"Linear LED address must be in range of [0, {LedCount - 1}].");
}
}
}
}

View File

@@ -1,9 +1,8 @@
using System.Text.Json;
public class AppConfig
{
string appPath;
public string appPath;
string configFile;
public Dictionary<string, object> config = new Dictionary<string, object>();
@@ -82,7 +81,7 @@ public class AppConfig
else
name = "cpu";
return paramName+"_" + name + "_" + mode;
return paramName + "_" + name + "_" + mode;
}
public byte[] getFanConfig(int device)

33
Communication/Device.cs Normal file
View File

@@ -0,0 +1,33 @@
// Source thanks to https://github.com/vddCore/Starlight :)
using Starlight.Communication.Platform;
namespace Starlight.Communication
{
public abstract class Device : IDisposable
{
private static UsbProvider _usbProvider;
protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength)
{
_usbProvider = new WindowsUsbProvider(vendorId, productId, maxFeatureReportLength);
}
protected T Packet<T>(params byte[] command) where T : Packet
{
return (T)Activator.CreateInstance(typeof(T), command)!;
}
public void Set(Packet packet)
=> _usbProvider?.Set(packet.Data);
public byte[] Get(Packet packet)
=> _usbProvider?.Get(packet.Data);
public void Dispose()
{
_usbProvider?.Dispose();
}
}
}

61
Communication/Packet.cs Normal file
View File

@@ -0,0 +1,61 @@
// Source thanks to https://github.com/vddCore/Starlight :)
using System.ComponentModel;
using HidSharp;
namespace Starlight.Communication
{
public abstract class Packet
{
private int _currentDataIndex = 1;
public byte[] Data { get; }
internal Packet(byte reportId, int packetLength, params byte[] data)
{
if (packetLength < 1)
{
throw new ArgumentOutOfRangeException(
nameof(packetLength),
"Packet length must be at least 1."
);
}
Data = new byte[packetLength];
Data[0] = reportId;
if (data.Length > 0)
{
if (_currentDataIndex >= Data.Length)
{
throw new ArgumentOutOfRangeException(
nameof(data),
"Your packet length does not allow for initial data to be appended."
);
}
AppendData(data);
}
}
public Packet AppendData(params byte[] data)
=> AppendData(out _, data);
public Packet AppendData(out int bytesWritten, params byte[] data)
{
bytesWritten = 0;
for (var i = 0;
i < data.Length && _currentDataIndex < Data.Length - 1;
i++, bytesWritten++, _currentDataIndex++)
{
if (_currentDataIndex > Data.Length - 1)
break;
Data[_currentDataIndex] = data[i];
}
return this;
}
}
}

View File

@@ -0,0 +1,19 @@
namespace Starlight.Communication.Platform
{
internal abstract class UsbProvider : IDisposable
{
protected ushort VendorID { get; }
protected ushort ProductID { get; }
protected UsbProvider(ushort vendorId, ushort productId)
{
VendorID = vendorId;
ProductID = productId;
}
public abstract void Set(byte[] data);
public abstract byte[] Get(byte[] data);
public abstract void Dispose();
}
}

View File

@@ -0,0 +1,79 @@
using System.ComponentModel;
using HidSharp;
namespace Starlight.Communication.Platform
{
internal class WindowsUsbProvider : UsbProvider
{
protected HidDevice HidDevice { get; }
protected HidStream HidStream { get; }
public WindowsUsbProvider(ushort vendorId, ushort productId, int maxFeatureReportLength)
: base(vendorId, productId)
{
try
{
HidDevice = DeviceList.Local
.GetHidDevices(vendorId, productId)
.First(x => x.GetMaxFeatureReportLength() == maxFeatureReportLength);
}
catch
{
throw new IOException("AniMe Matrix control device was not found on your machine.");
}
var config = new OpenConfiguration();
config.SetOption(OpenOption.Interruptible, true);
config.SetOption(OpenOption.Exclusive, false);
config.SetOption(OpenOption.Priority, 10);
HidStream = HidDevice.Open(config);
}
public override void Set(byte[] data)
{
WrapException(() =>
{
HidStream.SetFeature(data);
HidStream.Flush();
});
}
public override byte[] Get(byte[] data)
{
var outData = new byte[data.Length];
Array.Copy(data, outData, data.Length);
WrapException(() =>
{
HidStream.GetFeature(outData);
HidStream.Flush();
});
return data;
}
public override void Dispose()
{
HidStream.Dispose();
}
private void WrapException(Action action)
{
try
{
action();
}
catch (IOException e)
{
if (e.InnerException is Win32Exception w32e)
{
if (w32e.NativeErrorCode != 0)
{
throw;
}
}
}
}
}
}

View File

@@ -15,7 +15,8 @@
<AssemblyName>GHelper</AssemblyName>
<PlatformTarget>x64</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AssemblyVersion>0.14.1</AssemblyVersion>
<AssemblyVersion>0.15</AssemblyVersion>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
@@ -37,6 +38,7 @@
<ItemGroup>
<PackageReference Include="hidlibrary" Version="3.3.40" />
<PackageReference Include="HidSharpCore" Version="1.2.1.1" />
<PackageReference Include="System.Management" Version="7.0.0" />
<PackageReference Include="TaskScheduler" Version="2.10.1" />
<PackageReference Include="WinForms.DataVisualization" Version="1.7.0" />

View File

@@ -1,6 +1,7 @@
using Microsoft.Win32;
using System.Diagnostics;
using System.Management;
using Starlight.AnimeMatrix;
public class HardwareMonitor
{

View File

@@ -120,6 +120,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_matrix_desktop_48 {
get {
object obj = ResourceManager.GetObject("icons8-matrix-desktop-48", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View File

@@ -133,6 +133,9 @@
<data name="icons8-speed-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-speed-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="everything-is-fine-itsfine" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\everything-is-fine-itsfine.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-speed-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-speed-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -148,7 +151,7 @@
<data name="icons8-laptop-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-laptop-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="everything-is-fine-itsfine" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\everything-is-fine-itsfine.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="icons8-matrix-desktop-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-matrix-desktop-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

180
Settings.Designer.cs generated
View File

@@ -56,7 +56,7 @@
button60Hz = new Button();
checkScreen = new CheckBox();
checkBoost = new CheckBox();
pictureBox1 = new PictureBox();
pictureKeyboard = new PictureBox();
label1 = new Label();
comboKeyboard = new ComboBox();
buttonKeyboardColor = new Button();
@@ -66,6 +66,11 @@
pictureColor = new PictureBox();
pictureColor2 = new PictureBox();
labelVersion = new Label();
pictureMatrix = new PictureBox();
labelMatrix = new Label();
comboMatrix = new ComboBox();
comboMatrixRunning = new ComboBox();
buttonMatrix = new Button();
((System.ComponentModel.ISupportInitialize)trackBattery).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBattery).BeginInit();
tableGPU.SuspendLayout();
@@ -74,15 +79,16 @@
((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureScreen).BeginInit();
tableScreen.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureKeyboard).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureColor).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureColor2).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureMatrix).BeginInit();
SuspendLayout();
//
// checkStartup
//
checkStartup.AutoSize = true;
checkStartup.Location = new Point(33, 1016);
checkStartup.Location = new Point(35, 1138);
checkStartup.Margin = new Padding(4, 2, 4, 2);
checkStartup.Name = "checkStartup";
checkStartup.Size = new Size(206, 36);
@@ -95,12 +101,12 @@
//
trackBattery.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
trackBattery.LargeChange = 20;
trackBattery.Location = new Point(20, 908);
trackBattery.Location = new Point(22, 1030);
trackBattery.Margin = new Padding(4, 2, 4, 2);
trackBattery.Maximum = 100;
trackBattery.Minimum = 50;
trackBattery.Name = "trackBattery";
trackBattery.Size = new Size(676, 90);
trackBattery.Size = new Size(682, 90);
trackBattery.SmallChange = 10;
trackBattery.TabIndex = 3;
trackBattery.TickFrequency = 10;
@@ -111,7 +117,7 @@
//
labelBatteryTitle.AutoSize = true;
labelBatteryTitle.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelBatteryTitle.Location = new Point(78, 870);
labelBatteryTitle.Location = new Point(80, 992);
labelBatteryTitle.Margin = new Padding(4, 0, 4, 0);
labelBatteryTitle.Name = "labelBatteryTitle";
labelBatteryTitle.Size = new Size(248, 32);
@@ -122,7 +128,7 @@
//
pictureBattery.BackgroundImage = (Image)resources.GetObject("pictureBattery.BackgroundImage");
pictureBattery.BackgroundImageLayout = ImageLayout.Zoom;
pictureBattery.Location = new Point(36, 868);
pictureBattery.Location = new Point(38, 990);
pictureBattery.Margin = new Padding(4, 2, 4, 2);
pictureBattery.Name = "pictureBattery";
pictureBattery.Size = new Size(36, 38);
@@ -132,12 +138,12 @@
// labelGPUFan
//
labelGPUFan.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelGPUFan.Location = new Point(338, 262);
labelGPUFan.Location = new Point(344, 262);
labelGPUFan.Margin = new Padding(4, 0, 4, 0);
labelGPUFan.Name = "labelGPUFan";
labelGPUFan.Size = new Size(348, 32);
labelGPUFan.TabIndex = 8;
labelGPUFan.Text = "GPU Fan";
labelGPUFan.Text = " ";
labelGPUFan.TextAlign = ContentAlignment.TopRight;
//
// tableGPU
@@ -155,7 +161,7 @@
tableGPU.Name = "tableGPU";
tableGPU.RowCount = 1;
tableGPU.RowStyles.Add(new RowStyle(SizeType.Absolute, 108F));
tableGPU.Size = new Size(676, 108);
tableGPU.Size = new Size(682, 108);
tableGPU.TabIndex = 7;
//
// buttonUltimate
@@ -164,10 +170,10 @@
buttonUltimate.Dock = DockStyle.Fill;
buttonUltimate.FlatAppearance.BorderSize = 0;
buttonUltimate.FlatStyle = FlatStyle.Flat;
buttonUltimate.Location = new Point(458, 12);
buttonUltimate.Location = new Point(462, 12);
buttonUltimate.Margin = new Padding(8, 12, 8, 12);
buttonUltimate.Name = "buttonUltimate";
buttonUltimate.Size = new Size(210, 84);
buttonUltimate.Size = new Size(212, 84);
buttonUltimate.TabIndex = 2;
buttonUltimate.Text = "Ultimate";
buttonUltimate.UseVisualStyleBackColor = false;
@@ -178,10 +184,10 @@
buttonStandard.Dock = DockStyle.Fill;
buttonStandard.FlatAppearance.BorderSize = 0;
buttonStandard.FlatStyle = FlatStyle.Flat;
buttonStandard.Location = new Point(233, 12);
buttonStandard.Location = new Point(235, 12);
buttonStandard.Margin = new Padding(8, 12, 8, 12);
buttonStandard.Name = "buttonStandard";
buttonStandard.Size = new Size(209, 84);
buttonStandard.Size = new Size(211, 84);
buttonStandard.TabIndex = 1;
buttonStandard.Text = "Standard";
buttonStandard.UseVisualStyleBackColor = false;
@@ -196,7 +202,7 @@
buttonEco.Location = new Point(8, 12);
buttonEco.Margin = new Padding(8, 12, 8, 12);
buttonEco.Name = "buttonEco";
buttonEco.Size = new Size(209, 84);
buttonEco.Size = new Size(211, 84);
buttonEco.TabIndex = 0;
buttonEco.Text = "Eco";
buttonEco.UseVisualStyleBackColor = false;
@@ -226,12 +232,12 @@
// labelCPUFan
//
labelCPUFan.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelCPUFan.Location = new Point(320, 38);
labelCPUFan.Location = new Point(326, 38);
labelCPUFan.Margin = new Padding(4, 0, 4, 0);
labelCPUFan.Name = "labelCPUFan";
labelCPUFan.Size = new Size(366, 32);
labelCPUFan.TabIndex = 12;
labelCPUFan.Text = "CPU Fan";
labelCPUFan.Text = " ";
labelCPUFan.TextAlign = ContentAlignment.TopRight;
//
// tablePerf
@@ -249,7 +255,7 @@
tablePerf.Name = "tablePerf";
tablePerf.RowCount = 1;
tablePerf.RowStyles.Add(new RowStyle(SizeType.Absolute, 108F));
tablePerf.Size = new Size(676, 108);
tablePerf.Size = new Size(682, 108);
tablePerf.TabIndex = 11;
//
// buttonTurbo
@@ -259,10 +265,10 @@
buttonTurbo.FlatAppearance.BorderColor = Color.FromArgb(192, 0, 0);
buttonTurbo.FlatAppearance.BorderSize = 0;
buttonTurbo.FlatStyle = FlatStyle.Flat;
buttonTurbo.Location = new Point(458, 12);
buttonTurbo.Location = new Point(462, 12);
buttonTurbo.Margin = new Padding(8, 12, 8, 12);
buttonTurbo.Name = "buttonTurbo";
buttonTurbo.Size = new Size(210, 84);
buttonTurbo.Size = new Size(212, 84);
buttonTurbo.TabIndex = 2;
buttonTurbo.Text = "Turbo";
buttonTurbo.UseVisualStyleBackColor = false;
@@ -274,10 +280,10 @@
buttonBalanced.FlatAppearance.BorderColor = Color.FromArgb(0, 0, 192);
buttonBalanced.FlatAppearance.BorderSize = 0;
buttonBalanced.FlatStyle = FlatStyle.Flat;
buttonBalanced.Location = new Point(233, 12);
buttonBalanced.Location = new Point(235, 12);
buttonBalanced.Margin = new Padding(8, 12, 8, 12);
buttonBalanced.Name = "buttonBalanced";
buttonBalanced.Size = new Size(209, 84);
buttonBalanced.Size = new Size(211, 84);
buttonBalanced.TabIndex = 1;
buttonBalanced.Text = "Balanced";
buttonBalanced.UseVisualStyleBackColor = false;
@@ -293,7 +299,7 @@
buttonSilent.Location = new Point(8, 12);
buttonSilent.Margin = new Padding(8, 12, 8, 12);
buttonSilent.Name = "buttonSilent";
buttonSilent.Size = new Size(209, 84);
buttonSilent.Size = new Size(211, 84);
buttonSilent.TabIndex = 0;
buttonSilent.Text = "Silent";
buttonSilent.UseVisualStyleBackColor = false;
@@ -338,7 +344,7 @@
//
buttonQuit.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonQuit.BackColor = SystemColors.ButtonFace;
buttonQuit.Location = new Point(576, 1008);
buttonQuit.Location = new Point(584, 1130);
buttonQuit.Margin = new Padding(4, 2, 4, 2);
buttonQuit.Name = "buttonQuit";
buttonQuit.Size = new Size(120, 48);
@@ -382,7 +388,7 @@
tableScreen.Name = "tableScreen";
tableScreen.RowCount = 1;
tableScreen.RowStyles.Add(new RowStyle(SizeType.Absolute, 108F));
tableScreen.Size = new Size(676, 108);
tableScreen.Size = new Size(682, 108);
tableScreen.TabIndex = 19;
//
// button120Hz
@@ -392,10 +398,10 @@
button120Hz.FlatAppearance.BorderColor = SystemColors.ActiveBorder;
button120Hz.FlatAppearance.BorderSize = 0;
button120Hz.FlatStyle = FlatStyle.Flat;
button120Hz.Location = new Point(233, 12);
button120Hz.Location = new Point(235, 12);
button120Hz.Margin = new Padding(8, 12, 8, 12);
button120Hz.Name = "button120Hz";
button120Hz.Size = new Size(209, 84);
button120Hz.Size = new Size(211, 84);
button120Hz.TabIndex = 1;
button120Hz.Text = "120Hz + OD";
button120Hz.UseVisualStyleBackColor = false;
@@ -412,7 +418,7 @@
button60Hz.Location = new Point(8, 12);
button60Hz.Margin = new Padding(8, 12, 8, 12);
button60Hz.Name = "button60Hz";
button60Hz.Size = new Size(209, 84);
button60Hz.Size = new Size(211, 84);
button60Hz.TabIndex = 0;
button60Hz.Text = "60Hz";
button60Hz.UseVisualStyleBackColor = false;
@@ -441,16 +447,16 @@
checkBoost.Text = "CPU Turbo Boost enabled";
checkBoost.UseVisualStyleBackColor = true;
//
// pictureBox1
// pictureKeyboard
//
pictureBox1.BackgroundImage = Properties.Resources.icons8_keyboard_48;
pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
pictureBox1.Location = new Point(36, 724);
pictureBox1.Margin = new Padding(4, 2, 4, 2);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(36, 36);
pictureBox1.TabIndex = 23;
pictureBox1.TabStop = false;
pictureKeyboard.BackgroundImage = Properties.Resources.icons8_keyboard_48;
pictureKeyboard.BackgroundImageLayout = ImageLayout.Zoom;
pictureKeyboard.Location = new Point(36, 724);
pictureKeyboard.Margin = new Padding(4, 2, 4, 2);
pictureKeyboard.Name = "pictureKeyboard";
pictureKeyboard.Size = new Size(36, 36);
pictureKeyboard.TabIndex = 23;
pictureKeyboard.TabStop = false;
//
// label1
//
@@ -469,10 +475,10 @@
comboKeyboard.FormattingEnabled = true;
comboKeyboard.ItemHeight = 32;
comboKeyboard.Items.AddRange(new object[] { "Static", "Breathe", "Strobe", "Rainbow", "Dingding" });
comboKeyboard.Location = new Point(32, 778);
comboKeyboard.Location = new Point(30, 770);
comboKeyboard.Margin = new Padding(0);
comboKeyboard.Name = "comboKeyboard";
comboKeyboard.Size = new Size(200, 40);
comboKeyboard.Size = new Size(211, 40);
comboKeyboard.TabIndex = 24;
comboKeyboard.TabStop = false;
//
@@ -483,10 +489,10 @@
buttonKeyboardColor.FlatAppearance.BorderColor = Color.Red;
buttonKeyboardColor.FlatAppearance.BorderSize = 2;
buttonKeyboardColor.ForeColor = SystemColors.ControlText;
buttonKeyboardColor.Location = new Point(255, 774);
buttonKeyboardColor.Location = new Point(257, 766);
buttonKeyboardColor.Margin = new Padding(0);
buttonKeyboardColor.Name = "buttonKeyboardColor";
buttonKeyboardColor.Size = new Size(209, 48);
buttonKeyboardColor.Size = new Size(211, 48);
buttonKeyboardColor.TabIndex = 25;
buttonKeyboardColor.Text = "Color ";
buttonKeyboardColor.UseVisualStyleBackColor = false;
@@ -494,7 +500,7 @@
// labelBattery
//
labelBattery.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelBattery.Location = new Point(410, 868);
labelBattery.Location = new Point(420, 991);
labelBattery.Margin = new Padding(4, 0, 4, 0);
labelBattery.Name = "labelBattery";
labelBattery.Size = new Size(276, 32);
@@ -507,7 +513,7 @@
buttonFans.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonFans.BackColor = SystemColors.ButtonFace;
buttonFans.FlatAppearance.BorderSize = 0;
buttonFans.Location = new Point(480, 186);
buttonFans.Location = new Point(486, 186);
buttonFans.Margin = new Padding(4, 2, 4, 2);
buttonFans.Name = "buttonFans";
buttonFans.Size = new Size(210, 48);
@@ -520,7 +526,7 @@
buttonKeyboard.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonKeyboard.BackColor = SystemColors.ButtonFace;
buttonKeyboard.FlatAppearance.BorderSize = 0;
buttonKeyboard.Location = new Point(480, 773);
buttonKeyboard.Location = new Point(486, 765);
buttonKeyboard.Margin = new Padding(4, 2, 4, 2);
buttonKeyboard.Name = "buttonKeyboard";
buttonKeyboard.Size = new Size(209, 48);
@@ -530,7 +536,7 @@
//
// pictureColor
//
pictureColor.Location = new Point(431, 789);
pictureColor.Location = new Point(431, 781);
pictureColor.Name = "pictureColor";
pictureColor.Size = new Size(20, 20);
pictureColor.TabIndex = 30;
@@ -538,7 +544,7 @@
//
// pictureColor2
//
pictureColor2.Location = new Point(405, 789);
pictureColor2.Location = new Point(405, 781);
pictureColor2.Name = "pictureColor2";
pictureColor2.Size = new Size(20, 20);
pictureColor2.TabIndex = 31;
@@ -549,17 +555,83 @@
labelVersion.AutoSize = true;
labelVersion.Font = new Font("Segoe UI", 9F, FontStyle.Underline, GraphicsUnit.Point);
labelVersion.ForeColor = SystemColors.ControlDark;
labelVersion.Location = new Point(34, 966);
labelVersion.Location = new Point(36, 1088);
labelVersion.Name = "labelVersion";
labelVersion.Size = new Size(44, 32);
labelVersion.TabIndex = 32;
labelVersion.Text = "v.0";
//
// pictureMatrix
//
pictureMatrix.BackgroundImage = Properties.Resources.icons8_matrix_desktop_48;
pictureMatrix.BackgroundImageLayout = ImageLayout.Zoom;
pictureMatrix.Location = new Point(36, 858);
pictureMatrix.Margin = new Padding(4, 2, 4, 2);
pictureMatrix.Name = "pictureMatrix";
pictureMatrix.Size = new Size(36, 36);
pictureMatrix.TabIndex = 34;
pictureMatrix.TabStop = false;
//
// labelMatrix
//
labelMatrix.AutoSize = true;
labelMatrix.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelMatrix.Location = new Point(78, 858);
labelMatrix.Margin = new Padding(4, 0, 4, 0);
labelMatrix.Name = "labelMatrix";
labelMatrix.Size = new Size(170, 32);
labelMatrix.TabIndex = 33;
labelMatrix.Text = "Anime Matrix";
//
// comboMatrix
//
comboMatrix.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboMatrix.FormattingEnabled = true;
comboMatrix.ItemHeight = 32;
comboMatrix.Items.AddRange(new object[] { "Off", "Dim", "Medium", "Bright" });
comboMatrix.Location = new Point(30, 910);
comboMatrix.Margin = new Padding(0);
comboMatrix.Name = "comboMatrix";
comboMatrix.Size = new Size(211, 40);
comboMatrix.TabIndex = 35;
comboMatrix.TabStop = false;
//
// comboMatrixRunning
//
comboMatrixRunning.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboMatrixRunning.FormattingEnabled = true;
comboMatrixRunning.ItemHeight = 32;
comboMatrixRunning.Items.AddRange(new object[] { "Binary Banner", "Rog Logo", "Picture" });
comboMatrixRunning.Location = new Point(257, 910);
comboMatrixRunning.Margin = new Padding(0);
comboMatrixRunning.Name = "comboMatrixRunning";
comboMatrixRunning.Size = new Size(211, 40);
comboMatrixRunning.TabIndex = 36;
comboMatrixRunning.TabStop = false;
//
// buttonMatrix
//
buttonMatrix.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonMatrix.BackColor = SystemColors.ButtonFace;
buttonMatrix.FlatAppearance.BorderSize = 0;
buttonMatrix.Location = new Point(486, 905);
buttonMatrix.Margin = new Padding(4, 2, 4, 2);
buttonMatrix.Name = "buttonMatrix";
buttonMatrix.Size = new Size(209, 48);
buttonMatrix.TabIndex = 37;
buttonMatrix.Text = "Picture";
buttonMatrix.UseVisualStyleBackColor = false;
//
// SettingsForm
//
AutoScaleDimensions = new SizeF(192F, 192F);
AutoScaleMode = AutoScaleMode.Dpi;
ClientSize = new Size(730, 1089);
ClientSize = new Size(736, 1203);
Controls.Add(buttonMatrix);
Controls.Add(comboMatrixRunning);
Controls.Add(comboMatrix);
Controls.Add(pictureMatrix);
Controls.Add(labelMatrix);
Controls.Add(labelVersion);
Controls.Add(pictureColor2);
Controls.Add(pictureColor);
@@ -568,7 +640,7 @@
Controls.Add(labelBattery);
Controls.Add(buttonKeyboardColor);
Controls.Add(comboKeyboard);
Controls.Add(pictureBox1);
Controls.Add(pictureKeyboard);
Controls.Add(label1);
Controls.Add(checkBoost);
Controls.Add(checkScreen);
@@ -608,9 +680,10 @@
((System.ComponentModel.ISupportInitialize)picturePerf).EndInit();
((System.ComponentModel.ISupportInitialize)pictureScreen).EndInit();
tableScreen.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
((System.ComponentModel.ISupportInitialize)pictureKeyboard).EndInit();
((System.ComponentModel.ISupportInitialize)pictureColor).EndInit();
((System.ComponentModel.ISupportInitialize)pictureColor2).EndInit();
((System.ComponentModel.ISupportInitialize)pictureMatrix).EndInit();
ResumeLayout(false);
PerformLayout();
}
@@ -643,7 +716,7 @@
private Button button60Hz;
private CheckBox checkScreen;
private CheckBox checkBoost;
private PictureBox pictureBox1;
private PictureBox pictureKeyboard;
private Label label1;
private ComboBox comboKeyboard;
private Button buttonKeyboardColor;
@@ -653,5 +726,10 @@
private PictureBox pictureColor;
private PictureBox pictureColor2;
private Label labelVersion;
private PictureBox pictureMatrix;
private Label labelMatrix;
private ComboBox comboMatrix;
private ComboBox comboMatrixRunning;
private Button buttonMatrix;
}
}

View File

@@ -1,7 +1,10 @@
using System.Diagnostics;
using Starlight.AnimeMatrix;
using System.Diagnostics;
using System.Reflection;
using System.Security.Cryptography;
using System.Timers;
using System.Drawing.Imaging;
using System.CodeDom.Compiler;
using System.Drawing;
namespace GHelper
{
@@ -61,7 +64,6 @@ namespace GHelper
comboKeyboard.DropDownStyle = ComboBoxStyle.DropDownList;
comboKeyboard.SelectedIndex = 0;
comboKeyboard.SelectedValueChanged += ComboKeyboard_SelectedValueChanged;
buttonKeyboardColor.Click += ButtonKeyboardColor_Click;
@@ -78,12 +80,156 @@ namespace GHelper
labelCPUFan.Click += LabelCPUFan_Click;
labelGPUFan.Click += LabelCPUFan_Click;
InitMatrix();
comboMatrix.DropDownStyle = ComboBoxStyle.DropDownList;
comboMatrixRunning.DropDownStyle = ComboBoxStyle.DropDownList;
comboMatrix.SelectedValueChanged += ComboMatrix_SelectedValueChanged;
comboMatrixRunning.SelectedValueChanged += ComboMatrixRunning_SelectedValueChanged;
buttonMatrix.Click += ButtonMatrix_Click;
SetTimer();
}
void SetMatrixPicture(string fileName)
{
int width = 34 * 3;
int height = 61;
float scale;
Bitmap image;
try
{
using (var bmpTemp = (Bitmap)Image.FromFile(fileName))
{
image = new Bitmap(bmpTemp);
Bitmap canvas = new Bitmap(width, height);
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height);
var graph = Graphics.FromImage(canvas);
var scaleWidth = (int)(image.Width * scale);
var scaleHeight = (int)(image.Height * scale);
graph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
graph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
graph.DrawImage(image, ((int)width - scaleWidth), ((int)height - scaleHeight) / 2, scaleWidth, scaleHeight);
Bitmap bmp = new Bitmap(canvas, 34, 61);
var mat = new AnimeMatrixDevice();
mat.SetBuiltInAnimation(false);
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
var pixel = bmp.GetPixel(x, y);
byte color = (byte)((pixel.R + pixel.G + pixel.B) / 3);
mat.SetLedPlanar(x, y, color);
}
}
mat.Present();
mat.Dispose();
}
}
catch
{
Debug.WriteLine("Error loading picture");
}
}
private void ButtonMatrix_Click(object? sender, EventArgs e)
{
Thread t = new Thread((ThreadStart)(() =>
{
OpenFileDialog of = new OpenFileDialog();
of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png)|*.BMP;*.JPG;*.JPEG;*.PNG";
if (of.ShowDialog() == DialogResult.OK)
{
Program.config.setConfig("matrix_picture", of.FileName);
SetMatrixPicture(of.FileName);
BeginInvoke(delegate
{
comboMatrixRunning.SelectedIndex = 2;
});
}
return;
}));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
private void ComboMatrixRunning_SelectedValueChanged(object? sender, EventArgs e)
{
SetAnimeMatrix();
}
private void ComboMatrix_SelectedValueChanged(object? sender, EventArgs e)
{
SetAnimeMatrix();
}
private void SetAnimeMatrix()
{
int brightness = comboMatrix.SelectedIndex;
int running = comboMatrixRunning.SelectedIndex;
var mat = new AnimeMatrixDevice();
BuiltInAnimation animation = new BuiltInAnimation(
(BuiltInAnimation.Running)running,
BuiltInAnimation.Sleeping.Starfield,
BuiltInAnimation.Shutdown.SeeYa,
BuiltInAnimation.Startup.StaticEmergence
);
if (brightness == 0)
{
mat.SetDisplayState(false);
}
else
{
mat.SetDisplayState(true);
mat.SetBrightness((BrightnessMode)brightness);
if (running == 2)
{
string fileName = Program.config.getConfigString("matrix_picture");
SetMatrixPicture(fileName);
}
else
{
mat.SetBuiltInAnimation(true, animation);
}
}
mat.Dispose();
Program.config.setConfig("matrix_brightness", comboMatrix.SelectedIndex);
Program.config.setConfig("matrix_running", comboMatrixRunning.SelectedIndex);
}
private void LabelCPUFan_Click(object? sender, EventArgs e)
{
Program.config.setConfig("fan_rpm", (Program.config.getConfig("fan_rpm") == 1) ? 0 : 1);
@@ -188,10 +334,18 @@ namespace GHelper
SetAuraMode(mode, false);
Aura.Mode = mode;
}
public void InitMatrix()
{
int brightness = Program.config.getConfig("matrix_brightness");
int running = Program.config.getConfig("matrix_running");
comboMatrix.SelectedIndex = (brightness != -1) ? brightness : 0;
comboMatrixRunning.SelectedIndex = (running != -1) ? running : 0;
}
public void SetAuraColor(Color? color1 = null, Color? color2 = null, bool apply = true)
{
@@ -498,7 +652,7 @@ namespace GHelper
}
int oldMode = Program.config.getConfig("performance_mode");
Program.config.setConfig("performance_"+(int)SystemInformation.PowerStatus.PowerLineStatus, PerformanceMode);
Program.config.setConfig("performance_" + (int)SystemInformation.PowerStatus.PowerLineStatus, PerformanceMode);
Program.config.setConfig("performance_mode", PerformanceMode);
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, PerformanceMode);
@@ -537,10 +691,10 @@ namespace GHelper
public void AutoPerformance(PowerLineStatus Plugged = PowerLineStatus.Online)
{
int mode = Program.config.getConfig("performance_"+(int)Plugged);
int mode = Program.config.getConfig("performance_" + (int)Plugged);
if (mode != -1)
SetPerformanceMode(mode, true);
else
else
SetPerformanceMode(Program.config.getConfig("performance_mode"));
}