This commit is contained in:
Serge
2023-11-19 13:17:07 +01:00
parent e4bcc8f66c
commit ccf2ae9eed
2 changed files with 45 additions and 42 deletions

View File

@@ -12,34 +12,36 @@ public static class AsusHid
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6, 0x1abe }; static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6, 0x1abe };
static HidStream auraStream; static HidStream? auraStream;
public static HidStream FindHidStream(byte reportId, int minFeatureLength = 1) public static IEnumerable<HidDevice>? FindDevices(byte reportId, int minFeatureLength = 1)
{ {
HidDeviceLoader loader = new HidDeviceLoader(); HidDeviceLoader loader = new HidDeviceLoader();
IEnumerable<HidDevice> deviceList;
try try
{ {
var deviceList = loader.GetDevices(ASUS_ID).Where(device => deviceIds.Contains(device.ProductID) && device.CanOpen); deviceList = loader.GetDevices(ASUS_ID).Where(
foreach (var device in deviceList) device => deviceIds.Contains(device.ProductID) &&
{ device.CanOpen &&
var config = new OpenConfiguration(); device.GetMaxFeatureReportLength() >= minFeatureLength);
config.SetOption(OpenOption.Interruptible, false); }
config.SetOption(OpenOption.Exclusive, false); catch (Exception ex)
config.SetOption(OpenOption.Priority, 10); {
HidStream hidStream = device.Open(); Debug.WriteLine($"Error enumerating HID devices: {ex.Message}");
yield break;
}
if (device.GetMaxFeatureReportLength() >= minFeatureLength) foreach (var device in deviceList)
{ if (device.GetReportDescriptor().TryGetReport(ReportType.Feature, reportId, out _))
var reportDescriptor = device.GetReportDescriptor(); yield return device;
if (reportDescriptor.TryGetReport(ReportType.Feature, reportId, out _)) }
{
return hidStream;
}
}
hidStream.Close(); public static HidStream? FindHidStream(byte reportId, int minFeatureLength = 1)
hidStream.Dispose(); {
} try
{
return FindDevices(reportId, minFeatureLength)?.FirstOrDefault()?.Open();
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -49,29 +51,31 @@ public static class AsusHid
return null; return null;
} }
static void WriteData(HidStream stream, byte[] data, string log = "USB") public static void Write(byte[] data, byte reportId = AURA_ID, string log = "USB")
{ {
Write(new List<byte[]> { data }, reportId, log);
}
public static void Write(List<byte[]> dataList, byte reportId = AURA_ID, string log = "USB")
{
var devices = FindDevices(reportId);
if (devices is null) return;
try try
{ {
stream.Write(data); foreach (var device in devices)
Logger.WriteLine($"{log} " + stream.Device.ProductID + ": " + BitConverter.ToString(data)); using (var stream = device.Open())
foreach (var data in dataList)
{
stream.Write(data);
Logger.WriteLine($"{log} " + device.ProductID.ToString("X") + ": " + BitConverter.ToString(data));
}
} }
catch (Exception ex) catch (Exception ex)
{ {
Debug.WriteLine($"Error writing {log} to HID device: {ex.Message} {BitConverter.ToString(data)}"); Debug.WriteLine($"Error writing {log} to HID device: {ex.Message}");
} }
}
public static void Write(byte[] data, byte reportId = AURA_ID, string log = "USB")
{
using (var stream = FindHidStream(reportId))
WriteData(stream, data, log);
}
public static void Write(List<byte[]> dataList, byte reportId = AURA_ID)
{
using (var stream = FindHidStream(reportId))
foreach (var data in dataList)
WriteData(stream, data);
} }
public static void WriteAura(byte[] data) public static void WriteAura(byte[] data)

View File

@@ -128,12 +128,11 @@ namespace GHelper.USB
isSingleColor = AppConfig.IsSingleColor(); // Mono Color isSingleColor = AppConfig.IsSingleColor(); // Mono Color
if (AppConfig.ContainsModel("GA402X") || AppConfig.ContainsModel("GA402N")) if (AppConfig.ContainsModel("GA402X") || AppConfig.ContainsModel("GA402N"))
using (var stream = AsusHid.FindHidStream(AsusHid.AURA_ID)) {
{ var device = AsusHid.FindDevices(AsusHid.AURA_ID).FirstOrDefault();
if (stream is null) return; if (device is null) return;
if (stream.Device.ReleaseNumberBcd == 22 || stream.Device.ReleaseNumberBcd == 23) isSingleColor = true; if (device.ReleaseNumberBcd == 22 || device.ReleaseNumberBcd == 23) isSingleColor = true;
stream.Close(); }
}
} }
public static Dictionary<AuraSpeed, string> GetSpeeds() public static Dictionary<AuraSpeed, string> GetSpeeds()