mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
Added additional logic to the AnimeMatrix USB classes to re-use them.
This commit is contained in:
@@ -6,11 +6,17 @@ namespace GHelper.AnimeMatrix.Communication
|
|||||||
{
|
{
|
||||||
public abstract class Device : IDisposable
|
public abstract class Device : IDisposable
|
||||||
{
|
{
|
||||||
private static UsbProvider _usbProvider;
|
protected UsbProvider? _usbProvider;
|
||||||
|
|
||||||
private static ushort _vendorId;
|
protected ushort _vendorId;
|
||||||
private static ushort _productId;
|
protected ushort _productId;
|
||||||
private static int _maxFeatureReportLength;
|
protected int _maxFeatureReportLength;
|
||||||
|
|
||||||
|
protected Device(ushort vendorId, ushort productId)
|
||||||
|
{
|
||||||
|
_vendorId = vendorId;
|
||||||
|
_productId = productId;
|
||||||
|
}
|
||||||
|
|
||||||
protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength)
|
protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength)
|
||||||
{
|
{
|
||||||
@@ -20,7 +26,17 @@ namespace GHelper.AnimeMatrix.Communication
|
|||||||
SetProvider();
|
SetProvider();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetProvider()
|
public ushort VendorID()
|
||||||
|
{
|
||||||
|
return _vendorId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ushort ProductID()
|
||||||
|
{
|
||||||
|
return _productId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void SetProvider()
|
||||||
{
|
{
|
||||||
_usbProvider = new WindowsUsbProvider(_vendorId, _productId, _maxFeatureReportLength);
|
_usbProvider = new WindowsUsbProvider(_vendorId, _productId, _maxFeatureReportLength);
|
||||||
}
|
}
|
||||||
@@ -36,6 +52,11 @@ namespace GHelper.AnimeMatrix.Communication
|
|||||||
public byte[] Get(Packet packet)
|
public byte[] Get(Packet packet)
|
||||||
=> _usbProvider?.Get(packet.Data);
|
=> _usbProvider?.Get(packet.Data);
|
||||||
|
|
||||||
|
public void Read(byte[] data)
|
||||||
|
=> _usbProvider?.Read(data);
|
||||||
|
public void Write(byte[] data)
|
||||||
|
=> _usbProvider?.Write(data);
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
_usbProvider?.Dispose();
|
_usbProvider?.Dispose();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
namespace GHelper.AnimeMatrix.Communication.Platform
|
namespace GHelper.AnimeMatrix.Communication.Platform
|
||||||
{
|
{
|
||||||
internal abstract class UsbProvider : IDisposable
|
public abstract class UsbProvider : IDisposable
|
||||||
{
|
{
|
||||||
protected ushort VendorID { get; }
|
protected ushort VendorID { get; }
|
||||||
protected ushort ProductID { get; }
|
protected ushort ProductID { get; }
|
||||||
@@ -13,6 +13,8 @@ namespace GHelper.AnimeMatrix.Communication.Platform
|
|||||||
|
|
||||||
public abstract void Set(byte[] data);
|
public abstract void Set(byte[] data);
|
||||||
public abstract byte[] Get(byte[] data);
|
public abstract byte[] Get(byte[] data);
|
||||||
|
public abstract void Read(byte[] data);
|
||||||
|
public abstract void Write(byte[] data);
|
||||||
|
|
||||||
public abstract void Dispose();
|
public abstract void Dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,27 @@ namespace GHelper.AnimeMatrix.Communication.Platform
|
|||||||
protected HidDevice HidDevice { get; }
|
protected HidDevice HidDevice { get; }
|
||||||
protected HidStream HidStream { get; }
|
protected HidStream HidStream { get; }
|
||||||
|
|
||||||
|
public WindowsUsbProvider(ushort vendorId, ushort productId, string path, int timeout = 500) : base(vendorId, productId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HidDevice = DeviceList.Local.GetHidDevices(vendorId, productId)
|
||||||
|
.First(x => x.DevicePath.Contains(path));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
throw new IOException("HID device was not found on your machine.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var config = new OpenConfiguration();
|
||||||
|
config.SetOption(OpenOption.Interruptible, true);
|
||||||
|
config.SetOption(OpenOption.Exclusive, false);
|
||||||
|
config.SetOption(OpenOption.Priority, 10);
|
||||||
|
HidStream = HidDevice.Open(config);
|
||||||
|
HidStream.ReadTimeout = timeout;
|
||||||
|
HidStream.WriteTimeout = timeout;
|
||||||
|
}
|
||||||
|
|
||||||
public WindowsUsbProvider(ushort vendorId, ushort productId, int maxFeatureReportLength)
|
public WindowsUsbProvider(ushort vendorId, ushort productId, int maxFeatureReportLength)
|
||||||
: base(vendorId, productId)
|
: base(vendorId, productId)
|
||||||
{
|
{
|
||||||
@@ -53,6 +74,23 @@ namespace GHelper.AnimeMatrix.Communication.Platform
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Read(byte[] data)
|
||||||
|
{
|
||||||
|
WrapException(() =>
|
||||||
|
{
|
||||||
|
HidStream.Read(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Write(byte[] data)
|
||||||
|
{
|
||||||
|
WrapException(() =>
|
||||||
|
{
|
||||||
|
HidStream.Write(data);
|
||||||
|
HidStream.Flush();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
HidStream.Dispose();
|
HidStream.Dispose();
|
||||||
|
|||||||
Reference in New Issue
Block a user