mirror of
https://github.com/DarthAffe/RGB.NET.git
synced 2025-12-13 01:58:30 +00:00
Merge pull request #274 from DarthAffe/feature/openrgb
Added OpenRGB device provider
This commit is contained in:
commit
4b5d076953
24
RGB.NET.Devices.OpenRGB/Abstract/AbstractOpenRGBDevice.cs
Normal file
24
RGB.NET.Devices.OpenRGB/Abstract/AbstractOpenRGBDevice.cs
Normal file
@ -0,0 +1,24 @@
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
/// <inheritdoc cref="AbstractRGBDevice{TDeviceInfo}" />
|
||||
/// <summary>
|
||||
/// Represents a generic OpenRGB Device.
|
||||
/// </summary>
|
||||
public abstract class AbstractOpenRGBDevice<TDeviceInfo> : AbstractRGBDevice<TDeviceInfo>, IOpenRGBDevice
|
||||
where TDeviceInfo : OpenRGBDeviceInfo
|
||||
{
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="AbstractOpenRGBDevice{TDeviceInfo}"/> class.
|
||||
/// </summary>
|
||||
/// <param name="info">The generic information provided by OpenRGB for this device.</param>
|
||||
/// <param name="updateQueue">The queue used to update this device.</param>
|
||||
protected AbstractOpenRGBDevice(TDeviceInfo info, IUpdateQueue updateQueue)
|
||||
: base(info, updateQueue)
|
||||
{ }
|
||||
|
||||
#endregion
|
||||
}
|
||||
9
RGB.NET.Devices.OpenRGB/Abstract/IOpenRGBDevice.cs
Normal file
9
RGB.NET.Devices.OpenRGB/Abstract/IOpenRGBDevice.cs
Normal file
@ -0,0 +1,9 @@
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a generic OpenRGB Device.
|
||||
/// </summary>
|
||||
public interface IOpenRGBDevice : IRGBDevice
|
||||
{ }
|
||||
52
RGB.NET.Devices.OpenRGB/Abstract/OpenRGBDeviceInfo.cs
Normal file
52
RGB.NET.Devices.OpenRGB/Abstract/OpenRGBDeviceInfo.cs
Normal file
@ -0,0 +1,52 @@
|
||||
using RGB.NET.Core;
|
||||
using OpenRGBDevice = OpenRGB.NET.Models.Device;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
/// <summary>
|
||||
/// Represents generic information for an OpenRGB Device
|
||||
/// </summary>
|
||||
public class OpenRGBDeviceInfo : IRGBDeviceInfo
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
/// <inheritdoc />
|
||||
public RGBDeviceType DeviceType { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public string DeviceName { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Manufacturer { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Model { get; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public object? LayoutMetadata { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the OpenRGB device.
|
||||
/// </summary>
|
||||
public OpenRGBDevice OpenRGBDevice { get; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of <see cref="OpenRGBDeviceInfo"/>.
|
||||
/// </summary>
|
||||
/// <param name="openRGBDevice">The OpenRGB device to extract information from.</param>
|
||||
internal OpenRGBDeviceInfo(OpenRGBDevice openRGBDevice)
|
||||
{
|
||||
this.OpenRGBDevice = openRGBDevice;
|
||||
|
||||
DeviceType = Helper.GetRgbNetDeviceType(openRGBDevice.Type);
|
||||
Manufacturer = Helper.GetVendorName(openRGBDevice);
|
||||
Model = Helper.GetModelName(openRGBDevice);
|
||||
DeviceName = DeviceHelper.CreateDeviceName(Manufacturer, Model);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
145
RGB.NET.Devices.OpenRGB/Generic/LedMappings.cs
Normal file
145
RGB.NET.Devices.OpenRGB/Generic/LedMappings.cs
Normal file
@ -0,0 +1,145 @@
|
||||
using RGB.NET.Core;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
internal static class LedMappings
|
||||
{
|
||||
public static readonly Dictionary<string, LedId> DEFAULT = new()
|
||||
{
|
||||
["Key: A"] = LedId.Keyboard_A,
|
||||
["Key: B"] = LedId.Keyboard_B,
|
||||
["Key: C"] = LedId.Keyboard_C,
|
||||
["Key: D"] = LedId.Keyboard_D,
|
||||
["Key: E"] = LedId.Keyboard_E,
|
||||
["Key: F"] = LedId.Keyboard_F,
|
||||
["Key: G"] = LedId.Keyboard_G,
|
||||
["Key: H"] = LedId.Keyboard_H,
|
||||
["Key: I"] = LedId.Keyboard_I,
|
||||
["Key: J"] = LedId.Keyboard_J,
|
||||
["Key: K"] = LedId.Keyboard_K,
|
||||
["Key: L"] = LedId.Keyboard_L,
|
||||
["Key: M"] = LedId.Keyboard_M,
|
||||
["Key: N"] = LedId.Keyboard_N,
|
||||
["Key: O"] = LedId.Keyboard_O,
|
||||
["Key: P"] = LedId.Keyboard_P,
|
||||
["Key: Q"] = LedId.Keyboard_Q,
|
||||
["Key: R"] = LedId.Keyboard_R,
|
||||
["Key: S"] = LedId.Keyboard_S,
|
||||
["Key: T"] = LedId.Keyboard_T,
|
||||
["Key: U"] = LedId.Keyboard_U,
|
||||
["Key: V"] = LedId.Keyboard_V,
|
||||
["Key: W"] = LedId.Keyboard_W,
|
||||
["Key: X"] = LedId.Keyboard_X,
|
||||
["Key: Y"] = LedId.Keyboard_Y,
|
||||
["Key: Z"] = LedId.Keyboard_Z,
|
||||
["Key: 1"] = LedId.Keyboard_1,
|
||||
["Key: 2"] = LedId.Keyboard_2,
|
||||
["Key: 3"] = LedId.Keyboard_3,
|
||||
["Key: 4"] = LedId.Keyboard_4,
|
||||
["Key: 5"] = LedId.Keyboard_5,
|
||||
["Key: 6"] = LedId.Keyboard_6,
|
||||
["Key: 7"] = LedId.Keyboard_7,
|
||||
["Key: 8"] = LedId.Keyboard_8,
|
||||
["Key: 9"] = LedId.Keyboard_9,
|
||||
["Key: 0"] = LedId.Keyboard_0,
|
||||
["Key: Enter"] = LedId.Keyboard_Enter,
|
||||
["Key: Enter (ISO)"] = LedId.Keyboard_Enter,
|
||||
["Key: Escape"] = LedId.Keyboard_Escape,
|
||||
["Key: Backspace"] = LedId.Keyboard_Backspace,
|
||||
["Key: Tab"] = LedId.Keyboard_Tab,
|
||||
["Key: Space"] = LedId.Keyboard_Space,
|
||||
["Key: -"] = LedId.Keyboard_MinusAndUnderscore,
|
||||
["Key: ="] = LedId.Keyboard_EqualsAndPlus,
|
||||
["Key: ["] = LedId.Keyboard_BracketLeft,
|
||||
["Key: ]"] = LedId.Keyboard_BracketRight,
|
||||
["Key: \\ (ANSI)"] = LedId.Keyboard_Backslash,
|
||||
["Key: #"] = LedId.Keyboard_NonUsTilde,
|
||||
["Key: ;"] = LedId.Keyboard_SemicolonAndColon,
|
||||
["Key: '"] = LedId.Keyboard_ApostropheAndDoubleQuote,
|
||||
["Key: `"] = LedId.Keyboard_GraveAccentAndTilde,
|
||||
["Key: ,"] = LedId.Keyboard_CommaAndLessThan,
|
||||
["Key: ."] = LedId.Keyboard_PeriodAndBiggerThan,
|
||||
["Key: /"] = LedId.Keyboard_SlashAndQuestionMark,
|
||||
["Key: Caps Lock"] = LedId.Keyboard_CapsLock,
|
||||
["Key: F1"] = LedId.Keyboard_F1,
|
||||
["Key: F2"] = LedId.Keyboard_F2,
|
||||
["Key: F3"] = LedId.Keyboard_F3,
|
||||
["Key: F4"] = LedId.Keyboard_F4,
|
||||
["Key: F5"] = LedId.Keyboard_F5,
|
||||
["Key: F6"] = LedId.Keyboard_F6,
|
||||
["Key: F7"] = LedId.Keyboard_F7,
|
||||
["Key: F8"] = LedId.Keyboard_F8,
|
||||
["Key: F9"] = LedId.Keyboard_F9,
|
||||
["Key: F10"] = LedId.Keyboard_F10,
|
||||
["Key: F11"] = LedId.Keyboard_F11,
|
||||
["Key: F12"] = LedId.Keyboard_F12,
|
||||
["Key: Print Screen"] = LedId.Keyboard_PrintScreen,
|
||||
["Key: Scroll Lock"] = LedId.Keyboard_ScrollLock,
|
||||
["Key: Pause/Break"] = LedId.Keyboard_PauseBreak,
|
||||
["Key: Insert"] = LedId.Keyboard_Insert,
|
||||
["Key: Home"] = LedId.Keyboard_Home,
|
||||
["Key: Page Up"] = LedId.Keyboard_PageUp,
|
||||
["Key: Delete"] = LedId.Keyboard_Delete,
|
||||
["Key: End"] = LedId.Keyboard_End,
|
||||
["Key: Page Down"] = LedId.Keyboard_PageDown,
|
||||
["Key: Right Arrow"] = LedId.Keyboard_ArrowRight,
|
||||
["Key: Left Arrow"] = LedId.Keyboard_ArrowLeft,
|
||||
["Key: Down Arrow"] = LedId.Keyboard_ArrowDown,
|
||||
["Key: Up Arrow"] = LedId.Keyboard_ArrowUp,
|
||||
["Key: Num Lock"] = LedId.Keyboard_NumLock,
|
||||
["Key: Number Pad /"] = LedId.Keyboard_NumSlash,
|
||||
["Key: Number Pad *"] = LedId.Keyboard_NumAsterisk,
|
||||
["Key: Number Pad -"] = LedId.Keyboard_NumMinus,
|
||||
["Key: Number Pad +"] = LedId.Keyboard_NumPlus,
|
||||
["Key: Number Pad Enter"] = LedId.Keyboard_NumEnter,
|
||||
["Key: Number Pad 1"] = LedId.Keyboard_Num1,
|
||||
["Key: Number Pad 2"] = LedId.Keyboard_Num2,
|
||||
["Key: Number Pad 3"] = LedId.Keyboard_Num3,
|
||||
["Key: Number Pad 4"] = LedId.Keyboard_Num4,
|
||||
["Key: Number Pad 5"] = LedId.Keyboard_Num5,
|
||||
["Key: Number Pad 6"] = LedId.Keyboard_Num6,
|
||||
["Key: Number Pad 7"] = LedId.Keyboard_Num7,
|
||||
["Key: Number Pad 8"] = LedId.Keyboard_Num8,
|
||||
["Key: Number Pad 9"] = LedId.Keyboard_Num9,
|
||||
["Key: Number Pad 0"] = LedId.Keyboard_Num0,
|
||||
["Key: Number Pad ."] = LedId.Keyboard_NumPeriodAndDelete,
|
||||
["Key: Left Fn"] = LedId.Keyboard_Function,
|
||||
["Key: Right Fn"] = LedId.Keyboard_Function,
|
||||
["Key: \\ (ISO)"] = LedId.Keyboard_NonUsBackslash,
|
||||
["Key: Menu"] = LedId.Keyboard_Application,
|
||||
["Key: Left Control"] = LedId.Keyboard_LeftCtrl,
|
||||
["Key: Left Shift"] = LedId.Keyboard_LeftShift,
|
||||
["Key: Left Alt"] = LedId.Keyboard_LeftAlt,
|
||||
["Key: Left Windows"] = LedId.Keyboard_LeftGui,
|
||||
["Key: Right Control"] = LedId.Keyboard_RightCtrl,
|
||||
["Key: Right Shift"] = LedId.Keyboard_RightShift,
|
||||
["Key: Right Alt"] = LedId.Keyboard_RightAlt,
|
||||
["Key: Right Windows"] = LedId.Keyboard_RightGui,
|
||||
["Key: Media Next"] = LedId.Keyboard_MediaNextTrack,
|
||||
["Key: Media Previous"] = LedId.Keyboard_MediaPreviousTrack,
|
||||
["Key: Media Stop"] = LedId.Keyboard_MediaStop,
|
||||
["Key: Media Pause"] = LedId.Keyboard_MediaPlay,
|
||||
["Key: Media Play"] = LedId.Keyboard_MediaPlay,
|
||||
["Key: Media Play/Pause"] = LedId.Keyboard_MediaPlay,
|
||||
["Key: Media Mute"] = LedId.Keyboard_MediaMute,
|
||||
["Logo"] = LedId.Logo,
|
||||
["Key: Brightness"] = LedId.Keyboard_Brightness,
|
||||
["Key: M1"] = LedId.Keyboard_Macro1,
|
||||
["Key: M2"] = LedId.Keyboard_Macro2,
|
||||
["Key: M3"] = LedId.Keyboard_Macro3,
|
||||
["Key: M4"] = LedId.Keyboard_Macro4,
|
||||
["Key: M5"] = LedId.Keyboard_Macro5,
|
||||
["Key: G1"] = LedId.Keyboard_Programmable1,
|
||||
["Key: G2"] = LedId.Keyboard_Programmable2,
|
||||
["Key: G3"] = LedId.Keyboard_Programmable3,
|
||||
["Key: G4"] = LedId.Keyboard_Programmable4,
|
||||
["Key: G5"] = LedId.Keyboard_Programmable5,
|
||||
["Key: G6"] = LedId.Keyboard_Programmable6,
|
||||
["Key: G7"] = LedId.Keyboard_Programmable7,
|
||||
["Key: G8"] = LedId.Keyboard_Programmable8,
|
||||
["Key: G9"] = LedId.Keyboard_Programmable9,
|
||||
["Lighting"] = LedId.Keyboard_Brightness,
|
||||
["Game Mode"] = LedId.Keyboard_WinLock,
|
||||
};
|
||||
}
|
||||
83
RGB.NET.Devices.OpenRGB/Generic/OpenRGBGenericDevice.cs
Normal file
83
RGB.NET.Devices.OpenRGB/Generic/OpenRGBGenericDevice.cs
Normal file
@ -0,0 +1,83 @@
|
||||
using OpenRGB.NET.Enums;
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
/// <inheritdoc />
|
||||
public class OpenRGBGenericDevice : AbstractOpenRGBDevice<OpenRGBDeviceInfo>
|
||||
{
|
||||
#region Constructors
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="OpenRGBGenericDevice"/> class.
|
||||
/// </summary>
|
||||
/// <param name="info">Generic information for the device.</param>
|
||||
/// <param name="updateQueue">The queue used to update the device.</param>
|
||||
public OpenRGBGenericDevice(OpenRGBDeviceInfo info, IUpdateQueue updateQueue)
|
||||
: base(info, updateQueue)
|
||||
{
|
||||
InitializeLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <summary>
|
||||
/// Initializes the LEDs of the device based on the data provided by the SDK.
|
||||
/// </summary>
|
||||
private void InitializeLayout()
|
||||
{
|
||||
LedId initial = Helper.GetInitialLedIdForDeviceType(DeviceInfo.DeviceType);
|
||||
|
||||
int y = 0;
|
||||
Size ledSize = new(19);
|
||||
int zoneLedIndex = 0;
|
||||
const int LED_SPACING = 20;
|
||||
|
||||
foreach (global::OpenRGB.NET.Models.Zone? zone in DeviceInfo.OpenRGBDevice.Zones)
|
||||
{
|
||||
if (zone.Type == ZoneType.Matrix)
|
||||
{
|
||||
for (int row = 0; row < zone.MatrixMap.Height; row++)
|
||||
{
|
||||
for (int column = 0; column < zone.MatrixMap.Width; column++)
|
||||
{
|
||||
uint index = zone.MatrixMap.Matrix[row, column];
|
||||
|
||||
//will be max value if the position does not have an associated key
|
||||
if (index == uint.MaxValue)
|
||||
continue;
|
||||
|
||||
LedId ledId = LedMappings.DEFAULT.TryGetValue(DeviceInfo.OpenRGBDevice.Leds[zoneLedIndex + index].Name, out LedId id)
|
||||
? id
|
||||
: initial++;
|
||||
|
||||
//HACK: doing this because some different Led Names are mapped to the same LedId
|
||||
//for example, "Enter" and "ISO Enter".
|
||||
//this way, at least they'll be controllable as CustomX
|
||||
while (AddLed(ledId, new Point(LED_SPACING * column, y + (LED_SPACING * row)), ledSize, zoneLedIndex + (int)index) == null)
|
||||
ledId = initial++;
|
||||
}
|
||||
}
|
||||
y += (int)(zone.MatrixMap.Height * LED_SPACING);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < zone.LedCount; i++)
|
||||
{
|
||||
LedId ledId = initial++;
|
||||
|
||||
while (AddLed(ledId, new Point(LED_SPACING * i, y), ledSize, zoneLedIndex + i) == null)
|
||||
ledId = initial++;
|
||||
}
|
||||
}
|
||||
|
||||
//we'll just set each zone in its own row for now,
|
||||
//with each led for that zone being horizontally distributed
|
||||
y += LED_SPACING;
|
||||
zoneLedIndex += (int)zone.LedCount;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
61
RGB.NET.Devices.OpenRGB/Generic/OpenRGBUpdateQueue.cs
Normal file
61
RGB.NET.Devices.OpenRGB/Generic/OpenRGBUpdateQueue.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using OpenRGB.NET;
|
||||
using RGB.NET.Core;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using OpenRGBColor = OpenRGB.NET.Models.Color;
|
||||
using OpenRGBDevice = OpenRGB.NET.Models.Device;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Represents the update-queue performing updates for OpenRGB devices.
|
||||
/// </summary>
|
||||
public class OpenRGBUpdateQueue : UpdateQueue
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
private readonly int _deviceid;
|
||||
|
||||
private readonly OpenRGBClient _openRGB;
|
||||
private readonly OpenRGBDevice _device;
|
||||
private readonly OpenRGBColor[] _colors;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="OpenRGBUpdateQueue"/> class.
|
||||
/// </summary>
|
||||
/// <param name="updateTrigger">The update trigger used by this queue.</param>
|
||||
/// <param name="deviceid">The index used to identify the device.</param>
|
||||
/// <param name="client">The OpenRGB client used to send updates to the OpenRGB server.</param>
|
||||
/// <param name="device">The OpenRGB Device containing device-specific information.</param>
|
||||
public OpenRGBUpdateQueue(IDeviceUpdateTrigger updateTrigger, int deviceid, OpenRGBClient client, OpenRGBDevice device)
|
||||
: base(updateTrigger)
|
||||
{
|
||||
this._deviceid = deviceid;
|
||||
this._openRGB = client;
|
||||
this._device = device;
|
||||
|
||||
_colors = Enumerable.Range(0, _device.Colors.Length)
|
||||
.Select(_ => new OpenRGBColor())
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
/// <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());
|
||||
|
||||
_openRGB.UpdateLeds(_deviceid, _colors);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
55
RGB.NET.Devices.OpenRGB/Helper.cs
Normal file
55
RGB.NET.Devices.OpenRGB/Helper.cs
Normal file
@ -0,0 +1,55 @@
|
||||
using OpenRGB.NET.Enums;
|
||||
using RGB.NET.Core;
|
||||
using OpenRGBDevice = OpenRGB.NET.Models.Device;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
internal static class Helper
|
||||
{
|
||||
public static LedId GetInitialLedIdForDeviceType(RGBDeviceType type)
|
||||
=> type switch
|
||||
{
|
||||
RGBDeviceType.Mouse => LedId.Mouse1,
|
||||
RGBDeviceType.Headset => LedId.Headset1,
|
||||
RGBDeviceType.Mousepad => LedId.Mousepad1,
|
||||
RGBDeviceType.LedStripe => LedId.LedStripe1,
|
||||
RGBDeviceType.LedMatrix => LedId.LedMatrix1,
|
||||
RGBDeviceType.Mainboard => LedId.Mainboard1,
|
||||
RGBDeviceType.GraphicsCard => LedId.GraphicsCard1,
|
||||
RGBDeviceType.DRAM => LedId.DRAM1,
|
||||
RGBDeviceType.HeadsetStand => LedId.HeadsetStand1,
|
||||
RGBDeviceType.Keypad => LedId.Keypad1,
|
||||
RGBDeviceType.Fan => LedId.Fan1,
|
||||
RGBDeviceType.Speaker => LedId.Speaker1,
|
||||
RGBDeviceType.Cooler => LedId.Cooler1,
|
||||
RGBDeviceType.Keyboard => LedId.Keyboard_Custom1,
|
||||
_ => LedId.Custom1
|
||||
};
|
||||
|
||||
public static RGBDeviceType GetRgbNetDeviceType(DeviceType type)
|
||||
=> type switch
|
||||
{
|
||||
DeviceType.Motherboard => RGBDeviceType.Mainboard,
|
||||
DeviceType.Dram => RGBDeviceType.DRAM,
|
||||
DeviceType.Gpu => RGBDeviceType.GraphicsCard,
|
||||
DeviceType.Cooler => RGBDeviceType.Cooler,
|
||||
DeviceType.Ledstrip => RGBDeviceType.LedStripe,
|
||||
DeviceType.Keyboard => RGBDeviceType.Keyboard,
|
||||
DeviceType.Mouse => RGBDeviceType.Mouse,
|
||||
DeviceType.Mousemat => RGBDeviceType.Mousepad,
|
||||
DeviceType.Headset => RGBDeviceType.Headset,
|
||||
DeviceType.HeadsetStand => RGBDeviceType.HeadsetStand,
|
||||
_ => RGBDeviceType.Unknown
|
||||
};
|
||||
|
||||
public static LedId GetInitialLedIdForDeviceType(DeviceType type)
|
||||
=> GetInitialLedIdForDeviceType(GetRgbNetDeviceType(type));
|
||||
|
||||
public static string GetVendorName(OpenRGBDevice openRGBDevice) => string.IsNullOrWhiteSpace(openRGBDevice.Vendor)
|
||||
? "OpenRGB"
|
||||
: openRGBDevice.Vendor;
|
||||
|
||||
public static string GetModelName(OpenRGBDevice openRGBDevice) => string.IsNullOrWhiteSpace(openRGBDevice.Vendor)
|
||||
? openRGBDevice.Name
|
||||
: openRGBDevice.Name.Replace(openRGBDevice.Vendor, "").Trim();
|
||||
}
|
||||
138
RGB.NET.Devices.OpenRGB/OpenRGBDeviceProvider.cs
Normal file
138
RGB.NET.Devices.OpenRGB/OpenRGBDeviceProvider.cs
Normal file
@ -0,0 +1,138 @@
|
||||
using OpenRGB.NET;
|
||||
using OpenRGB.NET.Models;
|
||||
using RGB.NET.Core;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
/// <inheritdoc />
|
||||
/// <summary>
|
||||
/// Represents a device provider responsible for OpenRGB devices.
|
||||
/// </summary>
|
||||
public class OpenRGBDeviceProvider : AbstractRGBDeviceProvider
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
private readonly List<OpenRGBClient> _clients = new();
|
||||
|
||||
private static OpenRGBDeviceProvider? _instance;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the singleton <see cref="OpenRGBDeviceProvider"/> instance.
|
||||
/// </summary>
|
||||
public static OpenRGBDeviceProvider Instance => _instance ?? new OpenRGBDeviceProvider();
|
||||
|
||||
/// <summary>
|
||||
/// Gets a list of all defined device-definitions.
|
||||
/// </summary>
|
||||
public List<OpenRGBServerDefinition> DeviceDefinitions { get; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// Indicates whether all devices will be added, or just the ones with a 'Direct' mode. Defaults to false.
|
||||
/// </summary>
|
||||
public bool ForceAddAllDevices { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// Defines which device types will be separated by zones. Defaults to <see cref="RGBDeviceType.LedStripe" /> | <see cref="RGBDeviceType.Mainboard" />.
|
||||
/// </summary>
|
||||
public RGBDeviceType PerZoneDeviceFlag { get; } = RGBDeviceType.LedStripe | RGBDeviceType.Mainboard;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="OpenRGBDeviceProvider"/> class.
|
||||
/// </summary>
|
||||
/// <exception cref="InvalidOperationException">Thrown if this constructor is called even if there is already an instance of this class.</exception>
|
||||
public OpenRGBDeviceProvider()
|
||||
{
|
||||
if (_instance != null) throw new InvalidOperationException($"There can be only one instance of type {nameof(OpenRGBDeviceProvider)}");
|
||||
_instance = this;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
/// <inheritdoc />
|
||||
protected override void InitializeSDK()
|
||||
{
|
||||
foreach (OpenRGBServerDefinition? deviceDefinition in DeviceDefinitions)
|
||||
{
|
||||
try
|
||||
{
|
||||
OpenRGBClient? openRgb = new(ip: deviceDefinition.Ip, port: deviceDefinition.Port, name: deviceDefinition.ClientName, autoconnect: true);
|
||||
_clients.Add(openRgb);
|
||||
deviceDefinition.Connected = true;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
deviceDefinition.Connected = false;
|
||||
deviceDefinition.LastError = e.Message;
|
||||
Throw(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override IEnumerable<IRGBDevice> LoadDevices()
|
||||
{
|
||||
foreach (OpenRGBClient? openRgb in _clients)
|
||||
{
|
||||
int deviceCount = openRgb.GetControllerCount();
|
||||
|
||||
for (int i = 0; i < deviceCount; i++)
|
||||
{
|
||||
Device? device = openRgb.GetControllerData(i);
|
||||
|
||||
int directModeIndex = Array.FindIndex(device.Modes, d => d.Name == "Direct");
|
||||
if (directModeIndex != -1)
|
||||
{
|
||||
//set the device to direct mode if it has it
|
||||
openRgb.SetMode(i, directModeIndex);
|
||||
}
|
||||
else if (!ForceAddAllDevices)
|
||||
{
|
||||
//if direct mode does not exist
|
||||
//and if we're not forcing, continue to the next device.
|
||||
continue;
|
||||
}
|
||||
|
||||
OpenRGBUpdateQueue? updateQueue = new(GetUpdateTrigger(), i, openRgb, device);
|
||||
|
||||
if (PerZoneDeviceFlag.HasFlag(Helper.GetRgbNetDeviceType(device.Type)))
|
||||
{
|
||||
int totalLedCount = 0;
|
||||
|
||||
foreach (Zone zone in device.Zones)
|
||||
if (zone.LedCount > 0)
|
||||
{
|
||||
yield return new OpenRGBZoneDevice(new OpenRGBDeviceInfo(device), totalLedCount, zone, updateQueue);
|
||||
totalLedCount += (int)zone.LedCount;
|
||||
}
|
||||
}
|
||||
else
|
||||
yield return new OpenRGBGenericDevice(new OpenRGBDeviceInfo(device), updateQueue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void Dispose()
|
||||
{
|
||||
base.Dispose();
|
||||
|
||||
foreach (OpenRGBClient client in _clients)
|
||||
{
|
||||
try { client.Dispose(); }
|
||||
catch { /* at least we tried */ }
|
||||
}
|
||||
|
||||
_clients.Clear();
|
||||
DeviceDefinitions.Clear();
|
||||
Devices = Enumerable.Empty<IRGBDevice>();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
32
RGB.NET.Devices.OpenRGB/OpenRGBServerDefinition.cs
Normal file
32
RGB.NET.Devices.OpenRGB/OpenRGBServerDefinition.cs
Normal file
@ -0,0 +1,32 @@
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
/// <summary>
|
||||
/// Represents a definition of an OpenRGB server.
|
||||
/// </summary>
|
||||
public class OpenRGBServerDefinition
|
||||
{
|
||||
/// <summary>
|
||||
/// The name of the client that will appear in the OpenRGB interface.
|
||||
/// </summary>
|
||||
public string? ClientName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The ip address of the server.
|
||||
/// </summary>
|
||||
public string? Ip { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The port of the server.
|
||||
/// </summary>
|
||||
public int Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Whether the provider is connected to this server definition or not.
|
||||
/// </summary>
|
||||
public bool Connected { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The error that occurred when connecting, if this failed.
|
||||
/// </summary>
|
||||
public string? LastError { get; set; }
|
||||
}
|
||||
79
RGB.NET.Devices.OpenRGB/PerZone/OpenRGBZoneDevice.cs
Normal file
79
RGB.NET.Devices.OpenRGB/PerZone/OpenRGBZoneDevice.cs
Normal file
@ -0,0 +1,79 @@
|
||||
using OpenRGB.NET.Enums;
|
||||
using OpenRGB.NET.Models;
|
||||
using RGB.NET.Core;
|
||||
|
||||
namespace RGB.NET.Devices.OpenRGB;
|
||||
|
||||
/// <inheritdoc />
|
||||
public class OpenRGBZoneDevice : AbstractOpenRGBDevice<OpenRGBDeviceInfo>
|
||||
{
|
||||
#region Properties & Fields
|
||||
|
||||
private readonly int _initialLed;
|
||||
private readonly Zone _zone;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="OpenRGBZoneDevice"/> class.
|
||||
/// </summary>
|
||||
/// <param name="info">The information provided by OpenRGB</param>
|
||||
/// <param name="initialLed">The ledId of the first led in the device that belongs to this zone.</param>
|
||||
/// <param name="zone">The Zone information provided by OpenRGB.</param>
|
||||
/// <param name="updateQueue">The queue used to update this zone.</param>
|
||||
public OpenRGBZoneDevice(OpenRGBDeviceInfo info, int initialLed, Zone zone, IUpdateQueue updateQueue)
|
||||
: base(info, updateQueue)
|
||||
{
|
||||
_initialLed = initialLed;
|
||||
_zone = zone;
|
||||
|
||||
InitializeLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
|
||||
private void InitializeLayout()
|
||||
{
|
||||
Size ledSize = new(19);
|
||||
const int LED_SPACING = 20;
|
||||
LedId initialId = Helper.GetInitialLedIdForDeviceType(DeviceInfo.DeviceType) + _initialLed;
|
||||
|
||||
if (_zone.Type == ZoneType.Matrix)
|
||||
{
|
||||
for (int row = 0; row < _zone.MatrixMap.Height; row++)
|
||||
{
|
||||
for (int column = 0; column < _zone.MatrixMap.Width; column++)
|
||||
{
|
||||
uint index = _zone.MatrixMap.Matrix[row, column];
|
||||
|
||||
//will be max value if the position does not have an associated key
|
||||
if (index == uint.MaxValue)
|
||||
continue;
|
||||
|
||||
LedId ledId = LedMappings.DEFAULT.TryGetValue(DeviceInfo.OpenRGBDevice.Leds[_initialLed + index].Name, out LedId id)
|
||||
? id
|
||||
: initialId++;
|
||||
|
||||
while (AddLed(ledId, new Point(LED_SPACING * column, LED_SPACING * row), ledSize, _initialLed + (int)index) == null)
|
||||
ledId = initialId++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < _zone.LedCount; i++)
|
||||
{
|
||||
LedId ledId = initialId++;
|
||||
|
||||
while (AddLed(ledId, new Point(LED_SPACING * i, 0), ledSize, _initialLed + i) == null)
|
||||
ledId = initialId++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
65
RGB.NET.Devices.OpenRGB/RGB.NET.Devices.OpenRGB.csproj
Normal file
65
RGB.NET.Devices.OpenRGB/RGB.NET.Devices.OpenRGB.csproj
Normal file
@ -0,0 +1,65 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net6.0;net5.0</TargetFrameworks>
|
||||
<LangVersion>latest</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
|
||||
<Authors>diogotr7</Authors>
|
||||
<Company>Wyrez</Company>
|
||||
<Language>en-US</Language>
|
||||
<NeutralLanguage>en-US</NeutralLanguage>
|
||||
<Title>RGB.NET.Devices.OpenRGB</Title>
|
||||
<AssemblyName>RGB.NET.Devices.OpenRGB</AssemblyName>
|
||||
<AssemblyTitle>RGB.NET.Devices.OpenRGB</AssemblyTitle>
|
||||
<PackageId>RGB.NET.Devices.OpenRGB</PackageId>
|
||||
<RootNamespace>RGB.NET.Devices.OpenRGB</RootNamespace>
|
||||
<Description>OpenRGB-Device-Implementations of RGB.NET</Description>
|
||||
<Summary>OpenRGB-Device-Implementations of RGB.NET, a C# (.NET) library for accessing various RGB-peripherals</Summary>
|
||||
<Copyright>Copyright © Darth Affe 2022</Copyright>
|
||||
<PackageCopyright>Copyright © Darth Affe 2022</PackageCopyright>
|
||||
<PackageIcon>icon.png</PackageIcon>
|
||||
<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>$(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>$(DefineConstants);RELEASE</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="..\Resources\icon.png" Link="icon.png" Pack="true" PackagePath="\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="OpenRGB.NET" Version="1.7.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\RGB.NET.Core\RGB.NET.Core.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@ -0,0 +1,4 @@
|
||||
<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/=abstract/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=generic/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=perzone/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
@ -45,6 +45,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RGB.NET.Devices.PicoPi", "R
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RGB.NET.Presets.Tests", "Tests\RGB.NET.Presets.Tests\RGB.NET.Presets.Tests.csproj", "{EDBA49D6-AE96-4E96-9E6A-30154D93BD5F}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RGB.NET.Devices.OpenRGB", "RGB.NET.Devices.OpenRGB\RGB.NET.Devices.OpenRGB.csproj", "{F29A96E5-CDD0-469F-A871-A35A7519BC49}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@ -127,6 +129,10 @@ Global
|
||||
{EDBA49D6-AE96-4E96-9E6A-30154D93BD5F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{EDBA49D6-AE96-4E96-9E6A-30154D93BD5F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{EDBA49D6-AE96-4E96-9E6A-30154D93BD5F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F29A96E5-CDD0-469F-A871-A35A7519BC49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F29A96E5-CDD0-469F-A871-A35A7519BC49}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F29A96E5-CDD0-469F-A871-A35A7519BC49}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F29A96E5-CDD0-469F-A871-A35A7519BC49}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@ -147,6 +153,7 @@ Global
|
||||
{DD46DB2D-85BE-4962-86AE-E38C9053A548} = {D13032C6-432E-4F43-8A32-071133C22B16}
|
||||
{7FC5C7A8-7B27-46E7-A8E8-DB80568F49C5} = {D13032C6-432E-4F43-8A32-071133C22B16}
|
||||
{EDBA49D6-AE96-4E96-9E6A-30154D93BD5F} = {92D7C263-D4C9-4D26-93E2-93C1F9C2CD16}
|
||||
{F29A96E5-CDD0-469F-A871-A35A7519BC49} = {D13032C6-432E-4F43-8A32-071133C22B16}
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {7F222AD4-1F9E-4AAB-9D69-D62372D4C1BA}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user