I have a usb device which have a button. 
And I want to an android app to catch a signal of the button.
I found inferface and endpoint number of the button. 
It had seemed to perform ordinarily at galaxy S3 and galaxy note.
But later, I found that it has delay at other phones.

I was able to receive instant responses about 10% of the time; usually 
there was a 2-second delay, with some cases where the whole response was 
lost.

Although I couldn't figure out the exact reason, I realized that the phones 
that had response delays were those with kernel version 3.4 or later.

Here is the code that I used initially.

        if(mConnection != null){
mConnection.claimInterface(mInterfaces.get(0), true);
final UsbEndpoint endpoint = mInterfaces.get(0).getEndpoint(0);
Thread getSignalThread = new Thread(new Runnable() {
@Override
public synchronized void run() {
byte[] buffer = new byte[8];
final ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
while(mConnection!=null){
int len = mConnection.bulkTransfer(endpoint, buffer, buffer.length, 0); 
if( len>=0  ){
// do my own code 
} 
} 
}
});
getSignalThread.setPriority(Thread.MAX_PRIORITY);
getSignalThread.start();
}

***edit timeout** *

when the timeout was set to 50ms, I wasn't able to receive responses most 
of the time. When the timeout was 500ms, I was able to initially get some 
delayed-responses; however, I lost all responses after several tries with 
this setting.


***Using UsbRequest***

In addition to using the bulktransfer method, I also tried using UsbRequest 
and below is the code that I used.

                    @Override
public synchronized void run() {
byte[] buffer = new byte[8];
final ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
UsbRequest inRequest = new UsbRequest();
inRequest.initialize(mConnection, endpoint);
while(mConnection!=null){
inRequest.queue( byteBuffer , buffer.length);
if( mConnection.requestWait() == inRequest  ){
                                // do my own code
}
} 
}

However, the same kind of delay happened even after using UsbRequest.

***Using libusb***

I also tried using 
[libusb_interrupt_transfer](http://libusb.sourceforge.net/api-1.0/group__syncio.html#gac412bda21b7ecf57e4c76877d78e6486)
 
from an open source library called libusb.
However this also produced the same type of delay that I had when using 
UsbDeviceConnection. 

    unsigned char data_bt[8] = { 0, };
uint32_t out[2];
int transfered = 0;
while (devh_usb != NULL) {

libusb_interrupt_transfer(devh_usb, 0x83, data_bt, 8, &transfered, 0);
memcpy(out, data_bt, 8);
if (out[0] == PUSH) {
LOGI("button pushed!!!");
memset(data_bt, 0, 8);
//(env)->CallVoidMethod( thiz, mid);
}
}

After looking into the part where libusb_interrupt_transfer is processed 
libusb, I was able to figure out the general steps of interrupt_transfer:
1. make a transfer object of type interrupt
2. make a urb object that points to the transfer object
3. submit the urb object to the device's fd
4. detect any changes in the fd object via urb object
5. read urb through ioctl


steps 3, 4, 5 are the steps regarding file i/o.
I was able to find out that at step 4 the program waits for the button 
press before moving onto the next step.


Therefore I tried changing poll to epoll in order to check if the poll 
function was causing the delay; unfortunately nothing changed.

I also tried setting the timeout of the poll function to 500ms and making 
it always get values of the fd through ioctl but only found out that the 
value changed 2~3 seconds after pressing the button.

So in conclusion I feel that there is a delay in the process of updating 
the value of the fd after pressing the button. If there is anyone who could 
help me with this issue, please let me know. Thank you.


Thanks for reading

-- 
You received this message because you are subscribed to the Google Groups 
"Android Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to android-developers+unsubscr...@googlegroups.com.
To post to this group, send email to android-developers@googlegroups.com.
Visit this group at https://groups.google.com/group/android-developers.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/android-developers/aafaf47e-b8c6-4d40-b94d-f73ce5ae22c6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to