Added additional logic to the AnimeMatrix USB classes to re-use them.

This commit is contained in:
IceStormNG
2023-07-22 22:47:14 +02:00
parent 8cedcb7b5d
commit d9cba16218
3 changed files with 67 additions and 6 deletions

View File

@@ -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();

View File

@@ -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();
} }

View File

@@ -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();