diff --git a/CUE.NET.csproj b/CUE.NET.csproj index a378353..61b3900 100644 --- a/CUE.NET.csproj +++ b/CUE.NET.csproj @@ -58,6 +58,9 @@ + + + diff --git a/CUE.NET.sln b/CUE.NET.sln index 8183f2b..d99caab 100644 --- a/CUE.NET.sln +++ b/CUE.NET.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUE.NET", "CUE.NET.csproj", "{70A266B5-E9D4-4EAA-A91A-947C0039FFB6}" EndProject @@ -20,12 +20,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "libs", "libs", "{D69EF6D8-6 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "x86", "x86", "{0525D895-E706-4920-8733-DABD9194BFB1}" ProjectSection(SolutionItems) = preProject - libs\x86\CUESDK_2013.dll = libs\x86\CUESDK_2013.dll + bin\x86\CUESDK_2015.dll = bin\x86\CUESDK_2015.dll EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "x64", "x64", "{2F99124B-FAED-432D-B797-45566D373411}" ProjectSection(SolutionItems) = preProject - libs\x64\CUESDK_2013.dll = libs\x64\CUESDK_2013.dll + bin\x64\CUESDK_2015.dll = bin\x64\CUESDK_2015.dll EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AudioAnalyzer", "AudioAnalyzer", "{BE16A0BF-6794-4718-AF27-F2A50078D880}" diff --git a/CueSDK.cs b/CueSDK.cs index 5a233ad..0369cfd 100644 --- a/CueSDK.cs +++ b/CueSDK.cs @@ -7,6 +7,7 @@ using CUE.NET.Devices.Generic.Enums; using CUE.NET.Devices.Headset; using CUE.NET.Devices.Keyboard; using CUE.NET.Devices.Mouse; +using CUE.NET.Devices.Mousemat; using CUE.NET.Exceptions; using CUE.NET.Native; @@ -61,6 +62,12 @@ namespace CUE.NET /// public static CorsairHeadset HeadsetSDK { get; private set; } + /// + /// Gets the managed representation of a moustmat managed by the CUE-SDK. + /// Note that currently only one connected mousemat is supported. + /// + public static CorsairMousemat MousematSDK { get; private set; } + // ReSharper restore UnusedAutoPropertyAccessor.Global #endregion @@ -86,6 +93,8 @@ namespace CUE.NET return MouseSDK != null; case CorsairDeviceType.Headset: return HeadsetSDK != null; + case CorsairDeviceType.Mousemat: + return MousematSDK != null; default: return true; } @@ -163,7 +172,9 @@ namespace CUE.NET case CorsairDeviceType.Headset: HeadsetSDK = new CorsairHeadset(new CorsairHeadsetDeviceInfo(nativeDeviceInfo)); break; - + case CorsairDeviceType.Mousemat: + MousematSDK = new CorsairMousemat(new CorsairMousematDeviceInfo(nativeDeviceInfo)); + break; // ReSharper disable once RedundantCaseLabel case CorsairDeviceType.Unknown: default: @@ -198,6 +209,7 @@ namespace CUE.NET KeyboardSDK?.ResetLeds(); MouseSDK?.ResetLeds(); HeadsetSDK?.ResetLeds(); + MousematSDK?.ResetLeds(); _CUESDK.Reload(); @@ -244,6 +256,10 @@ namespace CUE.NET if (!reloadedDevices.ContainsKey(CorsairDeviceType.Headset) || HeadsetSDK.HeadsetDeviceInfo.Model != reloadedDevices[CorsairDeviceType.Headset].Model) throw new WrapperException("The previously loaded Headset got disconnected."); + if (MousematSDK != null) + if (!reloadedDevices.ContainsKey(CorsairDeviceType.Mousemat) + || MousematSDK.MousematDeviceInfo.Model != reloadedDevices[CorsairDeviceType.Mousemat].Model) + throw new WrapperException("The previously loaded Mousemat got disconnected."); IsInitialized = true; } @@ -255,6 +271,7 @@ namespace CUE.NET KeyboardSDK = null; MouseSDK = null; HeadsetSDK = null; + MousematSDK = null; IsInitialized = false; throw new CUEException(error); diff --git a/Devices/Generic/Enums/CorsairDeviceType.cs b/Devices/Generic/Enums/CorsairDeviceType.cs index 4deeeba..0e31b63 100644 --- a/Devices/Generic/Enums/CorsairDeviceType.cs +++ b/Devices/Generic/Enums/CorsairDeviceType.cs @@ -11,6 +11,7 @@ namespace CUE.NET.Devices.Generic.Enums Unknown = 0, Mouse = 1, Keyboard = 2, - Headset = 3 + Headset = 3, + Mousemat = 4 }; } diff --git a/Devices/Mousemat/CorsairMousemat.cs b/Devices/Mousemat/CorsairMousemat.cs new file mode 100644 index 0000000..efcdc0d --- /dev/null +++ b/Devices/Mousemat/CorsairMousemat.cs @@ -0,0 +1,149 @@ +// ReSharper disable UnusedAutoPropertyAccessor.Global +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable UnusedMember.Global + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using CUE.NET.Devices.Generic; +using CUE.NET.Devices.Generic.Enums; +using CUE.NET.Devices.Mousemat.Enums; +using CUE.NET.Effects; +using CUE.NET.Exceptions; +using CUE.NET.Native; + +namespace CUE.NET.Devices.Mousemat +{ + /// + /// Represents the SDK for a corsair mousemat. + /// + public class CorsairMousemat : AbstractCueDevice, IEnumerable + { + #region Properties & Fields + + #region Indexer + + /// + /// Gets the with the specified ID. + /// + /// The ID of the LED to get. + /// The LED with the specified ID. + public CorsairLed this[CorsairMousematLedId ledId] + { + get + { + CorsairLed led; + return base.Leds.TryGetValue((int)ledId, out led) ? led : null; + } + } + + #endregion + + /// + /// Gets specific information provided by CUE for the mousemat. + /// + public CorsairMousematDeviceInfo MousematDeviceInfo { get; } + + /// + /// Gets a value indicating if the mousemat has an active effect to deal with or not. + /// + protected override bool HasEffect => false; + + /// + /// Gets a read-only collection containing all LEDs of the mousemat. + /// + public new IEnumerable Leds => new ReadOnlyCollection(base.Leds.Values.ToList()); + + #endregion + + #region Constructors + + /// + /// Initializes a new instance of the class. + /// + /// The specific information provided by CUE for the mousemat + internal CorsairMousemat(CorsairMousematDeviceInfo info) + : base(info) + { + this.MousematDeviceInfo = info; + InitializeLeds(); + } + + #endregion + + #region Methods + + private void InitializeLeds() + { + int deviceCount = _CUESDK.CorsairGetDeviceCount(); + + // Get mousemat device index + int mousematIndex = -1; + for (int i = 0; i < deviceCount; i++) + { + _CorsairDeviceInfo nativeDeviceInfo = (_CorsairDeviceInfo)Marshal.PtrToStructure(_CUESDK.CorsairGetDeviceInfo(i), typeof(_CorsairDeviceInfo)); + GenericDeviceInfo info = new GenericDeviceInfo(nativeDeviceInfo); + if (info.Type != CorsairDeviceType.Mousemat) + continue; + + mousematIndex = i; + break; + } + if (mousematIndex < 0) + throw new WrapperException("Can't determine mousemat device index"); + + _CorsairLedPositions nativeLedPositions = (_CorsairLedPositions)Marshal.PtrToStructure(_CUESDK.CorsairGetLedPositionsByDeviceIndex(mousematIndex), typeof(_CorsairLedPositions)); + int structSize = Marshal.SizeOf(typeof(_CorsairLedPosition)); + IntPtr ptr = nativeLedPositions.pLedPosition; + + // Put the positions in an array for sorting later on + List<_CorsairLedPosition> positions = new List<_CorsairLedPosition>(); + for (int i = 0; i < nativeLedPositions.numberOfLed; i++) + { + _CorsairLedPosition ledPosition = (_CorsairLedPosition)Marshal.PtrToStructure(ptr, typeof(_CorsairLedPosition)); + ptr = new IntPtr(ptr.ToInt64() + structSize); + positions.Add(ledPosition); + } + + // Sort for easy iteration by clients + foreach (_CorsairLedPosition position in positions.OrderBy(p => p.ledId)) + GetLed((int)position.ledId); + } + + protected override void DeviceUpdate() + { + //TODO SpoinkyNL 01.09.2016: I'm not sure what DarthAffe is planning with this, will note in PR + } + + protected override void ApplyEffect(IEffect effect) + { + //TODO SpoinkyNL 09.09.2016: How should brushes be applied to mousemats? This seems to be gone in the dev branch + foreach (CorsairLed led in effect.LedList) + led.Color = effect.EffectBrush.GetColorAtPoint(new RectangleF(0, 0, 2, 2), new PointF(1, 1)); + } + + #region IEnumerable + + /// + /// Returns an enumerator that iterates over all LEDs of the mousemat. + /// + /// An enumerator for all LDS of the mousemat. + public IEnumerator GetEnumerator() + { + return Leds.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + #endregion + + #endregion + } +} \ No newline at end of file diff --git a/Devices/Mousemat/CorsairMousematDeviceInfo.cs b/Devices/Mousemat/CorsairMousematDeviceInfo.cs new file mode 100644 index 0000000..41be788 --- /dev/null +++ b/Devices/Mousemat/CorsairMousematDeviceInfo.cs @@ -0,0 +1,27 @@ +// ReSharper disable MemberCanBePrivate.Global +// ReSharper disable UnusedAutoPropertyAccessor.Global + +using CUE.NET.Devices.Generic; +using CUE.NET.Native; + +namespace CUE.NET.Devices.Mousemat +{ + /// + /// Represents specific information for a CUE Mousemat. + /// + public class CorsairMousematDeviceInfo : GenericDeviceInfo + { + #region Constructors + + /// + /// Internal constructor of managed . + /// + /// The native -struct + internal CorsairMousematDeviceInfo(_CorsairDeviceInfo nativeInfo) + : base(nativeInfo) + { + } + + #endregion + } +} \ No newline at end of file diff --git a/Devices/Mousemat/Enums/CorsairMousematLedId.cs b/Devices/Mousemat/Enums/CorsairMousematLedId.cs new file mode 100644 index 0000000..d3a6d5f --- /dev/null +++ b/Devices/Mousemat/Enums/CorsairMousematLedId.cs @@ -0,0 +1,25 @@ +namespace CUE.NET.Devices.Mousemat.Enums +{ + /// + /// Contains list of all LEDs available for corsair mousemats. + /// + public enum CorsairMousematLedId + { + Invalid = 0, + Zone1 = 155, + Zone2 = 156, + Zone3 = 157, + Zone4 = 158, + Zone5 = 159, + Zone6 = 160, + Zone7 = 161, + Zone8 = 162, + Zone9 = 163, + Zone10 = 164, + Zone11 = 165, + Zone12 = 166, + Zone13 = 167, + Zone14 = 168, + Zone15 = 169 + } +} \ No newline at end of file diff --git a/Examples/AudioAnalyzer/Example_AudioAnalyzer_full/Example_AudioAnalyzer_full.csproj b/Examples/AudioAnalyzer/Example_AudioAnalyzer_full/Example_AudioAnalyzer_full.csproj index 6ba9d6d..f15269a 100644 --- a/Examples/AudioAnalyzer/Example_AudioAnalyzer_full/Example_AudioAnalyzer_full.csproj +++ b/Examples/AudioAnalyzer/Example_AudioAnalyzer_full/Example_AudioAnalyzer_full.csproj @@ -96,7 +96,7 @@ - xcopy "$(SolutionDir)libs\x86\CUESDK_2013.dll" "$(TargetDir)x86\" /y + xcopy "$(SolutionDir)libs\x86\CUESDK_2015.dll" "$(TargetDir)x86\" /y