public HidDeviceWrap Read(Stream input, int reportId = -1) { if (!_ready || !Opened || input == null) { return(this); } while (Receiver.TryRead(_rawInputBytes, 0, out var report)) { int offset = InputReportOffsets[report.ReportID]; Buffer.BlockCopy(_rawInputBytes, 0, _inputBytes, offset, report.Length); } if (reportId < 0) { input.SetLength(InputLength); input.Position = 0; input.Write(_inputBytes, 0, InputLength); } else if (InputReportOffsets.ContainsKey(reportId)) { input.SetLength(MaxInputReportLength); input.Position = 0; input.Write(_inputBytes, InputReportOffsets[reportId], MaxInputReportLength); } else { input.SetLength(0); } return(this); }
public HidDeviceWrap Initialize() { Error = null; Opened = false; _ready = false; DevicePath = Device.DevicePath; Change(); Task.Run(() => { Opening = true; try { //Stream = Device.Open(); Descriptor = Device.GetReportDescriptor(); MaxInputReportLength = Device.GetMaxInputReportLength(); InputReportCount = 0; InputReportOffsets.Clear(); foreach (var report in Descriptor.InputReports) { InputReportOffsets.Add(report.ReportID, InputReportCount * MaxInputReportLength); InputReportCount++; } InputLength = MaxInputReportLength * InputReportCount; OutputLength = Device.GetMaxOutputReportLength(); _inputBytes = new byte[InputLength]; _rawInputBytes = new byte[MaxInputReportLength]; _outputBytes = new byte[OutputLength]; Receiver = Descriptor.CreateHidDeviceInputReceiver(); var options = new OpenConfiguration(); options.SetOption(OpenOption.Exclusive, false); options.SetOption(OpenOption.Transient, false); options.SetOption(OpenOption.Interruptible, false); options.SetOption(OpenOption.Priority, OpenPriority.High); Stream = Device.Open(options); Receiver.Start(Stream); Receiver.Received += (sender, args) => { Opened = true; _ready = true; Change(); }; Opened = true; } catch (Exception e) { Opened = false; Error = e; } Opening = false; Change(); _ready = Opened; }); return(this); }