/// <inheritdoc /> /// <exception cref="RGBDeviceException">Thrown if the SDK is already initialized or if the SDK is not compatible to CUE.</exception> /// <exception cref="CUEException">Thrown if the CUE-SDK provides an error.</exception> public bool Initialize(RGBDeviceType loadFilter = RGBDeviceType.All, bool exclusiveAccessIfPossible = false, bool throwExceptions = false) { IsInitialized = false; try { UpdateTrigger?.Stop(); _CUESDK.Reload(); ProtocolDetails = new CorsairProtocolDetails(_CUESDK.CorsairPerformProtocolHandshake()); CorsairError error = LastError; if (error != CorsairError.Success) { throw new CUEException(error); } if (ProtocolDetails.BreakingChanges) { throw new RGBDeviceException("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 (exclusiveAccessIfPossible) { if (!_CUESDK.CorsairRequestControl(CorsairAccessMode.ExclusiveLightingControl)) { throw new CUEException(LastError); } HasExclusiveAccess = true; } else { HasExclusiveAccess = false; } // DarthAffe 07.07.2018: 127 is CUE, we want to directly compete with it as in older versions. if (!_CUESDK.CorsairSetLayerPriority(127)) { throw new CUEException(LastError); } Dictionary <string, int> modelCounter = new Dictionary <string, int>(); IList <IRGBDevice> devices = new List <IRGBDevice>(); int deviceCount = _CUESDK.CorsairGetDeviceCount(); for (int i = 0; i < deviceCount; i++) { try { _CorsairDeviceInfo nativeDeviceInfo = (_CorsairDeviceInfo)Marshal.PtrToStructure(_CUESDK.CorsairGetDeviceInfo(i), typeof(_CorsairDeviceInfo)); CorsairRGBDeviceInfo info = new CorsairRGBDeviceInfo(i, RGBDeviceType.Unknown, nativeDeviceInfo, modelCounter); if (!info.CapsMask.HasFlag(CorsairDeviceCaps.Lighting)) { continue; // Everything that doesn't support lighting control is useless } CorsairDeviceUpdateQueue deviceUpdateQueue = null; foreach (ICorsairRGBDevice device in GetRGBDevice(info, i, nativeDeviceInfo, modelCounter)) { if ((device == null) || !loadFilter.HasFlag(device.DeviceInfo.DeviceType)) { continue; } if (deviceUpdateQueue == null) { deviceUpdateQueue = new CorsairDeviceUpdateQueue(UpdateTrigger, info.CorsairDeviceIndex); } device.Initialize(deviceUpdateQueue); AddSpecialParts(device); error = LastError; if (error != CorsairError.Success) { throw new CUEException(error); } devices.Add(device); } } catch { if (throwExceptions) { throw; } } } UpdateTrigger?.Start(); Devices = new ReadOnlyCollection <IRGBDevice>(devices); IsInitialized = true; } catch { Reset(); if (throwExceptions) { throw; } return(false); } return(true); }
/// <inheritdoc /> /// <exception cref="RGBDeviceException">Thrown if the SDK is already initialized or if the SDK is not compatible to CUE.</exception> /// <exception cref="CUEException">Thrown if the CUE-SDK provides an error.</exception> public bool Initialize(bool exclusiveAccessIfPossible = false, bool throwExceptions = false) { IsInitialized = false; try { _CUESDK.Reload(); ProtocolDetails = new CorsairProtocolDetails(_CUESDK.CorsairPerformProtocolHandshake()); CorsairError error = LastError; if (error != CorsairError.Success) { throw new CUEException(error); } if (ProtocolDetails.BreakingChanges) { throw new RGBDeviceException("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 (exclusiveAccessIfPossible) { if (!_CUESDK.CorsairRequestControl(CorsairAccessMode.ExclusiveLightingControl)) { throw new CUEException(LastError); } HasExclusiveAccess = true; } else { HasExclusiveAccess = false; } IList <IRGBDevice> devices = new List <IRGBDevice>(); int deviceCount = _CUESDK.CorsairGetDeviceCount(); for (int i = 0; i < deviceCount; i++) { try { _CorsairDeviceInfo nativeDeviceInfo = (_CorsairDeviceInfo)Marshal.PtrToStructure(_CUESDK.CorsairGetDeviceInfo(i), typeof(_CorsairDeviceInfo)); CorsairRGBDeviceInfo info = new CorsairRGBDeviceInfo(i, RGBDeviceType.Unknown, nativeDeviceInfo); if (!info.CapsMask.HasFlag(CorsairDeviceCaps.Lighting)) { continue; // Everything that doesn't support lighting control is useless } ICorsairRGBDevice device; switch (info.CorsairDeviceType) { case CorsairDeviceType.Keyboard: device = new CorsairKeyboardRGBDevice(new CorsairKeyboardRGBDeviceInfo(i, nativeDeviceInfo)); break; case CorsairDeviceType.Mouse: device = new CorsairMouseRGBDevice(new CorsairMouseRGBDeviceInfo(i, nativeDeviceInfo)); break; case CorsairDeviceType.Headset: device = new CorsairHeadsetRGBDevice(new CorsairHeadsetRGBDeviceInfo(i, nativeDeviceInfo)); break; case CorsairDeviceType.Mousepad: device = new CorsairMousepadRGBDevice(new CorsairMousepadRGBDeviceInfo(i, nativeDeviceInfo)); break; case CorsairDeviceType.HeadsetStand: device = new CorsairHeadsetStandRGBDevice(new CorsairHeadsetStandRGBDeviceInfo(i, nativeDeviceInfo)); break; // ReSharper disable once RedundantCaseLabel case CorsairDeviceType.Unknown: default: throw new RGBDeviceException("Unknown Device-Type"); } device.Initialize(); AddSpecialParts(device); error = LastError; if (error != CorsairError.Success) { throw new CUEException(error); } devices.Add(device); } catch { if (throwExceptions) { throw; } } } Devices = new ReadOnlyCollection <IRGBDevice>(devices); IsInitialized = true; } catch { Reset(); if (throwExceptions) { throw; } return(false); } return(true); }