diff --git a/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkRGBDevice.cs b/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkRGBDevice.cs index 79165d3..d4e614e 100644 --- a/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkRGBDevice.cs +++ b/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkRGBDevice.cs @@ -6,11 +6,11 @@ using RGB.NET.Devices.Razer.Native; namespace RGB.NET.Devices.Razer { - /// + /// /// /// Represents a razer chroma link. /// - public class RazerChromaLinkRGBDevice : RazerRGBDevice, ILedStripe + public class RazerChromaLinkRGBDevice : RazerRGBDevice, IUnknownDevice { #region Constructors @@ -19,7 +19,7 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The specific information provided by CUE for the chroma link. - internal RazerChromaLinkRGBDevice(RazerChromaLinkRGBDeviceInfo info) + internal RazerChromaLinkRGBDevice(RazerRGBDeviceInfo info) : base(info) { } @@ -38,7 +38,7 @@ namespace RGB.NET.Devices.Razer protected override object? GetLedCustomData(LedId ledId) => (int)ledId - (int)LedId.Custom1; /// - protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerChromaLinkUpdateQueue(updateTrigger, DeviceInfo.DeviceId); + protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerChromaLinkUpdateQueue(updateTrigger); #endregion } diff --git a/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkRGBDeviceInfo.cs b/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkRGBDeviceInfo.cs deleted file mode 100644 index fb9c3c4..0000000 --- a/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkRGBDeviceInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Razer -{ - /// - /// - /// Represents a generic information for a . - /// - public class RazerChromaLinkRGBDeviceInfo : RazerRGBDeviceInfo - { - #region Constructors - - /// - /// - /// Internal constructor of managed . - /// - /// The Id of the . - /// The model of the . - internal RazerChromaLinkRGBDeviceInfo(Guid deviceId, string model) - : base(deviceId, RGBDeviceType.LedStripe, model) - { } - - #endregion - } -} diff --git a/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkUpdateQueue.cs b/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkUpdateQueue.cs index 7455aa4..513109f 100644 --- a/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkUpdateQueue.cs +++ b/RGB.NET.Devices.Razer/ChromaLink/RazerChromaLinkUpdateQueue.cs @@ -17,9 +17,8 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The update trigger used to update this queue. - /// The id of the device updated by this queue. - public RazerChromaLinkUpdateQueue(IDeviceUpdateTrigger updateTrigger, Guid deviceId) - : base(updateTrigger, deviceId) + public RazerChromaLinkUpdateQueue(IDeviceUpdateTrigger updateTrigger) + : base(updateTrigger) { } #endregion diff --git a/RGB.NET.Devices.Razer/Generic/RazerRGBDevice.cs b/RGB.NET.Devices.Razer/Generic/RazerRGBDevice.cs index afab079..d254260 100644 --- a/RGB.NET.Devices.Razer/Generic/RazerRGBDevice.cs +++ b/RGB.NET.Devices.Razer/Generic/RazerRGBDevice.cs @@ -4,13 +4,12 @@ using RGB.NET.Core; namespace RGB.NET.Devices.Razer { - /// + /// /// /// /// Represents a generic razer-device. (keyboard, mouse, headset, mousepad). /// - public abstract class RazerRGBDevice : AbstractRGBDevice, IRazerRGBDevice - where TDeviceInfo : RazerRGBDeviceInfo + public abstract class RazerRGBDevice : AbstractRGBDevice, IRazerRGBDevice { #region Properties & Fields @@ -18,7 +17,7 @@ namespace RGB.NET.Devices.Razer /// /// Gets information about the . /// - public override TDeviceInfo DeviceInfo { get; } + public override RazerRGBDeviceInfo DeviceInfo { get; } /// /// Gets or sets the update queue performing updates for this device. @@ -31,10 +30,10 @@ namespace RGB.NET.Devices.Razer #region Constructors /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The generic information provided by razer for the device. - protected RazerRGBDevice(TDeviceInfo info) + protected RazerRGBDevice(RazerRGBDeviceInfo info) { this.DeviceInfo = info; diff --git a/RGB.NET.Devices.Razer/Generic/RazerRGBDeviceInfo.cs b/RGB.NET.Devices.Razer/Generic/RazerRGBDeviceInfo.cs index 8281158..1487bad 100644 --- a/RGB.NET.Devices.Razer/Generic/RazerRGBDeviceInfo.cs +++ b/RGB.NET.Devices.Razer/Generic/RazerRGBDeviceInfo.cs @@ -11,11 +11,6 @@ namespace RGB.NET.Devices.Razer { #region Properties & Fields - /// - /// Gets the Id of the . - /// - public Guid DeviceId { get; } - /// public RGBDeviceType DeviceType { get; } @@ -38,12 +33,10 @@ namespace RGB.NET.Devices.Razer /// /// Internal constructor of managed . /// - /// The Id of the . /// The type of the . /// The model of the . - internal RazerRGBDeviceInfo(Guid deviceId, RGBDeviceType deviceType, string model) + internal RazerRGBDeviceInfo(RGBDeviceType deviceType, string model) { - this.DeviceId = deviceId; this.DeviceType = deviceType; this.Model = model; diff --git a/RGB.NET.Devices.Razer/Generic/RazerUpdateQueue.cs b/RGB.NET.Devices.Razer/Generic/RazerUpdateQueue.cs index de99795..2727bb9 100644 --- a/RGB.NET.Devices.Razer/Generic/RazerUpdateQueue.cs +++ b/RGB.NET.Devices.Razer/Generic/RazerUpdateQueue.cs @@ -11,8 +11,7 @@ namespace RGB.NET.Devices.Razer public abstract class RazerUpdateQueue : UpdateQueue { #region Properties & Fields - - private readonly Guid _deviceId; + private Guid? _lastEffect; #endregion @@ -23,11 +22,9 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The update trigger used to update this queue. - /// The id of the device updated by this queue. - protected RazerUpdateQueue(IDeviceUpdateTrigger updateTrigger, Guid deviceId) + protected RazerUpdateQueue(IDeviceUpdateTrigger updateTrigger) : base(updateTrigger) { - this._deviceId = deviceId; } #endregion @@ -54,7 +51,7 @@ namespace RGB.NET.Devices.Razer /// /// The parameters of the effect. /// The id this effect is created with. - protected virtual void CreateEffect(IntPtr effectParams, ref Guid effectId) => _RazerSDK.CreateEffect(_deviceId, _Defines.EFFECT_ID, effectParams, ref effectId); + protected abstract void CreateEffect(IntPtr effectParams, ref Guid effectId); /// public override void Reset() diff --git a/RGB.NET.Devices.Razer/HID/DeviceChecker.cs b/RGB.NET.Devices.Razer/HID/DeviceChecker.cs new file mode 100644 index 0000000..d644204 --- /dev/null +++ b/RGB.NET.Devices.Razer/HID/DeviceChecker.cs @@ -0,0 +1,184 @@ +using System.Collections.Generic; +using System.Linq; +using HidSharp; +using RGB.NET.Core; +using DeviceDataList = System.Collections.Generic.List<(string model, RGB.NET.Core.RGBDeviceType deviceType, int id)>; + +namespace RGB.NET.Devices.Razer.HID +{ + internal static class DeviceChecker + { + #region Constants + + private const int VENDOR_ID = 0x1532; + + private static readonly DeviceDataList DEVICES + = new() + { + // Keyboards + ("BlackWidow Ultimate 2012", RGBDeviceType.Keyboard, 0x010D), + ("BlackWidow Classic (Alternate)", RGBDeviceType.Keyboard, 0x010E), + ("Anansi", RGBDeviceType.Keyboard, 0x010F), + ("BlackWidow Ultimate 2013", RGBDeviceType.Keyboard, 0x011A), + ("BlackWidow Stealth", RGBDeviceType.Keyboard, 0x011B), + ("DeathStalker Expert", RGBDeviceType.Keyboard, 0x0202), + ("BlackWidow Chroma", RGBDeviceType.Keyboard, 0x0203), + ("DeathStalker Chroma", RGBDeviceType.Keyboard, 0x0204), + ("Blade Stealth", RGBDeviceType.Keyboard, 0x0205), + ("BlackWidow Tournament Edition Chroma", RGBDeviceType.Keyboard, 0x0209), + ("Blade QHD", RGBDeviceType.Keyboard, 0x020F), + ("Blade Pro (Late 2016)", RGBDeviceType.Keyboard, 0x0210), + ("BlackWidow Chroma (Overwatch)", RGBDeviceType.Keyboard, 0x0211), + ("BlackWidow Ultimate 2016", RGBDeviceType.Keyboard, 0x0214), + ("BlackWidow X Chroma", RGBDeviceType.Keyboard, 0x0216), + ("BlackWidow X Ultimate", RGBDeviceType.Keyboard, 0x0217), + ("BlackWidow X Tournament Edition Chroma", RGBDeviceType.Keyboard, 0x021A), + ("Ornata Chroma", RGBDeviceType.Keyboard, 0x021E), + ("Ornata", RGBDeviceType.Keyboard, 0x021F), + ("Blade Stealth (Late 2016)", RGBDeviceType.Keyboard, 0x0220), + ("BlackWidow Chroma V2", RGBDeviceType.Keyboard, 0x0221), + ("Blade (Late 2016)", RGBDeviceType.Keyboard, 0x0224), + ("Blade Pro (2017)", RGBDeviceType.Keyboard, 0x0225), + ("Huntsman Elite", RGBDeviceType.Keyboard, 0x0226), + ("Huntsman", RGBDeviceType.Keyboard, 0x0227), + ("BlackWidow Elite", RGBDeviceType.Keyboard, 0x0228), + ("Cynosa Chroma", RGBDeviceType.Keyboard, 0x022A), + ("Blade Stealth (Mid 2017)", RGBDeviceType.Keyboard, 0x022D), + ("Blade Pro FullHD (2017)", RGBDeviceType.Keyboard, 0x022F), + ("Blade Stealth (Late 2017)", RGBDeviceType.Keyboard, 0x0232), + ("Blade 15 (2018)", RGBDeviceType.Keyboard, 0x0233), + ("Blade Pro 17 (2019)", RGBDeviceType.Keyboard, 0x0234), + ("BlackWidow Lite (2018)", RGBDeviceType.Keyboard, 0x0235), + ("BlackWidow Essential", RGBDeviceType.Keyboard, 0x0237), + ("Blade Stealth (2019)", RGBDeviceType.Keyboard, 0x0239), + ("Blade 15 (2019) Advanced", RGBDeviceType.Keyboard, 0x023A), + ("Blade 15 (2018) Base Model", RGBDeviceType.Keyboard, 0x023B), + ("Cynosa Lite", RGBDeviceType.Keyboard, 0x023F), + ("Blade 15 (2018) Mercury", RGBDeviceType.Keyboard, 0x0240), + ("BlackWidow (2019)", RGBDeviceType.Keyboard, 0x0241), + ("Huntsman Tournament Edition", RGBDeviceType.Keyboard, 0x0243), + ("Blade 15 (Mid 2019) Mercury", RGBDeviceType.Keyboard, 0x0245), + ("Blade 15 (Mid 2019) Base", RGBDeviceType.Keyboard, 0x0246), + ("Blade Stealth (Late 2019)", RGBDeviceType.Keyboard, 0x024A), + ("Blade Pro (Late 2019)", RGBDeviceType.Keyboard, 0x024C), + ("Blade 15 Studio Edition (2019)", RGBDeviceType.Keyboard, 0x024D), + ("Blade Stealth (Early 2020)", RGBDeviceType.Keyboard, 0x0252), + ("Blade 15 Advanced (2020)", RGBDeviceType.Keyboard, 0x0253), + ("Blade 15 (Early 2020) Base", RGBDeviceType.Keyboard, 0x0255), + ("Blade Stealth (Late 2020)", RGBDeviceType.Keyboard, 0x0259), + ("Ornata Chroma V2", RGBDeviceType.Keyboard, 0x025D), + ("Cynosa V2", RGBDeviceType.Keyboard, 0x025E), + + // Mice + ("Orochi 2011", RGBDeviceType.Mouse, 0x0013), + ("DeathAdder 3.5G", RGBDeviceType.Mouse, 0x0016), + ("Abyssus 1800", RGBDeviceType.Mouse, 0x0020), + ("Mamba 2012 (Wired)", RGBDeviceType.Mouse, 0x0024), + ("Mamba 2012 (Wireless)", RGBDeviceType.Mouse, 0x0025), + ("Naga 2012", RGBDeviceType.Mouse, 0x002E), + ("Imperator 2012", RGBDeviceType.Mouse, 0x002F), + ("Ouroboros 2012", RGBDeviceType.Mouse, 0x0032), + ("Taipan", RGBDeviceType.Mouse, 0x0034), + ("Naga Hex (Red)", RGBDeviceType.Mouse, 0x0036), + ("DeathAdder 2013", RGBDeviceType.Mouse, 0x0037), + ("DeathAdder 1800", RGBDeviceType.Mouse, 0x0038), + ("Orochi 2013", RGBDeviceType.Mouse, 0x0039), + ("Naga 2014", RGBDeviceType.Mouse, 0x0040), + ("Naga Hex", RGBDeviceType.Mouse, 0x0041), + ("Abyssus 2014", RGBDeviceType.Mouse, 0x0042), + ("DeathAdder Chroma", RGBDeviceType.Mouse, 0x0043), + ("Mamba (Wired)", RGBDeviceType.Mouse, 0x0044), + ("Mamba (Wireless)", RGBDeviceType.Mouse, 0x0045), + ("Mamba Tournament Edition", RGBDeviceType.Mouse, 0x0046), + ("Orochi (Wired)", RGBDeviceType.Mouse, 0x0048), + ("Diamondback Chroma", RGBDeviceType.Mouse, 0x004C), + ("DeathAdder 2000", RGBDeviceType.Mouse, 0x004F), + ("Naga Hex V2", RGBDeviceType.Mouse, 0x0050), + ("Naga Chroma", RGBDeviceType.Mouse, 0x0053), + ("DeathAdder 3500", RGBDeviceType.Mouse, 0x0054), + ("Lancehead (Wired)", RGBDeviceType.Mouse, 0x0059), + ("Lancehead (Wireless)", RGBDeviceType.Mouse, 0x005A), + ("Abyssus V2", RGBDeviceType.Mouse, 0x005B), + ("DeathAdder Elite", RGBDeviceType.Mouse, 0x005C), + ("Abyssus 2000", RGBDeviceType.Mouse, 0x005E), + ("Lancehead Tournament Edition", RGBDeviceType.Mouse, 0x0060), + ("Atheris (Receiver)", RGBDeviceType.Mouse, 0x0062), + ("Basilisk", RGBDeviceType.Mouse, 0x0064), + ("Naga Trinity", RGBDeviceType.Mouse, 0x0067), + ("Abyssus Elite (D.Va Edition)", RGBDeviceType.Mouse, 0x006A), + ("Abyssus Essential", RGBDeviceType.Mouse, 0x006B), + ("Mamba Elite (Wired)", RGBDeviceType.Mouse, 0x006C), + ("DeathAdder Essential", RGBDeviceType.Mouse, 0x006E), + ("Lancehead Wireless (Receiver)", RGBDeviceType.Mouse, 0x006F), + ("Lancehead Wireless (Wired)", RGBDeviceType.Mouse, 0x0070), + ("DeathAdder Essential (White Edition)", RGBDeviceType.Mouse, 0x0071), + ("Mamba Wireless (Receiver)", RGBDeviceType.Mouse, 0x0072), + ("Mamba Wireless (Wired)", RGBDeviceType.Mouse, 0x0073), + ("Viper", RGBDeviceType.Mouse, 0x0078), + ("Viper Ultimate (Wired)", RGBDeviceType.Mouse, 0x007A), + ("Viper Ultimate (Wireless)", RGBDeviceType.Mouse, 0x007B), + ("DeathAdder V2 Pro (Wired)", RGBDeviceType.Mouse, 0x007C), + ("DeathAdder V2 Pro (Wireless)", RGBDeviceType.Mouse, 0x007D), + ("Basilisk X HyperSpeed", RGBDeviceType.Mouse, 0x0083), + ("Basilisk Ultimate", RGBDeviceType.Mouse, 0x0088), + ("DeathAdder V2", RGBDeviceType.Mouse, 0x0084), + ("Viper Mini", RGBDeviceType.Mouse, 0x008A), + + // Mousepads + ("Firefly Hyperflux", RGBDeviceType.Mousepad, 0x0068), + ("Firefly", RGBDeviceType.Mousepad, 0x0C00), + ("Goliathus", RGBDeviceType.Mousepad, 0x0C01), + ("Goliathus Extended", RGBDeviceType.Mousepad, 0x0C02), + ("Firefly v2", RGBDeviceType.Mousepad, 0x0C04), + + // Headsets + ("Kraken 7.1", RGBDeviceType.Headset, 0x0501), + ("Kraken 7.1 Chroma", RGBDeviceType.Headset, 0x0504), + ("Kraken 7.1", RGBDeviceType.Headset, 0x0506), + ("Kraken 7.1 V2", RGBDeviceType.Headset, 0x0510), + ("Kraken Ultimate", RGBDeviceType.Headset, 0x0527), + ("Kraken Kitty Edition", RGBDeviceType.Headset, 0x0F19), + + // Keypads + ("Nostromo", RGBDeviceType.Keypad, 0x0111), + ("Orbweaver", RGBDeviceType.Keypad, 0x0113), + ("Tartarus", RGBDeviceType.Keypad, 0x0201), + ("Orbweaver Chroma", RGBDeviceType.Keypad, 0x0207), + ("Tartarus Chroma", RGBDeviceType.Keypad, 0x0208), + ("Tartarus V2", RGBDeviceType.Keypad, 0x022B), + ("Tartarus Pro", RGBDeviceType.Keypad, 0x0244), + + // Misc - unsupported through the effects API + // ("Core", RGBDeviceType.GraphicsCard, 0x0215), + // ("Base Station Chroma", RGBDeviceType.HeadsetStand, 0x0F08), + // ("Nommo Chroma", RGBDeviceType.Unknown, 0x0517), + // ("Nommo Pro", RGBDeviceType.Unknown, 0x0518), + // ("Chroma Mug Holder", RGBDeviceType.Unknown, 0x0F07), + // ("Chroma Hardware Development Kit (HDK)", RGBDeviceType.Unknown, 0x0F09), + // ("Mouse Bungee V3 Chroma", RGBDeviceType.Unknown, 0x0F1D), + // ("Base Station V2 Chroma", RGBDeviceType.Unknown, 0x0F20) + }; + + #endregion + + #region Properties & Fields + + public static DeviceDataList ConnectedDevices { get; } = new(); + + #endregion + + #region Methods + + internal static void LoadDeviceList(RGBDeviceType loadFilter) + { + ConnectedDevices.Clear(); + + HashSet ids = new(DeviceList.Local.GetHidDevices(VENDOR_ID).Select(x => x.ProductID).Distinct()); + DeviceDataList connectedDevices = DEVICES.Where(d => ids.Contains(d.id) && loadFilter.HasFlag(d.deviceType)).ToList(); + + ConnectedDevices.AddRange(connectedDevices); + } + + #endregion + } +} diff --git a/RGB.NET.Devices.Razer/Headset/RazerHeadsetRGBDevice.cs b/RGB.NET.Devices.Razer/Headset/RazerHeadsetRGBDevice.cs index 27ebbb0..895d4c9 100644 --- a/RGB.NET.Devices.Razer/Headset/RazerHeadsetRGBDevice.cs +++ b/RGB.NET.Devices.Razer/Headset/RazerHeadsetRGBDevice.cs @@ -6,11 +6,11 @@ using RGB.NET.Devices.Razer.Native; namespace RGB.NET.Devices.Razer { - /// + /// /// /// Represents a razer headset. /// - public class RazerHeadsetRGBDevice : RazerRGBDevice, IHeadset + public class RazerHeadsetRGBDevice : RazerRGBDevice, IHeadset { #region Constructors @@ -19,7 +19,7 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The specific information provided by CUE for the headset. - internal RazerHeadsetRGBDevice(RazerHeadsetRGBDeviceInfo info) + internal RazerHeadsetRGBDevice(RazerRGBDeviceInfo info) : base(info) { } @@ -38,7 +38,7 @@ namespace RGB.NET.Devices.Razer protected override object? GetLedCustomData(LedId ledId) => (int)ledId - (int)LedId.Headset1; /// - protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerHeadsetUpdateQueue(updateTrigger, DeviceInfo.DeviceId); + protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerHeadsetUpdateQueue(updateTrigger); #endregion } diff --git a/RGB.NET.Devices.Razer/Headset/RazerHeadsetRGBDeviceInfo.cs b/RGB.NET.Devices.Razer/Headset/RazerHeadsetRGBDeviceInfo.cs deleted file mode 100644 index bbe77fe..0000000 --- a/RGB.NET.Devices.Razer/Headset/RazerHeadsetRGBDeviceInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Razer -{ - /// - /// - /// Represents a generic information for a . - /// - public class RazerHeadsetRGBDeviceInfo : RazerRGBDeviceInfo - { - #region Constructors - - /// - /// - /// Internal constructor of managed . - /// - /// The Id of the . - /// The model of the . - internal RazerHeadsetRGBDeviceInfo(Guid deviceId, string model) - : base(deviceId, RGBDeviceType.Headset, model) - { } - - #endregion - } -} diff --git a/RGB.NET.Devices.Razer/Headset/RazerHeadsetUpdateQueue.cs b/RGB.NET.Devices.Razer/Headset/RazerHeadsetUpdateQueue.cs index 7e5d9b7..1241487 100644 --- a/RGB.NET.Devices.Razer/Headset/RazerHeadsetUpdateQueue.cs +++ b/RGB.NET.Devices.Razer/Headset/RazerHeadsetUpdateQueue.cs @@ -17,9 +17,8 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The update trigger used to update this queue. - /// The id of the device updated by this queue. - public RazerHeadsetUpdateQueue(IDeviceUpdateTrigger updateTrigger, Guid deviceId) - : base(updateTrigger, deviceId) + public RazerHeadsetUpdateQueue(IDeviceUpdateTrigger updateTrigger) + : base(updateTrigger) { } #endregion diff --git a/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardRGBDevice.cs b/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardRGBDevice.cs index f55ea9a..c21886d 100644 --- a/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardRGBDevice.cs @@ -6,15 +6,15 @@ using RGB.NET.Devices.Razer.Native; namespace RGB.NET.Devices.Razer { - /// + /// /// /// Represents a razer keyboard. /// - public class RazerKeyboardRGBDevice : RazerRGBDevice, IKeyboard + public class RazerKeyboardRGBDevice : RazerRGBDevice, IKeyboard { #region Properties & Fields - IKeyboardDeviceInfo IKeyboard.DeviceInfo => DeviceInfo; + IKeyboardDeviceInfo IKeyboard.DeviceInfo => (IKeyboardDeviceInfo) DeviceInfo; #endregion @@ -45,7 +45,7 @@ namespace RGB.NET.Devices.Razer protected override object? GetLedCustomData(LedId ledId) => (int)ledId - (int)LedId.Keyboard_Escape; /// - protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerKeyboardUpdateQueue(updateTrigger, DeviceInfo.DeviceId); + protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerKeyboardUpdateQueue(updateTrigger); #endregion } diff --git a/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardRGBDeviceInfo.cs b/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardRGBDeviceInfo.cs index f37a6a4..e9c750d 100644 --- a/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardRGBDeviceInfo.cs +++ b/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardRGBDeviceInfo.cs @@ -1,7 +1,6 @@ // ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedMember.Global -using System; using RGB.NET.Core; namespace RGB.NET.Devices.Razer @@ -24,10 +23,9 @@ namespace RGB.NET.Devices.Razer /// /// Internal constructor of managed . /// - /// The Id of the . /// The model of the . - internal RazerKeyboardRGBDeviceInfo(Guid deviceId, string model) - : base(deviceId, RGBDeviceType.Keyboard, model) + internal RazerKeyboardRGBDeviceInfo(string model) + : base(RGBDeviceType.Keyboard, model) { } #endregion diff --git a/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardUpdateQueue.cs b/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardUpdateQueue.cs index e87a987..73abef0 100644 --- a/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardUpdateQueue.cs +++ b/RGB.NET.Devices.Razer/Keyboard/RazerKeyboardUpdateQueue.cs @@ -17,9 +17,8 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The update trigger used to update this queue. - /// The id of the device updated by this queue. - public RazerKeyboardUpdateQueue(IDeviceUpdateTrigger updateTrigger, Guid deviceId) - : base(updateTrigger, deviceId) + public RazerKeyboardUpdateQueue(IDeviceUpdateTrigger updateTrigger) + : base(updateTrigger) { } #endregion diff --git a/RGB.NET.Devices.Razer/Keypad/RazerKeypadRGBDevice.cs b/RGB.NET.Devices.Razer/Keypad/RazerKeypadRGBDevice.cs index 2fac949..515fca4 100644 --- a/RGB.NET.Devices.Razer/Keypad/RazerKeypadRGBDevice.cs +++ b/RGB.NET.Devices.Razer/Keypad/RazerKeypadRGBDevice.cs @@ -6,11 +6,11 @@ using RGB.NET.Devices.Razer.Native; namespace RGB.NET.Devices.Razer { - /// + /// /// /// Represents a razer keypad. /// - public class RazerKeypadRGBDevice : RazerRGBDevice, IKeypad + public class RazerKeypadRGBDevice : RazerRGBDevice, IKeypad { #region Constructors @@ -19,7 +19,7 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The specific information provided by CUE for the keypad. - internal RazerKeypadRGBDevice(RazerKeypadRGBDeviceInfo info) + internal RazerKeypadRGBDevice(RazerRGBDeviceInfo info) : base(info) { } @@ -39,7 +39,7 @@ namespace RGB.NET.Devices.Razer protected override object? GetLedCustomData(LedId ledId) => (int)ledId - (int)LedId.Keypad1; /// - protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerKeypadUpdateQueue(updateTrigger, DeviceInfo.DeviceId); + protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerKeypadUpdateQueue(updateTrigger); #endregion } diff --git a/RGB.NET.Devices.Razer/Keypad/RazerKeypadRGBDeviceInfo.cs b/RGB.NET.Devices.Razer/Keypad/RazerKeypadRGBDeviceInfo.cs deleted file mode 100644 index 8fc0d4d..0000000 --- a/RGB.NET.Devices.Razer/Keypad/RazerKeypadRGBDeviceInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Razer -{ - /// - /// - /// Represents a generic information for a . - /// - public class RazerKeypadRGBDeviceInfo : RazerRGBDeviceInfo - { - #region Constructors - - /// - /// - /// Internal constructor of managed . - /// - /// The Id of the . - /// The model of the . - internal RazerKeypadRGBDeviceInfo(Guid deviceId, string model) - : base(deviceId, RGBDeviceType.Keypad, model) - { } - - #endregion - } -} diff --git a/RGB.NET.Devices.Razer/Keypad/RazerKeypadUpdateQueue.cs b/RGB.NET.Devices.Razer/Keypad/RazerKeypadUpdateQueue.cs index f0e884d..b13ef7f 100644 --- a/RGB.NET.Devices.Razer/Keypad/RazerKeypadUpdateQueue.cs +++ b/RGB.NET.Devices.Razer/Keypad/RazerKeypadUpdateQueue.cs @@ -17,9 +17,8 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The update trigger used to update this queue. - /// The id of the device updated by this queue. - public RazerKeypadUpdateQueue(IDeviceUpdateTrigger updateTrigger, Guid deviceId) - : base(updateTrigger, deviceId) + public RazerKeypadUpdateQueue(IDeviceUpdateTrigger updateTrigger) + : base(updateTrigger) { } #endregion @@ -43,6 +42,9 @@ namespace RGB.NET.Devices.Razer return ptr; } + /// + protected override void CreateEffect(IntPtr effectParams, ref Guid effectId) => _RazerSDK.CreateKeypadEffect(_Defines.KEYPAD_EFFECT_ID, effectParams, ref effectId); + #endregion } } diff --git a/RGB.NET.Devices.Razer/Mouse/RazerMouseRGBDevice.cs b/RGB.NET.Devices.Razer/Mouse/RazerMouseRGBDevice.cs index 983d90f..0fd0565 100644 --- a/RGB.NET.Devices.Razer/Mouse/RazerMouseRGBDevice.cs +++ b/RGB.NET.Devices.Razer/Mouse/RazerMouseRGBDevice.cs @@ -6,11 +6,11 @@ using RGB.NET.Devices.Razer.Native; namespace RGB.NET.Devices.Razer { - /// + /// /// /// Represents a razer mouse. /// - public class RazerMouseRGBDevice : RazerRGBDevice, IMouse + public class RazerMouseRGBDevice : RazerRGBDevice, IMouse { #region Constructors @@ -19,7 +19,7 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The specific information provided by CUE for the mouse. - internal RazerMouseRGBDevice(RazerMouseRGBDeviceInfo info) + internal RazerMouseRGBDevice(RazerRGBDeviceInfo info) : base(info) { } @@ -39,7 +39,7 @@ namespace RGB.NET.Devices.Razer protected override object? GetLedCustomData(LedId ledId) => (int)ledId - (int)LedId.Mouse1; /// - protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerMouseUpdateQueue(updateTrigger, DeviceInfo.DeviceId); + protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerMouseUpdateQueue(updateTrigger); #endregion } diff --git a/RGB.NET.Devices.Razer/Mouse/RazerMouseRGBDeviceInfo.cs b/RGB.NET.Devices.Razer/Mouse/RazerMouseRGBDeviceInfo.cs deleted file mode 100644 index c6d119c..0000000 --- a/RGB.NET.Devices.Razer/Mouse/RazerMouseRGBDeviceInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Razer -{ - /// - /// - /// Represents a generic information for a . - /// - public class RazerMouseRGBDeviceInfo : RazerRGBDeviceInfo - { - #region Constructors - - /// - /// - /// Internal constructor of managed . - /// - /// The Id of the . - /// The model of the . - internal RazerMouseRGBDeviceInfo(Guid deviceId, string model) - : base(deviceId, RGBDeviceType.Mouse, model) - { } - - #endregion - } -} diff --git a/RGB.NET.Devices.Razer/Mouse/RazerMouseUpdateQueue.cs b/RGB.NET.Devices.Razer/Mouse/RazerMouseUpdateQueue.cs index 95547d8..17d00b8 100644 --- a/RGB.NET.Devices.Razer/Mouse/RazerMouseUpdateQueue.cs +++ b/RGB.NET.Devices.Razer/Mouse/RazerMouseUpdateQueue.cs @@ -17,9 +17,8 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The update trigger used to update this queue. - /// The id of the device updated by this queue. - public RazerMouseUpdateQueue(IDeviceUpdateTrigger updateTrigger, Guid deviceId) - : base(updateTrigger, deviceId) + public RazerMouseUpdateQueue(IDeviceUpdateTrigger updateTrigger) + : base(updateTrigger) { } #endregion @@ -43,6 +42,10 @@ namespace RGB.NET.Devices.Razer return ptr; } + + /// + protected override void CreateEffect(IntPtr effectParams, ref Guid effectId) => _RazerSDK.CreateMouseEffect(_Defines.MOUSE_EFFECT_ID, effectParams, ref effectId); + #endregion } } diff --git a/RGB.NET.Devices.Razer/Mousepad/RazerMousepadRGBDevice.cs b/RGB.NET.Devices.Razer/Mousepad/RazerMousepadRGBDevice.cs index 285e211..e561a33 100644 --- a/RGB.NET.Devices.Razer/Mousepad/RazerMousepadRGBDevice.cs +++ b/RGB.NET.Devices.Razer/Mousepad/RazerMousepadRGBDevice.cs @@ -6,11 +6,11 @@ using RGB.NET.Devices.Razer.Native; namespace RGB.NET.Devices.Razer { - /// + /// /// /// Represents a razer mousepad. /// - public class RazerMousepadRGBDevice : RazerRGBDevice, IMousepad + public class RazerMousepadRGBDevice : RazerRGBDevice, IMousepad { #region Constructors @@ -19,7 +19,7 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The specific information provided by CUE for the mousepad. - internal RazerMousepadRGBDevice(RazerMousepadRGBDeviceInfo info) + internal RazerMousepadRGBDevice(RazerRGBDeviceInfo info) : base(info) { } @@ -38,7 +38,7 @@ namespace RGB.NET.Devices.Razer protected override object? GetLedCustomData(LedId ledId) => (int)ledId - (int)LedId.Mousepad1; /// - protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerMousepadUpdateQueue(updateTrigger, DeviceInfo.DeviceId); + protected override RazerUpdateQueue CreateUpdateQueue(IDeviceUpdateTrigger updateTrigger) => new RazerMousepadUpdateQueue(updateTrigger); #endregion } diff --git a/RGB.NET.Devices.Razer/Mousepad/RazerMousepadRGBDeviceInfo.cs b/RGB.NET.Devices.Razer/Mousepad/RazerMousepadRGBDeviceInfo.cs deleted file mode 100644 index eef2aae..0000000 --- a/RGB.NET.Devices.Razer/Mousepad/RazerMousepadRGBDeviceInfo.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Razer -{ - /// - /// - /// Represents a generic information for a . - /// - public class RazerMousepadRGBDeviceInfo : RazerRGBDeviceInfo - { - #region Constructors - - /// - /// - /// Internal constructor of managed . - /// - /// The Id of the . - /// The model of the . - internal RazerMousepadRGBDeviceInfo(Guid deviceId, string model) - : base(deviceId, RGBDeviceType.Mousepad, model) - { } - - #endregion - } -} diff --git a/RGB.NET.Devices.Razer/Mousepad/RazerMousepadUpdateQueue.cs b/RGB.NET.Devices.Razer/Mousepad/RazerMousepadUpdateQueue.cs index 419099b..b9aea89 100644 --- a/RGB.NET.Devices.Razer/Mousepad/RazerMousepadUpdateQueue.cs +++ b/RGB.NET.Devices.Razer/Mousepad/RazerMousepadUpdateQueue.cs @@ -17,9 +17,8 @@ namespace RGB.NET.Devices.Razer /// Initializes a new instance of the class. /// /// The update trigger used to update this queue. - /// The id of the device updated by this queue. - public RazerMousepadUpdateQueue(IDeviceUpdateTrigger updateTrigger, Guid deviceId) - : base(updateTrigger, deviceId) + public RazerMousepadUpdateQueue(IDeviceUpdateTrigger updateTrigger) + : base(updateTrigger) { } #endregion diff --git a/RGB.NET.Devices.Razer/Native/_Defines.cs b/RGB.NET.Devices.Razer/Native/_Defines.cs index 71dbd2b..cd9f7ff 100644 --- a/RGB.NET.Devices.Razer/Native/_Defines.cs +++ b/RGB.NET.Devices.Razer/Native/_Defines.cs @@ -7,6 +7,8 @@ internal const int CHROMALINK_EFFECT_ID = 1; internal const int KEYBOARD_EFFECT_ID = 9; internal const int MOUSEPAD_EFFECT_ID = 6; + internal const int MOUSE_EFFECT_ID = 3; + internal const int KEYPAD_EFFECT_ID = 2; internal const int KEYBOARD_MAX_ROW = 8; internal const int KEYBOARD_MAX_COLUMN = 24; diff --git a/RGB.NET.Devices.Razer/Native/_RazerSDK.cs b/RGB.NET.Devices.Razer/Native/_RazerSDK.cs index 2b9c1ef..37eb33d 100644 --- a/RGB.NET.Devices.Razer/Native/_RazerSDK.cs +++ b/RGB.NET.Devices.Razer/Native/_RazerSDK.cs @@ -44,6 +44,8 @@ namespace RGB.NET.Devices.Razer.Native _createHeadsetEffectPointer = (CreateHeadsetEffectPointer)Marshal.GetDelegateForFunctionPointer(GetProcAddress(_dllHandle, "CreateHeadsetEffect"), typeof(CreateHeadsetEffectPointer)); _createChromaLinkEffectPointer = (CreateChromaLinkEffectPointer)Marshal.GetDelegateForFunctionPointer(GetProcAddress(_dllHandle, "CreateChromaLinkEffect"), typeof(CreateChromaLinkEffectPointer)); _createKeyboardEffectPointer = (CreateKeyboardEffectPointer)Marshal.GetDelegateForFunctionPointer(GetProcAddress(_dllHandle, "CreateKeyboardEffect"), typeof(CreateKeyboardEffectPointer)); + _createKeypadEffectPointer = (CreateKeypadEffectPointer)Marshal.GetDelegateForFunctionPointer(GetProcAddress(_dllHandle, "CreateKeypadEffect"), typeof(CreateKeypadEffectPointer)); + _createMouseEffectPointer = (CreateMouseEffectPointer)Marshal.GetDelegateForFunctionPointer(GetProcAddress(_dllHandle, "CreateMouseEffect"), typeof(CreateMouseEffectPointer)); _createMousepadEffectPointer = (CreateMousepadEffectPointer)Marshal.GetDelegateForFunctionPointer(GetProcAddress(_dllHandle, "CreateMousepadEffect"), typeof(CreateMousepadEffectPointer)); _setEffectPointer = (SetEffectPointer)Marshal.GetDelegateForFunctionPointer(GetProcAddress(_dllHandle, "SetEffect"), typeof(SetEffectPointer)); _deleteEffectPointer = (DeleteEffectPointer)Marshal.GetDelegateForFunctionPointer(GetProcAddress(_dllHandle, "DeleteEffect"), typeof(DeleteEffectPointer)); @@ -80,6 +82,8 @@ namespace RGB.NET.Devices.Razer.Native private static CreateHeadsetEffectPointer? _createHeadsetEffectPointer; private static CreateChromaLinkEffectPointer? _createChromaLinkEffectPointer; private static CreateKeyboardEffectPointer? _createKeyboardEffectPointer; + private static CreateKeypadEffectPointer? _createKeypadEffectPointer; + private static CreateMouseEffectPointer? _createMouseEffectPointer; private static CreateMousepadEffectPointer? _createMousepadEffectPointer; private static SetEffectPointer? _setEffectPointer; private static DeleteEffectPointer? _deleteEffectPointer; @@ -109,6 +113,12 @@ namespace RGB.NET.Devices.Razer.Native [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate RazerError CreateKeyboardEffectPointer(int effectType, IntPtr param, ref Guid effectId); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate RazerError CreateKeypadEffectPointer(int effectType, IntPtr param, ref Guid effectId); + + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] + private delegate RazerError CreateMouseEffectPointer(int effectType, IntPtr param, ref Guid effectId); + [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate RazerError CreateMousepadEffectPointer(int effectType, IntPtr param, ref Guid effectId); @@ -151,11 +161,15 @@ namespace RGB.NET.Devices.Razer.Native internal static RazerError CreateEffect(Guid deviceId, int effectType, IntPtr param, ref Guid effectId) => (_createEffectPointer ?? throw new RGBDeviceException("The Razer-SDK is not initialized.")).Invoke(deviceId, effectType, param, ref effectId); internal static RazerError CreateHeadsetEffect(int effectType, IntPtr param, ref Guid effectId) => (_createHeadsetEffectPointer ?? throw new RGBDeviceException("The Razer-SDK is not initialized.")).Invoke(effectType, param, ref effectId); - + internal static RazerError CreateChromaLinkEffect(int effectType, IntPtr param, ref Guid effectId) => (_createChromaLinkEffectPointer ?? throw new RGBDeviceException("The Razer-SDK is not initialized.")).Invoke(effectType, param, ref effectId); - + internal static RazerError CreateKeyboardEffect(int effectType, IntPtr param, ref Guid effectId) => (_createKeyboardEffectPointer ?? throw new RGBDeviceException("The Razer-SDK is not initialized.")).Invoke(effectType, param, ref effectId); - + + internal static RazerError CreateKeypadEffect(int effectType, IntPtr param, ref Guid effectId) => (_createKeypadEffectPointer ?? throw new RGBDeviceException("The Razer-SDK is not initialized.")).Invoke(effectType, param, ref effectId); + + internal static RazerError CreateMouseEffect(int effectType, IntPtr param, ref Guid effectId) => (_createMouseEffectPointer ?? throw new RGBDeviceException("The Razer-SDK is not initialized.")).Invoke(effectType, param, ref effectId); + internal static RazerError CreateMousepadEffect(int effectType, IntPtr param, ref Guid effectId) => (_createMousepadEffectPointer ?? throw new RGBDeviceException("The Razer-SDK is not initialized.")).Invoke(effectType, param, ref effectId); internal static RazerError SetEffect(Guid effectId) => (_setEffectPointer ?? throw new RGBDeviceException("The Razer-SDK is not initialized.")).Invoke(effectId); diff --git a/RGB.NET.Devices.Razer/RGB.NET.Devices.Razer.csproj b/RGB.NET.Devices.Razer/RGB.NET.Devices.Razer.csproj index e45df5d..6610e29 100644 --- a/RGB.NET.Devices.Razer/RGB.NET.Devices.Razer.csproj +++ b/RGB.NET.Devices.Razer/RGB.NET.Devices.Razer.csproj @@ -50,6 +50,10 @@ $(DefineConstants);RELEASE + + + + diff --git a/RGB.NET.Devices.Razer/RazerDeviceProvider.cs b/RGB.NET.Devices.Razer/RazerDeviceProvider.cs index a44c4e2..b4c9944 100644 --- a/RGB.NET.Devices.Razer/RazerDeviceProvider.cs +++ b/RGB.NET.Devices.Razer/RazerDeviceProvider.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using RGB.NET.Core; +using RGB.NET.Devices.Razer.HID; using RGB.NET.Devices.Razer.Native; namespace RGB.NET.Devices.Razer @@ -29,13 +30,14 @@ namespace RGB.NET.Devices.Razer /// Gets a modifiable list of paths used to find the native SDK-dlls for x86 applications. /// The first match will be used. /// - public static List PossibleX86NativePaths { get; } = new() { @"%systemroot%\SysWOW64\RzChromaSDK.dll" }; + public static List PossibleX86NativePaths { get; } = new() {@"%systemroot%\SysWOW64\RzChromaSDK.dll"}; /// /// Gets a modifiable list of paths used to find the native SDK-dlls for x64 applications. /// The first match will be used. /// - public static List PossibleX64NativePaths { get; } = new() { @"%systemroot%\System32\RzChromaSDK.dll", @"%systemroot%\System32\RzChromaSDK64.dll" }; + public static List PossibleX64NativePaths { get; } = + new() {@"%systemroot%\System32\RzChromaSDK.dll", @"%systemroot%\System32\RzChromaSDK64.dll"}; /// /// @@ -66,7 +68,8 @@ namespace RGB.NET.Devices.Razer /// Thrown if this constructor is called even if there is already an instance of this class. public RazerDeviceProvider() { - if (_instance != null) throw new InvalidOperationException($"There can be only one instance of type {nameof(RazerDeviceProvider)}"); + if (_instance != null) + throw new InvalidOperationException($"There can be only one instance of type {nameof(RazerDeviceProvider)}"); _instance = this; UpdateTrigger = new DeviceUpdateTrigger(); @@ -96,84 +99,45 @@ namespace RGB.NET.Devices.Razer ThrowRazerError(error); IList devices = new List(); + DeviceChecker.LoadDeviceList(loadFilter); - if (loadFilter.HasFlag(RGBDeviceType.Keyboard)) - foreach ((Guid guid, string model) in Razer.Devices.KEYBOARDS) - try - { - if (((_RazerSDK.QueryDevice(guid, out _DeviceInfo deviceInfo) != RazerError.Success) || (deviceInfo.Connected < 1)) - && (!LoadEmulatorDevices || (Razer.Devices.KEYBOARDS.FirstOrDefault().guid != guid))) continue; + foreach ((var model, RGBDeviceType deviceType, int _) in DeviceChecker.ConnectedDevices) + { + RazerRGBDevice device = deviceType switch + { + RGBDeviceType.Keyboard => new RazerKeyboardRGBDevice(new RazerKeyboardRGBDeviceInfo(model)), + RGBDeviceType.Mouse => new RazerMouseRGBDevice(new RazerRGBDeviceInfo(deviceType, model)), + RGBDeviceType.Headset => new RazerHeadsetRGBDevice(new RazerRGBDeviceInfo(deviceType, model)), + RGBDeviceType.Mousepad => new RazerMousepadRGBDevice(new RazerRGBDeviceInfo(deviceType, model)), + RGBDeviceType.Keypad => new RazerKeypadRGBDevice(new RazerRGBDeviceInfo(deviceType, model)), + RGBDeviceType.Unknown => new RazerChromaLinkRGBDevice(new RazerRGBDeviceInfo(deviceType, model)), + _ => throw new RGBDeviceException($"Razer SDK does not support {deviceType} devices") + }; - RazerKeyboardRGBDevice device = new(new RazerKeyboardRGBDeviceInfo(guid, model)); - device.Initialize(UpdateTrigger); - devices.Add(device); - } - catch { if (throwExceptions) throw; } + devices.Add(device); + } - if (loadFilter.HasFlag(RGBDeviceType.Mouse)) - foreach ((Guid guid, string model) in Razer.Devices.MICE) - try - { - if (((_RazerSDK.QueryDevice(guid, out _DeviceInfo deviceInfo) != RazerError.Success) || (deviceInfo.Connected < 1)) - && (!LoadEmulatorDevices || (Razer.Devices.MICE.FirstOrDefault().guid != guid))) continue; + if (LoadEmulatorDevices) + { + if (loadFilter.HasFlag(RGBDeviceType.Keyboard) && devices.All(d => d.DeviceInfo.DeviceType != RGBDeviceType.Keyboard)) + devices.Add(new RazerKeyboardRGBDevice(new RazerKeyboardRGBDeviceInfo("Emulator Keyboard"))); + if (loadFilter.HasFlag(RGBDeviceType.Mouse) && devices.All(d => d.DeviceInfo.DeviceType != RGBDeviceType.Mouse)) + devices.Add(new RazerMouseRGBDevice(new RazerRGBDeviceInfo(RGBDeviceType.Mouse, "Emulator Mouse"))); + if (loadFilter.HasFlag(RGBDeviceType.Headset) && devices.All(d => d.DeviceInfo.DeviceType != RGBDeviceType.Headset)) + devices.Add(new RazerHeadsetRGBDevice(new RazerRGBDeviceInfo(RGBDeviceType.Headset, "Emulator Headset"))); + if (loadFilter.HasFlag(RGBDeviceType.Mousepad) && devices.All(d => d.DeviceInfo.DeviceType != RGBDeviceType.Mousepad)) + devices.Add(new RazerMousepadRGBDevice(new RazerRGBDeviceInfo(RGBDeviceType.Mousepad, "Emulator Mousepad"))); + if (loadFilter.HasFlag(RGBDeviceType.Keypad) && devices.All(d => d.DeviceInfo.DeviceType != RGBDeviceType.Keypad)) + devices.Add(new RazerKeypadRGBDevice(new RazerRGBDeviceInfo(RGBDeviceType.Keypad, "Emulator Keypad"))); + if (loadFilter.HasFlag(RGBDeviceType.Unknown) && devices.All(d => d.DeviceInfo.DeviceType != RGBDeviceType.Unknown)) + devices.Add(new RazerChromaLinkRGBDevice(new RazerRGBDeviceInfo(RGBDeviceType.Unknown, "Emulator Chroma Link"))); + } - RazerMouseRGBDevice device = new(new RazerMouseRGBDeviceInfo(guid, model)); - device.Initialize(UpdateTrigger); - devices.Add(device); - } - catch { if (throwExceptions) throw; } - - if (loadFilter.HasFlag(RGBDeviceType.Headset)) - foreach ((Guid guid, string model) in Razer.Devices.HEADSETS) - try - { - if (((_RazerSDK.QueryDevice(guid, out _DeviceInfo deviceInfo) != RazerError.Success) || (deviceInfo.Connected < 1)) - && (!LoadEmulatorDevices || (Razer.Devices.HEADSETS.FirstOrDefault().guid != guid))) continue; - - RazerHeadsetRGBDevice device = new(new RazerHeadsetRGBDeviceInfo(guid, model)); - device.Initialize(UpdateTrigger); - devices.Add(device); - } - catch { if (throwExceptions) throw; } - - if (loadFilter.HasFlag(RGBDeviceType.Mousepad)) - foreach ((Guid guid, string model) in Razer.Devices.MOUSEMATS) - try - { - if (((_RazerSDK.QueryDevice(guid, out _DeviceInfo deviceInfo) != RazerError.Success) || (deviceInfo.Connected < 1)) - && (!LoadEmulatorDevices || (Razer.Devices.MOUSEMATS.FirstOrDefault().guid != guid))) continue; - - RazerMousepadRGBDevice device = new(new RazerMousepadRGBDeviceInfo(guid, model)); - device.Initialize(UpdateTrigger); - devices.Add(device); - } - catch { if (throwExceptions) throw; } - - if (loadFilter.HasFlag(RGBDeviceType.Keypad)) - foreach ((Guid guid, string model) in Razer.Devices.KEYPADS) - try - { - if (((_RazerSDK.QueryDevice(guid, out _DeviceInfo deviceInfo) != RazerError.Success) || (deviceInfo.Connected < 1)) - && (!LoadEmulatorDevices || (Razer.Devices.KEYPADS.FirstOrDefault().guid != guid))) continue; - - RazerKeypadRGBDevice device = new(new RazerKeypadRGBDeviceInfo(guid, model)); - device.Initialize(UpdateTrigger); - devices.Add(device); - } - catch { if (throwExceptions) throw; } - - if (loadFilter.HasFlag(RGBDeviceType.Keyboard)) - foreach ((Guid guid, string model) in Razer.Devices.CHROMALINKS) - try - { - if (((_RazerSDK.QueryDevice(guid, out _DeviceInfo deviceInfo) != RazerError.Success) || (deviceInfo.Connected < 1)) - && (!LoadEmulatorDevices || (Razer.Devices.CHROMALINKS.FirstOrDefault().guid != guid))) continue; - - RazerChromaLinkRGBDevice device = new(new RazerChromaLinkRGBDeviceInfo(guid, model)); - device.Initialize(UpdateTrigger); - devices.Add(device); - } - catch { if (throwExceptions) throw; } + foreach (var rgbDevice in devices) + { + RazerRGBDevice device = (RazerRGBDevice)rgbDevice; + device.Initialize(UpdateTrigger); + } UpdateTrigger.Start(); Devices = new ReadOnlyCollection(devices); @@ -188,24 +152,31 @@ namespace RGB.NET.Devices.Razer return true; } - + private void ThrowRazerError(RazerError errorCode) => throw new RazerException(errorCode); private void TryUnInit() { try { _RazerSDK.UnInit(); } - catch { /* We tried our best */ } + catch + { /* We tried our best */ + } } /// public void Dispose() { try { UpdateTrigger.Dispose(); } - catch { /* at least we tried */ } + catch + { /* at least we tried */ + } foreach (IRGBDevice device in Devices) try { device.Dispose(); } - catch { /* at least we tried */ } + catch + { /* at least we tried */ + } + Devices = Enumerable.Empty(); TryUnInit();