mirror of
https://github.com/DarthAffe/RGB.NET.git
synced 2025-12-13 10:08:31 +00:00
Compare commits
15 Commits
ecf880d297
...
21b2f774c4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21b2f774c4 | ||
| 5fc2e34f28 | |||
| cdae699c8d | |||
| 924b121f64 | |||
| ef12e402ea | |||
| ef3998055d | |||
| fab2c158af | |||
| d487bee35c | |||
| 6974203e34 | |||
|
|
e645e4dcf2 | ||
|
|
3fbc4b997e | ||
|
|
3074a2b7bf | ||
|
|
6f4c07d65f | ||
|
|
1fa466809e | ||
|
|
17bd13b995 |
@ -14,13 +14,18 @@ namespace RGB.NET.Core
|
||||
private readonly List<T> _decorators = new();
|
||||
|
||||
/// <inheritdoc />
|
||||
public IReadOnlyCollection<T> Decorators
|
||||
public IReadOnlyList<T> Decorators { get; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="AbstractDecoratable{T}"/> class.
|
||||
/// </summary>
|
||||
protected AbstractDecoratable()
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (_decorators)
|
||||
return new ReadOnlyCollection<T>(_decorators);
|
||||
}
|
||||
Decorators = new ReadOnlyCollection<T>(_decorators);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -20,7 +20,7 @@ namespace RGB.NET.Core
|
||||
/// <summary>
|
||||
/// Gets a readonly-list of all <see cref="IDecorator"/> attached to this <see cref="IDecoratable{T}"/>.
|
||||
/// </summary>
|
||||
IReadOnlyCollection<T> Decorators { get; }
|
||||
IReadOnlyList<T> Decorators { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Adds an <see cref="IDecorator"/> to the <see cref="IDecoratable"/>.
|
||||
|
||||
@ -30,7 +30,7 @@ namespace RGB.NET.Core
|
||||
protected Dictionary<int, IDeviceUpdateTrigger> UpdateTriggerMapping { get; } = new();
|
||||
|
||||
/// <inheritdoc />
|
||||
public ReadOnlyCollection<(int id, IDeviceUpdateTrigger trigger)> UpdateTriggers => new(UpdateTriggerMapping.Select(x => (x.Key, x.Value)).ToList());
|
||||
public IReadOnlyList<(int id, IDeviceUpdateTrigger trigger)> UpdateTriggers => new ReadOnlyCollection<(int id, IDeviceUpdateTrigger trigger)>(UpdateTriggerMapping.Select(x => (x.Key, x.Value)).ToList());
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@ -2,7 +2,6 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace RGB.NET.Core
|
||||
{
|
||||
@ -31,7 +30,7 @@ namespace RGB.NET.Core
|
||||
/// <summary>
|
||||
/// Gets a collection <see cref="IDeviceUpdateTrigger"/> registered to this device provider.
|
||||
/// </summary>
|
||||
ReadOnlyCollection<(int id, IDeviceUpdateTrigger trigger)> UpdateTriggers { get; }
|
||||
IReadOnlyList<(int id, IDeviceUpdateTrigger trigger)> UpdateTriggers { get; }
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
@ -26,20 +26,15 @@ namespace RGB.NET.Core
|
||||
|
||||
/// <summary>
|
||||
/// Gets a readonly list containing all loaded <see cref="IRGBDevice"/>.
|
||||
/// This collection should be locked when enumerated in a multi-threaded application.
|
||||
/// </summary>
|
||||
public IEnumerable<IRGBDevice> Devices
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (_devices)
|
||||
return new ReadOnlyCollection<IRGBDevice>(_devices);
|
||||
}
|
||||
}
|
||||
public IReadOnlyList<IRGBDevice> Devices { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a readonly list containing all registered <see cref="IUpdateTrigger"/>.
|
||||
/// This collection should be locked when enumerated in a multi-threaded application.
|
||||
/// </summary>
|
||||
public IEnumerable<IUpdateTrigger> UpdateTriggers => new ReadOnlyCollection<IUpdateTrigger>(_updateTriggers);
|
||||
public IReadOnlyList<IUpdateTrigger> UpdateTriggers { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets a copy of the <see cref="Rectangle"/> representing this <see cref="RGBSurface"/>.
|
||||
@ -53,7 +48,7 @@ namespace RGB.NET.Core
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (_devices)
|
||||
lock (Devices)
|
||||
return _devices.SelectMany(x => x);
|
||||
}
|
||||
}
|
||||
@ -124,6 +119,9 @@ namespace RGB.NET.Core
|
||||
public RGBSurface()
|
||||
{
|
||||
_deltaTimeCounter = Stopwatch.StartNew();
|
||||
|
||||
Devices = new ReadOnlyCollection<IRGBDevice>(_devices);
|
||||
UpdateTriggers = new ReadOnlyCollection<IUpdateTrigger>(_updateTriggers);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -146,8 +144,8 @@ namespace RGB.NET.Core
|
||||
bool render = customData["render"] as bool? ?? true;
|
||||
bool updateDevices = customData["updateDevices"] as bool? ?? true;
|
||||
|
||||
lock (_updateTriggers)
|
||||
lock (_devices)
|
||||
lock (UpdateTriggers)
|
||||
lock (Devices)
|
||||
{
|
||||
OnUpdating(updateTrigger, customData);
|
||||
|
||||
@ -178,7 +176,7 @@ namespace RGB.NET.Core
|
||||
public void Dispose()
|
||||
{
|
||||
List<IRGBDevice> devices;
|
||||
lock (_devices)
|
||||
lock (Devices)
|
||||
devices = new List<IRGBDevice>(_devices);
|
||||
|
||||
foreach (IRGBDevice device in devices)
|
||||
@ -267,7 +265,7 @@ namespace RGB.NET.Core
|
||||
/// <param name="device">The <see cref="IRGBDevice"/> to attach.</param>
|
||||
public void Attach(IRGBDevice device)
|
||||
{
|
||||
lock (_devices)
|
||||
lock (Devices)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(device.DeviceInfo.DeviceName)) throw new RGBDeviceException($"The device '{device.DeviceInfo.Manufacturer} {device.DeviceInfo.Model}' has no valid name.");
|
||||
if (device.Surface != null) throw new RGBSurfaceException($"The device '{device.DeviceInfo.DeviceName}' is already attached to a surface.");
|
||||
@ -287,7 +285,7 @@ namespace RGB.NET.Core
|
||||
/// <returns><c>true</c> if the <see cref="IRGBDevice"/> could be detached; <c>false</c> otherwise.</returns>
|
||||
public void Detach(IRGBDevice device)
|
||||
{
|
||||
lock (_devices)
|
||||
lock (Devices)
|
||||
{
|
||||
if (!_devices.Contains(device)) throw new RGBSurfaceException($"The device '{device.DeviceInfo.DeviceName}' is not attached to this surface.");
|
||||
|
||||
@ -314,7 +312,7 @@ namespace RGB.NET.Core
|
||||
|
||||
private void UpdateSurfaceRectangle()
|
||||
{
|
||||
lock (_devices)
|
||||
lock (Devices)
|
||||
{
|
||||
Rectangle devicesRectangle = new(_devices.Select(d => d.Boundary));
|
||||
Boundary = Boundary.SetSize(new Size(devicesRectangle.Location.X + devicesRectangle.Size.Width, devicesRectangle.Location.Y + devicesRectangle.Size.Height));
|
||||
|
||||
@ -92,10 +92,20 @@ namespace RGB.NET.Core
|
||||
if (UpdateTask != null)
|
||||
{
|
||||
UpdateTokenSource?.Cancel();
|
||||
// ReSharper disable once MethodSupportsCancellation
|
||||
UpdateTask.Wait();
|
||||
UpdateTask.Dispose();
|
||||
UpdateTask = null;
|
||||
try
|
||||
{
|
||||
// ReSharper disable once MethodSupportsCancellation
|
||||
UpdateTask.Wait();
|
||||
}
|
||||
catch (AggregateException)
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
finally
|
||||
{
|
||||
UpdateTask.Dispose();
|
||||
UpdateTask = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -48,6 +48,21 @@ namespace RGB.NET.Devices.CoolerMaster
|
||||
{ LedId.Mouse3, (0,2) }
|
||||
}
|
||||
},
|
||||
|
||||
{ CoolerMasterDevicesIndexes.MM830, new Dictionary<LedId, (int row, int column)>
|
||||
{
|
||||
{ LedId.Mouse1, (0,0) },
|
||||
{ LedId.Mouse2, (0,1) },
|
||||
{ LedId.Mouse3, (0,2) },
|
||||
{ LedId.Mouse4, (0,3) },
|
||||
{ LedId.Mouse5, (0,4) },
|
||||
{ LedId.Mouse6, (0,5) },
|
||||
{ LedId.Mouse7, (0,6) },
|
||||
{ LedId.Mouse8, (0,7) },
|
||||
{ LedId.Mouse9, (0,8) },
|
||||
{ LedId.Mouse10, (0,9) },
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
#endregion
|
||||
|
||||
@ -68,7 +68,7 @@ namespace RGB.NET.Devices.DMX.E131
|
||||
this.Hostname = deviceDefinition.Hostname;
|
||||
this.Port = deviceDefinition.Port;
|
||||
this.Universe = deviceDefinition.Universe;
|
||||
|
||||
|
||||
byte[]? cid = deviceDefinition.CID;
|
||||
if ((cid == null) || (cid.Length != CID_LENGTH))
|
||||
{
|
||||
@ -76,7 +76,7 @@ namespace RGB.NET.Devices.DMX.E131
|
||||
new Random().NextBytes(cid);
|
||||
}
|
||||
|
||||
CID = cid!;
|
||||
CID = cid;
|
||||
|
||||
DeviceName = DeviceHelper.CreateDeviceName(Manufacturer, Model);
|
||||
}
|
||||
|
||||
@ -7,10 +7,14 @@ namespace RGB.NET.Devices.Wooting.Enum
|
||||
/// </summary>
|
||||
public enum WootingDeviceType
|
||||
{
|
||||
/// <summary>
|
||||
/// 10 Keyless Keyboard. E.g. Wooting One
|
||||
/// </summary>
|
||||
KeyboardTKL = 1,
|
||||
|
||||
/// <summary>
|
||||
/// Full Size keyboard. E.g. Wooting Two
|
||||
/// </summary>
|
||||
Keyboard = 2
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,21 +0,0 @@
|
||||
// ReSharper disable InconsistentNaming
|
||||
// ReSharper disable UnusedMember.Global
|
||||
|
||||
using System.ComponentModel;
|
||||
|
||||
#pragma warning disable 1591 // Missing XML comment for publicly visible type or member
|
||||
|
||||
namespace RGB.NET.Devices.Wooting.Enum
|
||||
{
|
||||
/// <summary>
|
||||
/// Contains a list of available device-indexes.
|
||||
/// </summary>
|
||||
public enum WootingDevicesIndexes
|
||||
{
|
||||
[Description("Wooting One")]
|
||||
WootingOne = 0,
|
||||
|
||||
[Description("Wooting Two")]
|
||||
WootingTwo = 1
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
using RGB.NET.Core;
|
||||
using RGB.NET.Devices.Wooting.Enum;
|
||||
using RGB.NET.Devices.Wooting.Helper;
|
||||
using RGB.NET.Devices.Wooting.Native;
|
||||
|
||||
namespace RGB.NET.Devices.Wooting.Generic
|
||||
{
|
||||
@ -28,9 +29,9 @@ namespace RGB.NET.Devices.Wooting.Generic
|
||||
public object? LayoutMetadata { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="WootingDevicesIndexes"/> of the <see cref="WootingRGBDevice{TDeviceInfo}"/>.
|
||||
/// Gets the <see cref="WootingDeviceType"/> of the <see cref="WootingRGBDevice{TDeviceInfo}"/>.
|
||||
/// </summary>
|
||||
public WootingDevicesIndexes DeviceIndex { get; }
|
||||
public WootingDeviceType WootingDeviceType { get; }
|
||||
|
||||
#endregion
|
||||
|
||||
@ -40,13 +41,13 @@ namespace RGB.NET.Devices.Wooting.Generic
|
||||
/// Internal constructor of managed <see cref="WootingRGBDeviceInfo"/>.
|
||||
/// </summary>
|
||||
/// <param name="deviceType">The type of the <see cref="IRGBDevice"/>.</param>
|
||||
/// <param name="deviceIndex">The <see cref="WootingDevicesIndexes"/> of the <see cref="IRGBDevice"/>.</param>
|
||||
internal WootingRGBDeviceInfo(RGBDeviceType deviceType, WootingDevicesIndexes deviceIndex)
|
||||
/// <param name="deviceInfo">The <see cref="_WootingDeviceInfo"/> of the <see cref="IRGBDevice"/>.</param>
|
||||
internal WootingRGBDeviceInfo(RGBDeviceType deviceType, _WootingDeviceInfo deviceInfo)
|
||||
{
|
||||
this.DeviceType = deviceType;
|
||||
this.DeviceIndex = deviceIndex;
|
||||
this.WootingDeviceType = deviceInfo.DeviceType;
|
||||
|
||||
Model = deviceIndex.GetDescription();
|
||||
Model = deviceInfo.Model;
|
||||
DeviceName = DeviceHelper.CreateDeviceName(Manufacturer, Model);
|
||||
}
|
||||
|
||||
|
||||
@ -13,9 +13,9 @@ namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
#region Wooting One
|
||||
#region TKL
|
||||
|
||||
private static readonly Dictionary<LedId, (int row, int column)> WootingOne_US = new()
|
||||
private static readonly Dictionary<LedId, (int row, int column)> TKL_US = new()
|
||||
{
|
||||
{ LedId.Keyboard_Escape, (0,0) },
|
||||
{ LedId.Keyboard_F1, (0,2) },
|
||||
@ -111,7 +111,7 @@ namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
{ LedId.Keyboard_ArrowRight, (5,16) }
|
||||
};
|
||||
|
||||
private static readonly Dictionary<LedId, (int row, int column)> WootingOne_UK = new()
|
||||
private static readonly Dictionary<LedId, (int row, int column)> TKL_UK = new()
|
||||
{
|
||||
{ LedId.Keyboard_Escape, (0,0) },
|
||||
{ LedId.Keyboard_F1, (0,2) },
|
||||
@ -178,7 +178,7 @@ namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
{ LedId.Keyboard_L, (3,9) },
|
||||
{ LedId.Keyboard_SemicolonAndColon, (3,10) },
|
||||
{ LedId.Keyboard_ApostropheAndDoubleQuote, (3,11) },
|
||||
{ LedId.Keyboard_NonUsTilde, (3,11) },
|
||||
{ LedId.Keyboard_NonUsTilde, (3,12) },
|
||||
{ LedId.Keyboard_Enter, (3,13) },
|
||||
|
||||
{ LedId.Keyboard_LeftShift, (4,0) },
|
||||
@ -211,9 +211,9 @@ namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
|
||||
#endregion
|
||||
|
||||
#region Wooting Two
|
||||
#region Fullsize
|
||||
|
||||
private static readonly Dictionary<LedId, (int row, int column)> WootingTwo_US = new()
|
||||
private static readonly Dictionary<LedId, (int row, int column)> Fullsize_US = new()
|
||||
{
|
||||
{ LedId.Keyboard_Escape, (0,0) },
|
||||
{ LedId.Keyboard_F1, (0,2) },
|
||||
@ -330,7 +330,7 @@ namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
{ LedId.Keyboard_NumPeriodAndDelete, (5,19) }
|
||||
};
|
||||
|
||||
private static readonly Dictionary<LedId, (int row, int column)> WootingTwo_UK = new()
|
||||
private static readonly Dictionary<LedId, (int row, int column)> Fullsize_UK = new()
|
||||
{
|
||||
{ LedId.Keyboard_Escape, (0,0) },
|
||||
{ LedId.Keyboard_F1, (0,2) },
|
||||
@ -454,20 +454,20 @@ namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
/// <summary>
|
||||
/// Contains all the hardware-id mappings for Wooting devices.
|
||||
/// </summary>
|
||||
public static readonly Dictionary<WootingDevicesIndexes, Dictionary<WootingPhysicalKeyboardLayout, Dictionary<LedId, (int row, int column)>>> Mapping =
|
||||
public static readonly Dictionary<WootingDeviceType, Dictionary<WootingPhysicalKeyboardLayout, Dictionary<LedId, (int row, int column)>>> Mapping =
|
||||
new()
|
||||
{
|
||||
{ WootingDevicesIndexes.WootingOne, new Dictionary<WootingPhysicalKeyboardLayout, Dictionary<LedId, (int row, int column)>>
|
||||
{ WootingDeviceType.KeyboardTKL, new Dictionary<WootingPhysicalKeyboardLayout, Dictionary<LedId, (int row, int column)>>
|
||||
{
|
||||
{ WootingPhysicalKeyboardLayout.US, WootingOne_US },
|
||||
{ WootingPhysicalKeyboardLayout.UK, WootingOne_UK }
|
||||
{ WootingPhysicalKeyboardLayout.US, TKL_US },
|
||||
{ WootingPhysicalKeyboardLayout.UK, TKL_UK }
|
||||
}
|
||||
},
|
||||
|
||||
{ WootingDevicesIndexes.WootingTwo, new Dictionary<WootingPhysicalKeyboardLayout, Dictionary<LedId, (int row, int column)>>
|
||||
{ WootingDeviceType.Keyboard, new Dictionary<WootingPhysicalKeyboardLayout, Dictionary<LedId, (int row, int column)>>
|
||||
{
|
||||
{ WootingPhysicalKeyboardLayout.US, WootingTwo_US },
|
||||
{ WootingPhysicalKeyboardLayout.UK, WootingTwo_UK }
|
||||
{ WootingPhysicalKeyboardLayout.US, Fullsize_US },
|
||||
{ WootingPhysicalKeyboardLayout.UK, Fullsize_UK }
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@ -38,14 +38,14 @@ namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
private void InitializeLayout()
|
||||
{
|
||||
//TODO DarthAffe 13.02.2021: Check how the mapping can work without knowing the physical layout
|
||||
Dictionary<LedId, (int row, int column)> mapping = WootingKeyboardLedMappings.Mapping[DeviceInfo.DeviceIndex][WootingPhysicalKeyboardLayout.US];
|
||||
Dictionary<LedId, (int row, int column)> mapping = WootingKeyboardLedMappings.Mapping[DeviceInfo.WootingDeviceType][WootingPhysicalKeyboardLayout.US];
|
||||
|
||||
foreach (KeyValuePair<LedId, (int row, int column)> led in mapping)
|
||||
AddLed(led.Key, new Point(led.Value.column * 19, led.Value.row * 19), new Size(19, 19));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override object GetLedCustomData(LedId ledId) => WootingKeyboardLedMappings.Mapping[DeviceInfo.DeviceIndex][WootingPhysicalKeyboardLayout.US][ledId];
|
||||
protected override object GetLedCustomData(LedId ledId) => WootingKeyboardLedMappings.Mapping[DeviceInfo.WootingDeviceType][WootingPhysicalKeyboardLayout.US][ledId];
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void UpdateLeds(IEnumerable<Led> ledsToUpdate) => UpdateQueue.SetData(GetUpdateData(ledsToUpdate));
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
using RGB.NET.Core;
|
||||
using RGB.NET.Devices.Wooting.Enum;
|
||||
using RGB.NET.Devices.Wooting.Generic;
|
||||
using RGB.NET.Devices.Wooting.Native;
|
||||
|
||||
namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
{
|
||||
@ -22,9 +23,9 @@ namespace RGB.NET.Devices.Wooting.Keyboard
|
||||
/// <summary>
|
||||
/// Internal constructor of managed <see cref="T:RGB.NET.Devices.Wooting.WootingKeyboardRGBDeviceInfo" />.
|
||||
/// </summary>
|
||||
/// <param name="deviceIndex">The index of the <see cref="T:RGB.NET.Devices.Wooting.WootingKeyboardRGBDevice" />.</param>
|
||||
internal WootingKeyboardRGBDeviceInfo(WootingDevicesIndexes deviceIndex)
|
||||
: base(RGBDeviceType.Keyboard, deviceIndex)
|
||||
/// <param name="deviceInfo">The native <see cref="T:RGB.NET.Devices.Wooting.Native._WootingDeviceInfo" />.</param>
|
||||
internal WootingKeyboardRGBDeviceInfo(_WootingDeviceInfo deviceInfo)
|
||||
: base(RGBDeviceType.Keyboard, deviceInfo)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
|
||||
@ -20,5 +20,7 @@ namespace RGB.NET.Devices.Wooting.Native
|
||||
internal byte KeycodeLimit { get; private set; }
|
||||
|
||||
internal WootingDeviceType DeviceType { get; private set; }
|
||||
|
||||
internal bool V2Interface { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -70,17 +70,8 @@ namespace RGB.NET.Devices.Wooting
|
||||
if (_WootingSDK.KeyboardConnected())
|
||||
{
|
||||
_WootingDeviceInfo nativeDeviceInfo = (_WootingDeviceInfo)Marshal.PtrToStructure(_WootingSDK.GetDeviceInfo(), typeof(_WootingDeviceInfo))!;
|
||||
IWootingRGBDevice? device = nativeDeviceInfo.Model switch
|
||||
{
|
||||
"Wooting two" => new WootingKeyboardRGBDevice(new WootingKeyboardRGBDeviceInfo(WootingDevicesIndexes.WootingTwo), GetUpdateTrigger()),
|
||||
"Wooting one" => new WootingKeyboardRGBDevice(new WootingKeyboardRGBDeviceInfo(WootingDevicesIndexes.WootingOne), GetUpdateTrigger()),
|
||||
_ => null
|
||||
};
|
||||
|
||||
if (device == null)
|
||||
Throw(new RGBDeviceException("No supported Wooting keyboard connected"));
|
||||
else
|
||||
yield return device;
|
||||
yield return new WootingKeyboardRGBDevice(new WootingKeyboardRGBDeviceInfo(nativeDeviceInfo), GetUpdateTrigger());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user