Newer
Older
Qwilight / Qwilight / System / IlluminationSystem / AuraSystem.cs
@Taehui Taehui on 14 Nov 9 KB 2023-11-15 오전 12:09
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 readonly Dictionary<ushort, VirtualKey> _inputMap = new();

        static AuraSystem()
        {
            _inputMap[1] = VirtualKey.Escape;
            _inputMap[2] = VirtualKey.Number1;
            _inputMap[3] = VirtualKey.Number2;
            _inputMap[4] = VirtualKey.Number3;
            _inputMap[5] = VirtualKey.Number4;
            _inputMap[6] = VirtualKey.Number5;
            _inputMap[7] = VirtualKey.Number6;
            _inputMap[8] = VirtualKey.Number7;
            _inputMap[9] = VirtualKey.Number8;
            _inputMap[10] = VirtualKey.Number9;
            _inputMap[11] = VirtualKey.Number0;
            _inputMap[12] = (VirtualKey)189;
            _inputMap[13] = (VirtualKey)187;
            _inputMap[14] = VirtualKey.Back;
            _inputMap[15] = VirtualKey.Tab;
            _inputMap[16] = VirtualKey.Q;
            _inputMap[17] = VirtualKey.W;
            _inputMap[18] = VirtualKey.E;
            _inputMap[19] = VirtualKey.R;
            _inputMap[20] = VirtualKey.T;
            _inputMap[21] = VirtualKey.Y;
            _inputMap[22] = VirtualKey.U;
            _inputMap[23] = VirtualKey.I;
            _inputMap[24] = VirtualKey.O;
            _inputMap[25] = VirtualKey.P;
            _inputMap[26] = (VirtualKey)219;
            _inputMap[27] = (VirtualKey)221;
            _inputMap[28] = VirtualKey.Enter;
            _inputMap[29] = VirtualKey.LeftControl;
            _inputMap[30] = VirtualKey.A;
            _inputMap[31] = VirtualKey.S;
            _inputMap[32] = VirtualKey.D;
            _inputMap[33] = VirtualKey.F;
            _inputMap[34] = VirtualKey.G;
            _inputMap[35] = VirtualKey.H;
            _inputMap[36] = VirtualKey.J;
            _inputMap[37] = VirtualKey.K;
            _inputMap[38] = VirtualKey.L;
            _inputMap[39] = (VirtualKey)186;
            _inputMap[40] = (VirtualKey)222;
            _inputMap[41] = (VirtualKey)192;
            _inputMap[42] = VirtualKey.LeftShift;
            _inputMap[43] = (VirtualKey)220;
            _inputMap[44] = VirtualKey.Z;
            _inputMap[45] = VirtualKey.X;
            _inputMap[46] = VirtualKey.C;
            _inputMap[47] = VirtualKey.V;
            _inputMap[48] = VirtualKey.B;
            _inputMap[49] = VirtualKey.N;
            _inputMap[50] = VirtualKey.M;
            _inputMap[51] = (VirtualKey)188;
            _inputMap[52] = (VirtualKey)190;
            _inputMap[53] = (VirtualKey)191;
            _inputMap[54] = VirtualKey.RightShift;
            _inputMap[55] = VirtualKey.Multiply;

            _inputMap[57] = VirtualKey.Space;
            _inputMap[58] = VirtualKey.CapitalLock;
            _inputMap[59] = VirtualKey.F1;
            _inputMap[60] = VirtualKey.F2;
            _inputMap[61] = VirtualKey.F3;
            _inputMap[62] = VirtualKey.F4;
            _inputMap[63] = VirtualKey.F5;
            _inputMap[64] = VirtualKey.F6;
            _inputMap[65] = VirtualKey.F7;
            _inputMap[66] = VirtualKey.F8;
            _inputMap[67] = VirtualKey.F9;
            _inputMap[68] = VirtualKey.F10;
            _inputMap[69] = VirtualKey.NumberKeyLock;
            _inputMap[70] = VirtualKey.Scroll;
            _inputMap[71] = VirtualKey.NumberPad7;
            _inputMap[72] = VirtualKey.NumberPad8;
            _inputMap[73] = VirtualKey.NumberPad9;

            _inputMap[75] = VirtualKey.NumberPad4;
            _inputMap[76] = VirtualKey.NumberPad5;
            _inputMap[77] = VirtualKey.NumberPad6;

            _inputMap[79] = VirtualKey.NumberPad1;
            _inputMap[80] = VirtualKey.NumberPad2;
            _inputMap[81] = VirtualKey.NumberPad3;
            _inputMap[82] = VirtualKey.NumberPad0;

            _inputMap[87] = VirtualKey.F11;
            _inputMap[88] = VirtualKey.F12;

            _inputMap[157] = VirtualKey.RightControl;

            _inputMap[197] = VirtualKey.Pause;
            _inputMap[199] = VirtualKey.Home;
            _inputMap[200] = VirtualKey.Up;
            _inputMap[201] = VirtualKey.PageUp;
            _inputMap[203] = VirtualKey.Left;
            _inputMap[205] = VirtualKey.Right;
            _inputMap[207] = VirtualKey.End;
            _inputMap[208] = VirtualKey.Down;
            _inputMap[209] = VirtualKey.PageDown;
            _inputMap[210] = VirtualKey.Insert;
            _inputMap[211] = VirtualKey.Delete;
            _inputMap[219] = VirtualKey.LeftWindows;
            _inputMap[221] = VirtualKey.Application;
        }

        readonly Dictionary<int, List<IAuraRgbLight>> _statusItems = new();
        readonly Dictionary<VirtualKey, List<IAuraRgbLight>> _inputItems = new();
        readonly List<IAuraRgbLight> _etcItems = new();
        readonly List<IAuraRgbLight> _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)
                            {
                                if (_inputMap.TryGetValue(ledItem.Code, out var input))
                                {
                                    Utility.Into(_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.Into(_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();
        }
    }
}