From 1e229324bec6d4c2e68215bb565e7216e4c9dd99 Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Sun, 18 Apr 2021 19:33:12 +0200 Subject: [PATCH] Rewrote Corsair device handling to use mappings --- .../CorsairDeviceProvider.cs | 25 ++++++- .../Custom/CorsairCustomRGBDevice.cs | 74 ++++++++++--------- .../Custom/CorsairCustomRGBDeviceInfo.cs | 5 +- .../Generic/CorsairRGBDevice.cs | 51 ++++++++++++- .../Generic/CorsairRGBDeviceInfo.cs | 8 +- .../Generic/ICorsairRGBDevice.cs | 4 +- .../LedMappings.cs} | 49 ++++++++++-- .../CorsairGraphicsCardRGBDevice.cs | 27 +++++++ .../CorsairGraphicsCardRGBDeviceInfo.cs | 29 ++++++++ .../Headset/CorsairHeadsetRGBDevice.cs | 18 +---- .../Headset/HeadsetIdMapping.cs | 14 ---- .../CorsairHeadsetStandRGBDevice.cs | 45 +---------- .../HeadsetStand/HeadsetStandIdMapping.cs | 21 ------ .../Keyboard/CorsairKeyboardRGBDevice.cs | 38 +--------- .../Mainboard/CorsairMainboardRGBDevice.cs | 27 +++++++ .../CorsairMainboardRGBDeviceInfo.cs | 29 ++++++++ .../Memory/CorsairMemoryRGBDevice.cs | 38 +--------- .../Memory/MemoryIdMapping.cs | 25 ------- .../Mouse/CorsairMouseRGBDevice.cs | 48 +----------- .../Mouse/MouseIdMapping.cs | 31 -------- .../Mousepad/CorsairMousepadRGBDevice.cs | 44 +---------- .../Mousepad/MousepadIdMapping.cs | 27 ------- ...RGB.NET.Devices.Corsair.csproj.DotSettings | 2 + 23 files changed, 284 insertions(+), 395 deletions(-) rename RGB.NET.Devices.Corsair/{Keyboard/KeyboardIdMapping.cs => Generic/LedMappings.cs} (84%) create mode 100644 RGB.NET.Devices.Corsair/GraphicsCard/CorsairGraphicsCardRGBDevice.cs create mode 100644 RGB.NET.Devices.Corsair/GraphicsCard/CorsairGraphicsCardRGBDeviceInfo.cs delete mode 100644 RGB.NET.Devices.Corsair/Headset/HeadsetIdMapping.cs delete mode 100644 RGB.NET.Devices.Corsair/HeadsetStand/HeadsetStandIdMapping.cs create mode 100644 RGB.NET.Devices.Corsair/Mainboard/CorsairMainboardRGBDevice.cs create mode 100644 RGB.NET.Devices.Corsair/Mainboard/CorsairMainboardRGBDeviceInfo.cs delete mode 100644 RGB.NET.Devices.Corsair/Memory/MemoryIdMapping.cs delete mode 100644 RGB.NET.Devices.Corsair/Mouse/MouseIdMapping.cs delete mode 100644 RGB.NET.Devices.Corsair/Mousepad/MousepadIdMapping.cs diff --git a/RGB.NET.Devices.Corsair/CorsairDeviceProvider.cs b/RGB.NET.Devices.Corsair/CorsairDeviceProvider.cs index 49053dc..0389501 100644 --- a/RGB.NET.Devices.Corsair/CorsairDeviceProvider.cs +++ b/RGB.NET.Devices.Corsair/CorsairDeviceProvider.cs @@ -3,8 +3,6 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; using System.Runtime.InteropServices; using RGB.NET.Core; using RGB.NET.Devices.Corsair.Native; @@ -85,7 +83,17 @@ namespace RGB.NET.Devices.Corsair Throw(new CUEException(LastError)); } + /// protected override IEnumerable LoadDevices() + { + foreach (ICorsairRGBDevice corsairDevice in LoadCorsairDevices()) + { + corsairDevice.Initialize(); + yield return corsairDevice; + } + } + + private IEnumerable LoadCorsairDevices() { int deviceCount = _CUESDK.CorsairGetDeviceCount(); for (int i = 0; i < deviceCount; i++) @@ -122,6 +130,14 @@ namespace RGB.NET.Devices.Corsair yield return new CorsairMemoryRGBDevice(new CorsairMemoryRGBDeviceInfo(i, nativeDeviceInfo), updateQueue); break; + case CorsairDeviceType.Mainboard: + yield return new CorsairMainboardRGBDevice(new CorsairMainboardRGBDeviceInfo(i, nativeDeviceInfo), updateQueue); + break; + + case CorsairDeviceType.GraphicsCard: + yield return new CorsairGraphicsCardRGBDevice(new CorsairGraphicsCardRGBDeviceInfo(i, nativeDeviceInfo), updateQueue); + break; + case CorsairDeviceType.Cooler: case CorsairDeviceType.CommanderPro: case CorsairDeviceType.LightningNodePro: @@ -129,6 +145,7 @@ namespace RGB.NET.Devices.Corsair if (channelsInfo != null) { IntPtr channelInfoPtr = channelsInfo.channels; + int ledOffset = 0; for (int channel = 0; channel < channelsInfo.channelsCount; channel++) { @@ -144,9 +161,10 @@ namespace RGB.NET.Devices.Corsair { _CorsairChannelDeviceInfo channelDeviceInfo = (_CorsairChannelDeviceInfo)Marshal.PtrToStructure(channelDeviceInfoPtr, typeof(_CorsairChannelDeviceInfo))!; - yield return new CorsairCustomRGBDevice(new CorsairCustomRGBDeviceInfo(info, nativeDeviceInfo, channelDeviceInfo, referenceLed), updateQueue); + yield return new CorsairCustomRGBDevice(new CorsairCustomRGBDeviceInfo(info, nativeDeviceInfo, channelDeviceInfo, referenceLed, ledOffset), updateQueue); referenceLed += channelDeviceInfo.deviceLedCount; + ledOffset += channelDeviceInfo.deviceLedCount; channelDeviceInfoPtr = new IntPtr(channelDeviceInfoPtr.ToInt64() + channelDeviceInfoStructSize); } @@ -155,7 +173,6 @@ namespace RGB.NET.Devices.Corsair } } break; - default: Throw(new RGBDeviceException("Unknown Device-Type")); break; diff --git a/RGB.NET.Devices.Corsair/Custom/CorsairCustomRGBDevice.cs b/RGB.NET.Devices.Corsair/Custom/CorsairCustomRGBDevice.cs index fc67e5a..d534d2b 100644 --- a/RGB.NET.Devices.Corsair/Custom/CorsairCustomRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/Custom/CorsairCustomRGBDevice.cs @@ -1,8 +1,10 @@ // ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedMember.Global -using System.Collections.Generic; +using System; +using System.Runtime.InteropServices; using RGB.NET.Core; +using RGB.NET.Devices.Corsair.Native; namespace RGB.NET.Devices.Corsair { @@ -12,12 +14,6 @@ namespace RGB.NET.Devices.Corsair /// public class CorsairCustomRGBDevice : CorsairRGBDevice, IUnknownDevice { - #region Properties & Fields - - private readonly Dictionary _idMapping = new(); - - #endregion - #region Constructors /// @@ -26,46 +22,52 @@ namespace RGB.NET.Devices.Corsair /// /// The specific information provided by CUE for the custom-device. internal CorsairCustomRGBDevice(CorsairCustomRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) - : base(info, updateQueue) - { - InitializeLayout(); - } + : base(info, new LedMapping(), updateQueue) + { } #endregion #region Methods - private void InitializeLayout() + /// + protected override void InitializeLayout() { - LedId referenceId = GetReferenceLed(DeviceInfo.DeviceType); + Mapping.Clear(); - for (int i = 0; i < DeviceInfo.LedCount; i++) + _CorsairLedPositions? nativeLedPositions = (_CorsairLedPositions?)Marshal.PtrToStructure(_CUESDK.CorsairGetLedPositionsByDeviceIndex(DeviceInfo.CorsairDeviceIndex), typeof(_CorsairLedPositions)); + if (nativeLedPositions == null) return; + + int structSize = Marshal.SizeOf(typeof(_CorsairLedPosition)); + IntPtr ptr = new(nativeLedPositions.pLedPosition.ToInt64() + (structSize * DeviceInfo.LedOffset)); + + LedId referenceLedId = GetReferenceLed(DeviceInfo.DeviceType); + for (int i = 0; i < nativeLedPositions.numberOfLed; i++) { - LedId ledId = referenceId + i; - _idMapping.Add(ledId, DeviceInfo.ReferenceCorsairLed + i); - AddLed(ledId, new Point(i * 10, 0), new Size(10, 10)); + LedId ledId = referenceLedId + i; + _CorsairLedPosition? ledPosition = (_CorsairLedPosition?)Marshal.PtrToStructure(ptr, typeof(_CorsairLedPosition)); + if (ledPosition == null) + { + ptr = new IntPtr(ptr.ToInt64() + structSize); + continue; + } + + Mapping.Add(ledId, ledPosition.LedId); + + Rectangle rectangle = ledPosition.ToRectangle(); + AddLed(ledId, rectangle.Location, rectangle.Size); + + ptr = new IntPtr(ptr.ToInt64() + structSize); } } - - protected override object GetLedCustomData(LedId ledId) => _idMapping.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; - - protected virtual LedId GetReferenceLed(RGBDeviceType deviceType) - { - switch (deviceType) + + private static LedId GetReferenceLed(RGBDeviceType deviceType) + => deviceType switch { - case RGBDeviceType.LedStripe: - return LedId.LedStripe1; - - case RGBDeviceType.Fan: - return LedId.Fan1; - - case RGBDeviceType.Cooler: - return LedId.Cooler1; - - default: - return LedId.Custom1; - } - } + RGBDeviceType.LedStripe => LedId.LedStripe1, + RGBDeviceType.Fan => LedId.Fan1, + RGBDeviceType.Cooler => LedId.Cooler1, + _ => LedId.Custom1 + }; #endregion } diff --git a/RGB.NET.Devices.Corsair/Custom/CorsairCustomRGBDeviceInfo.cs b/RGB.NET.Devices.Corsair/Custom/CorsairCustomRGBDeviceInfo.cs index 923f989..3a5eb31 100644 --- a/RGB.NET.Devices.Corsair/Custom/CorsairCustomRGBDeviceInfo.cs +++ b/RGB.NET.Devices.Corsair/Custom/CorsairCustomRGBDeviceInfo.cs @@ -17,6 +17,7 @@ namespace RGB.NET.Devices.Corsair public CorsairLedId ReferenceCorsairLed { get; } public int LedCount { get; } + internal int LedOffset { get; } #endregion @@ -31,11 +32,11 @@ namespace RGB.NET.Devices.Corsair /// The native -struct /// The native representing this device. /// The id of the first led of this device. - /// A dictionary containing counters to create unique names for equal devices models. - internal CorsairCustomRGBDeviceInfo(CorsairRGBDeviceInfo info, _CorsairDeviceInfo nativeInfo, _CorsairChannelDeviceInfo channelDeviceInfo, CorsairLedId referenceCorsairLed) + internal CorsairCustomRGBDeviceInfo(CorsairRGBDeviceInfo info, _CorsairDeviceInfo nativeInfo, _CorsairChannelDeviceInfo channelDeviceInfo, CorsairLedId referenceCorsairLed, int ledOffset) : base(info.CorsairDeviceIndex, GetDeviceType(channelDeviceInfo.type), nativeInfo, GetModelName(info, channelDeviceInfo)) { this.ReferenceCorsairLed = referenceCorsairLed; + this.LedOffset = ledOffset; LedCount = channelDeviceInfo.deviceLedCount; } diff --git a/RGB.NET.Devices.Corsair/Generic/CorsairRGBDevice.cs b/RGB.NET.Devices.Corsair/Generic/CorsairRGBDevice.cs index c7e1864..22792fc 100644 --- a/RGB.NET.Devices.Corsair/Generic/CorsairRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/Generic/CorsairRGBDevice.cs @@ -1,4 +1,7 @@ -using RGB.NET.Core; +using System; +using System.Runtime.InteropServices; +using RGB.NET.Core; +using RGB.NET.Devices.Corsair.Native; namespace RGB.NET.Devices.Corsair { @@ -9,15 +12,57 @@ namespace RGB.NET.Devices.Corsair public abstract class CorsairRGBDevice : AbstractRGBDevice, ICorsairRGBDevice where TDeviceInfo : CorsairRGBDeviceInfo { + #region Properties & Fields + + protected LedMapping Mapping { get; } + + #endregion + #region Constructors /// /// Initializes a new instance of the class. /// /// The generic information provided by CUE for the device. - protected CorsairRGBDevice(TDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) + protected CorsairRGBDevice(TDeviceInfo info, LedMapping mapping, CorsairDeviceUpdateQueue updateQueue) : base(info, updateQueue) - { } + { + this.Mapping = mapping; + } + + #endregion + + #region Methods + + void ICorsairRGBDevice.Initialize() => InitializeLayout(); + + protected virtual void InitializeLayout() + { + _CorsairLedPositions? nativeLedPositions = (_CorsairLedPositions?)Marshal.PtrToStructure(_CUESDK.CorsairGetLedPositionsByDeviceIndex(DeviceInfo.CorsairDeviceIndex), typeof(_CorsairLedPositions)); + if (nativeLedPositions == null) return; + + int structSize = Marshal.SizeOf(typeof(_CorsairLedPosition)); + IntPtr ptr = nativeLedPositions.pLedPosition; + + for (int i = 0; i < nativeLedPositions.numberOfLed; i++) + { + _CorsairLedPosition? ledPosition = (_CorsairLedPosition?)Marshal.PtrToStructure(ptr, typeof(_CorsairLedPosition)); + if (ledPosition == null) + { + ptr = new IntPtr(ptr.ToInt64() + structSize); + continue; + } + + LedId ledId = Mapping.TryGetValue(ledPosition.LedId, out LedId id) ? id : LedId.Invalid; + Rectangle rectangle = ledPosition.ToRectangle(); + AddLed(ledId, rectangle.Location, rectangle.Size); + + ptr = new IntPtr(ptr.ToInt64() + structSize); + } + } + + /// + protected override object GetLedCustomData(LedId ledId) => Mapping.TryGetValue(ledId, out CorsairLedId corsairLedId) ? corsairLedId : CorsairLedId.Invalid; #endregion } diff --git a/RGB.NET.Devices.Corsair/Generic/CorsairRGBDeviceInfo.cs b/RGB.NET.Devices.Corsair/Generic/CorsairRGBDeviceInfo.cs index 256ed6b..8033837 100644 --- a/RGB.NET.Devices.Corsair/Generic/CorsairRGBDeviceInfo.cs +++ b/RGB.NET.Devices.Corsair/Generic/CorsairRGBDeviceInfo.cs @@ -36,6 +36,7 @@ namespace RGB.NET.Devices.Corsair /// public string Model { get; } + /// public object? LayoutMetadata { get; set; } /// @@ -53,7 +54,6 @@ namespace RGB.NET.Devices.Corsair /// The index of the . /// The type of the . /// The native -struct - /// A dictionary containing counters to create unique names for equal devices models. internal CorsairRGBDeviceInfo(int deviceIndex, RGBDeviceType deviceType, _CorsairDeviceInfo nativeInfo) { this.CorsairDeviceIndex = deviceIndex; @@ -72,7 +72,6 @@ namespace RGB.NET.Devices.Corsair /// The type of the . /// The native -struct /// The name of the device-model (overwrites the one provided with the device info). - /// A dictionary containing counters to create unique names for equal devices models. internal CorsairRGBDeviceInfo(int deviceIndex, RGBDeviceType deviceType, _CorsairDeviceInfo nativeInfo, string modelName) { this.CorsairDeviceIndex = deviceIndex; @@ -84,11 +83,6 @@ namespace RGB.NET.Devices.Corsair DeviceName = DeviceHelper.CreateDeviceName(Manufacturer, Model); } - #endregion - - #region Methods - - #endregion } } diff --git a/RGB.NET.Devices.Corsair/Generic/ICorsairRGBDevice.cs b/RGB.NET.Devices.Corsair/Generic/ICorsairRGBDevice.cs index 9caca09..f236be3 100644 --- a/RGB.NET.Devices.Corsair/Generic/ICorsairRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/Generic/ICorsairRGBDevice.cs @@ -6,5 +6,7 @@ namespace RGB.NET.Devices.Corsair /// Represents a corsair RGB-device. /// public interface ICorsairRGBDevice : IRGBDevice - { } + { + internal void Initialize(); + } } diff --git a/RGB.NET.Devices.Corsair/Keyboard/KeyboardIdMapping.cs b/RGB.NET.Devices.Corsair/Generic/LedMappings.cs similarity index 84% rename from RGB.NET.Devices.Corsair/Keyboard/KeyboardIdMapping.cs rename to RGB.NET.Devices.Corsair/Generic/LedMappings.cs index d7855f6..c53c647 100644 --- a/RGB.NET.Devices.Corsair/Keyboard/KeyboardIdMapping.cs +++ b/RGB.NET.Devices.Corsair/Generic/LedMappings.cs @@ -1,12 +1,51 @@ -using System.Collections.Generic; -using RGB.NET.Core; +using RGB.NET.Core; namespace RGB.NET.Devices.Corsair { - internal static class KeyboardIdMapping + public static class LedMappings { - internal static readonly Dictionary DEFAULT = new() - { + static LedMappings() + { + for (int i = 0; i <= (CorsairLedId.GPU50 - CorsairLedId.GPU1); i++) + GraphicsCard.Add(LedId.GraphicsCard1 + i, (CorsairLedId.GPU1 + i)); + + for (int i = 0; i <= (CorsairLedId.HeadsetStandZone9 - CorsairLedId.HeadsetStandZone1); i++) + HeadsetStand.Add(LedId.HeadsetStand1 + i, (CorsairLedId.HeadsetStandZone1 + i)); + + for (int i = 0; i <= (CorsairLedId.Mainboard100 - CorsairLedId.Mainboard1); i++) + Mainboard.Add(LedId.Mainboard1 + i, (CorsairLedId.Mainboard1 + i)); + + for (int i = 0; i <= (CorsairLedId.DRAM12 - CorsairLedId.DRAM1); i++) + Memory.Add(LedId.DRAM1 + i, (CorsairLedId.DRAM1 + i)); + + for (int i = 0; i <= (CorsairLedId.Zone15 - CorsairLedId.Zone1); i++) + Mousepad.Add(LedId.Mousepad1 + i, (CorsairLedId.Zone1 + i)); + } + + public static LedMapping GraphicsCard = new(); + public static LedMapping HeadsetStand = new(); + public static LedMapping Mainboard = new(); + public static LedMapping Memory = new(); + public static LedMapping Mousepad = new(); + + public static LedMapping Headset = new() + { + { LedId.Headset1, CorsairLedId.LeftLogo }, + { LedId.Headset2, CorsairLedId.RightLogo }, + }; + + public static LedMapping Mouse = new() + { + { LedId.Mouse1, CorsairLedId.B1 }, + { LedId.Mouse2, CorsairLedId.B2 }, + { LedId.Mouse3, CorsairLedId.B3 }, + { LedId.Mouse4, CorsairLedId.B4 }, + { LedId.Mouse5, CorsairLedId.B5 }, + { LedId.Mouse6, CorsairLedId.B6 }, + }; + + public static LedMapping Keyboard = new() + { { LedId.Invalid, CorsairLedId.Invalid }, { LedId.Logo, CorsairLedId.Logo }, { LedId.Keyboard_Escape, CorsairLedId.Escape }, diff --git a/RGB.NET.Devices.Corsair/GraphicsCard/CorsairGraphicsCardRGBDevice.cs b/RGB.NET.Devices.Corsair/GraphicsCard/CorsairGraphicsCardRGBDevice.cs new file mode 100644 index 0000000..e2f7205 --- /dev/null +++ b/RGB.NET.Devices.Corsair/GraphicsCard/CorsairGraphicsCardRGBDevice.cs @@ -0,0 +1,27 @@ +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable UnusedMember.Global + +using RGB.NET.Core; + +namespace RGB.NET.Devices.Corsair +{ + /// + /// + /// Represents a corsair graphics card. + /// + public class CorsairGraphicsCardRGBDevice : CorsairRGBDevice, IGraphicsCard + { + #region Constructors + + /// + /// + /// Initializes a new instance of the class. + /// + /// The specific information provided by CUE for the graphics card. + internal CorsairGraphicsCardRGBDevice(CorsairGraphicsCardRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) + : base(info, LedMappings.GraphicsCard, updateQueue) + { } + + #endregion + } +} diff --git a/RGB.NET.Devices.Corsair/GraphicsCard/CorsairGraphicsCardRGBDeviceInfo.cs b/RGB.NET.Devices.Corsair/GraphicsCard/CorsairGraphicsCardRGBDeviceInfo.cs new file mode 100644 index 0000000..70f3cea --- /dev/null +++ b/RGB.NET.Devices.Corsair/GraphicsCard/CorsairGraphicsCardRGBDeviceInfo.cs @@ -0,0 +1,29 @@ +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable UnusedMember.Global + +using RGB.NET.Core; +using RGB.NET.Devices.Corsair.Native; + +namespace RGB.NET.Devices.Corsair +{ + /// + /// + /// Represents a generic information for a . + /// + public class CorsairGraphicsCardRGBDeviceInfo : CorsairRGBDeviceInfo + { + #region Constructors + + /// + /// + /// Internal constructor of managed . + /// + /// The index of the . + /// The native -struct + internal CorsairGraphicsCardRGBDeviceInfo(int deviceIndex, _CorsairDeviceInfo nativeInfo) + : base(deviceIndex, RGBDeviceType.GraphicsCard, nativeInfo) + { } + + #endregion + } +} diff --git a/RGB.NET.Devices.Corsair/Headset/CorsairHeadsetRGBDevice.cs b/RGB.NET.Devices.Corsair/Headset/CorsairHeadsetRGBDevice.cs index 92455d9..b1e1228 100644 --- a/RGB.NET.Devices.Corsair/Headset/CorsairHeadsetRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/Headset/CorsairHeadsetRGBDevice.cs @@ -19,22 +19,8 @@ namespace RGB.NET.Devices.Corsair /// /// The specific information provided by CUE for the headset internal CorsairHeadsetRGBDevice(CorsairHeadsetRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) - : base(info, updateQueue) - { - InitializeLayout(); - } - - #endregion - - #region Methods - - private void InitializeLayout() - { - AddLed(LedId.Headset1, new Point(0, 0), new Size(10, 10)); - AddLed(LedId.Headset2, new Point(10, 0), new Size(10, 10)); - } - - protected override object GetLedCustomData(LedId ledId) => HeadsetIdMapping.DEFAULT.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; + : base(info, LedMappings.Headset, updateQueue) + { } #endregion } diff --git a/RGB.NET.Devices.Corsair/Headset/HeadsetIdMapping.cs b/RGB.NET.Devices.Corsair/Headset/HeadsetIdMapping.cs deleted file mode 100644 index 7448184..0000000 --- a/RGB.NET.Devices.Corsair/Headset/HeadsetIdMapping.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Corsair -{ - internal static class HeadsetIdMapping - { - internal static readonly Dictionary DEFAULT = new() - { - { LedId.Headset1, CorsairLedId.LeftLogo }, - { LedId.Headset2, CorsairLedId.RightLogo }, - }; - } -} diff --git a/RGB.NET.Devices.Corsair/HeadsetStand/CorsairHeadsetStandRGBDevice.cs b/RGB.NET.Devices.Corsair/HeadsetStand/CorsairHeadsetStandRGBDevice.cs index ca17c0e..e55ab93 100644 --- a/RGB.NET.Devices.Corsair/HeadsetStand/CorsairHeadsetStandRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/HeadsetStand/CorsairHeadsetStandRGBDevice.cs @@ -1,12 +1,7 @@ // ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedMember.Global -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; using RGB.NET.Core; -using RGB.NET.Devices.Corsair.Native; namespace RGB.NET.Devices.Corsair { @@ -24,44 +19,8 @@ namespace RGB.NET.Devices.Corsair /// /// The specific information provided by CUE for the headset stand internal CorsairHeadsetStandRGBDevice(CorsairHeadsetStandRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) - : base(info, updateQueue) - { - InitializeLayout(); - } - - #endregion - - #region Methods - - private void InitializeLayout() - { - _CorsairLedPositions? nativeLedPositions = (_CorsairLedPositions?)Marshal.PtrToStructure(_CUESDK.CorsairGetLedPositionsByDeviceIndex(DeviceInfo.CorsairDeviceIndex), typeof(_CorsairLedPositions)); - if (nativeLedPositions == null) return; - - int structSize = Marshal.SizeOf(typeof(_CorsairLedPosition)); - IntPtr ptr = nativeLedPositions.pLedPosition; - - List<_CorsairLedPosition> positions = new(); - for (int i = 0; i < nativeLedPositions.numberOfLed; i++) - { - _CorsairLedPosition? ledPosition = (_CorsairLedPosition?)Marshal.PtrToStructure(ptr, typeof(_CorsairLedPosition)); - if (ledPosition == null) continue; - - ptr = new IntPtr(ptr.ToInt64() + structSize); - positions.Add(ledPosition); - } - - Dictionary mapping = HeadsetStandIdMapping.DEFAULT.SwapKeyValue(); - foreach (_CorsairLedPosition ledPosition in positions.OrderBy(p => p.LedId)) - { - LedId ledId = mapping.TryGetValue(ledPosition.LedId, out LedId id) ? id : LedId.Invalid; - Rectangle rectangle = ledPosition.ToRectangle(); - AddLed(ledId, rectangle.Location, rectangle.Size); - } - } - - /// - protected override object GetLedCustomData(LedId ledId) => HeadsetStandIdMapping.DEFAULT.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; + : base(info, LedMappings.HeadsetStand, updateQueue) + { } #endregion } diff --git a/RGB.NET.Devices.Corsair/HeadsetStand/HeadsetStandIdMapping.cs b/RGB.NET.Devices.Corsair/HeadsetStand/HeadsetStandIdMapping.cs deleted file mode 100644 index 4987118..0000000 --- a/RGB.NET.Devices.Corsair/HeadsetStand/HeadsetStandIdMapping.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Corsair -{ - internal static class HeadsetStandIdMapping - { - internal static readonly Dictionary DEFAULT = new() - { - { LedId.HeadsetStand1, CorsairLedId.HeadsetStandZone1 }, - { LedId.HeadsetStand2, CorsairLedId.HeadsetStandZone2 }, - { LedId.HeadsetStand3, CorsairLedId.HeadsetStandZone3 }, - { LedId.HeadsetStand4, CorsairLedId.HeadsetStandZone4 }, - { LedId.HeadsetStand5, CorsairLedId.HeadsetStandZone5 }, - { LedId.HeadsetStand6, CorsairLedId.HeadsetStandZone6 }, - { LedId.HeadsetStand7, CorsairLedId.HeadsetStandZone7 }, - { LedId.HeadsetStand8, CorsairLedId.HeadsetStandZone8 }, - { LedId.HeadsetStand9, CorsairLedId.HeadsetStandZone9 } - }; - } -} diff --git a/RGB.NET.Devices.Corsair/Keyboard/CorsairKeyboardRGBDevice.cs b/RGB.NET.Devices.Corsair/Keyboard/CorsairKeyboardRGBDevice.cs index 268cd75..68eb450 100644 --- a/RGB.NET.Devices.Corsair/Keyboard/CorsairKeyboardRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/Keyboard/CorsairKeyboardRGBDevice.cs @@ -1,11 +1,7 @@ // ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedMember.Global -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; using RGB.NET.Core; -using RGB.NET.Devices.Corsair.Native; namespace RGB.NET.Devices.Corsair { @@ -29,38 +25,8 @@ namespace RGB.NET.Devices.Corsair /// /// The specific information provided by CUE for the keyboard internal CorsairKeyboardRGBDevice(CorsairKeyboardRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) - : base(info, updateQueue) - { - InitializeLayout(); - } - - #endregion - - #region Methods - - private void InitializeLayout() - { - _CorsairLedPositions? nativeLedPositions = (_CorsairLedPositions?)Marshal.PtrToStructure(_CUESDK.CorsairGetLedPositionsByDeviceIndex(DeviceInfo.CorsairDeviceIndex), typeof(_CorsairLedPositions)); - if (nativeLedPositions == null) return; - - int structSize = Marshal.SizeOf(typeof(_CorsairLedPosition)); - IntPtr ptr = nativeLedPositions.pLedPosition; - - Dictionary mapping = KeyboardIdMapping.DEFAULT.SwapKeyValue(); - for (int i = 0; i < nativeLedPositions.numberOfLed; i++) - { - _CorsairLedPosition? ledPosition = (_CorsairLedPosition?)Marshal.PtrToStructure(ptr, typeof(_CorsairLedPosition)); - if (ledPosition == null) continue; - - LedId ledId = mapping.TryGetValue(ledPosition.LedId, out LedId id) ? id : LedId.Invalid; - Rectangle rectangle = ledPosition.ToRectangle(); - AddLed(ledId, rectangle.Location, rectangle.Size); - - ptr = new IntPtr(ptr.ToInt64() + structSize); - } - } - - protected override object GetLedCustomData(LedId ledId) => KeyboardIdMapping.DEFAULT.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; + : base(info, LedMappings.Keyboard, updateQueue) + { } #endregion } diff --git a/RGB.NET.Devices.Corsair/Mainboard/CorsairMainboardRGBDevice.cs b/RGB.NET.Devices.Corsair/Mainboard/CorsairMainboardRGBDevice.cs new file mode 100644 index 0000000..9652bf0 --- /dev/null +++ b/RGB.NET.Devices.Corsair/Mainboard/CorsairMainboardRGBDevice.cs @@ -0,0 +1,27 @@ +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable UnusedMember.Global + +using RGB.NET.Core; + +namespace RGB.NET.Devices.Corsair +{ + /// + /// + /// Represents a corsair memory. + /// + public class CorsairMainboardRGBDevice : CorsairRGBDevice, IMainboard + { + #region Constructors + + /// + /// + /// Initializes a new instance of the class. + /// + /// The specific information provided by CUE for the memory. + internal CorsairMainboardRGBDevice(CorsairMainboardRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) + : base(info, LedMappings.Mainboard, updateQueue) + { } + + #endregion + } +} diff --git a/RGB.NET.Devices.Corsair/Mainboard/CorsairMainboardRGBDeviceInfo.cs b/RGB.NET.Devices.Corsair/Mainboard/CorsairMainboardRGBDeviceInfo.cs new file mode 100644 index 0000000..43e58b0 --- /dev/null +++ b/RGB.NET.Devices.Corsair/Mainboard/CorsairMainboardRGBDeviceInfo.cs @@ -0,0 +1,29 @@ +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable UnusedMember.Global + +using RGB.NET.Core; +using RGB.NET.Devices.Corsair.Native; + +namespace RGB.NET.Devices.Corsair +{ + /// + /// + /// Represents a generic information for a . + /// + public class CorsairMainboardRGBDeviceInfo : CorsairRGBDeviceInfo + { + #region Constructors + + /// + /// + /// Internal constructor of managed . + /// + /// The index of the . + /// The native -struct + internal CorsairMainboardRGBDeviceInfo(int deviceIndex, _CorsairDeviceInfo nativeInfo) + : base(deviceIndex, RGBDeviceType.Mainboard, nativeInfo) + { } + + #endregion + } +} diff --git a/RGB.NET.Devices.Corsair/Memory/CorsairMemoryRGBDevice.cs b/RGB.NET.Devices.Corsair/Memory/CorsairMemoryRGBDevice.cs index cdc42e7..1f37d1c 100644 --- a/RGB.NET.Devices.Corsair/Memory/CorsairMemoryRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/Memory/CorsairMemoryRGBDevice.cs @@ -1,11 +1,7 @@ // ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedMember.Global -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; using RGB.NET.Core; -using RGB.NET.Devices.Corsair.Native; namespace RGB.NET.Devices.Corsair { @@ -23,38 +19,8 @@ namespace RGB.NET.Devices.Corsair /// /// The specific information provided by CUE for the memory. internal CorsairMemoryRGBDevice(CorsairMemoryRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) - : base(info, updateQueue) - { - InitializeLayout(); - } - - #endregion - - #region Methods - - private void InitializeLayout() - { - _CorsairLedPositions? nativeLedPositions = (_CorsairLedPositions?)Marshal.PtrToStructure(_CUESDK.CorsairGetLedPositionsByDeviceIndex(DeviceInfo.CorsairDeviceIndex), typeof(_CorsairLedPositions)); - if (nativeLedPositions == null) return; - - int structSize = Marshal.SizeOf(typeof(_CorsairLedPosition)); - IntPtr ptr = nativeLedPositions.pLedPosition; - - Dictionary mapping = MemoryIdMapping.DEFAULT.SwapKeyValue(); - for (int i = 0; i < nativeLedPositions.numberOfLed; i++) - { - _CorsairLedPosition? ledPosition = (_CorsairLedPosition?)Marshal.PtrToStructure(ptr, typeof(_CorsairLedPosition)); - if (ledPosition == null) continue; - - LedId ledId = mapping.TryGetValue(ledPosition.LedId, out LedId id) ? id : LedId.Invalid; - Rectangle rectangle = ledPosition.ToRectangle(); - AddLed(ledId, rectangle.Location, rectangle.Size); - - ptr = new IntPtr(ptr.ToInt64() + structSize); - } - } - - protected override object GetLedCustomData(LedId ledId) => MemoryIdMapping.DEFAULT.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; + : base(info, LedMappings.Memory, updateQueue) + { } #endregion } diff --git a/RGB.NET.Devices.Corsair/Memory/MemoryIdMapping.cs b/RGB.NET.Devices.Corsair/Memory/MemoryIdMapping.cs deleted file mode 100644 index 50750cd..0000000 --- a/RGB.NET.Devices.Corsair/Memory/MemoryIdMapping.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Corsair -{ - internal static class MemoryIdMapping - { - internal static readonly Dictionary DEFAULT = new() - { - { LedId.Invalid, CorsairLedId.Invalid }, - { LedId.DRAM1, CorsairLedId.DRAM1 }, - { LedId.DRAM2, CorsairLedId.DRAM2 }, - { LedId.DRAM3, CorsairLedId.DRAM3 }, - { LedId.DRAM4, CorsairLedId.DRAM4 }, - { LedId.DRAM5, CorsairLedId.DRAM5 }, - { LedId.DRAM6, CorsairLedId.DRAM6 }, - { LedId.DRAM7, CorsairLedId.DRAM7 }, - { LedId.DRAM8, CorsairLedId.DRAM8 }, - { LedId.DRAM9, CorsairLedId.DRAM9 }, - { LedId.DRAM10, CorsairLedId.DRAM10 }, - { LedId.DRAM11, CorsairLedId.DRAM11 }, - { LedId.DRAM12, CorsairLedId.DRAM12 }, - }; - } -} diff --git a/RGB.NET.Devices.Corsair/Mouse/CorsairMouseRGBDevice.cs b/RGB.NET.Devices.Corsair/Mouse/CorsairMouseRGBDevice.cs index a3d015f..e69e22e 100644 --- a/RGB.NET.Devices.Corsair/Mouse/CorsairMouseRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/Mouse/CorsairMouseRGBDevice.cs @@ -1,7 +1,6 @@ // ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedMember.Global -using System; using RGB.NET.Core; namespace RGB.NET.Devices.Corsair @@ -20,51 +19,8 @@ namespace RGB.NET.Devices.Corsair /// /// The specific information provided by CUE for the mouse internal CorsairMouseRGBDevice(CorsairMouseRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) - : base(info, updateQueue) - { - InitializeLayout(); - } - - #endregion - - #region Methods - - private void InitializeLayout() - { - switch (DeviceInfo.PhysicalLayout) - { - case CorsairPhysicalMouseLayout.Zones1: - AddLed(LedId.Mouse1, new Point(0, 0), new Size(10, 10)); - break; - case CorsairPhysicalMouseLayout.Zones2: - AddLed(LedId.Mouse1, new Point(0, 0), new Size(10, 10)); - AddLed(LedId.Mouse2, new Point(10, 0), new Size(10, 10)); - break; - case CorsairPhysicalMouseLayout.Zones3: - AddLed(LedId.Mouse1, new Point(0, 0), new Size(10, 10)); - AddLed(LedId.Mouse2, new Point(10, 0), new Size(10, 10)); - AddLed(LedId.Mouse3, new Point(20, 0), new Size(10, 10)); - break; - case CorsairPhysicalMouseLayout.Zones4: - AddLed(LedId.Mouse1, new Point(0, 0), new Size(10, 10)); - AddLed(LedId.Mouse2, new Point(10, 0), new Size(10, 10)); - AddLed(LedId.Mouse3, new Point(20, 0), new Size(10, 10)); - AddLed(LedId.Mouse4, new Point(30, 0), new Size(10, 10)); - break; - default: - throw new RGBDeviceException($"Can't initialize mouse with layout '{DeviceInfo.PhysicalLayout}'"); - } - } - - protected override object GetLedCustomData(LedId ledId) - { - if (string.Equals(DeviceInfo.Model, "GLAIVE RGB", StringComparison.OrdinalIgnoreCase)) - return MouseIdMapping.GLAIVE.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; - else if (string.Equals(DeviceInfo.Model, "M65 RGB ELITE", StringComparison.OrdinalIgnoreCase)) - return MouseIdMapping.M65_RGB_ELITE.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; - else - return MouseIdMapping.DEFAULT.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; - } + : base(info, LedMappings.Mouse, updateQueue) + { } #endregion } diff --git a/RGB.NET.Devices.Corsair/Mouse/MouseIdMapping.cs b/RGB.NET.Devices.Corsair/Mouse/MouseIdMapping.cs deleted file mode 100644 index 95982fd..0000000 --- a/RGB.NET.Devices.Corsair/Mouse/MouseIdMapping.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Corsair -{ - internal static class MouseIdMapping - { - internal static readonly Dictionary DEFAULT = new() - { - { LedId.Mouse1, CorsairLedId.B1 }, - { LedId.Mouse2, CorsairLedId.B2 }, - { LedId.Mouse3, CorsairLedId.B3 }, - { LedId.Mouse4, CorsairLedId.B4 }, - { LedId.Mouse5, CorsairLedId.B5 }, - { LedId.Mouse6, CorsairLedId.B6 }, - }; - - internal static readonly Dictionary GLAIVE = new() - { - { LedId.Mouse1, CorsairLedId.B1 }, - { LedId.Mouse2, CorsairLedId.B2 }, - { LedId.Mouse3, CorsairLedId.B5 }, - }; - - internal static readonly Dictionary M65_RGB_ELITE = new() - { - { LedId.Mouse1, CorsairLedId.B1 }, - { LedId.Mouse2, CorsairLedId.B3 }, - }; - } -} diff --git a/RGB.NET.Devices.Corsair/Mousepad/CorsairMousepadRGBDevice.cs b/RGB.NET.Devices.Corsair/Mousepad/CorsairMousepadRGBDevice.cs index 1f74aee..d475a6f 100644 --- a/RGB.NET.Devices.Corsair/Mousepad/CorsairMousepadRGBDevice.cs +++ b/RGB.NET.Devices.Corsair/Mousepad/CorsairMousepadRGBDevice.cs @@ -1,12 +1,7 @@ // ReSharper disable MemberCanBePrivate.Global // ReSharper disable UnusedMember.Global -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; using RGB.NET.Core; -using RGB.NET.Devices.Corsair.Native; namespace RGB.NET.Devices.Corsair { @@ -24,43 +19,8 @@ namespace RGB.NET.Devices.Corsair /// /// The specific information provided by CUE for the mousepad internal CorsairMousepadRGBDevice(CorsairMousepadRGBDeviceInfo info, CorsairDeviceUpdateQueue updateQueue) - : base(info, updateQueue) - { - InitializeLayout(); - } - - #endregion - - #region Methods - - private void InitializeLayout() - { - _CorsairLedPositions? nativeLedPositions = (_CorsairLedPositions?)Marshal.PtrToStructure(_CUESDK.CorsairGetLedPositionsByDeviceIndex(DeviceInfo.CorsairDeviceIndex), typeof(_CorsairLedPositions)); - if (nativeLedPositions == null) return; - - int structSize = Marshal.SizeOf(typeof(_CorsairLedPosition)); - IntPtr ptr = nativeLedPositions.pLedPosition; - - List<_CorsairLedPosition> positions = new(); - for (int i = 0; i < nativeLedPositions.numberOfLed; i++) - { - _CorsairLedPosition? ledPosition = (_CorsairLedPosition?)Marshal.PtrToStructure(ptr, typeof(_CorsairLedPosition)); - if (ledPosition == null) continue; - - ptr = new IntPtr(ptr.ToInt64() + structSize); - positions.Add(ledPosition); - } - - Dictionary mapping = MousepadIdMapping.DEFAULT.SwapKeyValue(); - foreach (_CorsairLedPosition ledPosition in positions.OrderBy(p => p.LedId)) - { - LedId ledId = mapping.TryGetValue(ledPosition.LedId, out LedId id) ? id : LedId.Invalid; - Rectangle rectangle = ledPosition.ToRectangle(); - AddLed(ledId, rectangle.Location, rectangle.Size); - } - } - - protected override object GetLedCustomData(LedId ledId) => MousepadIdMapping.DEFAULT.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid; + : base(info, LedMappings.Mousepad, updateQueue) + { } #endregion } diff --git a/RGB.NET.Devices.Corsair/Mousepad/MousepadIdMapping.cs b/RGB.NET.Devices.Corsair/Mousepad/MousepadIdMapping.cs deleted file mode 100644 index a415df6..0000000 --- a/RGB.NET.Devices.Corsair/Mousepad/MousepadIdMapping.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.Generic; -using RGB.NET.Core; - -namespace RGB.NET.Devices.Corsair -{ - internal static class MousepadIdMapping - { - internal static readonly Dictionary DEFAULT = new() - { - { LedId.Mousepad1, CorsairLedId.Zone1 }, - { LedId.Mousepad2, CorsairLedId.Zone2 }, - { LedId.Mousepad3, CorsairLedId.Zone3 }, - { LedId.Mousepad4, CorsairLedId.Zone4 }, - { LedId.Mousepad5, CorsairLedId.Zone5 }, - { LedId.Mousepad6, CorsairLedId.Zone6 }, - { LedId.Mousepad7, CorsairLedId.Zone7 }, - { LedId.Mousepad8, CorsairLedId.Zone8 }, - { LedId.Mousepad9, CorsairLedId.Zone9 }, - { LedId.Mousepad10, CorsairLedId.Zone10 }, - { LedId.Mousepad11, CorsairLedId.Zone11 }, - { LedId.Mousepad12, CorsairLedId.Zone12 }, - { LedId.Mousepad13, CorsairLedId.Zone13 }, - { LedId.Mousepad14, CorsairLedId.Zone14 }, - { LedId.Mousepad15, CorsairLedId.Zone15 } - }; - } -} diff --git a/RGB.NET.Devices.Corsair/RGB.NET.Devices.Corsair.csproj.DotSettings b/RGB.NET.Devices.Corsair/RGB.NET.Devices.Corsair.csproj.DotSettings index 704d9f9..0501b9d 100644 --- a/RGB.NET.Devices.Corsair/RGB.NET.Devices.Corsair.csproj.DotSettings +++ b/RGB.NET.Devices.Corsair/RGB.NET.Devices.Corsair.csproj.DotSettings @@ -1,8 +1,10 @@  True + True True True True + True True True False