mirror of
https://github.com/DarthAffe/RGB.NET.git
synced 2025-12-12 09:38:31 +00:00
Added Provider for WLED-Devices
This commit is contained in:
parent
3400edcf93
commit
67672be54c
33
RGB.NET.Devices.WLED/API/WledAPI.cs
Normal file
33
RGB.NET.Devices.WLED/API/WledAPI.cs
Normal file
@ -0,0 +1,33 @@
|
||||
using System.Net.Http;
|
||||
using System.Net.Http.Json;
|
||||
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
/// <summary>
|
||||
/// Partial implementation of the WLED-JSON-API
|
||||
/// </summary>
|
||||
public static class WledAPI
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets the data returned by the 'info' endpoint of the WLED-device.
|
||||
/// </summary>
|
||||
/// <param name="address">The address of the device to request data from.</param>
|
||||
/// <returns>The data returned by the WLED-device.</returns>
|
||||
public static WledInfo? Info(string address)
|
||||
{
|
||||
if (string.IsNullOrEmpty(address)) return null;
|
||||
|
||||
using HttpClient client = new();
|
||||
try
|
||||
{
|
||||
return client.Send(new HttpRequestMessage(HttpMethod.Get, $"http://{address}/json/info"))
|
||||
.Content
|
||||
.ReadFromJsonAsync<WledInfo>()
|
||||
.Result;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
156
RGB.NET.Devices.WLED/API/WledInfo.cs
Normal file
156
RGB.NET.Devices.WLED/API/WledInfo.cs
Normal file
@ -0,0 +1,156 @@
|
||||
// ReSharper disable InconsistentNaming
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
public class WledInfo
|
||||
{
|
||||
[JsonPropertyName("ver")]
|
||||
public string Version { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("vid")]
|
||||
public uint BuildId { get; set; }
|
||||
|
||||
[JsonPropertyName("leds")]
|
||||
public LedsInfo Leds { get; set; } = new();
|
||||
|
||||
[JsonPropertyName("str")]
|
||||
public bool SyncReceive { get; set; }
|
||||
|
||||
[JsonPropertyName("name")]
|
||||
public string Name { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("udpport")]
|
||||
public ushort UDPPort { get; set; }
|
||||
|
||||
[JsonPropertyName("live")]
|
||||
public bool IsLive { get; set; }
|
||||
|
||||
[JsonPropertyName("liveseg")]
|
||||
public short MainSegment { get; set; }
|
||||
|
||||
[JsonPropertyName("lm")]
|
||||
public string RealtimeDataSource { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("lip")]
|
||||
public string RealtimeDataSourceIpAddress { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("ws")]
|
||||
public byte ConnectedWebSocketCount { get; set; }
|
||||
|
||||
[JsonPropertyName("fxcount")]
|
||||
public byte EffectCount { get; set; }
|
||||
|
||||
[JsonPropertyName("palcount")]
|
||||
public short PaletteCount { get; set; }
|
||||
|
||||
[JsonPropertyName("maps")]
|
||||
public List<Map> LedMaps { get; set; } = [];
|
||||
|
||||
[JsonPropertyName("wifi")]
|
||||
public Wifi WifiInfo { get; set; } = new();
|
||||
|
||||
[JsonPropertyName("fs")]
|
||||
public Fs FilesystemInfo { get; set; } = new();
|
||||
|
||||
[JsonPropertyName("ndc")]
|
||||
public short DiscoveredDeviceCount { get; set; }
|
||||
|
||||
[JsonPropertyName("arch")]
|
||||
public string PlatformName { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("core")]
|
||||
public string ArduinoCoreVersion { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("freeheap")]
|
||||
public uint FreeHeap { get; set; }
|
||||
|
||||
[JsonPropertyName("uptime")]
|
||||
public uint Uptime { get; set; }
|
||||
|
||||
[JsonPropertyName("time")]
|
||||
public string Time { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("brand")]
|
||||
public string Brand { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("product")]
|
||||
public string Product { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("ip")]
|
||||
public string IpAddress { get; set; } = "";
|
||||
|
||||
|
||||
public class LedsInfo
|
||||
{
|
||||
[JsonPropertyName("count")]
|
||||
public ushort Count { get; set; }
|
||||
|
||||
[JsonPropertyName("pwr")]
|
||||
public ushort PowerUsage { get; set; }
|
||||
|
||||
[JsonPropertyName("fps")]
|
||||
public ushort RefreshRate { get; set; }
|
||||
|
||||
[JsonPropertyName("maxpwr")]
|
||||
public ushort MaxPower { get; set; }
|
||||
|
||||
[JsonPropertyName("maxseg")]
|
||||
public byte MaxSegments { get; set; }
|
||||
|
||||
[JsonPropertyName("matrix")]
|
||||
public MatrixDims? Matrix { get; set; }
|
||||
|
||||
[JsonPropertyName("seglc")]
|
||||
public List<byte> SegmentLightCapabilities { get; set; } = [];
|
||||
|
||||
[JsonPropertyName("lc")]
|
||||
public byte CombinedSegmentLightCapabilities { get; set; }
|
||||
}
|
||||
|
||||
public class Map
|
||||
{
|
||||
[JsonPropertyName("id")]
|
||||
public byte Id { get; set; }
|
||||
|
||||
[JsonPropertyName("n")]
|
||||
public string Name { get; set; } = "";
|
||||
}
|
||||
|
||||
public class Wifi
|
||||
{
|
||||
[JsonPropertyName("bssid")]
|
||||
public string BSSID { get; set; } = "";
|
||||
|
||||
[JsonPropertyName("rssi")]
|
||||
public long RSSI { get; set; }
|
||||
|
||||
[JsonPropertyName("signal")]
|
||||
public byte SignalQuality { get; set; }
|
||||
|
||||
[JsonPropertyName("channel")]
|
||||
public int Channel { get; set; }
|
||||
}
|
||||
|
||||
public class Fs
|
||||
{
|
||||
[JsonPropertyName("u")]
|
||||
public uint UsedSpace { get; set; }
|
||||
|
||||
[JsonPropertyName("t")]
|
||||
public uint TotalSpace { get; set; }
|
||||
|
||||
[JsonPropertyName("pmt")]
|
||||
public ulong LastPresetsJsonModificationTime { get; set; }
|
||||
}
|
||||
|
||||
public class MatrixDims
|
||||
{
|
||||
[JsonPropertyName("w")]
|
||||
public ushort Width { get; set; }
|
||||
|
||||
[JsonPropertyName("h")]
|
||||
public ushort Height { get; set; }
|
||||
}
|
||||
}
|
||||
8
RGB.NET.Devices.WLED/Generic/IWLedRGBDevice.cs
Normal file
8
RGB.NET.Devices.WLED/Generic/IWLedRGBDevice.cs
Normal file
@ -0,0 +1,8 @@
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a WLED-device.
|
||||
/// </summary>
|
||||
internal interface IWledRGBDevice : IRGBDevice;
|
||||
11
RGB.NET.Devices.WLED/Generic/IWledDeviceDefinition.cs
Normal file
11
RGB.NET.Devices.WLED/Generic/IWledDeviceDefinition.cs
Normal file
@ -0,0 +1,11 @@
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
/// <summary>
|
||||
/// Represents the data used to create a WLED-device.
|
||||
/// </summary>
|
||||
public interface IWledDeviceDefinition
|
||||
{
|
||||
string Address { get; }
|
||||
string? Manufacturer { get; }
|
||||
string? Model { get; }
|
||||
}
|
||||
102
RGB.NET.Devices.WLED/Generic/WLedDeviceUpdateQueue.cs
Normal file
102
RGB.NET.Devices.WLED/Generic/WLedDeviceUpdateQueue.cs
Normal file
@ -0,0 +1,102 @@
|
||||
using System;
|
||||
using System.Net.Sockets;
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Represents the update-queue performing updates for WLED devices.
|
||||
/// </summary>
|
||||
internal sealed class WledDeviceUpdateQueue : UpdateQueue
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
/// <summary>
|
||||
/// The UDP-Connection used to send data.
|
||||
/// </summary>
|
||||
private readonly UdpClient _socket;
|
||||
|
||||
/// <summary>
|
||||
/// The buffer the UDP-data is stored in.
|
||||
/// </summary>
|
||||
private byte[] _buffer;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="WledDeviceUpdateQueue"/> class.
|
||||
/// </summary>
|
||||
/// <param name="updateTrigger">The update trigger used by this queue.</param>
|
||||
/// <param name="deviceType">The device type used to identify the device.</param>
|
||||
public WledDeviceUpdateQueue(IDeviceUpdateTrigger updateTrigger, string address, int port, int ledCount)
|
||||
: base(updateTrigger)
|
||||
{
|
||||
_buffer = new byte[2 + (ledCount * 3)];
|
||||
_buffer[0] = 2; // protocol: DRGB
|
||||
_buffer[1] = 2; // Timeout 2s
|
||||
|
||||
_socket = new UdpClient();
|
||||
_socket.Connect(address, port);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnUpdate(object? sender, CustomUpdateData customData)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (customData[CustomUpdateDataIndex.HEARTBEAT] as bool? ?? false)
|
||||
Update(Array.Empty<(object key, Color color)>());
|
||||
else
|
||||
base.OnUpdate(sender, customData);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WledDeviceProvider.Instance.Throw(ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override bool Update(in ReadOnlySpan<(object key, Color color)> dataSet)
|
||||
{
|
||||
try
|
||||
{
|
||||
Span<byte> data = _buffer.AsSpan()[2..];
|
||||
foreach ((object key, Color color) in dataSet)
|
||||
{
|
||||
int ledIndex = (int)key;
|
||||
int offset = (ledIndex * 3);
|
||||
data[offset] = color.GetR();
|
||||
data[offset + 1] = color.GetG();
|
||||
data[offset + 2] = color.GetB();
|
||||
}
|
||||
|
||||
_socket.Send(_buffer);
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WledDeviceProvider.Instance.Throw(ex);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
{
|
||||
base.Dispose();
|
||||
|
||||
_socket.Dispose();
|
||||
_buffer = [];
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
37
RGB.NET.Devices.WLED/Generic/WLedRGBDevice.cs
Normal file
37
RGB.NET.Devices.WLED/Generic/WLedRGBDevice.cs
Normal file
@ -0,0 +1,37 @@
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
/// <inheritdoc cref="AbstractRGBDevice{WledRGBDeviceInfo}" />
|
||||
/// <inheritdoc cref="IWledRGBDevice" />
|
||||
/// <summary>
|
||||
/// Represents a WLED-device.
|
||||
/// </summary>
|
||||
public sealed class WledRGBDevice : AbstractRGBDevice<WledRGBDeviceInfo>, IWledRGBDevice, ILedStripe
|
||||
{
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="WledRGBDevice"/> class.
|
||||
/// </summary>
|
||||
internal WledRGBDevice(WledRGBDeviceInfo info, string address, IDeviceUpdateTrigger updateTrigger)
|
||||
: base(info, new WledDeviceUpdateQueue(updateTrigger, address, info.Info.UDPPort, info.Info.Leds.Count))
|
||||
{
|
||||
InitializeLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
private void InitializeLayout()
|
||||
{
|
||||
for (int i = 0; i < DeviceInfo.Info.Leds.Count; i++)
|
||||
AddLed(LedId.LedStripe1 + i, new Point(i * 10, 0), new Size(10, 10));
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override object GetLedCustomData(LedId ledId) => ledId - LedId.LedStripe1;
|
||||
|
||||
#endregion
|
||||
}
|
||||
52
RGB.NET.Devices.WLED/Generic/WLedRGBDeviceInfo.cs
Normal file
52
RGB.NET.Devices.WLED/Generic/WLedRGBDeviceInfo.cs
Normal file
@ -0,0 +1,52 @@
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Represents a generic information for a WLED-<see cref="T:RGB.NET.Core.IRGBDevice" />.
|
||||
/// </summary>
|
||||
public sealed class WledRGBDeviceInfo : IRGBDeviceInfo
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
/// <inheritdoc />
|
||||
public RGBDeviceType DeviceType => RGBDeviceType.LedStripe;
|
||||
|
||||
/// <inheritdoc />
|
||||
public string DeviceName { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Manufacturer { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Model { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public object? LayoutMetadata { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets some info returned by the WLED-device.
|
||||
/// </summary>
|
||||
public WledInfo Info { get; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Internal constructor of managed <see cref="WledRGBDeviceInfo"/>.
|
||||
/// </summary>
|
||||
/// <param name="manufacturer">The manufacturer of the device.</param>
|
||||
/// <param name="model">The represented device model.</param>
|
||||
internal WledRGBDeviceInfo(WledInfo info, string? manufacturer, string? model)
|
||||
{
|
||||
this.Info = info;
|
||||
this.Manufacturer = manufacturer ?? info.Brand;
|
||||
this.Model = model ?? info.Name;
|
||||
|
||||
DeviceName = DeviceHelper.CreateDeviceName(Manufacturer, Model);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
18
RGB.NET.Devices.WLED/Generic/WledDeviceDefinition.cs
Normal file
18
RGB.NET.Devices.WLED/Generic/WledDeviceDefinition.cs
Normal file
@ -0,0 +1,18 @@
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
/// <inheritdoc />
|
||||
public class WledDeviceDefinition(string address, string? manufacturer = null, string? model = null) : IWledDeviceDefinition
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Address { get; } = address;
|
||||
|
||||
/// <inheritdoc />
|
||||
public string? Manufacturer { get; } = manufacturer;
|
||||
|
||||
/// <inheritdoc />
|
||||
public string? Model { get; } = model;
|
||||
|
||||
#endregion
|
||||
}
|
||||
18
RGB.NET.Devices.WLED/README.md
Normal file
18
RGB.NET.Devices.WLED/README.md
Normal file
@ -0,0 +1,18 @@
|
||||
[RGB.NET](https://github.com/DarthAffe/RGB.NET) Device-Provider-Package for [WLED](https://kno.wled.ge/)-devices.
|
||||
|
||||
## Usage
|
||||
This provider does not load anything by default and requires additional configuration to work.
|
||||
|
||||
```csharp
|
||||
// Add as many WLED-devices as you like
|
||||
WledDeviceProvider.Instance.AddDeviceDefinition(new WledDeviceDefinition("<hostname>"));
|
||||
|
||||
surface.Load(WledDeviceProvider.Instance);
|
||||
```
|
||||
|
||||
You can also override the manufacturer and device model in the DeviceDefinition.
|
||||
|
||||
# Required SDK
|
||||
This provider does not require an additional SDK.
|
||||
|
||||
UDP realtime needs to be enabled on the WLED device.
|
||||
62
RGB.NET.Devices.WLED/RGB.NET.Devices.WLED.csproj
Normal file
62
RGB.NET.Devices.WLED/RGB.NET.Devices.WLED.csproj
Normal file
@ -0,0 +1,62 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net8.0;net7.0;net6.0</TargetFrameworks>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
|
||||
<Authors>Darth Affe</Authors>
|
||||
<Company>Wyrez</Company>
|
||||
<Language>en-US</Language>
|
||||
<NeutralLanguage>en-US</NeutralLanguage>
|
||||
<Title>RGB.NET.Devices.WLED</Title>
|
||||
<AssemblyName>RGB.NET.Devices.WLED</AssemblyName>
|
||||
<AssemblyTitle>RGB.NET.Devices.WLED</AssemblyTitle>
|
||||
<PackageId>RGB.NET.Devices.WLED</PackageId>
|
||||
<RootNamespace>RGB.NET.Devices.WLED</RootNamespace>
|
||||
<Description>WLED-Device-Implementations of RGB.NET</Description>
|
||||
<Summary>WLED-Device-Implementations of RGB.NET, a C# (.NET) library for accessing various RGB-peripherals</Summary>
|
||||
<Copyright>Copyright © Darth Affe 2024</Copyright>
|
||||
<PackageCopyright>Copyright © Darth Affe 2024</PackageCopyright>
|
||||
<PackageIcon>icon.png</PackageIcon>
|
||||
<PackageReadmeFile>README.md</PackageReadmeFile>
|
||||
<PackageProjectUrl>https://github.com/DarthAffe/RGB.NET</PackageProjectUrl>
|
||||
<PackageLicenseExpression>LGPL-2.1-only</PackageLicenseExpression>
|
||||
<RepositoryType>Github</RepositoryType>
|
||||
<RepositoryUrl>https://github.com/DarthAffe/RGB.NET</RepositoryUrl>
|
||||
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
|
||||
|
||||
<PackageReleaseNotes></PackageReleaseNotes>
|
||||
|
||||
<Version>0.0.1</Version>
|
||||
<AssemblyVersion>0.0.1</AssemblyVersion>
|
||||
<FileVersion>0.0.1</FileVersion>
|
||||
|
||||
<OutputPath>..\bin\</OutputPath>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<IncludeSource>True</IncludeSource>
|
||||
<IncludeSymbols>True</IncludeSymbols>
|
||||
<DebugType>portable</DebugType>
|
||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<DefineConstants>TRACE;DEBUG</DefineConstants>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<Optimize>false</Optimize>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
|
||||
<Optimize>true</Optimize>
|
||||
<NoWarn>$(NoWarn);CS1591;CS1572;CS1573</NoWarn>
|
||||
<DefineConstants>RELEASE</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="..\Resources\icon.png" Link="icon.png" Pack="true" PackagePath="\" />
|
||||
<None Include="README.md" Pack="true" PackagePath="\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\RGB.NET.Core\RGB.NET.Core.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@ -0,0 +1,3 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=api/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=generic/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
113
RGB.NET.Devices.WLED/WLedDeviceProvider.cs
Normal file
113
RGB.NET.Devices.WLED/WLedDeviceProvider.cs
Normal file
@ -0,0 +1,113 @@
|
||||
// ReSharper disable MemberCanBePrivate.Global
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.WLED;
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Represents a device provider responsible for WS2812B- and WS2811-Led-devices.
|
||||
/// </summary>
|
||||
// ReSharper disable once InconsistentNaming
|
||||
// ReSharper disable once UnusedType.Global
|
||||
public sealed class WledDeviceProvider : AbstractRGBDeviceProvider
|
||||
{
|
||||
#region Constants
|
||||
|
||||
private const int HEARTBEAT_TIMER = 1000;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties & Fields
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
private static readonly object _lock = new();
|
||||
|
||||
private static WledDeviceProvider? _instance;
|
||||
/// <summary>
|
||||
/// Gets the singleton <see cref="WledDeviceProvider"/> instance.
|
||||
/// </summary>
|
||||
public static WledDeviceProvider Instance
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (_lock)
|
||||
return _instance ?? new WledDeviceProvider();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a list of all defined device-definitions.
|
||||
/// </summary>
|
||||
public List<IWledDeviceDefinition> DeviceDefinitions { get; } = [];
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="WledDeviceProvider"/> class.
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException">Thrown if this constructor is called even if there is already an instance of this class.</exception>
|
||||
public WledDeviceProvider()
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
if (_instance != null) throw new InvalidOperationException($"There can be only one instance of type {nameof(WledDeviceProvider)}");
|
||||
_instance = this;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <summary>
|
||||
/// Adds the specified <see cref="IWledDeviceDefinition" /> to this device-provider.
|
||||
/// </summary>
|
||||
/// <param name="deviceDefinition">The <see cref="IWledDeviceDefinition"/> to add.</param>
|
||||
public void AddDeviceDefinition(IWledDeviceDefinition deviceDefinition) => DeviceDefinitions.Add(deviceDefinition);
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void InitializeSDK() { }
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override IEnumerable<IRGBDevice> LoadDevices()
|
||||
{
|
||||
int i = 0;
|
||||
foreach (IWledDeviceDefinition deviceDefinition in DeviceDefinitions)
|
||||
{
|
||||
IDeviceUpdateTrigger updateTrigger = GetUpdateTrigger(i++);
|
||||
WledRGBDevice? device = CreateWledDevice(deviceDefinition, updateTrigger);
|
||||
if (device != null)
|
||||
yield return device;
|
||||
}
|
||||
}
|
||||
|
||||
private static WledRGBDevice? CreateWledDevice(IWledDeviceDefinition deviceDefinition, IDeviceUpdateTrigger updateTrigger)
|
||||
{
|
||||
WledInfo? wledInfo = WledAPI.Info(deviceDefinition.Address);
|
||||
if (wledInfo == null) return null;
|
||||
|
||||
return new WledRGBDevice(new WledRGBDeviceInfo(wledInfo, deviceDefinition.Manufacturer, deviceDefinition.Model), deviceDefinition.Address, updateTrigger);
|
||||
}
|
||||
|
||||
protected override IDeviceUpdateTrigger CreateUpdateTrigger(int id, double updateRateHardLimit) => new DeviceUpdateTrigger(updateRateHardLimit) { HeartbeatTimer = HEARTBEAT_TIMER };
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
|
||||
DeviceDefinitions.Clear();
|
||||
|
||||
_instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@ -49,6 +49,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RGB.NET.Devices.OpenRGB", "
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RGB.NET.Devices.Corsair_Legacy", "RGB.NET.Devices.Corsair_Legacy\RGB.NET.Devices.Corsair_Legacy.csproj", "{66AF690C-27A1-4097-AC53-57C0ED89E286}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RGB.NET.Devices.WLED", "RGB.NET.Devices.WLED\RGB.NET.Devices.WLED.csproj", "{C533C5EA-66A8-4826-A814-80791E7593ED}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -139,6 +141,10 @@ Global
|
||||
{66AF690C-27A1-4097-AC53-57C0ED89E286}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{66AF690C-27A1-4097-AC53-57C0ED89E286}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{66AF690C-27A1-4097-AC53-57C0ED89E286}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C533C5EA-66A8-4826-A814-80791E7593ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C533C5EA-66A8-4826-A814-80791E7593ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C533C5EA-66A8-4826-A814-80791E7593ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C533C5EA-66A8-4826-A814-80791E7593ED}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@ -161,6 +167,7 @@ Global
|
||||
{EDBA49D6-AE96-4E96-9E6A-30154D93BD5F} = {92D7C263-D4C9-4D26-93E2-93C1F9C2CD16}
|
||||
{F29A96E5-CDD0-469F-A871-A35A7519BC49} = {D13032C6-432E-4F43-8A32-071133C22B16}
|
||||
{66AF690C-27A1-4097-AC53-57C0ED89E286} = {D13032C6-432E-4F43-8A32-071133C22B16}
|
||||
{C533C5EA-66A8-4826-A814-80791E7593ED} = {D13032C6-432E-4F43-8A32-071133C22B16}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {7F222AD4-1F9E-4AAB-9D69-D62372D4C1BA}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user