Skip to content

Commit

Permalink
Merge branch 'develop' into #19-Android
Browse files Browse the repository at this point in the history
  • Loading branch information
Christian committed Jul 7, 2019
2 parents b6c80a0 + f9e4bcb commit 2f8cbee
Show file tree
Hide file tree
Showing 70 changed files with 917 additions and 428 deletions.
2 changes: 2 additions & 0 deletions src/Device.Net - All.sln
Expand Up @@ -72,6 +72,8 @@ Global
{8E29E247-78B7-4FC8-AF1C-DA273050978C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8E29E247-78B7-4FC8-AF1C-DA273050978C}.Release|Any CPU.Build.0 = Release|Any CPU
{63695F84-3EC6-4F6A-8C8C-5219D75EDB68}.Debug|Any CPU.ActiveCfg = Debug|x86
{63695F84-3EC6-4F6A-8C8C-5219D75EDB68}.Debug|Any CPU.Build.0 = Debug|x86
{63695F84-3EC6-4F6A-8C8C-5219D75EDB68}.Debug|Any CPU.Deploy.0 = Debug|x86
{63695F84-3EC6-4F6A-8C8C-5219D75EDB68}.Release|Any CPU.ActiveCfg = Release|x86
{63695F84-3EC6-4F6A-8C8C-5219D75EDB68}.Release|Any CPU.Build.0 = Release|x86
{63695F84-3EC6-4F6A-8C8C-5219D75EDB68}.Release|Any CPU.Deploy.0 = Release|x86
Expand Down
5 changes: 5 additions & 0 deletions src/Device.Net - All.sln.DotSettings
@@ -0,0 +1,5 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=Findlay/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=setupapi/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Trezor/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=winusb/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
61 changes: 36 additions & 25 deletions src/Device.Net.LibUsb/LibUsbDevice.cs
Expand Up @@ -3,39 +3,39 @@
using LibUsbDotNet.Main;
using LibUsbDotNet.WinUsb;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace Device.Net.LibUsb
{
public class LibUsbDevice : IDevice
public class LibUsbDevice : DeviceBase, IDevice
{
#region Fields
private UsbEndpointReader _UsbEndpointReader;
private UsbEndpointWriter _UsbEndpointWriter;
private int ReadPacketSize;
private SemaphoreSlim _WriteAndReadLock = new SemaphoreSlim(1, 1);
private readonly SemaphoreSlim _WriteAndReadLock = new SemaphoreSlim(1, 1);
private bool disposed;
private bool _IsInitialized;
#endregion

#region Public Properties
public UsbDevice UsbDevice { get; }
public int VendorId => GetVendorId(UsbDevice);
public int ProductId => GetProductId(UsbDevice);
public int Timeout { get; }
public bool IsInitialized { get; private set; }
public ConnectedDeviceDefinitionBase ConnectedDeviceDefinition => throw new NotImplementedException();
public string DeviceId => UsbDevice.DevicePath;
public ILogger Logger { get; set; }
#endregion

#region Events
public event EventHandler Connected;
public event EventHandler Disconnected;
public override bool IsInitialized => _IsInitialized;
public override ushort WriteBufferSize => throw new NotImplementedException();
public override ushort ReadBufferSize => throw new NotImplementedException();
#endregion

#region Constructor
public LibUsbDevice(UsbDevice usbDevice, int timeout)
public LibUsbDevice(UsbDevice usbDevice, int timeout) : this(usbDevice, timeout, null, null)
{
}

public LibUsbDevice(UsbDevice usbDevice, int timeout, ILogger logger, ITracer tracer) : base(logger, tracer)
{
UsbDevice = usbDevice;
Timeout = timeout;
Expand All @@ -48,14 +48,18 @@ public void Close()
UsbDevice?.Close();
}

public void Dispose()
public override void Dispose()
{
if (disposed) return;
disposed = true;

_WriteAndReadLock.Dispose();

Close();

base.Dispose();

GC.SuppressFinalize(this);
}

public async Task InitializeAsync()
Expand Down Expand Up @@ -86,23 +90,25 @@ public async Task InitializeAsync()
_UsbEndpointReader = UsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
ReadPacketSize = _UsbEndpointReader.EndpointInfo.Descriptor.MaxPacketSize;
IsInitialized = true;
_IsInitialized = true;
});
}

public async Task<byte[]> ReadAsync()
public override async Task<byte[]> ReadAsync()
{
await _WriteAndReadLock.WaitAsync();

try
{
return await Task.Run(() =>
{
var buffer = new byte[ReadPacketSize];
var data = new byte[ReadPacketSize];
_UsbEndpointReader.Read(data, Timeout, out var bytesRead);
_UsbEndpointReader.Read(buffer, Timeout, out var bytesRead);
Tracer?.Trace(false, data);
return buffer;
return data;
});
}
finally
Expand All @@ -111,15 +117,25 @@ public async Task<byte[]> ReadAsync()
}
}

public async Task WriteAsync(byte[] data)
public override async Task WriteAsync(byte[] data)
{
await _WriteAndReadLock.WaitAsync();

try
{
await Task.Run(() =>
{
_UsbEndpointWriter.Write(data, Timeout, out var bytesWritten);
var errorCode = _UsbEndpointWriter.Write(data, Timeout, out var bytesWritten);
if (errorCode == ErrorCode.Ok || errorCode == ErrorCode.Success)
{
Tracer?.Trace(true, data);
}
else
{
var message = $"Error. Write error code: {errorCode}";
Logger?.Log(message, GetType().Name, null, LogLevel.Error);
throw new IOException(message);
}
});
}
finally
Expand All @@ -128,11 +144,6 @@ public async Task WriteAsync(byte[] data)
}
}

public async Task<byte[]> WriteAndReadAsync(byte[] writeBuffer)
{
await WriteAsync(writeBuffer);
return await ReadAsync();
}
#endregion

#region Public Static Methods
Expand Down
45 changes: 24 additions & 21 deletions src/Device.Net.LibUsb/LibUsbDeviceFactoryBase.cs
Expand Up @@ -9,7 +9,8 @@ namespace Device.Net.LibUsb
public abstract class LibUsbDeviceFactoryBase : IDeviceFactory
{
#region Public Properties
public ILogger Logger { get; set; }
public ILogger Logger { get; }
public ITracer Tracer { get; }
#endregion

#region Public Abstraction Properties
Expand All @@ -23,40 +24,42 @@ public async Task<IEnumerable<ConnectedDeviceDefinition>> GetConnectedDeviceDefi
{
IEnumerable<UsbRegistry> devices = UsbDevice.AllDevices;
if (deviceDefinition != null)
{
if (deviceDefinition.VendorId.HasValue)
{
devices = devices.Where(d => d.Vid == deviceDefinition.VendorId.Value);
}
if (deviceDefinition == null)
if (deviceDefinition.VendorId.HasValue)
return devices.Select(usbRegistry => new ConnectedDeviceDefinition(usbRegistry.DevicePath)
{
devices = devices.Where(d => d.Pid == deviceDefinition.ProductId.Value);
}
}
VendorId = (uint) usbRegistry.Vid,
ProductId = (uint) usbRegistry.Pid,
DeviceType = DeviceType
}).ToList();
var retVal = new List<ConnectedDeviceDefinition>();
if (deviceDefinition.VendorId.HasValue)
{
devices = devices.Where(d => d.Vid == deviceDefinition.VendorId.Value);
}
foreach (var usbRegistry in devices)
if (deviceDefinition.VendorId.HasValue)
{
retVal.Add(new ConnectedDeviceDefinition(usbRegistry.DevicePath)
{
VendorId = (uint)usbRegistry.Vid,
ProductId = (uint)usbRegistry.Pid,
DeviceType = DeviceType
});
devices = devices.Where(d => d.Pid == deviceDefinition.ProductId.Value);
}
return retVal;
return devices.Select(usbRegistry => new ConnectedDeviceDefinition(usbRegistry.DevicePath) {VendorId = (uint) usbRegistry.Vid, ProductId = (uint) usbRegistry.Pid, DeviceType = DeviceType}).ToList();
});
}

public IDevice GetDevice(ConnectedDeviceDefinition deviceDefinition)
{
var usbDeviceFinder = new UsbDeviceFinder((int)deviceDefinition.VendorId.Value, (int)deviceDefinition.ProductId.Value);
var usbDevice = UsbDevice.OpenUsbDevice(usbDeviceFinder);
return usbDevice != null ? new LibUsbDevice(usbDevice, 3000) { Logger = Logger } : null;
return usbDevice != null ? new LibUsbDevice(usbDevice, 3000, Logger, Tracer) : null;
}
#endregion

#region Constructor
protected LibUsbDeviceFactoryBase(ILogger logger, ITracer tracer)
{
Logger = logger;
Tracer = tracer;
}
#endregion
}
Expand Down
14 changes: 8 additions & 6 deletions src/Device.Net.LibUsb/LibUsbUsbDeviceFactory.cs
Expand Up @@ -2,16 +2,18 @@
{
public class LibUsbUsbDeviceFactory : LibUsbDeviceFactoryBase
{
public override DeviceType DeviceType => DeviceType.Usb;

public static void Register()
public LibUsbUsbDeviceFactory(ILogger logger, ITracer tracer) : base(logger, tracer)
{
Register(null);
}

public static void Register(ILogger logger)
public override DeviceType DeviceType => DeviceType.Usb;

/// <summary>
/// Register the factory for enumerating USB devices.
/// </summary>
public static void Register(ILogger logger, ITracer tracer)
{
DeviceManager.Current.DeviceFactories.Add(new LibUsbUsbDeviceFactory() { Logger = logger });
DeviceManager.Current.DeviceFactories.Add(new LibUsbUsbDeviceFactory(logger, tracer));
}
}
}
6 changes: 3 additions & 3 deletions src/Device.Net.UWP/Device.Net.UWP.csproj
Expand Up @@ -27,11 +27,11 @@
<DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<AssemblyOriginatorKeyFile>../Device.Net/Device.Net.pfx</AssemblyOriginatorKeyFile>
<SignAssembly>true</SignAssembly>
<SignAssembly>true</SignAssembly>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
Expand All @@ -54,7 +54,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers">
<Version>2.6.3</Version>
<Version>2.9.3</Version>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Expand Down
25 changes: 12 additions & 13 deletions src/Device.Net.UWP/UWPDeviceBase - Generic.cs
@@ -1,4 +1,5 @@
using System;
using Device.Net.Exceptions;
using System;
using System.Threading.Tasks;
using Windows.Foundation;

Expand All @@ -12,16 +13,11 @@ public abstract class UWPDeviceBase<T> : UWPDeviceBase, IDevice

#region Protected Properties
protected T ConnectedDevice { get; private set; }
protected bool Disposed { get; private set; } = false;
protected bool Disposed { get; private set; }
#endregion

#region Constructor
protected UWPDeviceBase()
{

}

protected UWPDeviceBase(string deviceId)
protected UWPDeviceBase(string deviceId, ILogger logger, ITracer tracer) : base(logger, tracer)
{
DeviceId = deviceId;
}
Expand All @@ -45,24 +41,27 @@ public override async Task<byte[]> ReadAsync()
{
if (IsReading)
{
throw new Exception("Reentry");
throw new AsyncException(Messages.ErrorMessageReentry);
}

//TODO: this should be a semaphore not a lock
lock (Chunks)
{
if (Chunks.Count > 0)
{
var retVal = Chunks[0];
Tracer?.Trace(false, retVal);
var data2 = Chunks[0];
Logger?.Log("Received data from device", GetType().Name, null, LogLevel.Information);
Chunks.RemoveAt(0);
return retVal;
Tracer?.Trace(false, data2);
return data2;
}
}

IsReading = true;
ReadChunkTaskCompletionSource = new TaskCompletionSource<byte[]>();
return await ReadChunkTaskCompletionSource.Task;
var data = await ReadChunkTaskCompletionSource.Task;
Tracer?.Trace(false, data);
return data;
}
#endregion

Expand Down
6 changes: 6 additions & 0 deletions src/Device.Net.UWP/UWPDeviceBase.cs
Expand Up @@ -35,5 +35,11 @@ protected void HandleDataReceived(byte[] bytes)
#region Public Abstract Methods
public abstract Task InitializeAsync();
#endregion

#region Constructor
protected UWPDeviceBase(ILogger logger, ITracer tracer) : base(logger, tracer)
{
}
#endregion
}
}
13 changes: 12 additions & 1 deletion src/Device.Net.UWP/UWPDeviceFactoryBase.cs
Expand Up @@ -23,7 +23,8 @@ public abstract class UWPDeviceFactoryBase
#endregion

#region Public Properties
public ILogger Logger { get; set; }
public ILogger Logger { get; }
public ITracer Tracer { get; }
#endregion

#region Public Abstract Properties
Expand All @@ -34,6 +35,14 @@ public abstract class UWPDeviceFactoryBase
protected abstract string GetAqsFilter(uint? vendorId, uint? productId);
#endregion

#region Constructor
protected UWPDeviceFactoryBase(ILogger logger, ITracer tracer)
{
Logger = logger;
Tracer = tracer;
}
#endregion

#region Abstraction Methods
protected string GetVendorPart(uint? vendorId)
{
Expand Down Expand Up @@ -101,6 +110,8 @@ public async Task<IEnumerable<ConnectedDeviceDefinition>> GetConnectedDeviceDefi
#region Public Static Methods
public static ConnectedDeviceDefinition GetDeviceInformation(wde.DeviceInformation deviceInformation, DeviceType deviceType)
{
if (deviceInformation == null) throw new ArgumentNullException(nameof(deviceInformation));

var retVal = WindowsDeviceFactoryBase.GetDeviceDefinitionFromWindowsDeviceId(deviceInformation.Id, deviceType);

//foreach (var keyValuePair in deviceInformation.Properties)
Expand Down

0 comments on commit 2f8cbee

Please sign in to comment.