diff --git a/RGB.NET.Core/Devices/AbstractRGBDevice.cs b/RGB.NET.Core/Devices/AbstractRGBDevice.cs
index cd76493..2ed8377 100644
--- a/RGB.NET.Core/Devices/AbstractRGBDevice.cs
+++ b/RGB.NET.Core/Devices/AbstractRGBDevice.cs
@@ -32,7 +32,11 @@ namespace RGB.NET.Core
public Point Location
{
get => _location;
- set => SetProperty(ref _location, value);
+ set
+ {
+ if (SetProperty(ref _location, value))
+ UpdateActualData();
+ }
}
private Size _size = Size.Invalid;
diff --git a/RGB.NET.Core/Update/TimerUpdateTrigger.cs b/RGB.NET.Core/Update/TimerUpdateTrigger.cs
index 996b86f..23eaa96 100644
--- a/RGB.NET.Core/Update/TimerUpdateTrigger.cs
+++ b/RGB.NET.Core/Update/TimerUpdateTrigger.cs
@@ -14,11 +14,13 @@ namespace RGB.NET.Core
{
#region Properties & Fields
+ private object _lock = new object();
+
private CancellationTokenSource _updateTokenSource;
private CancellationToken _updateToken;
private Task _updateTask;
private Stopwatch _sleepCounter;
-
+
private double _updateFrequency = 1.0 / 30.0;
///
/// Gets or sets the update-frequency in seconds. (Calculate by using '1.0 / updates per second')
@@ -33,7 +35,7 @@ namespace RGB.NET.Core
/// Gets the time it took the last update-loop cycle to run.
///
public double LastUpdateTime { get; private set; }
-
+
#endregion
#region Constructors
@@ -59,25 +61,32 @@ namespace RGB.NET.Core
///
public void Start()
{
- if (_updateTask == null)
+ lock (_lock)
{
- _updateTokenSource?.Dispose();
- _updateTokenSource = new CancellationTokenSource();
- _updateTask = Task.Factory.StartNew(UpdateLoop, (_updateToken = _updateTokenSource.Token), TaskCreationOptions.LongRunning, TaskScheduler.Default);
+ if (_updateTask == null)
+ {
+ _updateTokenSource?.Dispose();
+ _updateTokenSource = new CancellationTokenSource();
+ _updateTask = Task.Factory.StartNew(UpdateLoop, (_updateToken = _updateTokenSource.Token), TaskCreationOptions.LongRunning, TaskScheduler.Default);
+ }
}
}
///
/// Stops the trigger if running, causing it to stop performing updates.
///
- public async void Stop()
+ public void Stop()
{
- if (_updateTask != null)
+ lock (_lock)
{
- _updateTokenSource.Cancel();
- await _updateTask;
- _updateTask.Dispose();
- _updateTask = null;
+ if (_updateTask != null)
+ {
+ _updateTokenSource.Cancel();
+ // ReSharper disable once MethodSupportsCancellation
+ _updateTask.Wait();
+ _updateTask.Dispose();
+ _updateTask = null;
+ }
}
}
diff --git a/RGB.NET.Devices.Corsair/Mouse/CorsairMouseRGBDevice.cs b/RGB.NET.Devices.Corsair/Mouse/CorsairMouseRGBDevice.cs
index 6fcbffb..479b771 100644
--- a/RGB.NET.Devices.Corsair/Mouse/CorsairMouseRGBDevice.cs
+++ b/RGB.NET.Devices.Corsair/Mouse/CorsairMouseRGBDevice.cs
@@ -62,6 +62,8 @@ namespace RGB.NET.Devices.Corsair
{
if (string.Equals(DeviceInfo.Model, "GLAIVE RGB", StringComparison.OrdinalIgnoreCase))
return MouseIdMapping.GLAIVE.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid;
+ else if (string.Equals(DeviceInfo.Model, "M65 RGB ELITE", StringComparison.OrdinalIgnoreCase))
+ return MouseIdMapping.M65_RGB_ELITE.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid;
else
return MouseIdMapping.DEFAULT.TryGetValue(ledId, out CorsairLedId id) ? id : CorsairLedId.Invalid;
}
diff --git a/RGB.NET.Devices.Corsair/Mouse/MouseIdMapping.cs b/RGB.NET.Devices.Corsair/Mouse/MouseIdMapping.cs
index f01ac58..00dea5b 100644
--- a/RGB.NET.Devices.Corsair/Mouse/MouseIdMapping.cs
+++ b/RGB.NET.Devices.Corsair/Mouse/MouseIdMapping.cs
@@ -21,5 +21,11 @@ namespace RGB.NET.Devices.Corsair
{ LedId.Mouse2, CorsairLedId.B2 },
{ LedId.Mouse3, CorsairLedId.B5 },
};
+
+ internal static readonly Dictionary M65_RGB_ELITE = new Dictionary
+ {
+ { LedId.Mouse1, CorsairLedId.B1 },
+ { LedId.Mouse2, CorsairLedId.B3 },
+ };
}
}
diff --git a/RGB.NET.Devices.Logitech/HID/DeviceChecker.cs b/RGB.NET.Devices.Logitech/HID/DeviceChecker.cs
index db8209d..5ec7a69 100644
--- a/RGB.NET.Devices.Logitech/HID/DeviceChecker.cs
+++ b/RGB.NET.Devices.Logitech/HID/DeviceChecker.cs
@@ -17,8 +17,10 @@ namespace RGB.NET.Devices.Logitech.HID
= new List<(string model, RGBDeviceType deviceType, int id, int zones, string imageLayout, string layoutPath)>
{
("G910", RGBDeviceType.Keyboard, 0xC32B, 0, "DE", @"Keyboards\G910\UK"), //TODO DarthAffe 15.11.2017: Somehow detect the current layout
+ ("G910v2", RGBDeviceType.Keyboard, 0xC335, 0, "DE", @"Keyboards\G910\UK"),
("G810", RGBDeviceType.Keyboard, 0xC337, 0, "DE", @"Keyboards\G810\UK"),
("G610", RGBDeviceType.Keyboard, 0xC333, 0, "DE", @"Keyboards\G610\UK"),
+ ("G512", RGBDeviceType.Keyboard, 0xC33C, 0, "DE", @"Keyboards\G512\UK"),
("G410", RGBDeviceType.Keyboard, 0xC330, 0, "DE", @"Keyboards\G410\UK"),
("G213", RGBDeviceType.Keyboard, 0xC336, 0, "DE", @"Keyboards\G213\UK"),
("Pro", RGBDeviceType.Keyboard, 0xC339, 0, "DE", @"Keyboards\Pro\UK"),
@@ -29,8 +31,6 @@ namespace RGB.NET.Devices.Logitech.HID
{
("G19", RGBDeviceType.Keyboard, 0xC228, 0, "DE", @"Keyboards\G19\UK"),
("G19s", RGBDeviceType.Keyboard, 0xC229, 0, "DE", @"Keyboards\G19s\UK"),
- ("G502", RGBDeviceType.Mouse, 0xC332, 0, "default", @"Mice\G502"),
- ("G502 HERO", RGBDeviceType.Mouse, 0xC08B, 0, "default", @"Mice\G502"),
("G600", RGBDeviceType.Mouse, 0xC24A, 0, "default", @"Mice\G600"),
("G300s", RGBDeviceType.Mouse, 0xC246, 0, "default", @"Mice\G300s"),
("G510", RGBDeviceType.Keyboard, 0xC22D, 0, "DE", @"Keyboards\G510\UK"),
@@ -46,15 +46,19 @@ namespace RGB.NET.Devices.Logitech.HID
private static readonly List<(string model, RGBDeviceType deviceType, int id, int zones, string imageLayout, string layoutPath)> ZONE_DEVICES
= new List<(string model, RGBDeviceType deviceType, int id, int zones, string imageLayout, string layoutPath)>
{
+ ("G213", RGBDeviceType.Keyboard, 0xC336, 5, "default", @"Keyboards\G213"),
("G903", RGBDeviceType.Mouse, 0xC086, 2, "default", @"Mice\G903"),
("G900", RGBDeviceType.Mouse, 0xC539, 2, "default", @"Mice\G900"),
("G703", RGBDeviceType.Mouse, 0xC087, 2, "default", @"Mice\G703"),
+ ("G502 HERO", RGBDeviceType.Mouse, 0xC08B, 2, "default", @"Mice\G502"),
+ ("G502", RGBDeviceType.Mouse, 0xC332, 2, "default", @"Mice\G502"),
("G403", RGBDeviceType.Mouse, 0xC083, 2, "default", @"Mice\G403"),
("G303", RGBDeviceType.Mouse, 0xC080, 2, "default", @"Mice\G303"),
("G203", RGBDeviceType.Mouse, 0xC084, 1, "default", @"Mice\G203"),
("G Pro", RGBDeviceType.Mouse, 0xC085, 1, "default", @"Mice\GPro"),
("G633", RGBDeviceType.Headset, 0x0A5C, 2, "default", @"Headsets\G633"),
("G933", RGBDeviceType.Headset, 0x0A5B, 2, "default", @"Headsets\G933"),
+ ("G935", RGBDeviceType.Headset, 0x0A87, 2, "default", @"Headsets\G935"),
("G560", RGBDeviceType.Speaker, 0x0A78, 4, "default", @"Speakers\G560"),
};
diff --git a/RGB.NET.Devices.Msi/Exceptions/MysticLightException.cs b/RGB.NET.Devices.Msi/Exceptions/MysticLightException.cs
index d36665b..0b12582 100644
--- a/RGB.NET.Devices.Msi/Exceptions/MysticLightException.cs
+++ b/RGB.NET.Devices.Msi/Exceptions/MysticLightException.cs
@@ -34,6 +34,7 @@ namespace RGB.NET.Devices.Msi.Exceptions
/// The raw error code provided by the SDK.
/// The text-description of the error.
public MysticLightException(int errorCode, string description)
+ : base($"MSI error code {errorCode} ({description})")
{
this.ErrorCode = errorCode;
this.Description = description;
diff --git a/RGB.NET.Devices.Msi/Generic/IMsiRGBDevice.cs b/RGB.NET.Devices.Msi/Generic/IMsiRGBDevice.cs
index f8b35a8..cd09af0 100644
--- a/RGB.NET.Devices.Msi/Generic/IMsiRGBDevice.cs
+++ b/RGB.NET.Devices.Msi/Generic/IMsiRGBDevice.cs
@@ -3,10 +3,10 @@
namespace RGB.NET.Devices.Msi
{
///
- /// Represents a msi RGB-device.
+ /// Represents a MSI RGB-device.
///
internal interface IMsiRGBDevice : IRGBDevice
{
- void Initialize();
+ void Initialize(MsiDeviceUpdateQueue updateQueue, int ledCount);
}
}
diff --git a/RGB.NET.Devices.Msi/Generic/MsiDeviceUpdateQueue.cs b/RGB.NET.Devices.Msi/Generic/MsiDeviceUpdateQueue.cs
new file mode 100644
index 0000000..b2dffc0
--- /dev/null
+++ b/RGB.NET.Devices.Msi/Generic/MsiDeviceUpdateQueue.cs
@@ -0,0 +1,45 @@
+using System.Collections.Generic;
+using RGB.NET.Core;
+using RGB.NET.Devices.Msi.Native;
+
+namespace RGB.NET.Devices.Msi
+{
+ ///
+ ///
+ /// Represents the update-queue performing updates for MSI devices.
+ ///
+ public class MsiDeviceUpdateQueue : UpdateQueue
+ {
+ #region Properties & Fields
+
+ private string _deviceType;
+
+ #endregion
+
+ #region Constructors
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The update trigger used by this queue.
+ /// The device-type used to identify the device.
+ public MsiDeviceUpdateQueue(IDeviceUpdateTrigger updateTrigger, string deviceType)
+ : base(updateTrigger)
+ {
+ this._deviceType = deviceType;
+ }
+
+ #endregion
+
+ #region Methods
+
+ ///
+ protected override void Update(Dictionary