diff --git a/app/AnimeMatrix/Communication/Device.cs b/app/AnimeMatrix/Communication/Device.cs index 453d3369..93453649 100644 --- a/app/AnimeMatrix/Communication/Device.cs +++ b/app/AnimeMatrix/Communication/Device.cs @@ -6,11 +6,17 @@ namespace GHelper.AnimeMatrix.Communication { public abstract class Device : IDisposable { - private static UsbProvider _usbProvider; + protected UsbProvider? _usbProvider; - private static ushort _vendorId; - private static ushort _productId; - private static int _maxFeatureReportLength; + protected ushort _vendorId; + protected ushort _productId; + protected int _maxFeatureReportLength; + + protected Device(ushort vendorId, ushort productId) + { + _vendorId = vendorId; + _productId = productId; + } protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength) { @@ -20,7 +26,17 @@ namespace GHelper.AnimeMatrix.Communication SetProvider(); } - public void SetProvider() + public ushort VendorID() + { + return _vendorId; + } + + public ushort ProductID() + { + return _productId; + } + + public virtual void SetProvider() { _usbProvider = new WindowsUsbProvider(_vendorId, _productId, _maxFeatureReportLength); } @@ -36,6 +52,11 @@ namespace GHelper.AnimeMatrix.Communication public byte[] Get(Packet packet) => _usbProvider?.Get(packet.Data); + public void Read(byte[] data) + => _usbProvider?.Read(data); + public void Write(byte[] data) + => _usbProvider?.Write(data); + public void Dispose() { _usbProvider?.Dispose(); diff --git a/app/AnimeMatrix/Communication/Platform/UsbProvider.cs b/app/AnimeMatrix/Communication/Platform/UsbProvider.cs index b7488b8c..05098e8e 100644 --- a/app/AnimeMatrix/Communication/Platform/UsbProvider.cs +++ b/app/AnimeMatrix/Communication/Platform/UsbProvider.cs @@ -1,6 +1,6 @@ namespace GHelper.AnimeMatrix.Communication.Platform { - internal abstract class UsbProvider : IDisposable + public abstract class UsbProvider : IDisposable { protected ushort VendorID { get; } protected ushort ProductID { get; } @@ -13,6 +13,8 @@ namespace GHelper.AnimeMatrix.Communication.Platform public abstract void Set(byte[] data); public abstract byte[] Get(byte[] data); + public abstract void Read(byte[] data); + public abstract void Write(byte[] data); public abstract void Dispose(); } diff --git a/app/AnimeMatrix/Communication/Platform/WindowsUsbProvider.cs b/app/AnimeMatrix/Communication/Platform/WindowsUsbProvider.cs index 23d6415f..1a8630fa 100644 --- a/app/AnimeMatrix/Communication/Platform/WindowsUsbProvider.cs +++ b/app/AnimeMatrix/Communication/Platform/WindowsUsbProvider.cs @@ -8,6 +8,27 @@ namespace GHelper.AnimeMatrix.Communication.Platform protected HidDevice HidDevice { 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) : base(vendorId, productId) { @@ -53,6 +74,23 @@ namespace GHelper.AnimeMatrix.Communication.Platform 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() { HidStream.Dispose();