libusbhid_interrupt_read. failed! return code: -1
0libusb: error [winusbx_submit_bulk_transfer] ReadPipe/WritePipe failed: [2] 
The system cannot find the file specified.

But I don't really know how I can detect this and exit the process and signal 
my other program that the device is no longer present.   My read command:
       
hidReportData[reportIdx].dataLen:=libusbhid_interrupt_read(device_context,$81{endpoint},{out}hidReportData[reportIdx].hid_data,64{report
 length, varies by device}, {timeout=}50);
only reports the number of bytes read, and when the device is removed, the 
result of the libusbhid_interrupt_read seems to be 64.   I’m wondering what the 
proper way to gracefully detect the device has been disconnected is so I can 
just exit out of the mode the uses the device and return to normal processing 
without generating any errors.

You can try to handle the error return code by checking that a device that was present before has actually disappeared for the libusb device list.

It also appears that in newer versions of libusb, there are provisions for registering and unregistering a hotplug callback.

http://libusb.sourceforge.net/api-1.0/hotplug.html

It it easy to add the calls to libusbx but they need to be tested that they actually work as expected.


Any ideas?

James


-----Original Message-----
From: fpc-pascal <fpc-pascal-boun...@lists.freepascal.org> On Behalf Of Stefan 
V. Pantazi
Sent: Friday, August 23, 2019 10:54 AM
To: fpc-pascal@lists.freepascal.org
Subject: Re: [fpc-pascal] USB Human Interface Devices

Thanks for pushing on this. I think any pending timeout/transfer must be 
explicitly canceled before closing the USB device, so that the thread can end 
gracefully.

The only way I see is to use something like

libusb_handle_events_timeout_completed  

http://libusb.sourceforge.net/api-1.0/group__poll.html#ga43e52b912a760b41a0cf8a4a472fbd5b


before closing the USB device context.

That function is not currently part of the libusbx and has a time_t parameter 
that appears C-specific but for some reason is not included in ctypes unit. But 
I am sure Pascal equivalents can be defined. I will do some tests to include 
the libusb_handle_events_timeout_completed in libusbx and libusbhid and let you 
know.



On 8/23/19 7:07 AM, James Richters wrote:
Stefan ,
Do you get the following errors when you exit your program?   Is there some way 
I should shut down the read thread so I don't get this error?  I've been using 
a timeout of 0


libusb: error [do_close] Device handle closed while transfer was still
being processed, but the device is still connected as far as we know
libusb: error [do_close] A cancellation hasn't even been scheduled on
the transfer for which the device is closing
libusb: warning [libusb_exit] some libusb_devices were leaked
Assertion failed!

Program: i:\programming\gcode\libusbxhid\whb04b-4_test.exe
File: os/poll_windows.c, Line 145

Expression: fd != NULL
Heap dump by heaptrc unit of
i:\programming\gcode\libusbxhid\whb04b-4_test.exe
50 memory blocks allocated : 1782/1968
50 memory blocks freed     : 1782/1968
0 unfreed memory blocks : 0
True heap size : 131072 (160 used in System startup) True free heap :
130912 _______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


--
_______________________________________________________
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org 
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal


--
_______________________________________________________
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to