コード例 #1
0
ファイル: UnitTests.cs プロジェクト: githubassets/Device.Net
        public void TestGetAllUsbDevices()
        {
            var aqs = AqsHelpers.GetAqs(new List <FilterDeviceDefinition> {
            }, DeviceType.Usb);

            Assert.AreEqual("System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True", aqs);
        }
コード例 #2
0
ファイル: UnitTests.cs プロジェクト: githubassets/Device.Net
        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);
        }
コード例 #3
0
ファイル: UnitTests.cs プロジェクト: githubassets/Device.Net
        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);
        }
コード例 #4
0
ファイル: UnitTests.cs プロジェクト: githubassets/Device.Net
        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);
        }
コード例 #5
0
        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));
        }
コード例 #6
0
        /// <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))
                       ));
        }