Merge pull request #907 from IceStormNG/asus-mouse-support

ASUS Mouse: Resolved deadlocks
This commit is contained in:
Serge
2023-07-27 11:21:56 +02:00
committed by GitHub
3 changed files with 99 additions and 72 deletions

View File

@@ -82,7 +82,7 @@ namespace GHelper
InitMouseCapabilities();
Logger.WriteLine(mouse.GetDisplayName() + " (GUI): Initialized capabilities. Synchronizing mouse data");
Task task = Task.Run((Action)RefreshMouseData);
RefreshMouseData();
}
private void AsusMouseSettings_FormClosing(object? sender, FormClosingEventArgs e)
@@ -93,28 +93,28 @@ namespace GHelper
}
private void Mouse_MouseReadyChanged(object? sender, EventArgs e)
{
if (!mouse.IsDeviceReady)
{
this.Invoke(delegate
{
if (Disposing || IsDisposed)
{
return;
}
if (!mouse.IsDeviceReady)
{
this.Invoke(delegate
{
Close();
});
}
}
private void Mouse_BatteryUpdated(object? sender, EventArgs e)
{
this.Invoke(delegate
{
if (Disposing || IsDisposed)
{
return;
}
this.Invoke(delegate
{
VisualizeBatteryState();
});

View File

@@ -6,16 +6,24 @@ namespace GHelper.Peripherals
{
public class PeripheralsProvider
{
public static object _LOCK = new object();
private static readonly object _LOCK = new object();
public static List<AsusMouse> ConnectedMice = new List<AsusMouse>();
public static event EventHandler? DeviceChanged;
public static bool IsMouseConnected()
{
lock (_LOCK)
{
return ConnectedMice.Count > 0;
}
}
public static bool IsDeviceConnected(IPeripheral peripheral)
{
return AllPeripherals().Contains(peripheral);
}
//Expand if keyboards or other device get supported later.
public static bool IsAnyPeripheralConnect()
@@ -26,18 +34,18 @@ namespace GHelper.Peripherals
public static List<IPeripheral> AllPeripherals()
{
List<IPeripheral> l = new List<IPeripheral>();
lock (_LOCK)
{
l.AddRange(ConnectedMice);
}
return l;
}
public static void RefreshBatteryForAllDevices()
{
if (!IsAnyPeripheralConnect()) return;
List<IPeripheral> l = AllPeripherals();
lock (_LOCK)
{
foreach (IPeripheral m in AllPeripherals())
foreach (IPeripheral m in l)
{
if (!m.IsDeviceReady)
{
@@ -51,29 +59,30 @@ namespace GHelper.Peripherals
}
}
}
public static void Disconnect(AsusMouse am)
{
lock (_LOCK)
{
am.Disconnect -= Mouse_Disconnect;
am.MouseReadyChanged -= MouseReadyChanged;
am.BatteryUpdated -= BatteryUpdated;
ConnectedMice.Remove(am);
}
if (DeviceChanged is not null)
{
DeviceChanged(am, EventArgs.Empty);
}
}
}
public static void Connect(AsusMouse am)
{
lock (_LOCK)
{
if (ConnectedMice.Contains(am))
if (IsDeviceConnected(am))
{
//Mouse already connected;
return;
}
try
{
am.Connect();
@@ -84,8 +93,6 @@ namespace GHelper.Peripherals
return;
}
am.Disconnect += Mouse_Disconnect;
//The Mouse might needs a few ms to register all its subdevices or the sync will fail.
//Retry 3 times. Do not call this on main thread! It would block the UI
@@ -98,14 +105,31 @@ namespace GHelper.Peripherals
++tries;
}
lock (_LOCK)
{
ConnectedMice.Add(am);
}
Logger.WriteLine(am.GetDisplayName() + " added to the list: " + ConnectedMice.Count + " device are conneted.");
am.Disconnect += Mouse_Disconnect;
am.MouseReadyChanged += MouseReadyChanged;
am.BatteryUpdated += BatteryUpdated;
if (DeviceChanged is not null)
{
DeviceChanged(am, EventArgs.Empty);
}
UpdateSettingsView();
}
private static void BatteryUpdated(object? sender, EventArgs e)
{
UpdateSettingsView();
}
private static void MouseReadyChanged(object? sender, EventArgs e)
{
UpdateSettingsView();
}
private static void Mouse_Disconnect(object? sender, EventArgs e)
@@ -114,15 +138,18 @@ namespace GHelper.Peripherals
{
return;
}
AsusMouse am = (AsusMouse)sender;
lock (_LOCK)
{
AsusMouse am = (AsusMouse)sender;
ConnectedMice.Remove(am);
}
Logger.WriteLine(am.GetDisplayName() + " reported disconnect. " + ConnectedMice.Count + " device are conneted.");
am.Dispose();
UpdateSettingsView();
}
}
private static void UpdateSettingsView()
@@ -141,12 +168,11 @@ namespace GHelper.Peripherals
DetectMouse(new ChakramXWired());
DetectMouse(new GladiusIII());
DetectMouse(new GladiusIIIWired());
UpdateSettingsView();
}
public static void DetectMouse(AsusMouse am)
{
if (am.IsDeviceConnected() && !ConnectedMice.Contains(am))
if (am.IsDeviceConnected() && !IsDeviceConnected(am))
{
Logger.WriteLine("Detected a new" + am.GetDisplayName() + " . Connecting...");
Connect(am);

View File

@@ -236,7 +236,7 @@ namespace GHelper
{
screenControl.InitScreen();
gpuControl.InitXGM();
PeripheralsProvider.RefreshBatteryForAllDevices();
Task.Run((Action)PeripheralsProvider.RefreshBatteryForAllDevices);
updateControl.CheckForUpdates();
}
}
@@ -814,6 +814,7 @@ namespace GHelper
string battery = "";
HardwareControl.ReadSensors();
Task.Run((Action)PeripheralsProvider.RefreshBatteryForAllDevices);
if (HardwareControl.cpuTemp > 0)
cpuTemp = ": " + Math.Round((decimal)HardwareControl.cpuTemp).ToString() + "°C";