mirror of
https://github.com/DarthAffe/RGB.NET.git
synced 2026-11-11 04:57:15 +00:00
Streamlined device loading/handling in device providers
This commit is contained in:
1 parent
f6f3e9185c
commit
2a9a43683c
81 files changed
+867
-1864
No files matched your search
@@ -5,8 +5,6 @@ namespace RGB.NET.Devices.Logitech
|
||||
/// <summary>
|
||||
/// Represents a logitech RGB-device.
|
||||
/// </summary>
|
||||
internal interface ILogitechRGBDevice : IRGBDevice
|
||||
{
|
||||
void Initialize(UpdateQueue updateQueue);
|
||||
}
|
||||
public interface ILogitechRGBDevice : IRGBDevice
|
||||
{ }
|
||||
}
|
||||
@@ -3,60 +3,21 @@
|
||||
namespace RGB.NET.Devices.Logitech
|
||||
{
|
||||
/// <inheritdoc cref="AbstractRGBDevice{TDeviceInfo}" />
|
||||
/// <inheritdoc cref="ILogitechRGBDevice" />
|
||||
/// <summary>
|
||||
/// Represents a generic Logitech-device. (keyboard, mouse, headset, mousepad).
|
||||
/// </summary>
|
||||
public abstract class LogitechRGBDevice<TDeviceInfo> : AbstractRGBDevice<TDeviceInfo>, ILogitechRGBDevice
|
||||
where TDeviceInfo : LogitechRGBDeviceInfo
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Gets information about the <see cref="T:RGB.NET.Devices.Logitech.LogitechRGBDevice" />.
|
||||
/// </summary>
|
||||
public override TDeviceInfo DeviceInfo { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the update queue performing updates for this device.
|
||||
/// </summary>
|
||||
// ReSharper disable once MemberCanBePrivate.Global
|
||||
protected UpdateQueue? UpdateQueue { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="LogitechRGBDevice{TDeviceInfo}"/> class.
|
||||
/// </summary>
|
||||
/// <param name="info">The generic information provided by Logitech for the device.</param>
|
||||
protected LogitechRGBDevice(TDeviceInfo info)
|
||||
{
|
||||
this.DeviceInfo = info;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the device.
|
||||
/// </summary>
|
||||
public virtual void Initialize(UpdateQueue updateQueue)
|
||||
{
|
||||
UpdateQueue = updateQueue;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
{
|
||||
try { UpdateQueue?.Dispose(); }
|
||||
catch { /* at least we tried */ }
|
||||
|
||||
base.Dispose();
|
||||
}
|
||||
protected LogitechRGBDevice(TDeviceInfo info, IUpdateQueue updateQueue)
|
||||
: base(info, updateQueue)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using RGB.NET.Core;
|
||||
using RGB.NET.Devices.Logitech.HID;
|
||||
using RGB.NET.Devices.Logitech.Native;
|
||||
@@ -15,7 +13,7 @@ namespace RGB.NET.Devices.Logitech
|
||||
/// <summary>
|
||||
/// Represents a device provider responsible for logitech devices.
|
||||
/// </summary>
|
||||
public class LogitechDeviceProvider : IRGBDeviceProvider
|
||||
public class LogitechDeviceProvider : AbstractRGBDeviceProvider
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
@@ -37,21 +35,8 @@ namespace RGB.NET.Devices.Logitech
|
||||
/// </summary>
|
||||
public static List<string> PossibleX64NativePaths { get; } = new() { "x64/LogitechLedEnginesWrapper.dll" };
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IsInitialized { get; private set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<IRGBDevice> Devices { get; private set; } = Enumerable.Empty<IRGBDevice>();
|
||||
|
||||
/// <summary>
|
||||
/// The <see cref="DeviceUpdateTrigger"/> used to trigger the updates for logitech devices.
|
||||
/// </summary>
|
||||
public DeviceUpdateTrigger UpdateTrigger { get; }
|
||||
|
||||
// ReSharper disable once CollectionNeverQueried.Local - for now this is just to make sure they're never collected
|
||||
private readonly Dictionary<RGBDeviceType, LogitechZoneUpdateQueue> _zoneUpdateQueues = new();
|
||||
private LogitechPerDeviceUpdateQueue _perDeviceUpdateQueue;
|
||||
private LogitechPerKeyUpdateQueue _perKeyUpdateQueue;
|
||||
private LogitechPerDeviceUpdateQueue? _perDeviceUpdateQueue;
|
||||
private LogitechPerKeyUpdateQueue? _perKeyUpdateQueue;
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -65,116 +50,54 @@ namespace RGB.NET.Devices.Logitech
|
||||
{
|
||||
if (_instance != null) throw new InvalidOperationException($"There can be only one instance of type {nameof(LogitechDeviceProvider)}");
|
||||
_instance = this;
|
||||
|
||||
UpdateTrigger = new DeviceUpdateTrigger();
|
||||
_perDeviceUpdateQueue = new LogitechPerDeviceUpdateQueue(UpdateTrigger);
|
||||
_perKeyUpdateQueue = new LogitechPerKeyUpdateQueue(UpdateTrigger);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool Initialize(RGBDeviceType loadFilter = RGBDeviceType.All, bool throwExceptions = false)
|
||||
protected override void InitializeSDK()
|
||||
{
|
||||
try
|
||||
_perDeviceUpdateQueue = new LogitechPerDeviceUpdateQueue(GetUpdateTrigger());
|
||||
_perKeyUpdateQueue = new LogitechPerKeyUpdateQueue(GetUpdateTrigger());
|
||||
|
||||
_LogitechGSDK.Reload();
|
||||
if (!_LogitechGSDK.LogiLedInit()) Throw(new RGBDeviceException("Failed to initialize Logitech-SDK."));
|
||||
|
||||
_LogitechGSDK.LogiLedSaveCurrentLighting();
|
||||
}
|
||||
|
||||
//TODO DarthAffe 04.03.2021: Rework device selection and configuration for HID-based providers
|
||||
protected override IEnumerable<IRGBDevice> LoadDevices()
|
||||
{
|
||||
DeviceChecker.LoadDeviceList();
|
||||
|
||||
if (DeviceChecker.IsPerKeyDeviceConnected && (_perKeyUpdateQueue != null))
|
||||
{
|
||||
if (IsInitialized)
|
||||
_LogitechGSDK.LogiLedRestoreLighting();
|
||||
}
|
||||
catch { /* At least we tried ... */ }
|
||||
|
||||
IsInitialized = false;
|
||||
|
||||
try
|
||||
{
|
||||
UpdateTrigger.Stop();
|
||||
|
||||
_LogitechGSDK.Reload();
|
||||
if (!_LogitechGSDK.LogiLedInit()) return false;
|
||||
|
||||
_LogitechGSDK.LogiLedSaveCurrentLighting();
|
||||
|
||||
IList<IRGBDevice> devices = new List<IRGBDevice>();
|
||||
DeviceChecker.LoadDeviceList();
|
||||
|
||||
try
|
||||
{
|
||||
if (DeviceChecker.IsPerKeyDeviceConnected)
|
||||
{
|
||||
(string model, RGBDeviceType deviceType, int _, int _) = DeviceChecker.PerKeyDeviceData;
|
||||
if (loadFilter.HasFlag(deviceType)) //TODO DarthAffe 07.12.2017: Check if it's worth to try another device if the one returned doesn't match the filter
|
||||
{
|
||||
ILogitechRGBDevice device = new LogitechPerKeyRGBDevice(new LogitechRGBDeviceInfo(deviceType, model, LogitechDeviceCaps.PerKeyRGB, 0));
|
||||
device.Initialize(_perKeyUpdateQueue);
|
||||
devices.Add(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { if (throwExceptions) throw; }
|
||||
|
||||
try
|
||||
{
|
||||
if (DeviceChecker.IsPerDeviceDeviceConnected)
|
||||
{
|
||||
(string model, RGBDeviceType deviceType, int _, int _) = DeviceChecker.PerDeviceDeviceData;
|
||||
if (loadFilter.HasFlag(deviceType)) //TODO DarthAffe 07.12.2017: Check if it's worth to try another device if the one returned doesn't match the filter
|
||||
{
|
||||
ILogitechRGBDevice device = new LogitechPerDeviceRGBDevice(new LogitechRGBDeviceInfo(deviceType, model, LogitechDeviceCaps.DeviceRGB, 0));
|
||||
device.Initialize(_perDeviceUpdateQueue);
|
||||
devices.Add(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { if (throwExceptions) throw; }
|
||||
|
||||
try
|
||||
{
|
||||
if (DeviceChecker.IsZoneDeviceConnected)
|
||||
{
|
||||
foreach ((string model, RGBDeviceType deviceType, int _, int zones) in DeviceChecker.ZoneDeviceData)
|
||||
try
|
||||
{
|
||||
if (loadFilter.HasFlag(deviceType))
|
||||
{
|
||||
LogitechZoneUpdateQueue updateQueue = new(UpdateTrigger, deviceType);
|
||||
ILogitechRGBDevice device = new LogitechZoneRGBDevice(new LogitechRGBDeviceInfo(deviceType, model, LogitechDeviceCaps.DeviceRGB, zones));
|
||||
device.Initialize(updateQueue);
|
||||
devices.Add(device);
|
||||
_zoneUpdateQueues.Add(deviceType, updateQueue);
|
||||
}
|
||||
}
|
||||
catch { if (throwExceptions) throw; }
|
||||
}
|
||||
}
|
||||
catch { if (throwExceptions) throw; }
|
||||
|
||||
UpdateTrigger.Start();
|
||||
|
||||
Devices = new ReadOnlyCollection<IRGBDevice>(devices);
|
||||
IsInitialized = true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
if (throwExceptions)
|
||||
throw;
|
||||
return false;
|
||||
(string model, RGBDeviceType deviceType, int _, int _) = DeviceChecker.PerKeyDeviceData;
|
||||
yield return new LogitechPerKeyRGBDevice(new LogitechRGBDeviceInfo(deviceType, model, LogitechDeviceCaps.PerKeyRGB, 0), _perKeyUpdateQueue);
|
||||
}
|
||||
|
||||
return true;
|
||||
if (DeviceChecker.IsPerDeviceDeviceConnected && (_perDeviceUpdateQueue != null))
|
||||
{
|
||||
(string model, RGBDeviceType deviceType, int _, int _) = DeviceChecker.PerDeviceDeviceData;
|
||||
yield return new LogitechPerDeviceRGBDevice(new LogitechRGBDeviceInfo(deviceType, model, LogitechDeviceCaps.DeviceRGB, 0), _perDeviceUpdateQueue);
|
||||
}
|
||||
|
||||
if (DeviceChecker.IsZoneDeviceConnected)
|
||||
{
|
||||
foreach ((string model, RGBDeviceType deviceType, int _, int zones) in DeviceChecker.ZoneDeviceData)
|
||||
{
|
||||
LogitechZoneUpdateQueue updateQueue = new(GetUpdateTrigger(), deviceType);
|
||||
yield return new LogitechZoneRGBDevice(new LogitechRGBDeviceInfo(deviceType, model, LogitechDeviceCaps.DeviceRGB, zones), updateQueue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public void Dispose()
|
||||
public override void Dispose()
|
||||
{
|
||||
try { UpdateTrigger.Dispose(); }
|
||||
catch { /* at least we tried */ }
|
||||
|
||||
foreach (IRGBDevice device in Devices)
|
||||
try { device.Dispose(); }
|
||||
catch { /* at least we tried */ }
|
||||
Devices = Enumerable.Empty<IRGBDevice>();
|
||||
base.Dispose();
|
||||
|
||||
try { _LogitechGSDK.LogiLedRestoreLighting(); }
|
||||
catch { /* at least we tried */ }
|
||||
|
||||
@@ -17,26 +17,25 @@ namespace RGB.NET.Devices.Logitech
|
||||
/// Initializes a new instance of the <see cref="T:RGB.NET.Devices.Logitech.LogitechPerDeviceRGBDevice" /> class.
|
||||
/// </summary>
|
||||
/// <param name="info">The specific information provided by logitech for the per-device-lightable device</param>
|
||||
internal LogitechPerDeviceRGBDevice(LogitechRGBDeviceInfo info)
|
||||
: base(info)
|
||||
{ }
|
||||
internal LogitechPerDeviceRGBDevice(LogitechRGBDeviceInfo info, IUpdateQueue updateQueue)
|
||||
: base(info, updateQueue)
|
||||
{
|
||||
InitializeLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Initialize(UpdateQueue updateQueue)
|
||||
private void InitializeLayout()
|
||||
{
|
||||
base.Initialize(updateQueue);
|
||||
|
||||
AddLed(LedId.Custom1, new Point(0, 0), new Size(10, 10));
|
||||
}
|
||||
/// <inheritdoc />
|
||||
protected override object GetLedCustomData(LedId ledId) => (ledId, LogitechLedId.DEVICE);
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void UpdateLeds(IEnumerable<Led> ledsToUpdate) => UpdateQueue?.SetData(GetUpdateData(ledsToUpdate.Take(1)));
|
||||
protected override void UpdateLeds(IEnumerable<Led> ledsToUpdate) => UpdateQueue.SetData(GetUpdateData(ledsToUpdate.Take(1)));
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.Logitech
|
||||
@@ -17,8 +16,8 @@ namespace RGB.NET.Devices.Logitech
|
||||
/// Initializes a new instance of the <see cref="T:RGB.NET.Devices.Logitech.LogitechPerKeyRGBDevice" /> class.
|
||||
/// </summary>
|
||||
/// <param name="info">The specific information provided by logitech for the per-key-lightable device</param>
|
||||
internal LogitechPerKeyRGBDevice(LogitechRGBDeviceInfo info)
|
||||
: base(info)
|
||||
internal LogitechPerKeyRGBDevice(LogitechRGBDeviceInfo info, IUpdateQueue updateQueue)
|
||||
: base(info, updateQueue)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
@@ -29,7 +28,7 @@ namespace RGB.NET.Devices.Logitech
|
||||
protected override object GetLedCustomData(LedId ledId) => (ledId, PerKeyIdMapping.DEFAULT.TryGetValue(ledId, out LogitechLedId logitechLedId) ? logitechLedId : LogitechLedId.Invalid);
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void UpdateLeds(IEnumerable<Led> ledsToUpdate) => UpdateQueue?.SetData(GetUpdateData(ledsToUpdate));
|
||||
protected override void UpdateLeds(IEnumerable<Led> ledsToUpdate) => UpdateQueue.SetData(GetUpdateData(ledsToUpdate));
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.Logitech
|
||||
@@ -36,21 +35,20 @@ namespace RGB.NET.Devices.Logitech
|
||||
/// Initializes a new instance of the <see cref="T:RGB.NET.Devices.Logitech.LogitechZoneRGBDevice" /> class.
|
||||
/// </summary>
|
||||
/// <param name="info">The specific information provided by logitech for the zone-lightable device</param>
|
||||
internal LogitechZoneRGBDevice(LogitechRGBDeviceInfo info)
|
||||
: base(info)
|
||||
internal LogitechZoneRGBDevice(LogitechRGBDeviceInfo info, IUpdateQueue updateQueue)
|
||||
: base(info, updateQueue)
|
||||
{
|
||||
_baseLedId = BASE_LED_MAPPING.TryGetValue(info.DeviceType, out LedId id) ? id : LedId.Custom1;
|
||||
|
||||
InitializeLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Initialize(UpdateQueue updateQueue)
|
||||
private void InitializeLayout()
|
||||
{
|
||||
base.Initialize(updateQueue);
|
||||
|
||||
for (int i = 0; i < DeviceInfo.Zones; i++)
|
||||
AddLed(_baseLedId + i, new Point(i * 10, 0), new Size(10, 10));
|
||||
}
|
||||
@@ -59,7 +57,7 @@ namespace RGB.NET.Devices.Logitech
|
||||
protected override object? GetLedCustomData(LedId ledId) => (int)(ledId - _baseLedId);
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void UpdateLeds(IEnumerable<Led> ledsToUpdate) => UpdateQueue?.SetData(GetUpdateData(ledsToUpdate));
|
||||
protected override void UpdateLeds(IEnumerable<Led> ledsToUpdate) => UpdateQueue.SetData(GetUpdateData(ledsToUpdate));
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user