using System; using System.Collections; using System.Collections.Generic; using System.Linq; using HidSharp; using RGB.NET.Core; namespace RGB.NET.HID { public record HIDDeviceDefinition(int ProductId, RGBDeviceType DeviceType, string Name, LedMapping LedMapping, TData CustomData) where TLed : notnull; public class HIDLoader : IEnumerable> where TLed : notnull { #region Properties & Fields private readonly Dictionary> _deviceDefinitions = new(); public int VendorId { get; } public RGBDeviceType LoadFilter { get; set; } = RGBDeviceType.All; #endregion #region Constructors public HIDLoader(int vendorId) { this.VendorId = vendorId; } #endregion #region Methods public void Add(int productId, RGBDeviceType deviceType, string name, LedMapping ledMapping, TData customData) => _deviceDefinitions.Add(productId, new HIDDeviceDefinition(productId, deviceType, name, ledMapping, customData)); public IEnumerable<(HIDDeviceDefinition definition, HidDevice device)> GetConnectedDevices() { IEnumerable devices = DeviceList.Local.GetHidDevices(VendorId); foreach (HidDevice device in devices) { if (_deviceDefinitions.TryGetValue(device.ProductID, out HIDDeviceDefinition? definition)) if (LoadFilter.HasFlag(definition.DeviceType)) yield return (definition, device); } } public IEnumerable<(HIDDeviceDefinition definition, HidDevice device)> GetConnectedDevices(Func, TKey> groupBy) => GetConnectedDevices().GroupBy(x => groupBy(x.definition)) .Select(group => group.First()); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public IEnumerator> GetEnumerator() => _deviceDefinitions.Values.GetEnumerator(); #endregion } }