mirror of
https://github.com/DarthAffe/RGB.NET.git
synced 2025-12-13 01:58:30 +00:00
Merge pull request #303 from DarthAffe/DeviceExceptionHandling
Added exception-handling to all UpdateQueues
This commit is contained in:
commit
1b4b92b44c
@ -178,7 +178,7 @@ public abstract class AbstractRGBDeviceProvider : IRGBDeviceProvider
|
||||
/// </summary>
|
||||
/// <param name="ex">The exception to throw.</param>
|
||||
/// <param name="isCritical">Indicates if the exception is critical for device provider to work correctly.</param>
|
||||
protected virtual void Throw(Exception ex, bool isCritical = false)
|
||||
public virtual void Throw(Exception ex, bool isCritical = false)
|
||||
{
|
||||
ExceptionEventArgs args = new(ex, isCritical, ThrowsExceptions);
|
||||
try { OnException(args); } catch { /* we don't want to throw due to bad event handlers */ }
|
||||
|
||||
@ -20,6 +20,10 @@ public interface IRGBDeviceProvider : IDisposable
|
||||
/// <summary>
|
||||
/// Indicates if exceptions in the device provider are thrown or silently ignored.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This should only be set to <c>true</c> for debugging/development purposes.
|
||||
/// Production code should use the <see cref="Exception"/>-Event to handle exceptions.
|
||||
/// </remarks>
|
||||
bool ThrowsExceptions { get; }
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -89,8 +89,9 @@ public class AsusUpdateQueue : UpdateQueue
|
||||
|
||||
Device.Apply();
|
||||
}
|
||||
catch
|
||||
{ /* "The server threw an exception." seems to be a thing here ... */
|
||||
catch (Exception ex)
|
||||
{
|
||||
AsusDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -39,13 +39,20 @@ public class CoolerMasterUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
try
|
||||
{
|
||||
(int row, int column) = ((int, int))key;
|
||||
_deviceMatrix.KeyColor[row, column] = new _CoolerMasterKeyColor(color.GetR(), color.GetG(), color.GetB());
|
||||
}
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
{
|
||||
(int row, int column) = ((int, int))key;
|
||||
_deviceMatrix.KeyColor[row, column] = new _CoolerMasterKeyColor(color.GetR(), color.GetG(), color.GetB());
|
||||
}
|
||||
|
||||
_CoolerMasterSDK.SetAllLedColor(_deviceMatrix, _deviceIndex);
|
||||
_CoolerMasterSDK.SetAllLedColor(_deviceMatrix, _deviceIndex);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
CoolerMasterDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -50,6 +50,26 @@ public class CorsairDeviceProvider : AbstractRGBDeviceProvider
|
||||
/// </summary>
|
||||
public CorsairSessionDetails SessionDetails { get; private set; } = new();
|
||||
|
||||
private CorsairSessionState _sessionState = CorsairSessionState.Invalid;
|
||||
public CorsairSessionState SessionState
|
||||
{
|
||||
get => _sessionState;
|
||||
private set
|
||||
{
|
||||
_sessionState = value;
|
||||
|
||||
try { SessionStateChanged?.Invoke(this, SessionState); }
|
||||
catch { /* catch faulty event-handlers*/ }
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Events
|
||||
|
||||
// ReSharper disable once UnassignedField.Global
|
||||
public EventHandler<CorsairSessionState>? SessionStateChanged;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
@ -74,7 +94,7 @@ public class CorsairDeviceProvider : AbstractRGBDeviceProvider
|
||||
|
||||
using ManualResetEventSlim waitEvent = new(false);
|
||||
|
||||
void OnSessionStateChanged(object? sender, CorsairSessionState state)
|
||||
void OnInitializeSessionStateChanged(object? sender, CorsairSessionState state)
|
||||
{
|
||||
if (state == CorsairSessionState.Connected)
|
||||
// ReSharper disable once AccessToDisposedClosure
|
||||
@ -84,6 +104,7 @@ public class CorsairDeviceProvider : AbstractRGBDeviceProvider
|
||||
try
|
||||
{
|
||||
_CUESDK.SessionStateChanged += OnSessionStateChanged;
|
||||
_CUESDK.SessionStateChanged += OnInitializeSessionStateChanged;
|
||||
|
||||
CorsairError errorCode = _CUESDK.CorsairConnect();
|
||||
if (errorCode != CorsairError.Success)
|
||||
@ -100,10 +121,12 @@ public class CorsairDeviceProvider : AbstractRGBDeviceProvider
|
||||
}
|
||||
finally
|
||||
{
|
||||
_CUESDK.SessionStateChanged -= OnSessionStateChanged;
|
||||
_CUESDK.SessionStateChanged -= OnInitializeSessionStateChanged;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnSessionStateChanged(object? sender, CorsairSessionState state) => SessionState = state;
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override IEnumerable<IRGBDevice> LoadDevices()
|
||||
{
|
||||
@ -129,7 +152,7 @@ public class CorsairDeviceProvider : AbstractRGBDeviceProvider
|
||||
Throw(new RGBDeviceException($"Failed to take control of device '{device.id}'. (ErrorCode: {error})"));
|
||||
|
||||
CorsairDeviceUpdateQueue updateQueue = new(GetUpdateTrigger(), device);
|
||||
|
||||
|
||||
int channelLedCount = 0;
|
||||
for (int i = 0; i < device.channelCount; i++)
|
||||
{
|
||||
|
||||
@ -40,17 +40,24 @@ public class CorsairDeviceUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override unsafe void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
Span<_CorsairLedColor> colors = new((void*)_colorPtr, dataSet.Length);
|
||||
for (int i = 0; i < colors.Length; i++)
|
||||
try
|
||||
{
|
||||
(object id, Color color) = dataSet[i];
|
||||
(byte a, byte r, byte g, byte b) = color.GetRGBBytes();
|
||||
colors[i] = new _CorsairLedColor((CorsairLedId)id, r, g, b, a);
|
||||
}
|
||||
Span<_CorsairLedColor> colors = new((void*)_colorPtr, dataSet.Length);
|
||||
for (int i = 0; i < colors.Length; i++)
|
||||
{
|
||||
(object id, Color color) = dataSet[i];
|
||||
(byte a, byte r, byte g, byte b) = color.GetRGBBytes();
|
||||
colors[i] = new _CorsairLedColor((CorsairLedId)id, r, g, b, a);
|
||||
}
|
||||
|
||||
CorsairError error = _CUESDK.CorsairSetLedColors(_device.id!, dataSet.Length, _colorPtr);
|
||||
if (error != CorsairError.Success)
|
||||
throw new RGBDeviceException($"Failed to update device '{_device.id}'. (ErrorCode: {error})");
|
||||
CorsairError error = _CUESDK.CorsairSetLedColors(_device.id!, dataSet.Length, _colorPtr);
|
||||
if (error != CorsairError.Success)
|
||||
throw new RGBDeviceException($"Failed to update device '{_device.id}'. (ErrorCode: {error})");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
CorsairDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@ -61,16 +61,23 @@ public class E131UpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
DataPacket.SetSequenceNumber(GetNextSequenceNumber());
|
||||
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
try
|
||||
{
|
||||
LedChannelMapping mapping = (LedChannelMapping)key;
|
||||
foreach ((int channel, Func<Color, byte> getValue) in mapping)
|
||||
DataPacket.SetChannel(channel, getValue(color));
|
||||
}
|
||||
DataPacket.SetSequenceNumber(GetNextSequenceNumber());
|
||||
|
||||
_socket.Send(DataPacket, DataPacket.Length);
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
{
|
||||
LedChannelMapping mapping = (LedChannelMapping)key;
|
||||
foreach ((int channel, Func<Color, byte> getValue) in mapping)
|
||||
DataPacket.SetChannel(channel, getValue(color));
|
||||
}
|
||||
|
||||
_socket.Send(DataPacket, DataPacket.Length);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
DMXDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -27,12 +27,19 @@ public class LogitechPerDeviceUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
Color color = dataSet[0].color;
|
||||
try
|
||||
{
|
||||
Color color = dataSet[0].color;
|
||||
|
||||
_LogitechGSDK.LogiLedSetTargetDevice(LogitechDeviceCaps.DeviceRGB);
|
||||
_LogitechGSDK.LogiLedSetLighting((int)Math.Round(color.R * 100),
|
||||
(int)Math.Round(color.G * 100),
|
||||
(int)Math.Round(color.B * 100));
|
||||
_LogitechGSDK.LogiLedSetTargetDevice(LogitechDeviceCaps.DeviceRGB);
|
||||
_LogitechGSDK.LogiLedSetLighting((int)Math.Round(color.R * 100),
|
||||
(int)Math.Round(color.G * 100),
|
||||
(int)Math.Round(color.B * 100));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogitechDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -27,16 +27,23 @@ public class LogitechPerKeyUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
_LogitechGSDK.LogiLedSetTargetDevice(LogitechDeviceCaps.PerKeyRGB);
|
||||
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
try
|
||||
{
|
||||
// These will be LogitechLedId but the SDK expects an int and doesn't care about invalid values
|
||||
int keyName = (int)key;
|
||||
_LogitechGSDK.LogiLedSetLightingForKeyWithKeyName(keyName,
|
||||
(int)MathF.Round(color.R * 100),
|
||||
(int)MathF.Round(color.G * 100),
|
||||
(int)MathF.Round(color.B * 100));
|
||||
_LogitechGSDK.LogiLedSetTargetDevice(LogitechDeviceCaps.PerKeyRGB);
|
||||
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
{
|
||||
// These will be LogitechLedId but the SDK expects an int and doesn't care about invalid values
|
||||
int keyName = (int)key;
|
||||
_LogitechGSDK.LogiLedSetLightingForKeyWithKeyName(keyName,
|
||||
(int)MathF.Round(color.R * 100),
|
||||
(int)MathF.Round(color.G * 100),
|
||||
(int)MathF.Round(color.B * 100));
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogitechDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -36,8 +36,15 @@ public class MsiDeviceUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
_MsiSDK.SetLedColor(_deviceType, (int)key, color.GetR(), color.GetG(), color.GetB());
|
||||
try
|
||||
{
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
_MsiSDK.SetLedColor(_deviceType, (int)key, color.GetR(), color.GetG(), color.GetB());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MsiDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -37,8 +37,15 @@ public abstract class MidiUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
SendMessage(CreateMessage(key, color));
|
||||
try
|
||||
{
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
SendMessage(CreateMessage(key, color));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
NovationDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -51,10 +51,17 @@ public class OpenRGBUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
_colors[(int)key] = new OpenRGBColor(color.GetR(), color.GetG(), color.GetB());
|
||||
try
|
||||
{
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
_colors[(int)key] = new OpenRGBColor(color.GetR(), color.GetG(), color.GetB());
|
||||
|
||||
_openRGB.UpdateLeds(_deviceid, _colors);
|
||||
_openRGB.UpdateLeds(_deviceid, _colors);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
OpenRGBDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -46,20 +46,27 @@ public class PicoPiBulkUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
Span<byte> buffer = _dataBuffer;
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
try
|
||||
{
|
||||
int index = key as int? ?? -1;
|
||||
if (index < 0) continue;
|
||||
Span<byte> buffer = _dataBuffer;
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
{
|
||||
int index = key as int? ?? -1;
|
||||
if (index < 0) continue;
|
||||
|
||||
(byte _, byte r, byte g, byte b) = color.GetRGBBytes();
|
||||
int offset = index * 3;
|
||||
buffer[offset] = r;
|
||||
buffer[offset + 1] = g;
|
||||
buffer[offset + 2] = b;
|
||||
(byte _, byte r, byte g, byte b) = color.GetRGBBytes();
|
||||
int offset = index * 3;
|
||||
buffer[offset] = r;
|
||||
buffer[offset + 1] = g;
|
||||
buffer[offset + 2] = b;
|
||||
}
|
||||
|
||||
_sdk.SendBulkUpdate(buffer, _channel);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PicoPiDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
|
||||
_sdk.SendBulkUpdate(buffer, _channel);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -43,20 +43,27 @@ public class PicoPiHIDUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
Span<byte> buffer = _dataBuffer;
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
try
|
||||
{
|
||||
int index = key as int? ?? -1;
|
||||
if (index < 0) continue;
|
||||
Span<byte> buffer = _dataBuffer;
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
{
|
||||
int index = key as int? ?? -1;
|
||||
if (index < 0) continue;
|
||||
|
||||
(byte _, byte r, byte g, byte b) = color.GetRGBBytes();
|
||||
int offset = index * 3;
|
||||
buffer[offset] = r;
|
||||
buffer[offset + 1] = g;
|
||||
buffer[offset + 2] = b;
|
||||
(byte _, byte r, byte g, byte b) = color.GetRGBBytes();
|
||||
int offset = index * 3;
|
||||
buffer[offset] = r;
|
||||
buffer[offset + 1] = g;
|
||||
buffer[offset + 2] = b;
|
||||
}
|
||||
|
||||
_sdk.SendHidUpdate(buffer, _channel);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
PicoPiDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
|
||||
_sdk.SendHidUpdate(buffer, _channel);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -10,7 +10,7 @@ namespace RGB.NET.Devices.Razer;
|
||||
public abstract class RazerUpdateQueue : UpdateQueue
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
|
||||
private Guid? _lastEffect;
|
||||
|
||||
#endregion
|
||||
@ -23,8 +23,7 @@ public abstract class RazerUpdateQueue : UpdateQueue
|
||||
/// <param name="updateTrigger">The update trigger used to update this queue.</param>
|
||||
protected RazerUpdateQueue(IDeviceUpdateTrigger updateTrigger)
|
||||
: base(updateTrigger)
|
||||
{
|
||||
}
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
|
||||
@ -33,16 +32,23 @@ public abstract class RazerUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
IntPtr effectParams = CreateEffectParams(dataSet);
|
||||
Guid effectId = Guid.NewGuid();
|
||||
CreateEffect(effectParams, ref effectId);
|
||||
try
|
||||
{
|
||||
IntPtr effectParams = CreateEffectParams(dataSet);
|
||||
Guid effectId = Guid.NewGuid();
|
||||
CreateEffect(effectParams, ref effectId);
|
||||
|
||||
_RazerSDK.SetEffect(effectId);
|
||||
_RazerSDK.SetEffect(effectId);
|
||||
|
||||
if (_lastEffect.HasValue)
|
||||
_RazerSDK.DeleteEffect(_lastEffect.Value);
|
||||
if (_lastEffect.HasValue)
|
||||
_RazerSDK.DeleteEffect(_lastEffect.Value);
|
||||
|
||||
_lastEffect = effectId;
|
||||
_lastEffect = effectId;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
RazerDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -37,10 +37,17 @@ internal class SteelSeriesDeviceUpdateQueue : UpdateQueue
|
||||
|
||||
protected override void OnUpdate(object? sender, CustomUpdateData customData)
|
||||
{
|
||||
if (customData[CustomUpdateDataIndex.HEARTBEAT] as bool? ?? false)
|
||||
SteelSeriesSDK.SendHeartbeat();
|
||||
else
|
||||
base.OnUpdate(sender, customData);
|
||||
try
|
||||
{
|
||||
if (customData[CustomUpdateDataIndex.HEARTBEAT] as bool? ?? false)
|
||||
SteelSeriesSDK.SendHeartbeat();
|
||||
else
|
||||
base.OnUpdate(sender, customData);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
SteelSeriesDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
|
||||
@ -58,10 +58,17 @@ public abstract class SerialConnectionUpdateQueue<TData> : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
foreach (TData command in GetCommands(dataSet.ToArray()))
|
||||
try
|
||||
{
|
||||
SerialConnection.ReadTo(Prompt);
|
||||
SendCommand(command);
|
||||
foreach (TData command in GetCommands(dataSet.ToArray()))
|
||||
{
|
||||
SerialConnection.ReadTo(Prompt);
|
||||
SendCommand(command);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WS281XDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -13,7 +13,7 @@ public class WootingUpdateQueue : UpdateQueue
|
||||
#region Properties & Fields
|
||||
private readonly byte _deviceid;
|
||||
#endregion
|
||||
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
@ -33,17 +33,24 @@ public class WootingUpdateQueue : UpdateQueue
|
||||
/// <inheritdoc />
|
||||
protected override void Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
lock (_WootingSDK.SdkLock)
|
||||
try
|
||||
{
|
||||
_WootingSDK.SelectDevice(_deviceid);
|
||||
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
lock (_WootingSDK.SdkLock)
|
||||
{
|
||||
(int row, int column) = ((int, int))key;
|
||||
_WootingSDK.ArraySetSingle((byte)row, (byte)column, color.GetR(), color.GetG(), color.GetB());
|
||||
}
|
||||
_WootingSDK.SelectDevice(_deviceid);
|
||||
|
||||
_WootingSDK.ArrayUpdateKeyboard();
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
{
|
||||
(int row, int column) = ((int, int))key;
|
||||
_WootingSDK.ArraySetSingle((byte)row, (byte)column, color.GetR(), color.GetG(), color.GetB());
|
||||
}
|
||||
|
||||
_WootingSDK.ArrayUpdateKeyboard();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WootingDeviceProvider.Instance.Throw(ex, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user