[fpc-pascal] USB Human Interface Devices

Stefan V. Pantazi svpantazi at gmail.com
Wed Aug 28 23:36:11 CEST 2019


I agree with you: the libusbhid_interrupt_read and 
libusb_interrupt_transfer are very close semantically and returning as a 
result either the length of transferred data or the error code would 
make a lot of sense. But in rare cases one may still need to check both 
parameters:

http://libusb.sourceforge.net/api-1.0/group__syncio.html#gac412bda21b7ecf57e4c76877d78e6486
"Also check transferred when dealing with a timeout error code. libusb 
may have to split your transfer into a number of chunks to satisfy 
underlying O/S requirements, meaning that the timeout may expire after 
the first few chunks have completed. libusb is careful not to lose any 
data that may have been transferred; do not assume that timeout 
conditions indicate a complete lack of I/O."

At any rate, switching around and returning both: the error code as the 
result of libusb_interrupt_transfer and the length of data transfer as 
an out parameter maybe the right thing to do. That would probably make 
the semantics of libusbhid_interrupt_read and libusb_interrupt_transfer 
almost identical.

On 8/28/19 5:03 AM, James Richters wrote:
> Thanks for adding the hotplug functions and the sample program.  I will give that a try.
> 
> I have come up with another solution before I saw you added the hotplug functions:
> 
> My thinking is that the interrupt read is going to know about the missing device before anything because it will be constantly reading as fast is it can and my main thread will be cycling much slower,  so detecting the failure of the interrupt read would be the fastest way to know the device was not connected anymore.
> I noticed that lib_interupt_transfer produces a return code if anything prevents the transfer from being completed.  But this information is only used for optional debug reports, and not returned from the libusbhid_interrupt_write and libusbhid_interrupt_read functions,  they only return the number of bytes transferred.  Since the number of bytes read or sent is irrelevant due to an error, and the error codes seem to always be negative, then there is no ambiguity if we return the error if it is negative or bytes transferred if it is not negative. That way calls to libusbhid_interrupt_write and libusbhid_interrupt_read can quckly get the return code and / or the number of bytes transferred, just by checking if the result is negative or not. Since the interrupt read is happening in a tight loop and running way faster than anything else, it's likely that this will be the fastest way to stop the read thread when the device is unplugged, then I can go back to looking for it in the main program again.  The first read that produces an error will stop the thread.
> 
> I have tested this on my test branch. I get one negative return code during normal use... and that is if I get a timeout, I get a -7, perhaps because I asked for 8 bytes maybe? This is also useful information to have in my loop as if I get a -7, I don't need to bother checking the data at all since it was not read, it was just a timeout.  https://github.com/Zaaphod/libusbxhid/tree/Test
> 
> 
> James


More information about the fpc-pascal mailing list