Пример #1
0
        public UwpUsbInterface(
            windowsUsbInterface usbInterface,
            PerformControlTransferAsync performControlTransferAsync,
            IDataReceiver dataReceiver,
            ILoggerFactory loggerFactory,
            ushort?readBuffersize  = null,
            ushort?writeBufferSize = null) : base(
                performControlTransferAsync,
                loggerFactory.CreateLogger <UwpUsbInterface>(),
                readBuffersize,
                writeBufferSize)
        {
            UsbInterface = usbInterface ?? throw new ArgumentNullException(nameof(usbInterface));

            foreach (var inPipe in usbInterface.InterruptInPipes)
            {
                var uwpUsbInterfaceEndpoint = new UwpUsbInterfaceInterruptReadEndpoint(
                    inPipe,
                    dataReceiver,
                    loggerFactory.CreateLogger <UwpUsbInterfaceInterruptReadEndpoint>());

                UsbInterfaceEndpoints.Add(uwpUsbInterfaceEndpoint);
                InterruptReadEndpoint ??= uwpUsbInterfaceEndpoint;
            }

            foreach (var outPipe in usbInterface.InterruptOutPipes)
            {
                var uwpUsbInterfaceEndpoint =
                    new UwpUsbInterfaceEndpoint <UsbInterruptOutPipe>(
                        outPipe,
                        loggerFactory.CreateLogger <UwpUsbInterfaceEndpoint <UsbInterruptOutPipe> >());
                UsbInterfaceEndpoints.Add(uwpUsbInterfaceEndpoint);
                InterruptWriteEndpoint ??= uwpUsbInterfaceEndpoint;
            }

            foreach (var inPipe in usbInterface.BulkInPipes)
            {
                var uwpUsbInterfaceEndpoint = new UwpUsbInterfaceEndpoint <UsbBulkInPipe>(inPipe,
                                                                                          loggerFactory.CreateLogger <UwpUsbInterfaceEndpoint <UsbBulkInPipe> >());
                UsbInterfaceEndpoints.Add(uwpUsbInterfaceEndpoint);
                ReadEndpoint ??= uwpUsbInterfaceEndpoint;
            }

            foreach (var outPipe in usbInterface.BulkOutPipes)
            {
                var uwpUsbInterfaceEndpoint = new UwpUsbInterfaceEndpoint <UsbBulkOutPipe>(outPipe,
                                                                                           loggerFactory.CreateLogger <UwpUsbInterfaceEndpoint <UsbBulkOutPipe> >());
                UsbInterfaceEndpoints.Add(uwpUsbInterfaceEndpoint);
                WriteEndpoint ??= uwpUsbInterfaceEndpoint;
            }
        }
Пример #2
0
        public UWPUsbInterface(windowsUsbInterface usbInterface, ILogger logger, ITracer tracer, ushort?readBuffersize, ushort?writeBufferSize) : base(logger, tracer, readBuffersize, writeBufferSize)
        {
            UsbInterface = usbInterface ?? throw new ArgumentNullException(nameof(usbInterface));

            foreach (var inPipe in usbInterface.InterruptInPipes)
            {
                var uwpUsbInterfaceEndpoint = new UWPUsbInterfaceInterruptReadEndpoint(inPipe, Logger, Tracer);
                UsbInterfaceEndpoints.Add(uwpUsbInterfaceEndpoint);
                if (InterruptReadEndpoint == null)
                {
                    InterruptReadEndpoint = uwpUsbInterfaceEndpoint;
                }
            }

            foreach (var outPipe in usbInterface.InterruptOutPipes)
            {
                var uwpUsbInterfaceEndpoint = new UWPUsbInterfaceEndpoint <UsbInterruptOutPipe>(outPipe);
                UsbInterfaceEndpoints.Add(uwpUsbInterfaceEndpoint);
                if (InterruptWriteEndpoint == null)
                {
                    InterruptWriteEndpoint = uwpUsbInterfaceEndpoint;
                }
            }

            foreach (var inPipe in usbInterface.BulkInPipes)
            {
                var uwpUsbInterfaceEndpoint = new UWPUsbInterfaceEndpoint <UsbBulkInPipe>(inPipe);
                UsbInterfaceEndpoints.Add(uwpUsbInterfaceEndpoint);
                if (ReadEndpoint == null)
                {
                    ReadEndpoint = uwpUsbInterfaceEndpoint;
                }
            }

            foreach (var outPipe in usbInterface.BulkOutPipes)
            {
                var uwpUsbInterfaceEndpoint = new UWPUsbInterfaceEndpoint <UsbBulkOutPipe>(outPipe);
                UsbInterfaceEndpoints.Add(uwpUsbInterfaceEndpoint);
                if (WriteEndpoint == null)
                {
                    WriteEndpoint = uwpUsbInterfaceEndpoint;
                }
            }

            //TODO: Why does not UWP not support Control Transfer?
        }
            /// <summary>
            /// This is an internal method called from CreateAsync method.
            /// </summary>
            /// <remarks>
            /// The result of Task contains success(true) or failure(false).
            /// </remarks>
            private Task <bool> TryInitialize()
            {
                return(Task.Run(async() =>
                {
                    var device = this.device;

                    Windows.Devices.Usb.UsbInterface cdcControl = null;
                    Windows.Devices.Usb.UsbInterface cdcData = null;

                    for (int i = 0; i < device.Configuration.UsbInterfaces.Count; i++)
                    {
                        var interf = device.Configuration.UsbInterfaces[i];
                        if (interf == null)
                        {
                            continue;
                        }

                        for (int j = 0; j < interf.InterfaceSettings.Count; j++)
                        {
                            var setting = interf.InterfaceSettings[j];
                            byte index = setting.InterfaceDescriptor.InterfaceNumber;
                            byte interfaceClass = setting.InterfaceDescriptor.ClassCode;

                            if (interfaceClass == InterfaceClass.CdcControl)
                            {
                                cdcControl = interf;
                            }
                            else if (interfaceClass == InterfaceClass.CdcData)
                            {
                                cdcData = interf;
                            }
                            else if (interfaceClass == InterfaceClass.VendorSpecific)
                            {
                                if (cdcControl == null)
                                {
                                    // Test SetLineCoding/GetLineCoding
                                    uint written = 0;
                                    Windows.Storage.Streams.IBuffer gotBuffer = null;
                                    try
                                    {
                                        written = await this.SetLineCoding(index, Constants.DteRateTestValue, 0, 0, Constants.DataBitsTestValue);
                                    }
                                    catch (Exception)
                                    {
                                        // This interface is not compatible with CDC ACM. Try the next interface.
                                        continue;
                                    }

                                    try
                                    {
                                        gotBuffer = await this.GetLineCoding(index);
                                    }
                                    catch (Exception)
                                    {
                                        // This interface is not compatible with CDC ACM. Try the next interface.
                                        continue;
                                    }

                                    if (gotBuffer != null && gotBuffer.Length == Constants.ExpectedResultGetLineCoding)
                                    {
                                        var lineCodingReader = Windows.Storage.Streams.DataReader.FromBuffer(gotBuffer);
                                        lineCodingReader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;
                                        var bps = lineCodingReader.ReadUInt32();
                                        if (bps == Constants.DteRateTestValue)
                                        {
                                            // This could be a CdcControl.
                                            cdcControl = interf;
                                        }
                                    }
                                }

                                if (cdcData == null)
                                {
                                    if (interf.BulkInPipes.Count > 0 &&
                                        interf.BulkOutPipes.Count > 0)
                                    {
                                        // This could be a CdcData.
                                        cdcData = interf;
                                    }
                                }
                            }
                        }
                    }

                    this.cdcControl = cdcControl;
                    this.cdcData = cdcData;

                    if (this.cdcControl != null && this.cdcData != null)
                    {
                        // Flush the pipes.
                        for (int IN = 0; IN < this.cdcData.BulkInPipes.Count; IN++)
                        {
                            this.cdcData.BulkInPipes[IN].FlushBuffer();
                        }
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }));
            }