SerialInputOutputManager: use optimal read buffer size to reduce latency for FTDI and CH34x

pull/359/head v3.3.2
kai-morich 2021-04-04 20:48:46 +02:00
rodzic c917ac5c83
commit 848d4e7713
5 zmienionych plików z 27 dodań i 15 usunięć

Wyświetl plik

@ -29,7 +29,7 @@ allprojects {
Add library to dependencies
```gradle
dependencies {
implementation 'com.github.mik3y:usb-serial-for-android:3.3.0'
implementation 'com.github.mik3y:usb-serial-for-android:3.3.1'
}
```

Wyświetl plik

@ -818,7 +818,7 @@ public class DeviceTest {
purgeWriteBuffer(purgeTimeout);
// determine write buffer size
int writePacketSize = ((CommonUsbSerialPort)usb.serialPort).getWriteEndpoint().getMaxPacketSize();
int writePacketSize = usb.serialPort.getWriteEndpoint().getMaxPacketSize();
byte[] pbuf = new byte[writePacketSize];
int writePackets = 0;
try {
@ -1321,7 +1321,9 @@ public class DeviceTest {
@Test
public void IoManager() throws Exception {
SerialInputOutputManager.DEBUG = true;
usb.ioManager = new SerialInputOutputManager(null);
usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD));
assertNull(usb.ioManager);
usb.ioManager = new SerialInputOutputManager(usb.serialPort);
assertNull(usb.ioManager.getListener());
usb.ioManager.setListener(usb);
assertEquals(usb, usb.ioManager.getListener());
@ -1335,7 +1337,7 @@ public class DeviceTest {
usb.ioManager.setWriteTimeout(11);
assertEquals(11, usb.ioManager.getWriteTimeout());
assertEquals(4096, usb.ioManager.getReadBufferSize());
assertEquals(usb.serialPort.getReadEndpoint().getMaxPacketSize(), usb.ioManager.getReadBufferSize());
usb.ioManager.setReadBufferSize(12);
assertEquals(12, usb.ioManager.getReadBufferSize());
assertEquals(4096, usb.ioManager.getWriteBufferSize());
@ -1346,6 +1348,7 @@ public class DeviceTest {
usb.ioManager.setWriteBufferSize(usb.ioManager.getWriteBufferSize());
usb.ioManager.setReadTimeout(usb.ioManager.getReadTimeout());
usb.ioManager.setWriteTimeout(usb.ioManager.getWriteTimeout());
usb.close();
usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_IOMANAGER_START)); // creates new IoManager
usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE);
@ -2007,8 +2010,8 @@ public class DeviceTest {
usb.open();
assertTrue(usb.serialPort.isOpen());
assertEquals(((CommonUsbSerialPort)usb.serialPort).getWriteEndpoint().getMaxPacketSize(),
((CommonUsbSerialPort)usb.serialPort).getReadEndpoint().getMaxPacketSize());
assertEquals(usb.serialPort.getWriteEndpoint().getMaxPacketSize(),
usb.serialPort.getReadEndpoint().getMaxPacketSize());
s = usb.serialPort.getSerial();
// with target sdk 29 can throw SecurityException before USB permission dialog is confirmed
// not all devices implement serial numbers. some observed values are:

Wyświetl plik

@ -66,16 +66,10 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort {
return mPortNumber;
}
/**
* Returns the write endpoint.
* @return write endpoint
*/
@Override
public UsbEndpoint getWriteEndpoint() { return mWriteEndpoint; }
/**
* Returns the read endpoint.
* @return read endpoint
*/
@Override
public UsbEndpoint getReadEndpoint() { return mReadEndpoint; }
/**

Wyświetl plik

@ -8,6 +8,7 @@ package com.hoho.android.usbserial.driver;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbManager;
import androidx.annotation.IntDef;
@ -74,6 +75,18 @@ public interface UsbSerialPort extends Closeable {
*/
int getPortNumber();
/**
* Returns the write endpoint.
* @return write endpoint
*/
UsbEndpoint getWriteEndpoint();
/**
* Returns the read endpoint.
* @return read endpoint
*/
UsbEndpoint getReadEndpoint();
/**
* The serial number of the underlying UsbDeviceConnection, or {@code null}.
*

Wyświetl plik

@ -34,7 +34,7 @@ public class SerialInputOutputManager implements Runnable {
private final Object mReadBufferLock = new Object();
private final Object mWriteBufferLock = new Object();
private ByteBuffer mReadBuffer = ByteBuffer.allocate(BUFSIZ);
private ByteBuffer mReadBuffer; // default size = getReadEndpoint().getMaxPacketSize()
private ByteBuffer mWriteBuffer = ByteBuffer.allocate(BUFSIZ);
public enum State {
@ -62,11 +62,13 @@ public class SerialInputOutputManager implements Runnable {
public SerialInputOutputManager(UsbSerialPort serialPort) {
mSerialPort = serialPort;
mReadBuffer = ByteBuffer.allocate(serialPort.getReadEndpoint().getMaxPacketSize());
}
public SerialInputOutputManager(UsbSerialPort serialPort, Listener listener) {
mSerialPort = serialPort;
mListener = listener;
mReadBuffer = ByteBuffer.allocate(serialPort.getReadEndpoint().getMaxPacketSize());
}
public synchronized void setListener(Listener listener) {