diff --git a/Qwilight/Compute/DefaultCompute.cs b/Qwilight/Compute/DefaultCompute.cs index 7ab6bff..af8f872 100644 --- a/Qwilight/Compute/DefaultCompute.cs +++ b/Qwilight/Compute/DefaultCompute.cs @@ -2606,9 +2606,9 @@ var absInput = Math.Abs(input); if (isInput) { - IlluminationSystem.Instance.InputValues[absInput] = 1.0; + RGBSystem.Instance.InputValues[absInput] = 1.0; } - IlluminationSystem.Instance.HasInputValues[absInput] = isInput; + RGBSystem.Instance.HasInputValues[absInput] = isInput; if (input > 0) { switch (UI.Instance.LoopingMain) @@ -3345,7 +3345,7 @@ _millisMeter %= _millisStandardMeter; if (Configure.Instance.HandleMeter) { - IlluminationSystem.Instance.IsMeter = true; + RGBSystem.Instance.IsMeter = true; Array.Fill(JudgmentMainFrames, DrawingComponentValue.judgmentMainFrame); lock (DrawingComponentValue.PaintPropertyCSX) { @@ -4685,7 +4685,7 @@ public virtual ICollection HandleTwilightNetItems(CommentItem[] commentItems) => commentItems; - public virtual void OnFailed() => IlluminationSystem.Instance.IsFailed = true; + public virtual void OnFailed() => RGBSystem.Instance.IsFailed = true; public virtual void GetNetComments() { diff --git a/Qwilight/System/IlluminationSystem/AuraSystem.cs b/Qwilight/System/IlluminationSystem/AuraSystem.cs deleted file mode 100644 index 315ce81..0000000 --- a/Qwilight/System/IlluminationSystem/AuraSystem.cs +++ /dev/null @@ -1,271 +0,0 @@ -using AuraServiceLib; -using Microsoft.UI; -using Qwilight.Utilities; -using Windows.System; -using Windows.UI; - -namespace Qwilight -{ - public sealed class AuraSystem : BaseIlluminationSystem - { - public static readonly AuraSystem Instance = new(); - - static VirtualKey GetInput(ushort rawInput) => rawInput switch - { - 1 => VirtualKey.Escape, - 2 => VirtualKey.Number1, - 3 => VirtualKey.Number2, - 4 => VirtualKey.Number3, - 5 => VirtualKey.Number4, - 6 => VirtualKey.Number5, - 7 => VirtualKey.Number6, - 8 => VirtualKey.Number7, - 9 => VirtualKey.Number8, - 10 => VirtualKey.Number9, - 11 => VirtualKey.Number0, - 12 => (VirtualKey)189, - 13 => (VirtualKey)187, - 14 => VirtualKey.Back, - 15 => VirtualKey.Tab, - 16 => VirtualKey.Q, - 17 => VirtualKey.W, - 18 => VirtualKey.E, - 19 => VirtualKey.R, - 20 => VirtualKey.T, - 21 => VirtualKey.Y, - 22 => VirtualKey.U, - 23 => VirtualKey.I, - 24 => VirtualKey.O, - 25 => VirtualKey.P, - 26 => (VirtualKey)219, - 27 => (VirtualKey)221, - 28 => VirtualKey.Enter, - 29 => VirtualKey.LeftControl, - 30 => VirtualKey.A, - 31 => VirtualKey.S, - 32 => VirtualKey.D, - 33 => VirtualKey.F, - 34 => VirtualKey.G, - 35 => VirtualKey.H, - 36 => VirtualKey.J, - 37 => VirtualKey.K, - 38 => VirtualKey.L, - 39 => (VirtualKey)186, - 40 => (VirtualKey)222, - 41 => (VirtualKey)192, - 42 => VirtualKey.LeftShift, - 43 => (VirtualKey)220, - 44 => VirtualKey.Z, - 45 => VirtualKey.X, - 46 => VirtualKey.C, - 47 => VirtualKey.V, - 48 => VirtualKey.B, - 49 => VirtualKey.N, - 50 => VirtualKey.M, - 51 => (VirtualKey)188, - 52 => (VirtualKey)190, - 53 => (VirtualKey)191, - 54 => VirtualKey.RightShift, - 55 => VirtualKey.Multiply, - - 57 => VirtualKey.Space, - 58 => VirtualKey.CapitalLock, - 59 => VirtualKey.F1, - 60 => VirtualKey.F2, - 61 => VirtualKey.F3, - 62 => VirtualKey.F4, - 63 => VirtualKey.F5, - 64 => VirtualKey.F6, - 65 => VirtualKey.F7, - 66 => VirtualKey.F8, - 67 => VirtualKey.F9, - 68 => VirtualKey.F10, - 69 => VirtualKey.NumberKeyLock, - 70 => VirtualKey.Scroll, - 71 => VirtualKey.NumberPad7, - 72 => VirtualKey.NumberPad8, - 73 => VirtualKey.NumberPad9, - - 75 => VirtualKey.NumberPad4, - 76 => VirtualKey.NumberPad5, - 77 => VirtualKey.NumberPad6, - - 79 => VirtualKey.NumberPad1, - 80 => VirtualKey.NumberPad2, - 81 => VirtualKey.NumberPad3, - 82 => VirtualKey.NumberPad0, - - 87 => VirtualKey.F11, - 88 => VirtualKey.F12, - - 157 => VirtualKey.RightControl, - - 197 => VirtualKey.Pause, - 199 => VirtualKey.Home, - 200 => VirtualKey.Up, - 201 => VirtualKey.PageUp, - 203 => VirtualKey.Left, - 205 => VirtualKey.Right, - 207 => VirtualKey.End, - 208 => VirtualKey.Down, - 209 => VirtualKey.PageDown, - 210 => VirtualKey.Insert, - 211 => VirtualKey.Delete, - 219 => VirtualKey.LeftWindows, - 221 => VirtualKey.Application, - - _ => VirtualKey.None - }; - - readonly Dictionary> _statusItems = new(); - readonly Dictionary> _inputItems = new(); - readonly List _etcItems = new(); - readonly List _illuminatedItems = new(); - int _highestStatusCount; - IAuraSdk2 _auraSDK; - IAuraSyncDeviceCollection _auraItems; - - public override bool IsAvailable => Configure.Instance.Aura; - - public override bool Init() - { - try - { - _auraSDK = new AuraSdk() as IAuraSdk2; - _auraSDK.SwitchMode(); - _auraItems = _auraSDK.Enumerate(0); - if (_auraItems.Count > 0) - { - _statusItems.Clear(); - _inputItems.Clear(); - _etcItems.Clear(); - _illuminatedItems.Clear(); - foreach (IAuraSyncDevice auraItem in _auraItems) - { - foreach (IAuraRgbLight ledItem in auraItem.Lights) - { - _illuminatedItems.Add(ledItem); - } - if (auraItem is IAuraSyncKeyboard auraInput) - { - foreach (IAuraRgbKey ledItem in auraInput.Keys) - { - var input = GetInput(ledItem.Code); - if (input != VirtualKey.None) - { - Utility.NewValue(_inputItems, input, auraInput.Key[ledItem.Code]); - } - } - } - else - { - if (auraItem.Name.IsFrontCaselsss("ENE_RGB_For_ASUS")) - { - for (var i = auraItem.Lights.Count - 1; i >= 0; --i) - { - Utility.NewValue(_statusItems, i, auraItem.Lights[i]); - } - } - else - { - foreach (IAuraRgbLight ledItem in auraItem.Lights) - { - _etcItems.Add(ledItem); - } - } - } - } - _highestStatusCount = _statusItems.Keys.Count > 0 ? _statusItems.Keys.Max() : 0; - } - return true; - } - catch - { - return false; - } - } - - public override void SetInputColor(VirtualKey input, uint value) - { - if (_inputItems.TryGetValue(input, out var inputItems)) - { - foreach (var inputItem in inputItems) - { - inputItem.Color = value; - } - } - } - - public override void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) - { - if (!double.IsNaN(status)) - { - var value = _highestStatusCount * status; - var valueInt = (int)value; - var remainder = value - valueInt; - if (remainder > 0.0 && _statusItems.TryGetValue(valueInt, out var faintStatusItems)) - { - foreach (var statusItem in faintStatusItems) - { - statusItem.Color = Utility.GetColor((uint)(value0 * remainder), (uint)(value1 * remainder), (uint)(value2 * remainder), (uint)(value3 * remainder)); - } - } - for (var i = valueInt - 1; i >= 0; --i) - { - if (_statusItems.TryGetValue(valueInt, out var statusItems)) - { - foreach (var statusItem in statusItems) - { - statusItem.Color = Utility.GetColor(value0, value1, value2, value3); - } - } - } - } - } - - public override void SetEtcColor(uint value) - { - foreach (var etcItem in _etcItems) - { - etcItem.Color = value; - } - } - - public override void OnBeforeHandle() - { - foreach (IAuraRgbLight ledItem in _illuminatedItems) - { - ledItem.Color = 0; - } - } - - public override void OnHandled() - { - foreach (IAuraSyncDevice auraItem in _auraItems) - { - auraItem.Apply(); - } - } - - public override Color GetMeterColor() => Colors.Red; - - public override void Dispose() - { - lock (IlluminationSystem.Instance.HandlingCSX) - { - if (IsHandling) - { - IsHandling = false; - _auraSDK.ReleaseControl(0); - _auraSDK = null; - } - } - } - - public override void Toggle() - { - Configure.Instance.Aura = !Configure.Instance.Aura; - base.Toggle(); - } - } -} diff --git a/Qwilight/System/IlluminationSystem/BWSystem.cs b/Qwilight/System/IlluminationSystem/BWSystem.cs deleted file mode 100644 index 35c6d32..0000000 --- a/Qwilight/System/IlluminationSystem/BWSystem.cs +++ /dev/null @@ -1,241 +0,0 @@ -using ChromaSDK; -using Microsoft.UI; -using Qwilight.Utilities; -using System.IO; -using Windows.System; -using Windows.UI; - -namespace Qwilight -{ - public sealed class BWSystem : BaseIlluminationSystem - { - public static readonly BWSystem Instance = new(); - - static Keyboard.RZKEY GetInput(VirtualKey input) => input switch - { - VirtualKey.Escape => Keyboard.RZKEY.RZKEY_ESC, - VirtualKey.F1 => Keyboard.RZKEY.RZKEY_F1, - VirtualKey.F2 => Keyboard.RZKEY.RZKEY_F2, - VirtualKey.F3 => Keyboard.RZKEY.RZKEY_F3, - VirtualKey.F4 => Keyboard.RZKEY.RZKEY_F4, - VirtualKey.F5 => Keyboard.RZKEY.RZKEY_F5, - VirtualKey.F6 => Keyboard.RZKEY.RZKEY_F6, - VirtualKey.F7 => Keyboard.RZKEY.RZKEY_F7, - VirtualKey.F8 => Keyboard.RZKEY.RZKEY_F8, - VirtualKey.F9 => Keyboard.RZKEY.RZKEY_F9, - VirtualKey.F10 => Keyboard.RZKEY.RZKEY_F10, - VirtualKey.F11 => Keyboard.RZKEY.RZKEY_F11, - VirtualKey.F12 => Keyboard.RZKEY.RZKEY_F12, - VirtualKey.Insert => Keyboard.RZKEY.RZKEY_INSERT, - VirtualKey.Delete => Keyboard.RZKEY.RZKEY_DELETE, - (VirtualKey)192 => Keyboard.RZKEY.RZKEY_OEM_1, - VirtualKey.Number1 => Keyboard.RZKEY.RZKEY_1, - VirtualKey.Number2 => Keyboard.RZKEY.RZKEY_2, - VirtualKey.Number3 => Keyboard.RZKEY.RZKEY_3, - VirtualKey.Number4 => Keyboard.RZKEY.RZKEY_4, - VirtualKey.Number5 => Keyboard.RZKEY.RZKEY_5, - VirtualKey.Number6 => Keyboard.RZKEY.RZKEY_6, - VirtualKey.Number7 => Keyboard.RZKEY.RZKEY_7, - VirtualKey.Number8 => Keyboard.RZKEY.RZKEY_8, - VirtualKey.Number9 => Keyboard.RZKEY.RZKEY_9, - VirtualKey.Number0 => Keyboard.RZKEY.RZKEY_0, - (VirtualKey)189 => Keyboard.RZKEY.RZKEY_OEM_2, - (VirtualKey)187 => Keyboard.RZKEY.RZKEY_OEM_3, - VirtualKey.Back => Keyboard.RZKEY.RZKEY_BACKSPACE, - VirtualKey.Tab => Keyboard.RZKEY.RZKEY_TAB, - VirtualKey.Q => Keyboard.RZKEY.RZKEY_Q, - VirtualKey.W => Keyboard.RZKEY.RZKEY_W, - VirtualKey.E => Keyboard.RZKEY.RZKEY_E, - VirtualKey.R => Keyboard.RZKEY.RZKEY_R, - VirtualKey.T => Keyboard.RZKEY.RZKEY_T, - VirtualKey.Y => Keyboard.RZKEY.RZKEY_Y, - VirtualKey.U => Keyboard.RZKEY.RZKEY_U, - VirtualKey.I => Keyboard.RZKEY.RZKEY_I, - VirtualKey.O => Keyboard.RZKEY.RZKEY_O, - VirtualKey.P => Keyboard.RZKEY.RZKEY_P, - (VirtualKey)219 => Keyboard.RZKEY.RZKEY_OEM_4, - (VirtualKey)221 => Keyboard.RZKEY.RZKEY_OEM_5, - (VirtualKey)220 => Keyboard.RZKEY.RZKEY_OEM_6, - VirtualKey.CapitalLock => Keyboard.RZKEY.RZKEY_CAPSLOCK, - VirtualKey.A => Keyboard.RZKEY.RZKEY_A, - VirtualKey.S => Keyboard.RZKEY.RZKEY_S, - VirtualKey.D => Keyboard.RZKEY.RZKEY_D, - VirtualKey.F => Keyboard.RZKEY.RZKEY_F, - VirtualKey.G => Keyboard.RZKEY.RZKEY_G, - VirtualKey.H => Keyboard.RZKEY.RZKEY_H, - VirtualKey.J => Keyboard.RZKEY.RZKEY_J, - VirtualKey.K => Keyboard.RZKEY.RZKEY_K, - VirtualKey.L => Keyboard.RZKEY.RZKEY_L, - (VirtualKey)186 => Keyboard.RZKEY.RZKEY_OEM_7, - (VirtualKey)222 => Keyboard.RZKEY.RZKEY_OEM_8, - VirtualKey.Enter => Keyboard.RZKEY.RZKEY_ENTER, - VirtualKey.LeftShift => Keyboard.RZKEY.RZKEY_LSHIFT, - VirtualKey.Z => Keyboard.RZKEY.RZKEY_Z, - VirtualKey.X => Keyboard.RZKEY.RZKEY_X, - VirtualKey.C => Keyboard.RZKEY.RZKEY_C, - VirtualKey.V => Keyboard.RZKEY.RZKEY_V, - VirtualKey.B => Keyboard.RZKEY.RZKEY_B, - VirtualKey.N => Keyboard.RZKEY.RZKEY_N, - VirtualKey.M => Keyboard.RZKEY.RZKEY_M, - (VirtualKey)188 => Keyboard.RZKEY.RZKEY_OEM_9, - (VirtualKey)190 => Keyboard.RZKEY.RZKEY_OEM_10, - (VirtualKey)191 => Keyboard.RZKEY.RZKEY_OEM_11, - VirtualKey.RightShift => Keyboard.RZKEY.RZKEY_RSHIFT, - VirtualKey.LeftControl => Keyboard.RZKEY.RZKEY_LCTRL, - VirtualKey.LeftWindows => Keyboard.RZKEY.RZKEY_LWIN, - VirtualKey.LeftMenu => Keyboard.RZKEY.RZKEY_LALT, - VirtualKey.Space => Keyboard.RZKEY.RZKEY_SPACE, - VirtualKey.RightMenu => Keyboard.RZKEY.RZKEY_RALT, - VirtualKey.RightControl => Keyboard.RZKEY.RZKEY_RCTRL, - VirtualKey.Left => Keyboard.RZKEY.RZKEY_LEFT, - VirtualKey.Up => Keyboard.RZKEY.RZKEY_UP, - VirtualKey.Down => Keyboard.RZKEY.RZKEY_DOWN, - VirtualKey.Right => Keyboard.RZKEY.RZKEY_RIGHT, - VirtualKey.NumberKeyLock => Keyboard.RZKEY.RZKEY_NUMLOCK, - VirtualKey.NumberPad0 => Keyboard.RZKEY.RZKEY_NUMPAD0, - VirtualKey.NumberPad1 => Keyboard.RZKEY.RZKEY_NUMPAD1, - VirtualKey.NumberPad2 => Keyboard.RZKEY.RZKEY_NUMPAD2, - VirtualKey.NumberPad3 => Keyboard.RZKEY.RZKEY_NUMPAD3, - VirtualKey.NumberPad4 => Keyboard.RZKEY.RZKEY_NUMPAD4, - VirtualKey.NumberPad5 => Keyboard.RZKEY.RZKEY_NUMPAD5, - VirtualKey.NumberPad6 => Keyboard.RZKEY.RZKEY_NUMPAD6, - VirtualKey.NumberPad7 => Keyboard.RZKEY.RZKEY_NUMPAD7, - VirtualKey.NumberPad8 => Keyboard.RZKEY.RZKEY_NUMPAD8, - VirtualKey.NumberPad9 => Keyboard.RZKEY.RZKEY_NUMPAD9, - VirtualKey.Snapshot => Keyboard.RZKEY.RZKEY_PRINTSCREEN, - VirtualKey.Scroll => Keyboard.RZKEY.RZKEY_SCROLL, - VirtualKey.Pause => Keyboard.RZKEY.RZKEY_PAUSE, - VirtualKey.Home => Keyboard.RZKEY.RZKEY_HOME, - VirtualKey.PageUp => Keyboard.RZKEY.RZKEY_PAGEUP, - VirtualKey.End => Keyboard.RZKEY.RZKEY_END, - VirtualKey.PageDown => Keyboard.RZKEY.RZKEY_PAGEDOWN, - _ => Keyboard.RZKEY.RZKEY_INVALID - }; - - int[] _dataInputColors; - int[] _dataInputs; - int[] _dataPoint; - int[] _dataAudio; - int[] _dataPanel; - - BWSystem() - { - Utility.CopyFile(Path.Combine(QwilightComponent.CPUAssetsEntryPath, "LogitechLedEnginesWrapper.dll"), Path.Combine(AppContext.BaseDirectory, "LogitechLedEnginesWrapper.dll")); - } - - public override bool IsAvailable => Configure.Instance.BW; - - public override bool Init() - { - Utility.CopyFile(Path.Combine(QwilightComponent.CPUAssetsEntryPath, "CChromaEditorLibrary64.dll"), Path.Combine(AppContext.BaseDirectory, "CChromaEditorLibrary64.dll")); - try - { - var data = new APPINFOTYPE - { - Title = "Qwilight", - Description = "Qwilight", - - Author_Name = "Taehui", - Author_Contact = "https://taehui.ddns.net", - - SupportedDevice = 1, - Category = 2 - }; - var isOK = ChromaAnimationAPI.InitSDK(ref data) == 0; - if (isOK) - { - _dataInputColors = new int[ChromaAnimationAPI.GetMaxRow(ChromaAnimationAPI.Device2D.Keyboard) * ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Keyboard)]; - _dataInputs = new int[ChromaAnimationAPI.GetMaxRow(ChromaAnimationAPI.Device2D.Keyboard) * ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Keyboard)]; - _dataPoint = new int[ChromaAnimationAPI.GetMaxRow(ChromaAnimationAPI.Device2D.Mouse) * ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Mouse)]; - _dataAudio = new int[ChromaAnimationAPI.GetMaxLeds(ChromaAnimationAPI.Device1D.Headset)]; - _dataPanel = new int[ChromaAnimationAPI.GetMaxLeds(ChromaAnimationAPI.Device1D.Mousepad)]; - } - return isOK; - } - catch - { - return false; - } - } - - public override void SetInputColor(VirtualKey rawInput, uint value) - { - var input = GetInput(rawInput); - if (input != Keyboard.RZKEY.RZKEY_INVALID) - { - _dataInputColors[ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Keyboard) * (((int)input & 65280) >> 8) + ((int)input & 255)] = (int)value; - _dataInputs[ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Keyboard) * (((int)input & 65280) >> 8) + ((int)input & 255)] = (int)value; - } - } - - public override void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) - { - if (!double.IsNaN(status)) - { - var value = _dataPanel.Length * status; - var valueInt = (int)value; - for (var i = valueInt - 1; i >= 0; --i) - { - _dataPanel[i] = (int)Utility.GetColor(value0, value1, value2, value3); - } - var remainder = value - valueInt; - if (remainder > 0.0) - { - _dataPanel[valueInt] = (int)Utility.GetColor((uint)(value0 * remainder), (uint)(value1 * remainder), (uint)(value2 * remainder), (uint)(value3 * remainder)); - } - } - } - - public override void SetEtcColor(uint value) - { - Array.Fill(_dataAudio, (int)value); - Array.Fill(_dataPoint, (int)value); - } - - public override void OnBeforeHandle() - { - Array.Clear(_dataInputColors, 0, _dataInputColors.Length); - Array.Clear(_dataInputs, 0, _dataInputs.Length); - Array.Clear(_dataAudio, 0, _dataAudio.Length); - Array.Clear(_dataPoint, 0, _dataPoint.Length); - Array.Clear(_dataPanel, 0, _dataPanel.Length); - } - - public override void OnHandled() - { - ChromaAnimationAPI.SetCustomColorFlag2D((int)ChromaAnimationAPI.Device2D.Keyboard, _dataInputColors); - ChromaAnimationAPI.SetEffectKeyboardCustom2D((int)ChromaAnimationAPI.Device2D.Keyboard, _dataInputColors, _dataInputs); - ChromaAnimationAPI.SetEffectCustom1D((int)ChromaAnimationAPI.Device1D.Headset, _dataAudio); - ChromaAnimationAPI.SetEffectCustom2D((int)ChromaAnimationAPI.Device2D.Mouse, _dataPoint); - ChromaAnimationAPI.SetEffectCustom1D((int)ChromaAnimationAPI.Device1D.Mousepad, _dataPanel); - } - - public override Color GetMeterColor() => Colors.Green; - - public override void Dispose() - { - lock (IlluminationSystem.Instance.HandlingCSX) - { - if (IsHandling) - { - IsHandling = false; - try - { - ChromaAnimationAPI.StopAll(); - ChromaAnimationAPI.CloseAll(); - ChromaAnimationAPI.Uninit(); - } - catch (DllNotFoundException) - { - } - } - } - } - - public override void Toggle() - { - Configure.Instance.BW = !Configure.Instance.BW; - base.Toggle(); - } - } -} diff --git a/Qwilight/System/IlluminationSystem/BaseIlluminationSystem.cs b/Qwilight/System/IlluminationSystem/BaseIlluminationSystem.cs deleted file mode 100644 index 9309343..0000000 --- a/Qwilight/System/IlluminationSystem/BaseIlluminationSystem.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Windows.System; -using Windows.UI; - -namespace Qwilight -{ - public abstract class BaseIlluminationSystem : IDisposable - { - public abstract bool IsAvailable { get; } - - public abstract bool Init(); - - public bool IsHandling { get; set; } - - public abstract void SetInputColor(VirtualKey input, uint value); - - public abstract void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3); - - public abstract void SetEtcColor(uint value); - - public abstract void OnBeforeHandle(); - - public abstract void OnHandled(); - - public abstract Color GetMeterColor(); - - public abstract void Dispose(); - - public virtual void Toggle() - { - if (IsAvailable) - { - IlluminationSystem.Instance.HandleIfAvailable(); - } - else - { - Dispose(); - } - } - } -} diff --git a/Qwilight/System/IlluminationSystem/IlluminationSystem.cs b/Qwilight/System/IlluminationSystem/IlluminationSystem.cs deleted file mode 100644 index 7f186d7..0000000 --- a/Qwilight/System/IlluminationSystem/IlluminationSystem.cs +++ /dev/null @@ -1,614 +0,0 @@ -using Qwilight.Compute; -using Qwilight.Utilities; -using Qwilight.ViewModel; -using System.Diagnostics; -using System.IO; -using Windows.System; -using Windows.UI; - -namespace Qwilight -{ - public sealed class IlluminationSystem : IDisposable - { - public static readonly IlluminationSystem Instance = new(); - - static readonly string FaultEntryPath = Path.Combine(QwilightComponent.FaultEntryPath, nameof(IlluminationSystem)); - - readonly BaseIlluminationSystem[] _targetSystems = new BaseIlluminationSystem[] - { - BWSystem.Instance, AuraSystem.Instance, K70System.Instance, LSSystem.Instance - }; - - readonly object _availableCSX = new(); - - void Init() - { - foreach (var targetSystem in _targetSystems) - { - if (!targetSystem.IsHandling && targetSystem.IsAvailable) - { - targetSystem.IsHandling = targetSystem.Init(); - } - } - } - - void OnBeforeHandle() - { - foreach (var targetSystem in _targetSystems) - { - if (targetSystem.IsHandling) - { - targetSystem.OnBeforeHandle(); - } - } - } - - void SetInputColor(VirtualKey rawInput, uint value) - { - foreach (var targetSystem in _targetSystems) - { - if (targetSystem.IsHandling) - { - targetSystem.SetInputColor(rawInput, value); - } - } - } - - void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) - { - foreach (var targetSystem in _targetSystems) - { - if (targetSystem.IsHandling) - { - targetSystem.SetStatusColors(status, value0, value1, value2, value3); - } - } - } - - void SetEtcColor(double failedValue, double meterValue) - { - foreach (var targetSystem in _targetSystems) - { - if (targetSystem.IsHandling) - { - if (failedValue > 0.0) - { - targetSystem.SetEtcColor(GetFailedColor(failedValue)); - } - else if (meterValue > 0.0) - { - targetSystem.SetEtcColor(GetValueColor(targetSystem.GetMeterColor(), meterValue)); - } - } - } - } - - void OnHandled() - { - foreach (var targetSystem in _targetSystems) - { - if (targetSystem.IsHandling) - { - targetSystem.OnHandled(); - } - } - } - - public object HandlingCSX { get; } = new(); - - public bool[] HasInputValues { get; } = new bool[53]; - - public double[] InputValues { get; } = new double[53]; - - public bool IsMeter { get; set; } - - public bool IsFailed { get; set; } - - bool IsAvailable => _targetSystems.Any(targetSystem => targetSystem.IsAvailable); - - public void HandleIfAvailable() - { - lock (_availableCSX) - { - if (IsAvailable) - { - Monitor.Pulse(_availableCSX); - } - } - } - - public void HandleSystem() - { - var voteViewModel = ViewModels.Instance.VoteValue; - var wwwLevelViewModel = ViewModels.Instance.WwwLevelValue; - var assistViewModel = ViewModels.Instance.AssistValue; - var mainViewModel = ViewModels.Instance.MainValue; - var inputViewModel = ViewModels.Instance.InputValue; - var toNotifyViewModel = ViewModels.Instance.NotifyValue; - var inputStandardViewModel = ViewModels.Instance.InputStandardValue; - var siteContainerViewModel = ViewModels.Instance.SiteContainerValue; - var valueConfigureViewModel = ViewModels.Instance.ConfigureValue; - var defaultStatusInputs = new[] { - VirtualKey.Number1, - VirtualKey.Number2, - VirtualKey.Number3, - VirtualKey.Number4, - VirtualKey.Number5, - VirtualKey.Number6, - VirtualKey.Number7, - VirtualKey.Number8, - VirtualKey.Number9, - VirtualKey.Number0, - }; - var defaultStatusInputsLength = defaultStatusInputs.Length; - var defaultStatusInputsUnit = 1.0 / defaultStatusInputsLength; - var mainHitPointsInputs = new[] { - VirtualKey.Number1, - VirtualKey.Number2, - VirtualKey.Number3, - VirtualKey.Number4, - VirtualKey.Number5, - }; - var mainHitPointsInputsLength = mainHitPointsInputs.Length; - var mainHitPointsInputsUnit = 1.0 / mainHitPointsInputsLength; - var mainStatusInputs = new[] { - VirtualKey.Number6, - VirtualKey.Number7, - VirtualKey.Number8, - VirtualKey.Number9, - VirtualKey.Number0, - }; - var mainStatusInputsLength = mainStatusInputs.Length; - var mainStatusInputsUnit = 1.0 / mainStatusInputsLength; - var audioVisualizerInputs = new VirtualKey[10][] { - new[] - { - VirtualKey.Z, - VirtualKey.A, - VirtualKey.Q, - }, - new[] - { - VirtualKey.X, - VirtualKey.S, - VirtualKey.W, - }, - new[] - { - VirtualKey.C, - VirtualKey.D, - VirtualKey.E, - }, - new[] - { - VirtualKey.V, - VirtualKey.F, - VirtualKey.R, - }, - new[] - { - VirtualKey.B, - VirtualKey.G, - VirtualKey.T, - }, - new[] - { - VirtualKey.N, - VirtualKey.H, - VirtualKey.Y, - }, - new[] - { - VirtualKey.M, - VirtualKey.J, - VirtualKey.U, - }, - new[] - { - (VirtualKey)188, - VirtualKey.K, - VirtualKey.I, - }, - new[] - { - (VirtualKey)190, - VirtualKey.L, - VirtualKey.O, - }, - new[] - { - (VirtualKey)191, - (VirtualKey)186, - VirtualKey.P, - } - }; - var audioVisualizerInputsLength = audioVisualizerInputs.Length; - - var audioMainVisualizerValues = new double[audioVisualizerInputsLength]; - var audioMainVisualizerFrames = new double[audioVisualizerInputsLength]; - var lastAudioVisualizerMainValues = new double[audioVisualizerInputsLength]; - var audioInputVisualizerValues = new double[audioVisualizerInputsLength]; - var audioInputVisualizerFrames = new double[audioVisualizerInputsLength]; - var lastAudioVisualizerInputValues = new double[audioVisualizerInputsLength]; - var audioVisualizerColors = new Color[audioVisualizerInputs.Length, 3, 2]; - - var meterValue = 0.0; - var failedValue = 0.0; - - var handlingColor = GetHandlingColor(1.0); - var inputStandardColor = GetInputStandardColor(1.0); - var defaultColor = GetDefaultColor(1.0); - var inputColor = GetInputColor(0.0); - - var loopingCounter = 0.0; - var loopingHandler = Stopwatch.StartNew(); - while (true) - { - try - { - lock (HandlingCSX) - { - Init(); - OnBeforeHandle(); - - SetInputColor(VirtualKey.F6, defaultColor); - SetInputColor(VirtualKey.F7, voteViewModel.IsOpened ? handlingColor : defaultColor); - SetInputColor(VirtualKey.F8, siteContainerViewModel.IsOpened ? handlingColor : defaultColor); - SetInputColor(VirtualKey.F10, wwwLevelViewModel.IsOpened ? handlingColor : defaultColor); - SetInputColor(VirtualKey.F11, toNotifyViewModel.IsOpened ? handlingColor : defaultColor); - if (!QwilightComponent.IsValve) - { - SetInputColor(VirtualKey.F12, defaultColor); - } - - var isInputStandardWindowOpened = inputStandardViewModel.IsOpened; - var isDefaultInputWindowOpened = inputViewModel.IsOpened && inputViewModel.ControllerModeValue == InputViewModel.ControllerMode.DefaultInput; - - var defaultComputer = mainViewModel.Computer; - switch (mainViewModel.ModeValue) - { - case MainViewModel.Mode.NoteFile: - PaintInputAudioVisualizer(); - - PaintEtc(); - - var autoComputer = mainViewModel.AutoComputer; - if (autoComputer != null) - { - PaintInputStatus(autoComputer); - PaintStatusStatus(autoComputer); - } - - SetInputColor(VirtualKey.Escape, defaultColor); - SetInputColor(VirtualKey.Enter, defaultColor); - SetInputColor(VirtualKey.Delete, defaultColor); - SetInputColor(VirtualKey.Left, defaultColor); - SetInputColor(VirtualKey.Right, defaultColor); - SetInputColor(VirtualKey.Up, defaultColor); - SetInputColor(VirtualKey.Down, defaultColor); - SetInputColor(VirtualKey.Space, defaultColor); - - SetInputColor(VirtualKey.F1, assistViewModel.IsOpened ? handlingColor : defaultColor); - SetInputColor(VirtualKey.F5, mainViewModel.IsDefaultEntryLoading ? handlingColor : defaultColor); - SetInputColor(VirtualKey.F9, mainViewModel.EntryItemValue?.NoteFile?.HasFavoriteEntryItem == true ? handlingColor : defaultColor); - break; - case MainViewModel.Mode.Computing: - PaintEtc(); - - var handlingHitPointsColor = defaultComputer.ModeComponentValue.HandlingHitPointsColor; - var hitPoints = defaultComputer.HitPoints.Value; - for (var i = mainHitPointsInputsLength - 1; i >= 0; --i) - { - var value = Math.Clamp((hitPoints - ((double)i / mainHitPointsInputsLength)) / mainHitPointsInputsUnit, 0, 1); - SetInputColor(mainHitPointsInputs[i], GetValueColor(handlingHitPointsColor, value)); - } - - SetStatusColors(hitPoints, handlingHitPointsColor.R, handlingHitPointsColor.G, handlingHitPointsColor.B, handlingHitPointsColor.A); - - var status = defaultComputer.Status; - for (var i = mainStatusInputsLength - 1; i >= 0; --i) - { - var value = Math.Clamp((status - (double)i / mainStatusInputsLength) / mainStatusInputsUnit, 0, 1); - SetInputColor(mainStatusInputs[i], GetStatusColor(value * meterValue)); - } - - SetInputColor(VirtualKey.Escape, defaultComputer.IsPausingWindowOpened ? handlingColor : defaultColor); - SetInputColor(VirtualKey.Enter, defaultComputer.IsPassable || defaultComputer.IsPausingWindowOpened ? defaultColor : handlingColor); - - if (defaultComputer.IsPausingWindowOpened) - { - SetInputColor(VirtualKey.Up, defaultColor); - SetInputColor(VirtualKey.Down, defaultColor); - SetInputColor(VirtualKey.Space, defaultColor); - } - - if (!isInputStandardWindowOpened) - { - for (var i = Configure.Instance.DefaultInputBundlesV6.StandardInputs.Length - 1; i >= 0; --i) - { - switch (i) - { - case InputStandardViewModel.ModifyAutoMode: - if (defaultComputer.CanModifyAutoMode) - { - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, defaultComputer.IsAutoMode ? inputStandardColor : handlingColor); - } - break; - case InputStandardViewModel.MediaMode: - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, Configure.Instance.LoadedMedia && Configure.Instance.Media ? inputStandardColor : handlingColor); - break; - case InputStandardViewModel.PostItem0: - case InputStandardViewModel.PostItem1: - if (defaultComputer.PostableItems[0] != null || defaultComputer.PostableItems[1] != null) - { - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, inputStandardColor); - } - break; - default: - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, inputStandardColor); - break; - } - } - } - - if (!isDefaultInputWindowOpened) - { - var inputs = Configure.Instance.DefaultInputBundlesV6.Inputs[(int)defaultComputer.InputMode]; - if (inputs != null) - { - for (var i = inputs.Length - 1; i > 0; --i) - { - foreach (var defaultInput in inputs[i]) - { - SetInputColor(defaultInput.Data, failedValue > 0.0 ? GetFailedColor(failedValue) : GetInputColor(InputValues[i])); - } - } - } - } - - for (var i = InputValues.Length - 1; i > 0; --i) - { - if (!HasInputValues[i]) - { - InputValues[i] = Math.Max(0.0, InputValues[i] - (60 / 1000.0)); - } - } - break; - case MainViewModel.Mode.Quit: - PaintInputAudioVisualizer(); - PaintEtc(); - - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.MediaMode].Data, Configure.Instance.Media ? inputStandardColor : handlingColor); - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.HandleUndo].Data, inputStandardColor); - - SetInputColor(VirtualKey.Escape, defaultColor); - SetInputColor(VirtualKey.Enter, defaultColor); - if (0 < defaultComputer.LevyingComputingPosition) - { - SetInputColor(VirtualKey.Left, defaultColor); - } - if (defaultComputer.LevyingComputingPosition < defaultComputer.HighestComputingPosition) - { - SetInputColor(VirtualKey.Right, defaultColor); - } - break; - } - - if (isInputStandardWindowOpened) - { - for (var i = Configure.Instance.DefaultInputBundlesV6.StandardInputs.Length - 1; i >= 0; --i) - { - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, inputStandardColor); - } - } - else - { - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.LowerMultiplier].Data, inputStandardColor); - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.HigherMultiplier].Data, inputStandardColor); - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.LowerAudioMultiplier].Data, inputStandardColor); - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.HigherAudioMultiplier].Data, inputStandardColor); - SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.MediaMode].Data, Configure.Instance.Media ? inputStandardColor : handlingColor); - } - - if (isDefaultInputWindowOpened) - { - var inputControllerInputs = Configure.Instance.DefaultInputBundlesV6.Inputs[(int)inputViewModel.InputMode]; - if (inputControllerInputs != null) - { - foreach (var inputControllerInput in inputControllerInputs) - { - if (inputControllerInput != null) - { - foreach (var defaultInput in inputControllerInput) - { - SetInputColor(defaultInput.Data, inputColor); - } - } - } - } - } - - var modeComponent = mainViewModel.ModeComponentValue; - if (valueConfigureViewModel.IsOpened && valueConfigureViewModel.TabPosition == 0 && valueConfigureViewModel.TabPositionComputing == 0 && (mainViewModel.CanModifyModeComponent || modeComponent.CanModifyMultiplier || modeComponent.CanModifyAudioMultiplier)) - { - SetInputColor(VirtualKey.F1, defaultColor); - SetInputColor(VirtualKey.F2, defaultColor); - SetInputColor(VirtualKey.F3, defaultColor); - SetInputColor(VirtualKey.F4, defaultColor); - SetInputColor(VirtualKey.F5, defaultColor); - SetInputColor(VirtualKey.F6, defaultColor); - SetInputColor(VirtualKey.F7, defaultColor); - SetInputColor(VirtualKey.F8, defaultColor); - } - - if (IsMeter) - { - meterValue = 1.0; - IsMeter = false; - } - else - { - meterValue = Math.Max(0.0, meterValue - 60 / 1000.0); - } - - if (IsFailed) - { - failedValue = 1.0; - IsFailed = false; - } - else - { - failedValue = Math.Max(0.0, failedValue - 60 / QwilightComponent.StandardWaitMillis); - } - - OnHandled(); - } - - loopingCounter += 1000.0 / 60; - var toWait = loopingCounter - loopingHandler.GetMillis(); - if (toWait > 0.0) - { - Thread.Sleep(TimeSpan.FromMilliseconds(toWait)); - } - - lock (_availableCSX) - { - if (!IsAvailable) - { - Monitor.Wait(_availableCSX); - } - } - - void PaintEtc() - { - SetEtcColor(failedValue, meterValue); - } - - void PaintStatusStatus(DefaultCompute defaultComputer) - { - var statusColor = defaultComputer.IsHandling ? defaultComputer.IsPausing ? BaseUI.Instance.StatusPausedColor : BaseUI.Instance.StatusHandlingColor : BaseUI.Instance.StatusLoadingNoteFileColor; - var handlingMeterValue = defaultComputer.IsHandling && !defaultComputer.IsPausing ? meterValue : 1.0; - SetStatusColors(defaultComputer.Status, (uint)(statusColor.R * handlingMeterValue), (uint)(statusColor.G * handlingMeterValue), (uint)(statusColor.B * handlingMeterValue), (uint)(statusColor.A * handlingMeterValue)); - } - - void PaintInputStatus(DefaultCompute defaultComputer) - { - var statusColor = defaultComputer.IsHandling ? defaultComputer.IsPausing ? BaseUI.Instance.StatusPausedColor : BaseUI.Instance.StatusHandlingColor : BaseUI.Instance.StatusLoadingNoteFileColor; - var handlingMeterValue = defaultComputer.IsHandling && !defaultComputer.IsPausing ? meterValue : 1.0; - for (var i = defaultStatusInputsLength - 1; i >= 0; --i) - { - SetInputColor(defaultStatusInputs[i], GetValueColor(statusColor, handlingMeterValue * Math.Clamp((defaultComputer.Status - (double)i / defaultStatusInputsLength) / defaultStatusInputsUnit, 0, 1))); - } - } - - void PaintInputAudioVisualizer() - { - for (var i = audioVisualizerInputsLength - 1; i >= 0; --i) - { - var audioMainVisualizerValue = 0.0; - var audioInputVisualizerValue = 0.0; - for (var j = ((i + 1) * Configure.Instance.AudioVisualizerCount / audioVisualizerInputsLength) - 1; j >= i * Configure.Instance.AudioVisualizerCount / audioVisualizerInputsLength; --j) - { - audioMainVisualizerValue = Math.Max(audioMainVisualizerValue, AudioSystem.Instance.GetAudioVisualizerValue(AudioSystem.MainAudio, j)); - audioInputVisualizerValue = Math.Max(audioInputVisualizerValue, AudioSystem.Instance.GetAudioVisualizerValue(AudioSystem.InputAudio, j)); - } - audioMainVisualizerValues[i] = audioMainVisualizerValue; - audioInputVisualizerValues[i] = audioInputVisualizerValue; - - var distance = lastAudioVisualizerMainValues[i] - audioMainVisualizerValues[i]; - audioMainVisualizerFrames[i] = Math.Clamp(audioMainVisualizerFrames[i] + (distance == 0.0 ? 0.0 : distance > 0 ? -1 / 3.0 : 1 / 3.0), 0.0, 3.0); - distance = lastAudioVisualizerInputValues[i] - audioInputVisualizerValues[i]; - audioInputVisualizerFrames[i] = Math.Clamp(audioInputVisualizerFrames[i] + (distance == 0.0 ? 0.0 : distance > 0 ? -1 / 3.0 : 1 / 3.0), 0.0, 3.0); - } - - Array.Copy(audioMainVisualizerValues, lastAudioVisualizerMainValues, audioVisualizerInputsLength); - Array.Copy(audioInputVisualizerValues, lastAudioVisualizerInputValues, audioVisualizerInputsLength); - - Array.Clear(audioVisualizerColors, 0, audioVisualizerColors.Length); - var audioVisualizerMainColor = Configure.Instance.AudioVisualizerMainColor; - var audioVisualizerInputColor = Configure.Instance.AudioVisualizerInputColor; - for (var i = audioVisualizerInputsLength - 1; i >= 0; --i) - { - var value = audioMainVisualizerFrames[i]; - var valueInt = (int)value; - var remainder = value - valueInt; - if (remainder > 0.0) - { - audioVisualizerColors[i, valueInt, 0] = new() - { - R = (byte)(audioVisualizerMainColor.R * remainder), - G = (byte)(audioVisualizerMainColor.R * remainder), - B = (byte)(audioVisualizerMainColor.R * remainder), - }; - } - for (var j = valueInt - 1; j >= 0; --j) - { - audioVisualizerColors[i, j, 0] = audioVisualizerMainColor; - } - - value = audioInputVisualizerFrames[i]; - valueInt = (int)value; - remainder = value - valueInt; - if (remainder > 0.0) - { - audioVisualizerColors[i, valueInt, 1] = new() - { - R = (byte)(audioVisualizerInputColor.R * remainder), - G = (byte)(audioVisualizerInputColor.R * remainder), - B = (byte)(audioVisualizerInputColor.R * remainder), - }; - } - for (var j = valueInt - 1; j >= 0; --j) - { - audioVisualizerColors[i, j, 1] = audioVisualizerInputColor; - } - - for (var j = audioVisualizerColors.GetLength(0) - 1; j >= 0; --j) - { - for (var m = audioVisualizerColors.GetLength(1) - 1; m >= 0; --m) - { - SetInputColor(audioVisualizerInputs[j][m], GetValueColor(new() - { - A = (byte)((audioVisualizerColors[j, m, 0].A + audioVisualizerColors[j, m, 1].A) / 2), - R = (byte)((audioVisualizerColors[j, m, 0].R + audioVisualizerColors[j, m, 1].R) / 2), - G = (byte)((audioVisualizerColors[j, m, 0].G + audioVisualizerColors[j, m, 1].G) / 2), - B = (byte)((audioVisualizerColors[j, m, 0].B + audioVisualizerColors[j, m, 1].B) / 2) - }, 1.0)); - } - } - } - } - } - catch (ThreadInterruptedException) - { - } - catch (Exception e) - { - Utility.SaveFaultFile(FaultEntryPath, e); - } - } - } - - uint GetDefaultColor(double status) => Utility.GetColor((uint)(0 * status), (uint)(127 * status), (uint)(255 * status), 255); - - uint GetHandlingColor(double status) => Utility.GetColor((uint)(255 * status), (uint)(127 * status), (uint)(0 * status), 255); - - uint GetInputColor(double status) => Utility.GetColor((uint)(0 * status), (uint)(255 * (1.0 - status)), (uint)(255 * status), 255); - - uint GetInputStandardColor(double status) => Utility.GetColor((uint)(255 * status), (uint)(255 * status), (uint)(0 * status), 255); - - uint GetFailedColor(double status) => Utility.GetColor((uint)(255 * status), (uint)(0 * status), (uint)(0 * status), 255); - - uint GetStatusColor(double status) => Utility.GetColor((uint)(0 * status), (uint)(255 * status), (uint)(255 * status), 255); - - uint GetValueColor(Color value, double status) => Utility.GetColor((uint)(value.R * status), (uint)(value.G * status), (uint)(value.B * status), 255); - - public void Dispose() - { - foreach (var targetSystem in _targetSystems) - { - targetSystem.Dispose(); - } - } - } -} diff --git a/Qwilight/System/IlluminationSystem/K70System.cs b/Qwilight/System/IlluminationSystem/K70System.cs deleted file mode 100644 index 0c4281b..0000000 --- a/Qwilight/System/IlluminationSystem/K70System.cs +++ /dev/null @@ -1,208 +0,0 @@ -using CUESDK; -using Microsoft.UI; -using System.Buffers; -using Windows.System; -using Windows.UI; - -namespace Qwilight -{ - public sealed class K70System : BaseIlluminationSystem - { - public static readonly K70System Instance = new(); - - static CorsairLedId GetInput(VirtualKey rawInput) => rawInput switch - { - VirtualKey.Escape => CorsairLedId.KeyboardEscape, - VirtualKey.F1 => CorsairLedId.KeyboardF1, - VirtualKey.F2 => CorsairLedId.KeyboardF2, - VirtualKey.F3 => CorsairLedId.KeyboardF3, - VirtualKey.F4 => CorsairLedId.KeyboardF4, - VirtualKey.F5 => CorsairLedId.KeyboardF5, - VirtualKey.F6 => CorsairLedId.KeyboardF6, - VirtualKey.F7 => CorsairLedId.KeyboardF7, - VirtualKey.F8 => CorsairLedId.KeyboardF8, - VirtualKey.F9 => CorsairLedId.KeyboardF9, - VirtualKey.F10 => CorsairLedId.KeyboardF10, - VirtualKey.F11 => CorsairLedId.KeyboardF11, - VirtualKey.F12 => CorsairLedId.KeyboardF12, - VirtualKey.Insert => CorsairLedId.KeyboardInsert, - VirtualKey.Delete => CorsairLedId.KeyboardDelete, - (VirtualKey)192 => CorsairLedId.KeyboardGraveAccentAndTilde, - VirtualKey.Number1 => CorsairLedId.Keyboard1, - VirtualKey.Number2 => CorsairLedId.Keyboard2, - VirtualKey.Number3 => CorsairLedId.Keyboard3, - VirtualKey.Number4 => CorsairLedId.Keyboard4, - VirtualKey.Number5 => CorsairLedId.Keyboard5, - VirtualKey.Number6 => CorsairLedId.Keyboard6, - VirtualKey.Number7 => CorsairLedId.Keyboard7, - VirtualKey.Number8 => CorsairLedId.Keyboard8, - VirtualKey.Number9 => CorsairLedId.Keyboard9, - VirtualKey.Number0 => CorsairLedId.Keyboard0, - (VirtualKey)189 => CorsairLedId.KeyboardMinusAndUnderscore, - (VirtualKey)187 => CorsairLedId.KeyboardEqualsAndPlus, - VirtualKey.Back => CorsairLedId.KeyboardBackspace, - VirtualKey.Tab => CorsairLedId.KeyboardTab, - VirtualKey.Q => CorsairLedId.KeyboardQ, - VirtualKey.W => CorsairLedId.KeyboardW, - VirtualKey.E => CorsairLedId.KeyboardE, - VirtualKey.R => CorsairLedId.KeyboardR, - VirtualKey.T => CorsairLedId.KeyboardT, - VirtualKey.Y => CorsairLedId.KeyboardY, - VirtualKey.U => CorsairLedId.KeyboardU, - VirtualKey.I => CorsairLedId.KeyboardI, - VirtualKey.O => CorsairLedId.KeyboardO, - VirtualKey.P => CorsairLedId.KeyboardP, - (VirtualKey)219 => CorsairLedId.KeyboardBracketLeft, - (VirtualKey)221 => CorsairLedId.KeyboardBracketRight, - (VirtualKey)220 => CorsairLedId.KeyboardBackslash, - VirtualKey.CapitalLock => CorsairLedId.KeyboardCapsLock, - VirtualKey.A => CorsairLedId.KeyboardA, - VirtualKey.S => CorsairLedId.KeyboardS, - VirtualKey.D => CorsairLedId.KeyboardD, - VirtualKey.F => CorsairLedId.KeyboardF, - VirtualKey.G => CorsairLedId.KeyboardG, - VirtualKey.H => CorsairLedId.KeyboardH, - VirtualKey.J => CorsairLedId.KeyboardJ, - VirtualKey.K => CorsairLedId.KeyboardK, - VirtualKey.L => CorsairLedId.KeyboardL, - (VirtualKey)186 => CorsairLedId.KeyboardSemicolonAndColon, - (VirtualKey)222 => CorsairLedId.KeyboardApostropheAndDoubleQuote, - VirtualKey.Enter => CorsairLedId.KeyboardEnter, - VirtualKey.LeftShift => CorsairLedId.KeyboardLeftShift, - VirtualKey.Z => CorsairLedId.KeyboardZ, - VirtualKey.X => CorsairLedId.KeyboardX, - VirtualKey.C => CorsairLedId.KeyboardC, - VirtualKey.V => CorsairLedId.KeyboardV, - VirtualKey.B => CorsairLedId.KeyboardB, - VirtualKey.N => CorsairLedId.KeyboardN, - VirtualKey.M => CorsairLedId.KeyboardM, - (VirtualKey)188 => CorsairLedId.KeyboardCommaAndLessThan, - (VirtualKey)190 => CorsairLedId.KeyboardPeriodAndBiggerThan, - (VirtualKey)191 => CorsairLedId.KeyboardSlashAndQuestionMark, - VirtualKey.RightShift => CorsairLedId.KeyboardRightShift, - VirtualKey.LeftControl => CorsairLedId.KeyboardLeftCtrl, - VirtualKey.LeftWindows => CorsairLedId.KeyboardLeftGui, - VirtualKey.LeftMenu => CorsairLedId.KeyboardLeftAlt, - VirtualKey.Space => CorsairLedId.KeyboardSpace, - VirtualKey.RightMenu => CorsairLedId.KeyboardRightAlt, - VirtualKey.RightControl => CorsairLedId.KeyboardRightCtrl, - VirtualKey.Left => CorsairLedId.KeyboardLeftArrow, - VirtualKey.Up => CorsairLedId.KeyboardUpArrow, - VirtualKey.Down => CorsairLedId.KeyboardDownArrow, - VirtualKey.Right => CorsairLedId.KeyboardRightArrow, - VirtualKey.NumberKeyLock => CorsairLedId.KeyboardNumLock, - VirtualKey.NumberPad0 => CorsairLedId.KeyboardKeypad0, - VirtualKey.NumberPad1 => CorsairLedId.KeyboardKeypad1, - VirtualKey.NumberPad2 => CorsairLedId.KeyboardKeypad2, - VirtualKey.NumberPad3 => CorsairLedId.KeyboardKeypad3, - VirtualKey.NumberPad4 => CorsairLedId.KeyboardKeypad4, - VirtualKey.NumberPad5 => CorsairLedId.KeyboardKeypad5, - VirtualKey.NumberPad6 => CorsairLedId.KeyboardKeypad6, - VirtualKey.NumberPad7 => CorsairLedId.KeyboardKeypad7, - VirtualKey.NumberPad8 => CorsairLedId.KeyboardKeypad8, - VirtualKey.NumberPad9 => CorsairLedId.KeyboardKeypad9, - VirtualKey.Snapshot => CorsairLedId.KeyboardPrintScreen, - VirtualKey.Scroll => CorsairLedId.KeyboardScrollLock, - VirtualKey.Pause => CorsairLedId.KeyboardPauseBreak, - VirtualKey.Home => CorsairLedId.KeyboardHome, - VirtualKey.PageUp => CorsairLedId.KeyboardPageUp, - VirtualKey.End => CorsairLedId.KeyboardEnd, - VirtualKey.PageDown => CorsairLedId.KeyboardPageDown, - _ => default, - }; - - readonly CorsairLedId[] _inputs; - readonly Dictionary _illuminatedIDs = new(); - readonly CorsairLedColor[] _illuminatedColors; - int _illuminatedCount; - - K70System() - { - _inputs = (Enum.GetValues(typeof(CorsairLedId)) as CorsairLedId[]).Where(input => (CorsairLedId.KeyboardEscape <= input && input <= CorsairLedId.KeyboardFn) || input == CorsairLedId.KeyboardLogo || (CorsairLedId.KeyboardLightPipeZone1 <= input && input <= CorsairLedId.KeyboardLightPipeZone19) || (CorsairLedId.KeyboardLightPipeZone20 <= input && input <= CorsairLedId.KeyboardProfile)).ToArray(); - _illuminatedColors = new CorsairLedColor[_inputs.Length]; - } - - public override bool IsAvailable => Configure.Instance.K70; - - public override bool Init() - { - CorsairLightingSDK.PerformProtocolHandshake(); - return CorsairLightingSDK.GetLastError() == CorsairError.Success && CorsairLightingSDK.RequestControl(CorsairAccessMode.ExclusiveLightingControl); - } - - public override void SetInputColor(VirtualKey rawInput, uint value) - { - var input = GetInput(rawInput); - if (input != CorsairLedId.Invalid) - { - _illuminatedIDs[input] = value; - } - } - - public override void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) - { - } - - public override void SetEtcColor(uint value) - { - _illuminatedIDs[CorsairLedId.KeyboardLogo] = value; - for (var i = CorsairLedId.KeyboardLightPipeZone19; i >= CorsairLedId.KeyboardLightPipeZone1; --i) - { - _illuminatedIDs[i] = value; - } - for (var i = CorsairLedId.KeyboardProfile; i >= CorsairLedId.KeyboardLightPipeZone20; --i) - { - _illuminatedIDs[i] = value; - } - } - - public override void OnBeforeHandle() - { - _illuminatedIDs.Clear(); - _illuminatedCount = CorsairLightingSDK.GetDeviceCount(); - } - - public override void OnHandled() - { - for (var i = _inputs.Length - 1; i >= 0; --i) - { - var input = _inputs[i]; - _illuminatedColors[i] = _illuminatedIDs.TryGetValue(input, out var value) ? new() - { - LedId = input, - R = (int)(value & 255), - G = (int)((value >> 8) & 255), - B = (int)(value >> 16) - } : new() - { - LedId = input - }; - } - for (var i = _illuminatedCount - 1; i >= 0; --i) - { - CorsairLightingSDK.SetLedsColorsBufferByDeviceIndex(i, _illuminatedColors); - } - CorsairLightingSDK.SetLedsColorsFlushBuffer(); - } - - public override Color GetMeterColor() => Colors.Yellow; - - public override void Dispose() - { - lock (IlluminationSystem.Instance.HandlingCSX) - { - if (IsHandling) - { - IsHandling = false; - CorsairLightingSDK.ReleaseControl(CorsairAccessMode.ExclusiveLightingControl); - } - } - } - - public override void Toggle() - { - Configure.Instance.K70 = !Configure.Instance.K70; - base.Toggle(); - } - } -} diff --git a/Qwilight/System/IlluminationSystem/LSSystem.cs b/Qwilight/System/IlluminationSystem/LSSystem.cs deleted file mode 100644 index 6ce14e9..0000000 --- a/Qwilight/System/IlluminationSystem/LSSystem.cs +++ /dev/null @@ -1,198 +0,0 @@ -using LedCSharp; -using Microsoft.UI; -using Qwilight.Utilities; -using System.IO; -using Windows.System; -using Windows.UI; - -namespace Qwilight -{ - public sealed class LSSystem : BaseIlluminationSystem - { - public static readonly LSSystem Instance = new(); - - static keyboardNames GetInput(VirtualKey rawInput) => rawInput switch - { - VirtualKey.Escape => keyboardNames.ESC, - VirtualKey.F1 => keyboardNames.F1, - VirtualKey.F2 => keyboardNames.F2, - VirtualKey.F3 => keyboardNames.F3, - VirtualKey.F4 => keyboardNames.F4, - VirtualKey.F5 => keyboardNames.F5, - VirtualKey.F6 => keyboardNames.F6, - VirtualKey.F7 => keyboardNames.F7, - VirtualKey.F8 => keyboardNames.F8, - VirtualKey.F9 => keyboardNames.F9, - VirtualKey.F10 => keyboardNames.F10, - VirtualKey.F11 => keyboardNames.F11, - VirtualKey.F12 => keyboardNames.F12, - VirtualKey.Insert => keyboardNames.INSERT, - VirtualKey.Delete => keyboardNames.KEYBOARD_DELETE, - (VirtualKey)192 => keyboardNames.TILDE, - VirtualKey.Number1 => keyboardNames.ONE, - VirtualKey.Number2 => keyboardNames.TWO, - VirtualKey.Number3 => keyboardNames.THREE, - VirtualKey.Number4 => keyboardNames.FOUR, - VirtualKey.Number5 => keyboardNames.FIVE, - VirtualKey.Number6 => keyboardNames.SIX, - VirtualKey.Number7 => keyboardNames.SEVEN, - VirtualKey.Number8 => keyboardNames.EIGHT, - VirtualKey.Number9 => keyboardNames.NINE, - VirtualKey.Number0 => keyboardNames.ZERO, - (VirtualKey)189 => keyboardNames.MINUS, - (VirtualKey)187 => keyboardNames.EQUALS, - VirtualKey.Back => keyboardNames.BACKSPACE, - VirtualKey.Tab => keyboardNames.TAB, - VirtualKey.Q => keyboardNames.Q, - VirtualKey.W => keyboardNames.W, - VirtualKey.E => keyboardNames.E, - VirtualKey.R => keyboardNames.R, - VirtualKey.T => keyboardNames.T, - VirtualKey.Y => keyboardNames.Y, - VirtualKey.U => keyboardNames.U, - VirtualKey.I => keyboardNames.I, - VirtualKey.O => keyboardNames.O, - VirtualKey.P => keyboardNames.P, - (VirtualKey)219 => keyboardNames.OPEN_BRACKET, - (VirtualKey)221 => keyboardNames.CLOSE_BRACKET, - (VirtualKey)220 => keyboardNames.BACKSLASH, - VirtualKey.CapitalLock => keyboardNames.CAPS_LOCK, - VirtualKey.A => keyboardNames.A, - VirtualKey.S => keyboardNames.S, - VirtualKey.D => keyboardNames.D, - VirtualKey.F => keyboardNames.F, - VirtualKey.G => keyboardNames.G, - VirtualKey.H => keyboardNames.H, - VirtualKey.J => keyboardNames.J, - VirtualKey.K => keyboardNames.K, - VirtualKey.L => keyboardNames.L, - (VirtualKey)186 => keyboardNames.SEMICOLON, - (VirtualKey)222 => keyboardNames.APOSTROPHE, - VirtualKey.Enter => keyboardNames.ENTER, - VirtualKey.LeftShift => keyboardNames.LEFT_SHIFT, - VirtualKey.Z => keyboardNames.Z, - VirtualKey.X => keyboardNames.X, - VirtualKey.C => keyboardNames.C, - VirtualKey.V => keyboardNames.V, - VirtualKey.B => keyboardNames.B, - VirtualKey.N => keyboardNames.N, - VirtualKey.M => keyboardNames.M, - (VirtualKey)188 => keyboardNames.COMMA, - (VirtualKey)190 => keyboardNames.PERIOD, - (VirtualKey)191 => keyboardNames.FORWARD_SLASH, - VirtualKey.RightShift => keyboardNames.RIGHT_SHIFT, - VirtualKey.LeftControl => keyboardNames.LEFT_CONTROL, - VirtualKey.LeftWindows => keyboardNames.LEFT_WINDOWS, - VirtualKey.LeftMenu => keyboardNames.LEFT_ALT, - VirtualKey.Space => keyboardNames.SPACE, - VirtualKey.RightMenu => keyboardNames.RIGHT_ALT, - VirtualKey.RightControl => keyboardNames.RIGHT_CONTROL, - VirtualKey.Left => keyboardNames.ARROW_LEFT, - VirtualKey.Up => keyboardNames.ARROW_UP, - VirtualKey.Down => keyboardNames.ARROW_DOWN, - VirtualKey.Right => keyboardNames.ARROW_RIGHT, - VirtualKey.NumberKeyLock => keyboardNames.NUM_LOCK, - VirtualKey.NumberPad0 => keyboardNames.NUM_ZERO, - VirtualKey.NumberPad1 => keyboardNames.NUM_ONE, - VirtualKey.NumberPad2 => keyboardNames.NUM_TWO, - VirtualKey.NumberPad3 => keyboardNames.NUM_THREE, - VirtualKey.NumberPad4 => keyboardNames.NUM_FOUR, - VirtualKey.NumberPad5 => keyboardNames.NUM_FIVE, - VirtualKey.NumberPad6 => keyboardNames.NUM_SIX, - VirtualKey.NumberPad7 => keyboardNames.NUM_SEVEN, - VirtualKey.NumberPad8 => keyboardNames.NUM_EIGHT, - VirtualKey.NumberPad9 => keyboardNames.NUM_NINE, - VirtualKey.Snapshot => keyboardNames.PRINT_SCREEN, - VirtualKey.Scroll => keyboardNames.SCROLL_LOCK, - VirtualKey.Pause => keyboardNames.PAUSE_BREAK, - VirtualKey.Home => keyboardNames.HOME, - VirtualKey.PageUp => keyboardNames.PAGE_UP, - VirtualKey.End => keyboardNames.END, - VirtualKey.PageDown => keyboardNames.PAGE_DOWN, - _ => default - }; - - readonly keyboardNames[] _inputs = (Enum.GetValues(typeof(keyboardNames)) as keyboardNames[]); - readonly Dictionary _illuminatedIDs = new(); - - LSSystem() - { - Utility.CopyFile(Path.Combine(QwilightComponent.CPUAssetsEntryPath, "LogitechLedEnginesWrapper.dll"), Path.Combine(AppContext.BaseDirectory, "LogitechLedEnginesWrapper.dll")); - } - - public override bool IsAvailable => Configure.Instance.LS; - - public override bool Init() - { - try - { - var isOK = LogitechGSDK.LogiLedInitWithName("Qwilight"); - if (isOK) - { - LogitechGSDK.LogiLedSetTargetDevice(LogitechGSDK.LOGI_DEVICETYPE_ALL); - } - return isOK; - } - catch - { - return false; - } - } - - public override void SetInputColor(VirtualKey rawInput, uint value) - { - var input = GetInput(rawInput); - if (input != default) - { - _illuminatedIDs[input] = value; - } - } - - public override void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) - { - } - - public override void SetEtcColor(uint value) - { - LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Headset, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); - LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Keyboard, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); - LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Mouse, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); - LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Mousemat, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); - LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Speaker, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); - } - - public override void OnBeforeHandle() - { - _illuminatedIDs.Clear(); - } - - public override void OnHandled() - { - foreach (var input in _inputs) - { - var value = _illuminatedIDs.GetValueOrDefault(input); - LogitechGSDK.LogiLedSetLightingForKeyWithKeyName(input, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); - } - } - - public override Color GetMeterColor() => Colors.Cyan; - - public override void Dispose() - { - lock (IlluminationSystem.Instance.HandlingCSX) - { - if (IsHandling) - { - IsHandling = false; - LogitechGSDK.LogiLedShutdown(); - } - } - } - - public override void Toggle() - { - Configure.Instance.LS = !Configure.Instance.LS; - base.Toggle(); - } - } -} diff --git a/Qwilight/System/RGBSystem/AuraSystem.cs b/Qwilight/System/RGBSystem/AuraSystem.cs new file mode 100644 index 0000000..6d0eb7b --- /dev/null +++ b/Qwilight/System/RGBSystem/AuraSystem.cs @@ -0,0 +1,271 @@ +using AuraServiceLib; +using Microsoft.UI; +using Qwilight.Utilities; +using Windows.System; +using Windows.UI; + +namespace Qwilight +{ + public sealed class AuraSystem : BaseRGBSystem + { + public static readonly AuraSystem Instance = new(); + + static VirtualKey GetInput(ushort rawInput) => rawInput switch + { + 1 => VirtualKey.Escape, + 2 => VirtualKey.Number1, + 3 => VirtualKey.Number2, + 4 => VirtualKey.Number3, + 5 => VirtualKey.Number4, + 6 => VirtualKey.Number5, + 7 => VirtualKey.Number6, + 8 => VirtualKey.Number7, + 9 => VirtualKey.Number8, + 10 => VirtualKey.Number9, + 11 => VirtualKey.Number0, + 12 => (VirtualKey)189, + 13 => (VirtualKey)187, + 14 => VirtualKey.Back, + 15 => VirtualKey.Tab, + 16 => VirtualKey.Q, + 17 => VirtualKey.W, + 18 => VirtualKey.E, + 19 => VirtualKey.R, + 20 => VirtualKey.T, + 21 => VirtualKey.Y, + 22 => VirtualKey.U, + 23 => VirtualKey.I, + 24 => VirtualKey.O, + 25 => VirtualKey.P, + 26 => (VirtualKey)219, + 27 => (VirtualKey)221, + 28 => VirtualKey.Enter, + 29 => VirtualKey.LeftControl, + 30 => VirtualKey.A, + 31 => VirtualKey.S, + 32 => VirtualKey.D, + 33 => VirtualKey.F, + 34 => VirtualKey.G, + 35 => VirtualKey.H, + 36 => VirtualKey.J, + 37 => VirtualKey.K, + 38 => VirtualKey.L, + 39 => (VirtualKey)186, + 40 => (VirtualKey)222, + 41 => (VirtualKey)192, + 42 => VirtualKey.LeftShift, + 43 => (VirtualKey)220, + 44 => VirtualKey.Z, + 45 => VirtualKey.X, + 46 => VirtualKey.C, + 47 => VirtualKey.V, + 48 => VirtualKey.B, + 49 => VirtualKey.N, + 50 => VirtualKey.M, + 51 => (VirtualKey)188, + 52 => (VirtualKey)190, + 53 => (VirtualKey)191, + 54 => VirtualKey.RightShift, + 55 => VirtualKey.Multiply, + + 57 => VirtualKey.Space, + 58 => VirtualKey.CapitalLock, + 59 => VirtualKey.F1, + 60 => VirtualKey.F2, + 61 => VirtualKey.F3, + 62 => VirtualKey.F4, + 63 => VirtualKey.F5, + 64 => VirtualKey.F6, + 65 => VirtualKey.F7, + 66 => VirtualKey.F8, + 67 => VirtualKey.F9, + 68 => VirtualKey.F10, + 69 => VirtualKey.NumberKeyLock, + 70 => VirtualKey.Scroll, + 71 => VirtualKey.NumberPad7, + 72 => VirtualKey.NumberPad8, + 73 => VirtualKey.NumberPad9, + + 75 => VirtualKey.NumberPad4, + 76 => VirtualKey.NumberPad5, + 77 => VirtualKey.NumberPad6, + + 79 => VirtualKey.NumberPad1, + 80 => VirtualKey.NumberPad2, + 81 => VirtualKey.NumberPad3, + 82 => VirtualKey.NumberPad0, + + 87 => VirtualKey.F11, + 88 => VirtualKey.F12, + + 157 => VirtualKey.RightControl, + + 197 => VirtualKey.Pause, + 199 => VirtualKey.Home, + 200 => VirtualKey.Up, + 201 => VirtualKey.PageUp, + 203 => VirtualKey.Left, + 205 => VirtualKey.Right, + 207 => VirtualKey.End, + 208 => VirtualKey.Down, + 209 => VirtualKey.PageDown, + 210 => VirtualKey.Insert, + 211 => VirtualKey.Delete, + 219 => VirtualKey.LeftWindows, + 221 => VirtualKey.Application, + + _ => VirtualKey.None + }; + + readonly Dictionary> _statusItems = new(); + readonly Dictionary> _inputItems = new(); + readonly List _etcItems = new(); + readonly List _rgbItems = new(); + int _highestStatusCount; + IAuraSdk2 _auraSDK; + IAuraSyncDeviceCollection _auraItems; + + public override bool IsAvailable => Configure.Instance.Aura; + + public override bool Init() + { + try + { + _auraSDK = new AuraSdk() as IAuraSdk2; + _auraSDK.SwitchMode(); + _auraItems = _auraSDK.Enumerate(0); + if (_auraItems.Count > 0) + { + _statusItems.Clear(); + _inputItems.Clear(); + _etcItems.Clear(); + _rgbItems.Clear(); + foreach (IAuraSyncDevice auraItem in _auraItems) + { + foreach (IAuraRgbLight ledItem in auraItem.Lights) + { + _rgbItems.Add(ledItem); + } + if (auraItem is IAuraSyncKeyboard auraInput) + { + foreach (IAuraRgbKey ledItem in auraInput.Keys) + { + var input = GetInput(ledItem.Code); + if (input != VirtualKey.None) + { + Utility.NewValue(_inputItems, input, auraInput.Key[ledItem.Code]); + } + } + } + else + { + if (auraItem.Name.IsFrontCaselsss("ENE_RGB_For_ASUS")) + { + for (var i = auraItem.Lights.Count - 1; i >= 0; --i) + { + Utility.NewValue(_statusItems, i, auraItem.Lights[i]); + } + } + else + { + foreach (IAuraRgbLight ledItem in auraItem.Lights) + { + _etcItems.Add(ledItem); + } + } + } + } + _highestStatusCount = _statusItems.Keys.Count > 0 ? _statusItems.Keys.Max() : 0; + } + return true; + } + catch + { + return false; + } + } + + public override void SetInputColor(VirtualKey input, uint value) + { + if (_inputItems.TryGetValue(input, out var inputItems)) + { + foreach (var inputItem in inputItems) + { + inputItem.Color = value; + } + } + } + + public override void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) + { + if (!double.IsNaN(status)) + { + var value = _highestStatusCount * status; + var valueInt = (int)value; + var remainder = value - valueInt; + if (remainder > 0.0 && _statusItems.TryGetValue(valueInt, out var faintStatusItems)) + { + foreach (var statusItem in faintStatusItems) + { + statusItem.Color = Utility.GetColor((uint)(value0 * remainder), (uint)(value1 * remainder), (uint)(value2 * remainder), (uint)(value3 * remainder)); + } + } + for (var i = valueInt - 1; i >= 0; --i) + { + if (_statusItems.TryGetValue(valueInt, out var statusItems)) + { + foreach (var statusItem in statusItems) + { + statusItem.Color = Utility.GetColor(value0, value1, value2, value3); + } + } + } + } + } + + public override void SetEtcColor(uint value) + { + foreach (var etcItem in _etcItems) + { + etcItem.Color = value; + } + } + + public override void OnBeforeHandle() + { + foreach (IAuraRgbLight ledItem in _rgbItems) + { + ledItem.Color = 0; + } + } + + public override void OnHandled() + { + foreach (IAuraSyncDevice auraItem in _auraItems) + { + auraItem.Apply(); + } + } + + public override Color GetMeterColor() => Colors.Red; + + public override void Dispose() + { + lock (RGBSystem.Instance.HandlingCSX) + { + if (IsHandling) + { + IsHandling = false; + _auraSDK.ReleaseControl(0); + _auraSDK = null; + } + } + } + + public override void Toggle() + { + Configure.Instance.Aura = !Configure.Instance.Aura; + base.Toggle(); + } + } +} diff --git a/Qwilight/System/RGBSystem/BWSystem.cs b/Qwilight/System/RGBSystem/BWSystem.cs new file mode 100644 index 0000000..0df2e54 --- /dev/null +++ b/Qwilight/System/RGBSystem/BWSystem.cs @@ -0,0 +1,241 @@ +using ChromaSDK; +using Microsoft.UI; +using Qwilight.Utilities; +using System.IO; +using Windows.System; +using Windows.UI; + +namespace Qwilight +{ + public sealed class BWSystem : BaseRGBSystem + { + public static readonly BWSystem Instance = new(); + + static Keyboard.RZKEY GetInput(VirtualKey input) => input switch + { + VirtualKey.Escape => Keyboard.RZKEY.RZKEY_ESC, + VirtualKey.F1 => Keyboard.RZKEY.RZKEY_F1, + VirtualKey.F2 => Keyboard.RZKEY.RZKEY_F2, + VirtualKey.F3 => Keyboard.RZKEY.RZKEY_F3, + VirtualKey.F4 => Keyboard.RZKEY.RZKEY_F4, + VirtualKey.F5 => Keyboard.RZKEY.RZKEY_F5, + VirtualKey.F6 => Keyboard.RZKEY.RZKEY_F6, + VirtualKey.F7 => Keyboard.RZKEY.RZKEY_F7, + VirtualKey.F8 => Keyboard.RZKEY.RZKEY_F8, + VirtualKey.F9 => Keyboard.RZKEY.RZKEY_F9, + VirtualKey.F10 => Keyboard.RZKEY.RZKEY_F10, + VirtualKey.F11 => Keyboard.RZKEY.RZKEY_F11, + VirtualKey.F12 => Keyboard.RZKEY.RZKEY_F12, + VirtualKey.Insert => Keyboard.RZKEY.RZKEY_INSERT, + VirtualKey.Delete => Keyboard.RZKEY.RZKEY_DELETE, + (VirtualKey)192 => Keyboard.RZKEY.RZKEY_OEM_1, + VirtualKey.Number1 => Keyboard.RZKEY.RZKEY_1, + VirtualKey.Number2 => Keyboard.RZKEY.RZKEY_2, + VirtualKey.Number3 => Keyboard.RZKEY.RZKEY_3, + VirtualKey.Number4 => Keyboard.RZKEY.RZKEY_4, + VirtualKey.Number5 => Keyboard.RZKEY.RZKEY_5, + VirtualKey.Number6 => Keyboard.RZKEY.RZKEY_6, + VirtualKey.Number7 => Keyboard.RZKEY.RZKEY_7, + VirtualKey.Number8 => Keyboard.RZKEY.RZKEY_8, + VirtualKey.Number9 => Keyboard.RZKEY.RZKEY_9, + VirtualKey.Number0 => Keyboard.RZKEY.RZKEY_0, + (VirtualKey)189 => Keyboard.RZKEY.RZKEY_OEM_2, + (VirtualKey)187 => Keyboard.RZKEY.RZKEY_OEM_3, + VirtualKey.Back => Keyboard.RZKEY.RZKEY_BACKSPACE, + VirtualKey.Tab => Keyboard.RZKEY.RZKEY_TAB, + VirtualKey.Q => Keyboard.RZKEY.RZKEY_Q, + VirtualKey.W => Keyboard.RZKEY.RZKEY_W, + VirtualKey.E => Keyboard.RZKEY.RZKEY_E, + VirtualKey.R => Keyboard.RZKEY.RZKEY_R, + VirtualKey.T => Keyboard.RZKEY.RZKEY_T, + VirtualKey.Y => Keyboard.RZKEY.RZKEY_Y, + VirtualKey.U => Keyboard.RZKEY.RZKEY_U, + VirtualKey.I => Keyboard.RZKEY.RZKEY_I, + VirtualKey.O => Keyboard.RZKEY.RZKEY_O, + VirtualKey.P => Keyboard.RZKEY.RZKEY_P, + (VirtualKey)219 => Keyboard.RZKEY.RZKEY_OEM_4, + (VirtualKey)221 => Keyboard.RZKEY.RZKEY_OEM_5, + (VirtualKey)220 => Keyboard.RZKEY.RZKEY_OEM_6, + VirtualKey.CapitalLock => Keyboard.RZKEY.RZKEY_CAPSLOCK, + VirtualKey.A => Keyboard.RZKEY.RZKEY_A, + VirtualKey.S => Keyboard.RZKEY.RZKEY_S, + VirtualKey.D => Keyboard.RZKEY.RZKEY_D, + VirtualKey.F => Keyboard.RZKEY.RZKEY_F, + VirtualKey.G => Keyboard.RZKEY.RZKEY_G, + VirtualKey.H => Keyboard.RZKEY.RZKEY_H, + VirtualKey.J => Keyboard.RZKEY.RZKEY_J, + VirtualKey.K => Keyboard.RZKEY.RZKEY_K, + VirtualKey.L => Keyboard.RZKEY.RZKEY_L, + (VirtualKey)186 => Keyboard.RZKEY.RZKEY_OEM_7, + (VirtualKey)222 => Keyboard.RZKEY.RZKEY_OEM_8, + VirtualKey.Enter => Keyboard.RZKEY.RZKEY_ENTER, + VirtualKey.LeftShift => Keyboard.RZKEY.RZKEY_LSHIFT, + VirtualKey.Z => Keyboard.RZKEY.RZKEY_Z, + VirtualKey.X => Keyboard.RZKEY.RZKEY_X, + VirtualKey.C => Keyboard.RZKEY.RZKEY_C, + VirtualKey.V => Keyboard.RZKEY.RZKEY_V, + VirtualKey.B => Keyboard.RZKEY.RZKEY_B, + VirtualKey.N => Keyboard.RZKEY.RZKEY_N, + VirtualKey.M => Keyboard.RZKEY.RZKEY_M, + (VirtualKey)188 => Keyboard.RZKEY.RZKEY_OEM_9, + (VirtualKey)190 => Keyboard.RZKEY.RZKEY_OEM_10, + (VirtualKey)191 => Keyboard.RZKEY.RZKEY_OEM_11, + VirtualKey.RightShift => Keyboard.RZKEY.RZKEY_RSHIFT, + VirtualKey.LeftControl => Keyboard.RZKEY.RZKEY_LCTRL, + VirtualKey.LeftWindows => Keyboard.RZKEY.RZKEY_LWIN, + VirtualKey.LeftMenu => Keyboard.RZKEY.RZKEY_LALT, + VirtualKey.Space => Keyboard.RZKEY.RZKEY_SPACE, + VirtualKey.RightMenu => Keyboard.RZKEY.RZKEY_RALT, + VirtualKey.RightControl => Keyboard.RZKEY.RZKEY_RCTRL, + VirtualKey.Left => Keyboard.RZKEY.RZKEY_LEFT, + VirtualKey.Up => Keyboard.RZKEY.RZKEY_UP, + VirtualKey.Down => Keyboard.RZKEY.RZKEY_DOWN, + VirtualKey.Right => Keyboard.RZKEY.RZKEY_RIGHT, + VirtualKey.NumberKeyLock => Keyboard.RZKEY.RZKEY_NUMLOCK, + VirtualKey.NumberPad0 => Keyboard.RZKEY.RZKEY_NUMPAD0, + VirtualKey.NumberPad1 => Keyboard.RZKEY.RZKEY_NUMPAD1, + VirtualKey.NumberPad2 => Keyboard.RZKEY.RZKEY_NUMPAD2, + VirtualKey.NumberPad3 => Keyboard.RZKEY.RZKEY_NUMPAD3, + VirtualKey.NumberPad4 => Keyboard.RZKEY.RZKEY_NUMPAD4, + VirtualKey.NumberPad5 => Keyboard.RZKEY.RZKEY_NUMPAD5, + VirtualKey.NumberPad6 => Keyboard.RZKEY.RZKEY_NUMPAD6, + VirtualKey.NumberPad7 => Keyboard.RZKEY.RZKEY_NUMPAD7, + VirtualKey.NumberPad8 => Keyboard.RZKEY.RZKEY_NUMPAD8, + VirtualKey.NumberPad9 => Keyboard.RZKEY.RZKEY_NUMPAD9, + VirtualKey.Snapshot => Keyboard.RZKEY.RZKEY_PRINTSCREEN, + VirtualKey.Scroll => Keyboard.RZKEY.RZKEY_SCROLL, + VirtualKey.Pause => Keyboard.RZKEY.RZKEY_PAUSE, + VirtualKey.Home => Keyboard.RZKEY.RZKEY_HOME, + VirtualKey.PageUp => Keyboard.RZKEY.RZKEY_PAGEUP, + VirtualKey.End => Keyboard.RZKEY.RZKEY_END, + VirtualKey.PageDown => Keyboard.RZKEY.RZKEY_PAGEDOWN, + _ => Keyboard.RZKEY.RZKEY_INVALID + }; + + int[] _dataInputColors; + int[] _dataInputs; + int[] _dataPoint; + int[] _dataAudio; + int[] _dataPanel; + + BWSystem() + { + Utility.CopyFile(Path.Combine(QwilightComponent.CPUAssetsEntryPath, "LogitechLedEnginesWrapper.dll"), Path.Combine(AppContext.BaseDirectory, "LogitechLedEnginesWrapper.dll")); + } + + public override bool IsAvailable => Configure.Instance.BW; + + public override bool Init() + { + Utility.CopyFile(Path.Combine(QwilightComponent.CPUAssetsEntryPath, "CChromaEditorLibrary64.dll"), Path.Combine(AppContext.BaseDirectory, "CChromaEditorLibrary64.dll")); + try + { + var data = new APPINFOTYPE + { + Title = "Qwilight", + Description = "Qwilight", + + Author_Name = "Taehui", + Author_Contact = "https://taehui.ddns.net", + + SupportedDevice = 1, + Category = 2 + }; + var isOK = ChromaAnimationAPI.InitSDK(ref data) == 0; + if (isOK) + { + _dataInputColors = new int[ChromaAnimationAPI.GetMaxRow(ChromaAnimationAPI.Device2D.Keyboard) * ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Keyboard)]; + _dataInputs = new int[ChromaAnimationAPI.GetMaxRow(ChromaAnimationAPI.Device2D.Keyboard) * ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Keyboard)]; + _dataPoint = new int[ChromaAnimationAPI.GetMaxRow(ChromaAnimationAPI.Device2D.Mouse) * ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Mouse)]; + _dataAudio = new int[ChromaAnimationAPI.GetMaxLeds(ChromaAnimationAPI.Device1D.Headset)]; + _dataPanel = new int[ChromaAnimationAPI.GetMaxLeds(ChromaAnimationAPI.Device1D.Mousepad)]; + } + return isOK; + } + catch + { + return false; + } + } + + public override void SetInputColor(VirtualKey rawInput, uint value) + { + var input = GetInput(rawInput); + if (input != Keyboard.RZKEY.RZKEY_INVALID) + { + _dataInputColors[ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Keyboard) * (((int)input & 65280) >> 8) + ((int)input & 255)] = (int)value; + _dataInputs[ChromaAnimationAPI.GetMaxColumn(ChromaAnimationAPI.Device2D.Keyboard) * (((int)input & 65280) >> 8) + ((int)input & 255)] = (int)value; + } + } + + public override void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) + { + if (!double.IsNaN(status)) + { + var value = _dataPanel.Length * status; + var valueInt = (int)value; + for (var i = valueInt - 1; i >= 0; --i) + { + _dataPanel[i] = (int)Utility.GetColor(value0, value1, value2, value3); + } + var remainder = value - valueInt; + if (remainder > 0.0) + { + _dataPanel[valueInt] = (int)Utility.GetColor((uint)(value0 * remainder), (uint)(value1 * remainder), (uint)(value2 * remainder), (uint)(value3 * remainder)); + } + } + } + + public override void SetEtcColor(uint value) + { + Array.Fill(_dataAudio, (int)value); + Array.Fill(_dataPoint, (int)value); + } + + public override void OnBeforeHandle() + { + Array.Clear(_dataInputColors, 0, _dataInputColors.Length); + Array.Clear(_dataInputs, 0, _dataInputs.Length); + Array.Clear(_dataAudio, 0, _dataAudio.Length); + Array.Clear(_dataPoint, 0, _dataPoint.Length); + Array.Clear(_dataPanel, 0, _dataPanel.Length); + } + + public override void OnHandled() + { + ChromaAnimationAPI.SetCustomColorFlag2D((int)ChromaAnimationAPI.Device2D.Keyboard, _dataInputColors); + ChromaAnimationAPI.SetEffectKeyboardCustom2D((int)ChromaAnimationAPI.Device2D.Keyboard, _dataInputColors, _dataInputs); + ChromaAnimationAPI.SetEffectCustom1D((int)ChromaAnimationAPI.Device1D.Headset, _dataAudio); + ChromaAnimationAPI.SetEffectCustom2D((int)ChromaAnimationAPI.Device2D.Mouse, _dataPoint); + ChromaAnimationAPI.SetEffectCustom1D((int)ChromaAnimationAPI.Device1D.Mousepad, _dataPanel); + } + + public override Color GetMeterColor() => Colors.Green; + + public override void Dispose() + { + lock (RGBSystem.Instance.HandlingCSX) + { + if (IsHandling) + { + IsHandling = false; + try + { + ChromaAnimationAPI.StopAll(); + ChromaAnimationAPI.CloseAll(); + ChromaAnimationAPI.Uninit(); + } + catch (DllNotFoundException) + { + } + } + } + } + + public override void Toggle() + { + Configure.Instance.BW = !Configure.Instance.BW; + base.Toggle(); + } + } +} diff --git a/Qwilight/System/RGBSystem/BaseRGBSystem.cs b/Qwilight/System/RGBSystem/BaseRGBSystem.cs new file mode 100644 index 0000000..99a24c9 --- /dev/null +++ b/Qwilight/System/RGBSystem/BaseRGBSystem.cs @@ -0,0 +1,40 @@ +using Windows.System; +using Windows.UI; + +namespace Qwilight +{ + public abstract class BaseRGBSystem : IDisposable + { + public abstract bool IsAvailable { get; } + + public abstract bool Init(); + + public bool IsHandling { get; set; } + + public abstract void SetInputColor(VirtualKey input, uint value); + + public abstract void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3); + + public abstract void SetEtcColor(uint value); + + public abstract void OnBeforeHandle(); + + public abstract void OnHandled(); + + public abstract Color GetMeterColor(); + + public abstract void Dispose(); + + public virtual void Toggle() + { + if (IsAvailable) + { + RGBSystem.Instance.HandleIfAvailable(); + } + else + { + Dispose(); + } + } + } +} diff --git a/Qwilight/System/RGBSystem/K70System.cs b/Qwilight/System/RGBSystem/K70System.cs new file mode 100644 index 0000000..6ac2fbc --- /dev/null +++ b/Qwilight/System/RGBSystem/K70System.cs @@ -0,0 +1,208 @@ +using CUESDK; +using Microsoft.UI; +using System.Buffers; +using Windows.System; +using Windows.UI; + +namespace Qwilight +{ + public sealed class K70System : BaseRGBSystem + { + public static readonly K70System Instance = new(); + + static CorsairLedId GetInput(VirtualKey rawInput) => rawInput switch + { + VirtualKey.Escape => CorsairLedId.KeyboardEscape, + VirtualKey.F1 => CorsairLedId.KeyboardF1, + VirtualKey.F2 => CorsairLedId.KeyboardF2, + VirtualKey.F3 => CorsairLedId.KeyboardF3, + VirtualKey.F4 => CorsairLedId.KeyboardF4, + VirtualKey.F5 => CorsairLedId.KeyboardF5, + VirtualKey.F6 => CorsairLedId.KeyboardF6, + VirtualKey.F7 => CorsairLedId.KeyboardF7, + VirtualKey.F8 => CorsairLedId.KeyboardF8, + VirtualKey.F9 => CorsairLedId.KeyboardF9, + VirtualKey.F10 => CorsairLedId.KeyboardF10, + VirtualKey.F11 => CorsairLedId.KeyboardF11, + VirtualKey.F12 => CorsairLedId.KeyboardF12, + VirtualKey.Insert => CorsairLedId.KeyboardInsert, + VirtualKey.Delete => CorsairLedId.KeyboardDelete, + (VirtualKey)192 => CorsairLedId.KeyboardGraveAccentAndTilde, + VirtualKey.Number1 => CorsairLedId.Keyboard1, + VirtualKey.Number2 => CorsairLedId.Keyboard2, + VirtualKey.Number3 => CorsairLedId.Keyboard3, + VirtualKey.Number4 => CorsairLedId.Keyboard4, + VirtualKey.Number5 => CorsairLedId.Keyboard5, + VirtualKey.Number6 => CorsairLedId.Keyboard6, + VirtualKey.Number7 => CorsairLedId.Keyboard7, + VirtualKey.Number8 => CorsairLedId.Keyboard8, + VirtualKey.Number9 => CorsairLedId.Keyboard9, + VirtualKey.Number0 => CorsairLedId.Keyboard0, + (VirtualKey)189 => CorsairLedId.KeyboardMinusAndUnderscore, + (VirtualKey)187 => CorsairLedId.KeyboardEqualsAndPlus, + VirtualKey.Back => CorsairLedId.KeyboardBackspace, + VirtualKey.Tab => CorsairLedId.KeyboardTab, + VirtualKey.Q => CorsairLedId.KeyboardQ, + VirtualKey.W => CorsairLedId.KeyboardW, + VirtualKey.E => CorsairLedId.KeyboardE, + VirtualKey.R => CorsairLedId.KeyboardR, + VirtualKey.T => CorsairLedId.KeyboardT, + VirtualKey.Y => CorsairLedId.KeyboardY, + VirtualKey.U => CorsairLedId.KeyboardU, + VirtualKey.I => CorsairLedId.KeyboardI, + VirtualKey.O => CorsairLedId.KeyboardO, + VirtualKey.P => CorsairLedId.KeyboardP, + (VirtualKey)219 => CorsairLedId.KeyboardBracketLeft, + (VirtualKey)221 => CorsairLedId.KeyboardBracketRight, + (VirtualKey)220 => CorsairLedId.KeyboardBackslash, + VirtualKey.CapitalLock => CorsairLedId.KeyboardCapsLock, + VirtualKey.A => CorsairLedId.KeyboardA, + VirtualKey.S => CorsairLedId.KeyboardS, + VirtualKey.D => CorsairLedId.KeyboardD, + VirtualKey.F => CorsairLedId.KeyboardF, + VirtualKey.G => CorsairLedId.KeyboardG, + VirtualKey.H => CorsairLedId.KeyboardH, + VirtualKey.J => CorsairLedId.KeyboardJ, + VirtualKey.K => CorsairLedId.KeyboardK, + VirtualKey.L => CorsairLedId.KeyboardL, + (VirtualKey)186 => CorsairLedId.KeyboardSemicolonAndColon, + (VirtualKey)222 => CorsairLedId.KeyboardApostropheAndDoubleQuote, + VirtualKey.Enter => CorsairLedId.KeyboardEnter, + VirtualKey.LeftShift => CorsairLedId.KeyboardLeftShift, + VirtualKey.Z => CorsairLedId.KeyboardZ, + VirtualKey.X => CorsairLedId.KeyboardX, + VirtualKey.C => CorsairLedId.KeyboardC, + VirtualKey.V => CorsairLedId.KeyboardV, + VirtualKey.B => CorsairLedId.KeyboardB, + VirtualKey.N => CorsairLedId.KeyboardN, + VirtualKey.M => CorsairLedId.KeyboardM, + (VirtualKey)188 => CorsairLedId.KeyboardCommaAndLessThan, + (VirtualKey)190 => CorsairLedId.KeyboardPeriodAndBiggerThan, + (VirtualKey)191 => CorsairLedId.KeyboardSlashAndQuestionMark, + VirtualKey.RightShift => CorsairLedId.KeyboardRightShift, + VirtualKey.LeftControl => CorsairLedId.KeyboardLeftCtrl, + VirtualKey.LeftWindows => CorsairLedId.KeyboardLeftGui, + VirtualKey.LeftMenu => CorsairLedId.KeyboardLeftAlt, + VirtualKey.Space => CorsairLedId.KeyboardSpace, + VirtualKey.RightMenu => CorsairLedId.KeyboardRightAlt, + VirtualKey.RightControl => CorsairLedId.KeyboardRightCtrl, + VirtualKey.Left => CorsairLedId.KeyboardLeftArrow, + VirtualKey.Up => CorsairLedId.KeyboardUpArrow, + VirtualKey.Down => CorsairLedId.KeyboardDownArrow, + VirtualKey.Right => CorsairLedId.KeyboardRightArrow, + VirtualKey.NumberKeyLock => CorsairLedId.KeyboardNumLock, + VirtualKey.NumberPad0 => CorsairLedId.KeyboardKeypad0, + VirtualKey.NumberPad1 => CorsairLedId.KeyboardKeypad1, + VirtualKey.NumberPad2 => CorsairLedId.KeyboardKeypad2, + VirtualKey.NumberPad3 => CorsairLedId.KeyboardKeypad3, + VirtualKey.NumberPad4 => CorsairLedId.KeyboardKeypad4, + VirtualKey.NumberPad5 => CorsairLedId.KeyboardKeypad5, + VirtualKey.NumberPad6 => CorsairLedId.KeyboardKeypad6, + VirtualKey.NumberPad7 => CorsairLedId.KeyboardKeypad7, + VirtualKey.NumberPad8 => CorsairLedId.KeyboardKeypad8, + VirtualKey.NumberPad9 => CorsairLedId.KeyboardKeypad9, + VirtualKey.Snapshot => CorsairLedId.KeyboardPrintScreen, + VirtualKey.Scroll => CorsairLedId.KeyboardScrollLock, + VirtualKey.Pause => CorsairLedId.KeyboardPauseBreak, + VirtualKey.Home => CorsairLedId.KeyboardHome, + VirtualKey.PageUp => CorsairLedId.KeyboardPageUp, + VirtualKey.End => CorsairLedId.KeyboardEnd, + VirtualKey.PageDown => CorsairLedId.KeyboardPageDown, + _ => default, + }; + + readonly CorsairLedId[] _inputs; + readonly Dictionary _rgbIDs = new(); + readonly CorsairLedColor[] _rgbColors; + int _rgbCount; + + K70System() + { + _inputs = (Enum.GetValues(typeof(CorsairLedId)) as CorsairLedId[]).Where(input => (CorsairLedId.KeyboardEscape <= input && input <= CorsairLedId.KeyboardFn) || input == CorsairLedId.KeyboardLogo || (CorsairLedId.KeyboardLightPipeZone1 <= input && input <= CorsairLedId.KeyboardLightPipeZone19) || (CorsairLedId.KeyboardLightPipeZone20 <= input && input <= CorsairLedId.KeyboardProfile)).ToArray(); + _rgbColors = new CorsairLedColor[_inputs.Length]; + } + + public override bool IsAvailable => Configure.Instance.K70; + + public override bool Init() + { + CorsairLightingSDK.PerformProtocolHandshake(); + return CorsairLightingSDK.GetLastError() == CorsairError.Success && CorsairLightingSDK.RequestControl(CorsairAccessMode.ExclusiveLightingControl); + } + + public override void SetInputColor(VirtualKey rawInput, uint value) + { + var input = GetInput(rawInput); + if (input != CorsairLedId.Invalid) + { + _rgbIDs[input] = value; + } + } + + public override void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) + { + } + + public override void SetEtcColor(uint value) + { + _rgbIDs[CorsairLedId.KeyboardLogo] = value; + for (var i = CorsairLedId.KeyboardLightPipeZone19; i >= CorsairLedId.KeyboardLightPipeZone1; --i) + { + _rgbIDs[i] = value; + } + for (var i = CorsairLedId.KeyboardProfile; i >= CorsairLedId.KeyboardLightPipeZone20; --i) + { + _rgbIDs[i] = value; + } + } + + public override void OnBeforeHandle() + { + _rgbIDs.Clear(); + _rgbCount = CorsairLightingSDK.GetDeviceCount(); + } + + public override void OnHandled() + { + for (var i = _inputs.Length - 1; i >= 0; --i) + { + var input = _inputs[i]; + _rgbColors[i] = _rgbIDs.TryGetValue(input, out var value) ? new() + { + LedId = input, + R = (int)(value & 255), + G = (int)((value >> 8) & 255), + B = (int)(value >> 16) + } : new() + { + LedId = input + }; + } + for (var i = _rgbCount - 1; i >= 0; --i) + { + CorsairLightingSDK.SetLedsColorsBufferByDeviceIndex(i, _rgbColors); + } + CorsairLightingSDK.SetLedsColorsFlushBuffer(); + } + + public override Color GetMeterColor() => Colors.Yellow; + + public override void Dispose() + { + lock (RGBSystem.Instance.HandlingCSX) + { + if (IsHandling) + { + IsHandling = false; + CorsairLightingSDK.ReleaseControl(CorsairAccessMode.ExclusiveLightingControl); + } + } + } + + public override void Toggle() + { + Configure.Instance.K70 = !Configure.Instance.K70; + base.Toggle(); + } + } +} diff --git a/Qwilight/System/RGBSystem/LSSystem.cs b/Qwilight/System/RGBSystem/LSSystem.cs new file mode 100644 index 0000000..c8d6ffe --- /dev/null +++ b/Qwilight/System/RGBSystem/LSSystem.cs @@ -0,0 +1,198 @@ +using LedCSharp; +using Microsoft.UI; +using Qwilight.Utilities; +using System.IO; +using Windows.System; +using Windows.UI; + +namespace Qwilight +{ + public sealed class LSSystem : BaseRGBSystem + { + public static readonly LSSystem Instance = new(); + + static keyboardNames GetInput(VirtualKey rawInput) => rawInput switch + { + VirtualKey.Escape => keyboardNames.ESC, + VirtualKey.F1 => keyboardNames.F1, + VirtualKey.F2 => keyboardNames.F2, + VirtualKey.F3 => keyboardNames.F3, + VirtualKey.F4 => keyboardNames.F4, + VirtualKey.F5 => keyboardNames.F5, + VirtualKey.F6 => keyboardNames.F6, + VirtualKey.F7 => keyboardNames.F7, + VirtualKey.F8 => keyboardNames.F8, + VirtualKey.F9 => keyboardNames.F9, + VirtualKey.F10 => keyboardNames.F10, + VirtualKey.F11 => keyboardNames.F11, + VirtualKey.F12 => keyboardNames.F12, + VirtualKey.Insert => keyboardNames.INSERT, + VirtualKey.Delete => keyboardNames.KEYBOARD_DELETE, + (VirtualKey)192 => keyboardNames.TILDE, + VirtualKey.Number1 => keyboardNames.ONE, + VirtualKey.Number2 => keyboardNames.TWO, + VirtualKey.Number3 => keyboardNames.THREE, + VirtualKey.Number4 => keyboardNames.FOUR, + VirtualKey.Number5 => keyboardNames.FIVE, + VirtualKey.Number6 => keyboardNames.SIX, + VirtualKey.Number7 => keyboardNames.SEVEN, + VirtualKey.Number8 => keyboardNames.EIGHT, + VirtualKey.Number9 => keyboardNames.NINE, + VirtualKey.Number0 => keyboardNames.ZERO, + (VirtualKey)189 => keyboardNames.MINUS, + (VirtualKey)187 => keyboardNames.EQUALS, + VirtualKey.Back => keyboardNames.BACKSPACE, + VirtualKey.Tab => keyboardNames.TAB, + VirtualKey.Q => keyboardNames.Q, + VirtualKey.W => keyboardNames.W, + VirtualKey.E => keyboardNames.E, + VirtualKey.R => keyboardNames.R, + VirtualKey.T => keyboardNames.T, + VirtualKey.Y => keyboardNames.Y, + VirtualKey.U => keyboardNames.U, + VirtualKey.I => keyboardNames.I, + VirtualKey.O => keyboardNames.O, + VirtualKey.P => keyboardNames.P, + (VirtualKey)219 => keyboardNames.OPEN_BRACKET, + (VirtualKey)221 => keyboardNames.CLOSE_BRACKET, + (VirtualKey)220 => keyboardNames.BACKSLASH, + VirtualKey.CapitalLock => keyboardNames.CAPS_LOCK, + VirtualKey.A => keyboardNames.A, + VirtualKey.S => keyboardNames.S, + VirtualKey.D => keyboardNames.D, + VirtualKey.F => keyboardNames.F, + VirtualKey.G => keyboardNames.G, + VirtualKey.H => keyboardNames.H, + VirtualKey.J => keyboardNames.J, + VirtualKey.K => keyboardNames.K, + VirtualKey.L => keyboardNames.L, + (VirtualKey)186 => keyboardNames.SEMICOLON, + (VirtualKey)222 => keyboardNames.APOSTROPHE, + VirtualKey.Enter => keyboardNames.ENTER, + VirtualKey.LeftShift => keyboardNames.LEFT_SHIFT, + VirtualKey.Z => keyboardNames.Z, + VirtualKey.X => keyboardNames.X, + VirtualKey.C => keyboardNames.C, + VirtualKey.V => keyboardNames.V, + VirtualKey.B => keyboardNames.B, + VirtualKey.N => keyboardNames.N, + VirtualKey.M => keyboardNames.M, + (VirtualKey)188 => keyboardNames.COMMA, + (VirtualKey)190 => keyboardNames.PERIOD, + (VirtualKey)191 => keyboardNames.FORWARD_SLASH, + VirtualKey.RightShift => keyboardNames.RIGHT_SHIFT, + VirtualKey.LeftControl => keyboardNames.LEFT_CONTROL, + VirtualKey.LeftWindows => keyboardNames.LEFT_WINDOWS, + VirtualKey.LeftMenu => keyboardNames.LEFT_ALT, + VirtualKey.Space => keyboardNames.SPACE, + VirtualKey.RightMenu => keyboardNames.RIGHT_ALT, + VirtualKey.RightControl => keyboardNames.RIGHT_CONTROL, + VirtualKey.Left => keyboardNames.ARROW_LEFT, + VirtualKey.Up => keyboardNames.ARROW_UP, + VirtualKey.Down => keyboardNames.ARROW_DOWN, + VirtualKey.Right => keyboardNames.ARROW_RIGHT, + VirtualKey.NumberKeyLock => keyboardNames.NUM_LOCK, + VirtualKey.NumberPad0 => keyboardNames.NUM_ZERO, + VirtualKey.NumberPad1 => keyboardNames.NUM_ONE, + VirtualKey.NumberPad2 => keyboardNames.NUM_TWO, + VirtualKey.NumberPad3 => keyboardNames.NUM_THREE, + VirtualKey.NumberPad4 => keyboardNames.NUM_FOUR, + VirtualKey.NumberPad5 => keyboardNames.NUM_FIVE, + VirtualKey.NumberPad6 => keyboardNames.NUM_SIX, + VirtualKey.NumberPad7 => keyboardNames.NUM_SEVEN, + VirtualKey.NumberPad8 => keyboardNames.NUM_EIGHT, + VirtualKey.NumberPad9 => keyboardNames.NUM_NINE, + VirtualKey.Snapshot => keyboardNames.PRINT_SCREEN, + VirtualKey.Scroll => keyboardNames.SCROLL_LOCK, + VirtualKey.Pause => keyboardNames.PAUSE_BREAK, + VirtualKey.Home => keyboardNames.HOME, + VirtualKey.PageUp => keyboardNames.PAGE_UP, + VirtualKey.End => keyboardNames.END, + VirtualKey.PageDown => keyboardNames.PAGE_DOWN, + _ => default + }; + + readonly keyboardNames[] _inputs = (Enum.GetValues(typeof(keyboardNames)) as keyboardNames[]); + readonly Dictionary _rgbIDs = new(); + + LSSystem() + { + Utility.CopyFile(Path.Combine(QwilightComponent.CPUAssetsEntryPath, "LogitechLedEnginesWrapper.dll"), Path.Combine(AppContext.BaseDirectory, "LogitechLedEnginesWrapper.dll")); + } + + public override bool IsAvailable => Configure.Instance.LS; + + public override bool Init() + { + try + { + var isOK = LogitechGSDK.LogiLedInitWithName("Qwilight"); + if (isOK) + { + LogitechGSDK.LogiLedSetTargetDevice(LogitechGSDK.LOGI_DEVICETYPE_ALL); + } + return isOK; + } + catch + { + return false; + } + } + + public override void SetInputColor(VirtualKey rawInput, uint value) + { + var input = GetInput(rawInput); + if (input != default) + { + _rgbIDs[input] = value; + } + } + + public override void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) + { + } + + public override void SetEtcColor(uint value) + { + LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Headset, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); + LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Keyboard, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); + LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Mouse, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); + LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Mousemat, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); + LogitechGSDK.LogiLedSetLightingForTargetZone(DeviceType.Speaker, 0, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); + } + + public override void OnBeforeHandle() + { + _rgbIDs.Clear(); + } + + public override void OnHandled() + { + foreach (var input in _inputs) + { + var value = _rgbIDs.GetValueOrDefault(input); + LogitechGSDK.LogiLedSetLightingForKeyWithKeyName(input, (int)(100 * (value & 255) / 255), (int)(100 * ((value >> 8) & 255) / 255), (int)(100 * ((value >> 16) & 255) / 255)); + } + } + + public override Color GetMeterColor() => Colors.Cyan; + + public override void Dispose() + { + lock (RGBSystem.Instance.HandlingCSX) + { + if (IsHandling) + { + IsHandling = false; + LogitechGSDK.LogiLedShutdown(); + } + } + } + + public override void Toggle() + { + Configure.Instance.LS = !Configure.Instance.LS; + base.Toggle(); + } + } +} diff --git a/Qwilight/System/RGBSystem/RGBSystem.cs b/Qwilight/System/RGBSystem/RGBSystem.cs new file mode 100644 index 0000000..a704b91 --- /dev/null +++ b/Qwilight/System/RGBSystem/RGBSystem.cs @@ -0,0 +1,614 @@ +using Qwilight.Compute; +using Qwilight.Utilities; +using Qwilight.ViewModel; +using System.Diagnostics; +using System.IO; +using Windows.System; +using Windows.UI; + +namespace Qwilight +{ + public sealed class RGBSystem : IDisposable + { + public static readonly RGBSystem Instance = new(); + + static readonly string FaultEntryPath = Path.Combine(QwilightComponent.FaultEntryPath, nameof(RGBSystem)); + + readonly BaseRGBSystem[] _targetSystems = new BaseRGBSystem[] + { + BWSystem.Instance, AuraSystem.Instance, K70System.Instance, LSSystem.Instance + }; + + readonly object _availableCSX = new(); + + void Init() + { + foreach (var targetSystem in _targetSystems) + { + if (!targetSystem.IsHandling && targetSystem.IsAvailable) + { + targetSystem.IsHandling = targetSystem.Init(); + } + } + } + + void OnBeforeHandle() + { + foreach (var targetSystem in _targetSystems) + { + if (targetSystem.IsHandling) + { + targetSystem.OnBeforeHandle(); + } + } + } + + void SetInputColor(VirtualKey rawInput, uint value) + { + foreach (var targetSystem in _targetSystems) + { + if (targetSystem.IsHandling) + { + targetSystem.SetInputColor(rawInput, value); + } + } + } + + void SetStatusColors(double status, uint value0, uint value1, uint value2, uint value3) + { + foreach (var targetSystem in _targetSystems) + { + if (targetSystem.IsHandling) + { + targetSystem.SetStatusColors(status, value0, value1, value2, value3); + } + } + } + + void SetEtcColor(double failedValue, double meterValue) + { + foreach (var targetSystem in _targetSystems) + { + if (targetSystem.IsHandling) + { + if (failedValue > 0.0) + { + targetSystem.SetEtcColor(GetFailedColor(failedValue)); + } + else if (meterValue > 0.0) + { + targetSystem.SetEtcColor(GetValueColor(targetSystem.GetMeterColor(), meterValue)); + } + } + } + } + + void OnHandled() + { + foreach (var targetSystem in _targetSystems) + { + if (targetSystem.IsHandling) + { + targetSystem.OnHandled(); + } + } + } + + public object HandlingCSX { get; } = new(); + + public bool[] HasInputValues { get; } = new bool[53]; + + public double[] InputValues { get; } = new double[53]; + + public bool IsMeter { get; set; } + + public bool IsFailed { get; set; } + + bool IsAvailable => _targetSystems.Any(targetSystem => targetSystem.IsAvailable); + + public void HandleIfAvailable() + { + lock (_availableCSX) + { + if (IsAvailable) + { + Monitor.Pulse(_availableCSX); + } + } + } + + public void HandleSystem() + { + var voteViewModel = ViewModels.Instance.VoteValue; + var wwwLevelViewModel = ViewModels.Instance.WwwLevelValue; + var assistViewModel = ViewModels.Instance.AssistValue; + var mainViewModel = ViewModels.Instance.MainValue; + var inputViewModel = ViewModels.Instance.InputValue; + var toNotifyViewModel = ViewModels.Instance.NotifyValue; + var inputStandardViewModel = ViewModels.Instance.InputStandardValue; + var siteContainerViewModel = ViewModels.Instance.SiteContainerValue; + var valueConfigureViewModel = ViewModels.Instance.ConfigureValue; + var defaultStatusInputs = new[] { + VirtualKey.Number1, + VirtualKey.Number2, + VirtualKey.Number3, + VirtualKey.Number4, + VirtualKey.Number5, + VirtualKey.Number6, + VirtualKey.Number7, + VirtualKey.Number8, + VirtualKey.Number9, + VirtualKey.Number0, + }; + var defaultStatusInputsLength = defaultStatusInputs.Length; + var defaultStatusInputsUnit = 1.0 / defaultStatusInputsLength; + var mainHitPointsInputs = new[] { + VirtualKey.Number1, + VirtualKey.Number2, + VirtualKey.Number3, + VirtualKey.Number4, + VirtualKey.Number5, + }; + var mainHitPointsInputsLength = mainHitPointsInputs.Length; + var mainHitPointsInputsUnit = 1.0 / mainHitPointsInputsLength; + var mainStatusInputs = new[] { + VirtualKey.Number6, + VirtualKey.Number7, + VirtualKey.Number8, + VirtualKey.Number9, + VirtualKey.Number0, + }; + var mainStatusInputsLength = mainStatusInputs.Length; + var mainStatusInputsUnit = 1.0 / mainStatusInputsLength; + var audioVisualizerInputs = new VirtualKey[10][] { + new[] + { + VirtualKey.Z, + VirtualKey.A, + VirtualKey.Q, + }, + new[] + { + VirtualKey.X, + VirtualKey.S, + VirtualKey.W, + }, + new[] + { + VirtualKey.C, + VirtualKey.D, + VirtualKey.E, + }, + new[] + { + VirtualKey.V, + VirtualKey.F, + VirtualKey.R, + }, + new[] + { + VirtualKey.B, + VirtualKey.G, + VirtualKey.T, + }, + new[] + { + VirtualKey.N, + VirtualKey.H, + VirtualKey.Y, + }, + new[] + { + VirtualKey.M, + VirtualKey.J, + VirtualKey.U, + }, + new[] + { + (VirtualKey)188, + VirtualKey.K, + VirtualKey.I, + }, + new[] + { + (VirtualKey)190, + VirtualKey.L, + VirtualKey.O, + }, + new[] + { + (VirtualKey)191, + (VirtualKey)186, + VirtualKey.P, + } + }; + var audioVisualizerInputsLength = audioVisualizerInputs.Length; + + var audioMainVisualizerValues = new double[audioVisualizerInputsLength]; + var audioMainVisualizerFrames = new double[audioVisualizerInputsLength]; + var lastAudioVisualizerMainValues = new double[audioVisualizerInputsLength]; + var audioInputVisualizerValues = new double[audioVisualizerInputsLength]; + var audioInputVisualizerFrames = new double[audioVisualizerInputsLength]; + var lastAudioVisualizerInputValues = new double[audioVisualizerInputsLength]; + var audioVisualizerColors = new Color[audioVisualizerInputs.Length, 3, 2]; + + var meterValue = 0.0; + var failedValue = 0.0; + + var handlingColor = GetHandlingColor(1.0); + var inputStandardColor = GetInputStandardColor(1.0); + var defaultColor = GetDefaultColor(1.0); + var inputColor = GetInputColor(0.0); + + var loopingCounter = 0.0; + var loopingHandler = Stopwatch.StartNew(); + while (true) + { + try + { + lock (HandlingCSX) + { + Init(); + OnBeforeHandle(); + + SetInputColor(VirtualKey.F6, defaultColor); + SetInputColor(VirtualKey.F7, voteViewModel.IsOpened ? handlingColor : defaultColor); + SetInputColor(VirtualKey.F8, siteContainerViewModel.IsOpened ? handlingColor : defaultColor); + SetInputColor(VirtualKey.F10, wwwLevelViewModel.IsOpened ? handlingColor : defaultColor); + SetInputColor(VirtualKey.F11, toNotifyViewModel.IsOpened ? handlingColor : defaultColor); + if (!QwilightComponent.IsValve) + { + SetInputColor(VirtualKey.F12, defaultColor); + } + + var isInputStandardWindowOpened = inputStandardViewModel.IsOpened; + var isDefaultInputWindowOpened = inputViewModel.IsOpened && inputViewModel.ControllerModeValue == InputViewModel.ControllerMode.DefaultInput; + + var defaultComputer = mainViewModel.Computer; + switch (mainViewModel.ModeValue) + { + case MainViewModel.Mode.NoteFile: + PaintInputAudioVisualizer(); + + PaintEtc(); + + var autoComputer = mainViewModel.AutoComputer; + if (autoComputer != null) + { + PaintInputStatus(autoComputer); + PaintStatusStatus(autoComputer); + } + + SetInputColor(VirtualKey.Escape, defaultColor); + SetInputColor(VirtualKey.Enter, defaultColor); + SetInputColor(VirtualKey.Delete, defaultColor); + SetInputColor(VirtualKey.Left, defaultColor); + SetInputColor(VirtualKey.Right, defaultColor); + SetInputColor(VirtualKey.Up, defaultColor); + SetInputColor(VirtualKey.Down, defaultColor); + SetInputColor(VirtualKey.Space, defaultColor); + + SetInputColor(VirtualKey.F1, assistViewModel.IsOpened ? handlingColor : defaultColor); + SetInputColor(VirtualKey.F5, mainViewModel.IsDefaultEntryLoading ? handlingColor : defaultColor); + SetInputColor(VirtualKey.F9, mainViewModel.EntryItemValue?.NoteFile?.HasFavoriteEntryItem == true ? handlingColor : defaultColor); + break; + case MainViewModel.Mode.Computing: + PaintEtc(); + + var handlingHitPointsColor = defaultComputer.ModeComponentValue.HandlingHitPointsColor; + var hitPoints = defaultComputer.HitPoints.Value; + for (var i = mainHitPointsInputsLength - 1; i >= 0; --i) + { + var value = Math.Clamp((hitPoints - ((double)i / mainHitPointsInputsLength)) / mainHitPointsInputsUnit, 0, 1); + SetInputColor(mainHitPointsInputs[i], GetValueColor(handlingHitPointsColor, value)); + } + + SetStatusColors(hitPoints, handlingHitPointsColor.R, handlingHitPointsColor.G, handlingHitPointsColor.B, handlingHitPointsColor.A); + + var status = defaultComputer.Status; + for (var i = mainStatusInputsLength - 1; i >= 0; --i) + { + var value = Math.Clamp((status - (double)i / mainStatusInputsLength) / mainStatusInputsUnit, 0, 1); + SetInputColor(mainStatusInputs[i], GetStatusColor(value * meterValue)); + } + + SetInputColor(VirtualKey.Escape, defaultComputer.IsPausingWindowOpened ? handlingColor : defaultColor); + SetInputColor(VirtualKey.Enter, defaultComputer.IsPassable || defaultComputer.IsPausingWindowOpened ? defaultColor : handlingColor); + + if (defaultComputer.IsPausingWindowOpened) + { + SetInputColor(VirtualKey.Up, defaultColor); + SetInputColor(VirtualKey.Down, defaultColor); + SetInputColor(VirtualKey.Space, defaultColor); + } + + if (!isInputStandardWindowOpened) + { + for (var i = Configure.Instance.DefaultInputBundlesV6.StandardInputs.Length - 1; i >= 0; --i) + { + switch (i) + { + case InputStandardViewModel.ModifyAutoMode: + if (defaultComputer.CanModifyAutoMode) + { + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, defaultComputer.IsAutoMode ? inputStandardColor : handlingColor); + } + break; + case InputStandardViewModel.MediaMode: + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, Configure.Instance.LoadedMedia && Configure.Instance.Media ? inputStandardColor : handlingColor); + break; + case InputStandardViewModel.PostItem0: + case InputStandardViewModel.PostItem1: + if (defaultComputer.PostableItems[0] != null || defaultComputer.PostableItems[1] != null) + { + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, inputStandardColor); + } + break; + default: + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, inputStandardColor); + break; + } + } + } + + if (!isDefaultInputWindowOpened) + { + var inputs = Configure.Instance.DefaultInputBundlesV6.Inputs[(int)defaultComputer.InputMode]; + if (inputs != null) + { + for (var i = inputs.Length - 1; i > 0; --i) + { + foreach (var defaultInput in inputs[i]) + { + SetInputColor(defaultInput.Data, failedValue > 0.0 ? GetFailedColor(failedValue) : GetInputColor(InputValues[i])); + } + } + } + } + + for (var i = InputValues.Length - 1; i > 0; --i) + { + if (!HasInputValues[i]) + { + InputValues[i] = Math.Max(0.0, InputValues[i] - (60 / 1000.0)); + } + } + break; + case MainViewModel.Mode.Quit: + PaintInputAudioVisualizer(); + PaintEtc(); + + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.MediaMode].Data, Configure.Instance.Media ? inputStandardColor : handlingColor); + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.HandleUndo].Data, inputStandardColor); + + SetInputColor(VirtualKey.Escape, defaultColor); + SetInputColor(VirtualKey.Enter, defaultColor); + if (0 < defaultComputer.LevyingComputingPosition) + { + SetInputColor(VirtualKey.Left, defaultColor); + } + if (defaultComputer.LevyingComputingPosition < defaultComputer.HighestComputingPosition) + { + SetInputColor(VirtualKey.Right, defaultColor); + } + break; + } + + if (isInputStandardWindowOpened) + { + for (var i = Configure.Instance.DefaultInputBundlesV6.StandardInputs.Length - 1; i >= 0; --i) + { + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[i].Data, inputStandardColor); + } + } + else + { + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.LowerMultiplier].Data, inputStandardColor); + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.HigherMultiplier].Data, inputStandardColor); + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.LowerAudioMultiplier].Data, inputStandardColor); + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.HigherAudioMultiplier].Data, inputStandardColor); + SetInputColor(Configure.Instance.DefaultInputBundlesV6.StandardInputs[InputStandardViewModel.MediaMode].Data, Configure.Instance.Media ? inputStandardColor : handlingColor); + } + + if (isDefaultInputWindowOpened) + { + var inputControllerInputs = Configure.Instance.DefaultInputBundlesV6.Inputs[(int)inputViewModel.InputMode]; + if (inputControllerInputs != null) + { + foreach (var inputControllerInput in inputControllerInputs) + { + if (inputControllerInput != null) + { + foreach (var defaultInput in inputControllerInput) + { + SetInputColor(defaultInput.Data, inputColor); + } + } + } + } + } + + var modeComponent = mainViewModel.ModeComponentValue; + if (valueConfigureViewModel.IsOpened && valueConfigureViewModel.TabPosition == 0 && valueConfigureViewModel.TabPositionComputing == 0 && (mainViewModel.CanModifyModeComponent || modeComponent.CanModifyMultiplier || modeComponent.CanModifyAudioMultiplier)) + { + SetInputColor(VirtualKey.F1, defaultColor); + SetInputColor(VirtualKey.F2, defaultColor); + SetInputColor(VirtualKey.F3, defaultColor); + SetInputColor(VirtualKey.F4, defaultColor); + SetInputColor(VirtualKey.F5, defaultColor); + SetInputColor(VirtualKey.F6, defaultColor); + SetInputColor(VirtualKey.F7, defaultColor); + SetInputColor(VirtualKey.F8, defaultColor); + } + + if (IsMeter) + { + meterValue = 1.0; + IsMeter = false; + } + else + { + meterValue = Math.Max(0.0, meterValue - 60 / 1000.0); + } + + if (IsFailed) + { + failedValue = 1.0; + IsFailed = false; + } + else + { + failedValue = Math.Max(0.0, failedValue - 60 / QwilightComponent.StandardWaitMillis); + } + + OnHandled(); + } + + loopingCounter += 1000.0 / 60; + var toWait = loopingCounter - loopingHandler.GetMillis(); + if (toWait > 0.0) + { + Thread.Sleep(TimeSpan.FromMilliseconds(toWait)); + } + + lock (_availableCSX) + { + if (!IsAvailable) + { + Monitor.Wait(_availableCSX); + } + } + + void PaintEtc() + { + SetEtcColor(failedValue, meterValue); + } + + void PaintStatusStatus(DefaultCompute defaultComputer) + { + var statusColor = defaultComputer.IsHandling ? defaultComputer.IsPausing ? BaseUI.Instance.StatusPausedColor : BaseUI.Instance.StatusHandlingColor : BaseUI.Instance.StatusLoadingNoteFileColor; + var handlingMeterValue = defaultComputer.IsHandling && !defaultComputer.IsPausing ? meterValue : 1.0; + SetStatusColors(defaultComputer.Status, (uint)(statusColor.R * handlingMeterValue), (uint)(statusColor.G * handlingMeterValue), (uint)(statusColor.B * handlingMeterValue), (uint)(statusColor.A * handlingMeterValue)); + } + + void PaintInputStatus(DefaultCompute defaultComputer) + { + var statusColor = defaultComputer.IsHandling ? defaultComputer.IsPausing ? BaseUI.Instance.StatusPausedColor : BaseUI.Instance.StatusHandlingColor : BaseUI.Instance.StatusLoadingNoteFileColor; + var handlingMeterValue = defaultComputer.IsHandling && !defaultComputer.IsPausing ? meterValue : 1.0; + for (var i = defaultStatusInputsLength - 1; i >= 0; --i) + { + SetInputColor(defaultStatusInputs[i], GetValueColor(statusColor, handlingMeterValue * Math.Clamp((defaultComputer.Status - (double)i / defaultStatusInputsLength) / defaultStatusInputsUnit, 0, 1))); + } + } + + void PaintInputAudioVisualizer() + { + for (var i = audioVisualizerInputsLength - 1; i >= 0; --i) + { + var audioMainVisualizerValue = 0.0; + var audioInputVisualizerValue = 0.0; + for (var j = ((i + 1) * Configure.Instance.AudioVisualizerCount / audioVisualizerInputsLength) - 1; j >= i * Configure.Instance.AudioVisualizerCount / audioVisualizerInputsLength; --j) + { + audioMainVisualizerValue = Math.Max(audioMainVisualizerValue, AudioSystem.Instance.GetAudioVisualizerValue(AudioSystem.MainAudio, j)); + audioInputVisualizerValue = Math.Max(audioInputVisualizerValue, AudioSystem.Instance.GetAudioVisualizerValue(AudioSystem.InputAudio, j)); + } + audioMainVisualizerValues[i] = audioMainVisualizerValue; + audioInputVisualizerValues[i] = audioInputVisualizerValue; + + var distance = lastAudioVisualizerMainValues[i] - audioMainVisualizerValues[i]; + audioMainVisualizerFrames[i] = Math.Clamp(audioMainVisualizerFrames[i] + (distance == 0.0 ? 0.0 : distance > 0 ? -1 / 3.0 : 1 / 3.0), 0.0, 3.0); + distance = lastAudioVisualizerInputValues[i] - audioInputVisualizerValues[i]; + audioInputVisualizerFrames[i] = Math.Clamp(audioInputVisualizerFrames[i] + (distance == 0.0 ? 0.0 : distance > 0 ? -1 / 3.0 : 1 / 3.0), 0.0, 3.0); + } + + Array.Copy(audioMainVisualizerValues, lastAudioVisualizerMainValues, audioVisualizerInputsLength); + Array.Copy(audioInputVisualizerValues, lastAudioVisualizerInputValues, audioVisualizerInputsLength); + + Array.Clear(audioVisualizerColors, 0, audioVisualizerColors.Length); + var audioVisualizerMainColor = Configure.Instance.AudioVisualizerMainColor; + var audioVisualizerInputColor = Configure.Instance.AudioVisualizerInputColor; + for (var i = audioVisualizerInputsLength - 1; i >= 0; --i) + { + var value = audioMainVisualizerFrames[i]; + var valueInt = (int)value; + var remainder = value - valueInt; + if (remainder > 0.0) + { + audioVisualizerColors[i, valueInt, 0] = new() + { + R = (byte)(audioVisualizerMainColor.R * remainder), + G = (byte)(audioVisualizerMainColor.R * remainder), + B = (byte)(audioVisualizerMainColor.R * remainder), + }; + } + for (var j = valueInt - 1; j >= 0; --j) + { + audioVisualizerColors[i, j, 0] = audioVisualizerMainColor; + } + + value = audioInputVisualizerFrames[i]; + valueInt = (int)value; + remainder = value - valueInt; + if (remainder > 0.0) + { + audioVisualizerColors[i, valueInt, 1] = new() + { + R = (byte)(audioVisualizerInputColor.R * remainder), + G = (byte)(audioVisualizerInputColor.R * remainder), + B = (byte)(audioVisualizerInputColor.R * remainder), + }; + } + for (var j = valueInt - 1; j >= 0; --j) + { + audioVisualizerColors[i, j, 1] = audioVisualizerInputColor; + } + + for (var j = audioVisualizerColors.GetLength(0) - 1; j >= 0; --j) + { + for (var m = audioVisualizerColors.GetLength(1) - 1; m >= 0; --m) + { + SetInputColor(audioVisualizerInputs[j][m], GetValueColor(new() + { + A = (byte)((audioVisualizerColors[j, m, 0].A + audioVisualizerColors[j, m, 1].A) / 2), + R = (byte)((audioVisualizerColors[j, m, 0].R + audioVisualizerColors[j, m, 1].R) / 2), + G = (byte)((audioVisualizerColors[j, m, 0].G + audioVisualizerColors[j, m, 1].G) / 2), + B = (byte)((audioVisualizerColors[j, m, 0].B + audioVisualizerColors[j, m, 1].B) / 2) + }, 1.0)); + } + } + } + } + } + catch (ThreadInterruptedException) + { + } + catch (Exception e) + { + Utility.SaveFaultFile(FaultEntryPath, e); + } + } + } + + uint GetDefaultColor(double status) => Utility.GetColor((uint)(0 * status), (uint)(127 * status), (uint)(255 * status), 255); + + uint GetHandlingColor(double status) => Utility.GetColor((uint)(255 * status), (uint)(127 * status), (uint)(0 * status), 255); + + uint GetInputColor(double status) => Utility.GetColor((uint)(0 * status), (uint)(255 * (1.0 - status)), (uint)(255 * status), 255); + + uint GetInputStandardColor(double status) => Utility.GetColor((uint)(255 * status), (uint)(255 * status), (uint)(0 * status), 255); + + uint GetFailedColor(double status) => Utility.GetColor((uint)(255 * status), (uint)(0 * status), (uint)(0 * status), 255); + + uint GetStatusColor(double status) => Utility.GetColor((uint)(0 * status), (uint)(255 * status), (uint)(255 * status), 255); + + uint GetValueColor(Color value, double status) => Utility.GetColor((uint)(value.R * status), (uint)(value.G * status), (uint)(value.B * status), 255); + + public void Dispose() + { + foreach (var targetSystem in _targetSystems) + { + targetSystem.Dispose(); + } + } + } +} diff --git a/Qwilight/ViewModel/MainViewModel.cs b/Qwilight/ViewModel/MainViewModel.cs index e6610ca..00545a3 100644 --- a/Qwilight/ViewModel/MainViewModel.cs +++ b/Qwilight/ViewModel/MainViewModel.cs @@ -670,7 +670,7 @@ _isLoaded = true; Utility.HandleParallelly(TVSystem.Instance.HandleSystem, false); - Utility.HandleParallelly(IlluminationSystem.Instance.HandleSystem, false); + Utility.HandleParallelly(RGBSystem.Instance.HandleSystem, false); DefaultControllerSystem.Instance.HandleSystem(); Utility.HandleParallelly(DrawingSystem.Instance.HandleSystem); Utility.HandleParallelly(TwilightSystem.Instance.HandleSystem, false); @@ -1627,7 +1627,7 @@ AudioSystem.Instance.Dispose(); AudioInputSystem.Instance.Dispose(); TwilightSystem.Instance.Dispose(); - IlluminationSystem.Instance.Dispose(); + RGBSystem.Instance.Dispose(); ValveSystem.Instance.Dispose(); Utility.ModifyHwMode(QwilightComponent.DefaultHwMode);