// ReSharper disable MemberCanBePrivate.Global using System.Runtime.InteropServices; using CUE.NET.Devices.Generic; using CUE.NET.Devices.Generic.Enums; using CUE.NET.Devices.Headset; using CUE.NET.Devices.Keyboard; using CUE.NET.Devices.Mouse; using CUE.NET.Exceptions; using CUE.NET.Native; namespace CUE.NET { public static class CueSDK { #region Properties & Fields // ReSharper disable UnusedAutoPropertyAccessor.Global /// /// Gets the loaded architecture (x64/x86). /// public static string LoadedArchitecture => _CUESDK.LoadedArchitecture; /// /// Gets the protocol details for the current SDK-connection. /// public static CorsairProtocolDetails ProtocolDetails { get; private set; } /// /// Gets whether the application has exclusive access to the SDK or not. /// public static bool HasExclusiveAccess { get; private set; } /// /// Gets the last error documented by CUE. /// public static CorsairError LastError => _CUESDK.CorsairGetLastError(); /// /// Gets the managed representation of a keyboard managed by the CUE-SDK. /// Note that currently only one connected keyboard is supported. /// public static CorsairKeyboard KeyboardSDK { get; private set; } /// /// Gets the managed representation of a mouse managed by the CUE-SDK. /// Note that currently only one connected mouse is supported. /// public static CorsairMouse MouseSDK { get; private set; } /// /// Gets the managed representation of a headset managed by the CUE-SDK. /// Note that currently only one connected headset is supported. /// public static CorsairHeadset HeadsetSDK { get; private set; } // ReSharper restore UnusedAutoPropertyAccessor.Global #endregion #region Methods /// /// Initializes the CUE-SDK. This method should be called exactly ONE time, before anything else is done. /// /// Specifies whether the application should request exclusive access or not. /// Thrown if the SDK is already initialized, the SDK is not compatible to CUE or if CUE returns unknown devices. public static void Initialize(bool exclusiveAccess = false) { if (ProtocolDetails != null) throw new WrapperException("CueSDK is already initialized."); ProtocolDetails = new CorsairProtocolDetails(_CUESDK.CorsairPerformProtocolHandshake()); CorsairError error = LastError; if (error != CorsairError.Success) Throw(error); if (ProtocolDetails.BreakingChanges) throw new WrapperException("The SDK currently used isn't compatible with the installed version of CUE.\r\n" + $"CUE-Version: {ProtocolDetails.ServerVersion} (Protocol {ProtocolDetails.ServerProtocolVersion})\r\n" + $"SDK-Version: {ProtocolDetails.SdkVersion} (Protocol {ProtocolDetails.SdkProtocolVersion})"); if (exclusiveAccess) { if (!_CUESDK.CorsairRequestControl(CorsairAccessMode.ExclusiveLightingControl)) Throw(error); HasExclusiveAccess = true; } int deviceCount = _CUESDK.CorsairGetDeviceCount(); for (int i = 0; i < deviceCount; i++) { _CorsairDeviceInfo nativeDeviceInfo = (_CorsairDeviceInfo)Marshal.PtrToStructure(_CUESDK.CorsairGetDeviceInfo(i), typeof(_CorsairDeviceInfo)); GenericDeviceInfo info = new GenericDeviceInfo(nativeDeviceInfo); if (!info.CapsMask.HasFlag(CorsairDeviceCaps.Lighting)) continue; // Everything that doesn't support lighting control is useless switch (info.Type) { case CorsairDeviceType.Keyboard: KeyboardSDK = new CorsairKeyboard(new CorsairKeyboardDeviceInfo(nativeDeviceInfo)); break; case CorsairDeviceType.Mouse: MouseSDK = new CorsairMouse(new CorsairMouseDeviceInfo(nativeDeviceInfo)); break; case CorsairDeviceType.Headset: HeadsetSDK = new CorsairHeadset(new CorsairHeadsetDeviceInfo(nativeDeviceInfo)); break; // ReSharper disable once RedundantCaseLabel case CorsairDeviceType.Unknown: default: throw new WrapperException("Unknown Device-Type"); } error = LastError; if (error != CorsairError.Success) Throw(error); } } private static void Throw(CorsairError error) { ProtocolDetails = null; HasExclusiveAccess = false; KeyboardSDK = null; MouseSDK = null; HeadsetSDK = null; throw new CUEException(error); } #endregion } }