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-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

Reply via email to