private async Task sendRequest(byte[] request, YGenericHub.RequestAsyncResult asyncResult, object asyncContext) { int pos = 0; if (_currentRequest != null) { await _currentRequest.GetResponse(); } //Debug.WriteLine(string.Format("{0}:Check last request is sent", Environment.CurrentManagedThreadId)); _currentRequest = new YRequest(request, asyncResult, asyncContext, 10000); while (pos < request.Length) { if (_hid == null) { _devState = DevState.IOError; _currentRequest = null; throw new YAPI_Exception(YAPI.IO_ERROR, "USB device has been stopped"); } // construct a HID output report to send to the device HidOutputReport outReport; try { outReport = _hid.CreateOutputReport(); } catch (Exception ex) { _devState = DevState.IOError; _currentRequest = null; throw new YAPI_Exception(YAPI.IO_ERROR, "Error during CreateOutputReport():" + ex.Message); } int size = YUSBPkt.imm_FormatTCP(outReport, request, pos, true); // Send the output report asynchronously uint u; try { u = await _hid.SendOutputReportAsync(outReport); } catch (Exception ex) { _devState = DevState.IOError; _currentRequest = null; throw new YAPI_Exception(YAPI.IO_ERROR, "Error during SendOutputReportAsync():" + ex.Message); } if (u != 65) { _devState = DevState.IOError; _watcher.imm_removeUsableDevice(this); return; } pos += size; } //Debug.WriteLine(string.Format("{0}:sent", Environment.CurrentManagedThreadId)); }
public async Task <byte[]> DevRequestSync(string serial, byte[] request, YGenericHub.RequestProgress progress, object context) { if (_devState != DevState.StreamReadyReceived) { throw new YAPI_Exception(YAPI.IO_ERROR, "Device not ready"); } await sendRequest(request, null, null); byte[] res = await _currentRequest.GetResponse(); _currentRequest = null; return(res); }