public void TestGetAllUsbDevices() { var aqs = AqsHelpers.GetAqs(new List <FilterDeviceDefinition> { }, DeviceType.Usb); Assert.AreEqual("System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True", aqs); }
public void TestGetAqsSingleUsbDevice() { var aqs = AqsHelpers.GetAqs(new List <FilterDeviceDefinition> { new FilterDeviceDefinition(0x1209, 0x53C1) }, DeviceType.Usb); Assert.AreEqual("System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND ((System.DeviceInterface.WinUsb.UsbVendorId:=4617 AND System.DeviceInterface.WinUsb.UsbProductId:=21441))", aqs); }
public void TestGetAqsSingleHidDevice() { var aqs = AqsHelpers.GetAqs(new List <FilterDeviceDefinition> { new FilterDeviceDefinition(10741, 4112) }, DeviceType.Hid); Assert.AreEqual("System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND ((System.DeviceInterface.Hid.VendorId:=10741 AND System.DeviceInterface.Hid.ProductId:=4112))", aqs); }
public void TestGetAqsTwoUsbDevices() { var aqs = AqsHelpers.GetAqs(new List <FilterDeviceDefinition> { new FilterDeviceDefinition(10741, 4112), new FilterDeviceDefinition(10741, 4113) }, DeviceType.Usb); Assert.AreEqual("System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND ((System.DeviceInterface.WinUsb.UsbVendorId:=10741 AND System.DeviceInterface.WinUsb.UsbProductId:=4112) OR (System.DeviceInterface.WinUsb.UsbVendorId:=10741 AND System.DeviceInterface.WinUsb.UsbProductId:=4113))", aqs); }
public static IDeviceFactory CreateUwpUsbDeviceFactory( this IEnumerable <FilterDeviceDefinition> filterDeviceDefinitions, ILoggerFactory loggerFactory, GetConnectedDeviceDefinitionsAsync getConnectedDeviceDefinitionsAsync = null, GetUsbInterfaceManager getUsbInterfaceManager = null, ushort?readBufferSize = null, ushort?writeBufferSize = null, Func <wde.DeviceInformation, bool> deviceInformationFilter = null, Func <windowsUsbDevice, SetupPacket, byte[], CancellationToken, Task <TransferResult> > performControlTransferAsync = null, IDataReceiver dataReceiver = null) { if (getConnectedDeviceDefinitionsAsync == null) { //Filter to by device Id. //TODO: There is surely a better way to do this deviceInformationFilter ??= d => d.Id.Contains(@"\\?\usb", StringComparison.OrdinalIgnoreCase) && d.Id.Contains(@"vid", StringComparison.OrdinalIgnoreCase) && d.Id.Contains(@"pid", StringComparison.OrdinalIgnoreCase); var uwpHidDeviceEnumerator = new UwpDeviceEnumerator( AqsHelpers.GetAqs(filterDeviceDefinitions, DeviceType.Usb), DeviceType.Usb, (d, cancellationToken) => Task.FromResult(new ConnectionInfo { CanConnect = true }), loggerFactory, deviceInformationFilter); getConnectedDeviceDefinitionsAsync = uwpHidDeviceEnumerator.GetConnectedDeviceDefinitionsAsync; } getUsbInterfaceManager ??= (deviceId, cancellationToken) => Task.FromResult <IUsbInterfaceManager>( new UwpUsbInterfaceManager( //TODO: no idea if this is OK... new ConnectedDeviceDefinition(deviceId, DeviceType.Usb), dataReceiver, performControlTransferAsync, loggerFactory, readBufferSize, writeBufferSize)); return(UsbDeviceFactoryExtensions.CreateUsbDeviceFactory(getConnectedDeviceDefinitionsAsync, getUsbInterfaceManager, loggerFactory)); }
/// <summary> /// Creates a <see cref="IDeviceFactory"/> for UWP Hid devices /// </summary> /// <param name="filterDeviceDefinitions">Devices must match these</param> /// <param name="loggerFactory"><see href="https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.iloggerfactory"/></param> /// <param name="classGuid">Filters by specified class guid</param> /// <param name="deviceInformationFilter"></param> /// <param name="dataReceiver"></param> /// <param name="readBufferSize">Override the input report size</param> /// <param name="readTransferTransform">Exposes the raw data from the device (including Report Id) on reads and allows you to format the returned <see cref="TransferResult"/></param> /// <param name="writeTransferTransform">Given the Report Id and data supplied for the write, allow you to format the raw data that is sent to the device</param> /// <param name="writeReportTransform">Given the data supplied, allow you to divide the data in to a <see cref="Report"/></param> /// <param name="writeBufferSize">Override the output report size</param> /// <param name="getConnectedDeviceDefinitionsAsync">Override the default call for getting definitions</param> /// <param name="getDevice"></param> /// <param name="readReportTransform">Allows you to manually convert the <see cref="Report"/> in to a <see cref="TransferResult"/> so that the Report Id is not discarded on ReadAsync. By default, this inserts the Report Id at index zero of the array.</param> /// <returns>A factory which enumerates and instantiates devices</returns> public static IDeviceFactory CreateUwpHidDeviceFactory( this IEnumerable <FilterDeviceDefinition> filterDeviceDefinitions, ILoggerFactory loggerFactory = null, GetConnectedDeviceDefinitionsAsync getConnectedDeviceDefinitionsAsync = null, GetDeviceAsync getDevice = null, Guid?classGuid = null, Func <wde.DeviceInformation, bool> deviceInformationFilter = null, IDataReceiver dataReceiver = null, ushort?writeBufferSize = null, ushort?readBufferSize = null, Func <Report, TransferResult> readReportTransform = null, Func <TransferResult, Report> readTransferTransform = null, Func <byte[], byte, byte[]> writeTransferTransform = null, WriteReportTransform writeReportTransform = null) { loggerFactory ??= NullLoggerFactory.Instance; getDevice ??= (c, cancellationToken) => Task.FromResult <IDevice>( new HidDevice( new UwpHidDeviceHandler( c, dataReceiver ?? new UwpDataReceiver( new Observable <TransferResult>(), loggerFactory.CreateLogger <UwpDataReceiver>()), loggerFactory, writeBufferSize, readBufferSize, readTransferTransform, writeTransferTransform), loggerFactory, readReportTransform, writeReportTransform)); var aqs = AqsHelpers.GetAqs(filterDeviceDefinitions, DeviceType.Hid); var logger = loggerFactory.CreateLogger <UwpDeviceEnumerator>(); if (getConnectedDeviceDefinitionsAsync == null) { //Filter to by device Id. //TODO: There is surely a better way to do this deviceInformationFilter ??= d => d.Id.Contains(@"\\?\hid", StringComparison.OrdinalIgnoreCase) && d.Id.Contains(@"vid", StringComparison.OrdinalIgnoreCase) && d.Id.Contains(@"pid", StringComparison.OrdinalIgnoreCase); var uwpHidDeviceEnumerator = new UwpDeviceEnumerator( aqs, DeviceType.Hid, async(deviceId, cancellationToken) => { using var hidDevice = await UwpHidDeviceHandler.GetHidDevice(deviceId).AsTask(cancellationToken); var canConnect = hidDevice != null; if (!canConnect) { return new ConnectionInfo { CanConnect = false } } ; logger?.LogInformation("Testing device connection. Id: {deviceId}. Can connect: {canConnect}", deviceId, true); return(new ConnectionInfo { CanConnect = true, UsagePage = hidDevice.UsagePage }); }, loggerFactory, deviceInformationFilter); getConnectedDeviceDefinitionsAsync = uwpHidDeviceEnumerator.GetConnectedDeviceDefinitionsAsync; } return(new DeviceFactory( loggerFactory, getConnectedDeviceDefinitionsAsync, getDevice, (c, cancellationToken) => Task.FromResult(c.DeviceType == DeviceType.Hid && (classGuid == null || classGuid.Value == c.ClassGuid)) )); }