diff --git a/ASUSWmi.cs b/ASUSWmi.cs index 2dde755a..baa3e2b9 100644 --- a/ASUSWmi.cs +++ b/ASUSWmi.cs @@ -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); } diff --git a/AnimeMatrix/AnimeMatrixDevice.cs b/AnimeMatrix/AnimeMatrixDevice.cs new file mode 100644 index 00000000..9c94f3c8 --- /dev/null +++ b/AnimeMatrix/AnimeMatrixDevice.cs @@ -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(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(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(0xC0, 0x02) + .AppendData(BitConverter.GetBytes((ushort)(address + 1))) + .AppendData(BitConverter.GetBytes((ushort)0x0001)) + .AppendData(value) + ); + + Set(Packet(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(0xC0, 0x02) + .AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 0 + 1))) + .AppendData(BitConverter.GetBytes((ushort)UpdatePageLength)) + .AppendData(_displayBuffer[(UpdatePageLength * 0)..(UpdatePageLength * 1)]) + ); + + Set(Packet(0xC0, 0x02) + .AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 1 + 1))) + .AppendData(BitConverter.GetBytes((ushort)UpdatePageLength)) + .AppendData(_displayBuffer[(UpdatePageLength * 1)..(UpdatePageLength * 2)]) + ); + + Set(Packet(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(0xC0, 0x03)); + } + + public void SetDisplayState(bool enable) + { + if (enable) + { + Set(Packet(0xC3, 0x01) + .AppendData(0x00)); + } + else + { + Set(Packet(0xC3, 0x01) + .AppendData(0x80)); + } + } + + public void SetBrightness(BrightnessMode mode) + { + Set(Packet(0xC0, 0x04) + .AppendData((byte)mode) + ); + } + + public void SetBuiltInAnimation(bool enable) + { + var enabled = enable ? (byte)0x00 : (byte)0x80; + Set(Packet(0xC4, 0x01, enabled)); + } + + public void SetBuiltInAnimation(bool enable, BuiltInAnimation animation) + { + SetBuiltInAnimation(enable); + Set(Packet(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}]."); + } + } + } +} \ No newline at end of file diff --git a/AppConfig.cs b/AppConfig.cs index db27733c..4a717098 100644 --- a/AppConfig.cs +++ b/AppConfig.cs @@ -1,9 +1,8 @@ using System.Text.Json; - public class AppConfig { - string appPath; + public string appPath; string configFile; public Dictionary config = new Dictionary(); @@ -82,7 +81,7 @@ public class AppConfig else name = "cpu"; - return paramName+"_" + name + "_" + mode; + return paramName + "_" + name + "_" + mode; } public byte[] getFanConfig(int device) diff --git a/Communication/Device.cs b/Communication/Device.cs new file mode 100644 index 00000000..2603d222 --- /dev/null +++ b/Communication/Device.cs @@ -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(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(); + } + } +} \ No newline at end of file diff --git a/Communication/Packet.cs b/Communication/Packet.cs new file mode 100644 index 00000000..0aa0bc87 --- /dev/null +++ b/Communication/Packet.cs @@ -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; + } + } +} \ No newline at end of file diff --git a/Communication/Platform/UsbProvider.cs b/Communication/Platform/UsbProvider.cs new file mode 100644 index 00000000..c3394cf3 --- /dev/null +++ b/Communication/Platform/UsbProvider.cs @@ -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(); + } +} \ No newline at end of file diff --git a/Communication/Platform/WindowsUsbProvider.cs b/Communication/Platform/WindowsUsbProvider.cs new file mode 100644 index 00000000..8933ca49 --- /dev/null +++ b/Communication/Platform/WindowsUsbProvider.cs @@ -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; + } + } + } + } + } +} \ No newline at end of file diff --git a/GHelper.csproj b/GHelper.csproj index 82624507..4e26af8b 100644 --- a/GHelper.csproj +++ b/GHelper.csproj @@ -15,7 +15,8 @@ GHelper x64 False - 0.14.1 + 0.15 + True @@ -37,6 +38,7 @@ + diff --git a/Program.cs b/Program.cs index 7cb37791..8e7e4447 100644 --- a/Program.cs +++ b/Program.cs @@ -1,6 +1,7 @@ using Microsoft.Win32; using System.Diagnostics; using System.Management; +using Starlight.AnimeMatrix; public class HardwareMonitor { diff --git a/Properties/Resources.Designer.cs b/Properties/Resources.Designer.cs index 43839093..af44bc02 100644 --- a/Properties/Resources.Designer.cs +++ b/Properties/Resources.Designer.cs @@ -120,6 +120,16 @@ namespace GHelper.Properties { } } + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap icons8_matrix_desktop_48 { + get { + object obj = ResourceManager.GetObject("icons8-matrix-desktop-48", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/Properties/Resources.resx b/Properties/Resources.resx index a22315f2..f8966b05 100644 --- a/Properties/Resources.resx +++ b/Properties/Resources.resx @@ -133,6 +133,9 @@ ..\Resources\icons8-speed-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\everything-is-fine-itsfine.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\icons8-speed-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -148,7 +151,7 @@ ..\Resources\icons8-laptop-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\everything-is-fine-itsfine.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icons8-matrix-desktop-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/Resources/icons8-matrix-desktop-48.png b/Resources/icons8-matrix-desktop-48.png new file mode 100644 index 00000000..23cb9f47 Binary files /dev/null and b/Resources/icons8-matrix-desktop-48.png differ diff --git a/Settings.Designer.cs b/Settings.Designer.cs index b3ae5f6b..2c9d5585 100644 --- a/Settings.Designer.cs +++ b/Settings.Designer.cs @@ -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; } } \ No newline at end of file diff --git a/Settings.cs b/Settings.cs index e7be9e3c..590f6b67 100644 --- a/Settings.cs +++ b/Settings.cs @@ -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")); }