[fpc-pascal] USB Human Interface Devices
James Richters
james at productionautomation.net
Wed Aug 28 01:50:56 CEST 2019
I finally have this working fairly well. I used Stefan's sample program as a guide and used classes to define my thread... and that seemed to solve the crashing issue I was having when trying to write to the LCD from outside the fast read thread. Here is the current version: https://github.com/Zaaphod/libusbxhid/blob/Test/WHB04B-4_test.pas
One thing I wasn't able to duplicate however was the use of EnterCriticalsection(criticalSection); and LeaveCriticalsection(criticalSection); when writing to shared variables. If I try to ever use EnterCriticalsection(criticalSection); in the read thread, My program just instantly locks up and I can't even break out of it. If I try to use it in the main program I instantly get
EAccessViolation: Access violation
$00007FFF18A2DF23
$00007FFF189E9BBC
$00007FFF189E9AD0
$000000010000DCDA
$000000010000D54B
$000000010000218B PROCESS_USB_DATA, line 475 of WHB04B-4_test.pas
$0000000100002B37 SIMPLETERMINAL, line 641 of WHB04B-4_test.pas
$0000000100002DDD USE_MPG_DEVICE, line 675 of WHB04B-4_test.pas
$0000000100002F93 main, line 699 of WHB04B-4_test.pas
$0000000100002FE6
$0000000100011350
$0000000100001980
$00007FFF17B47E94
$00007FFF18A4A251
Line 475 is EnterCriticalsection(criticalSection);
I left where I had the criticalsection stuff in the program but commented out. It does seem to work fine without it though.. since the read, I am curious what I'm doing wrong, or if I need to do something else because I'm on Windows.
Also, there are two versions of this device, once is hard wired to the USB port, the other is wireless. They both have power buttons on them. When I turn off the power button on the wireless version, the transceiver still plugged into the USB port just reports that the device is turned off.. but the hard wired version just basically unplugs it from the USB port. When this happens, my read loop generates:
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.
Any ideas?
James
-----Original Message-----
From: fpc-pascal <fpc-pascal-bounces at lists.freepascal.org> On Behalf Of Stefan V. Pantazi
Sent: Friday, August 23, 2019 10:54 AM
To: fpc-pascal at 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 at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>
--
_______________________________________________________
_______________________________________________
fpc-pascal maillist - fpc-pascal at lists.freepascal.org https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
More information about the fpc-pascal
mailing list