diff --git a/build.gradle b/build.gradle index 1d6c342..bcbb0ed 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.1' + classpath 'com.android.tools.build:gradle:3.5.3' } } diff --git a/usbSerialForAndroid/publishToMavenLocal.gradle b/usbSerialForAndroid/publishToMavenLocal.gradle index a007e7b..40d028a 100644 --- a/usbSerialForAndroid/publishToMavenLocal.gradle +++ b/usbSerialForAndroid/publishToMavenLocal.gradle @@ -5,7 +5,7 @@ publishing { maven(MavenPublication) { groupId 'com.github.mik3y' artifactId 'usb-serial-for-android' - version '2.1.0a' + version '2.2.0a' afterEvaluate { artifact androidSourcesJar artifact bundleReleaseAar diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java index 319d7ea..9a82093 100644 --- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java +++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java @@ -1091,13 +1091,13 @@ public class DeviceTest implements SerialInputOutputManager.Listener { // int diffLen = readSpeedInt(5, 0); if(usbSerialDriver instanceof Ch34xSerialDriver && diffLen == -1) - diffLen = 0; // todo: investigate last packet loss + diffLen = 0; // todo: investigate last packet loss assertEquals(0, diffLen); } private int readSpeedInt(int writeSeconds, int readTimeout) throws Exception { int baudrate = 115200; - if(usbSerialDriver instanceof Ch34xSerialDriver && readTimeout != 0) + if(usbSerialDriver instanceof Ch34xSerialDriver) baudrate = 38400; int writeAhead = 5*baudrate/10; // write ahead for another 5 second read if(usbSerialDriver instanceof CdcAcmSerialDriver) @@ -1355,8 +1355,6 @@ public class DeviceTest implements SerialInputOutputManager.Listener { int longTimeout = 1000; int shortTimeout = 10; - if(usbSerialDriver instanceof Ch34xSerialDriver) - shortTimeout = 20; // too short timeout causes mysterious effects like lost telnet data time = System.currentTimeMillis(); len = usbSerialPort.read(buf, shortTimeout); assertEquals(0, len); diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java index a2825f1..3f617d0 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CdcAcmSerialDriver.java @@ -94,26 +94,13 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { } @Override - public void open(UsbDeviceConnection connection) throws IOException { - if (mConnection != null) { - throw new IOException("Already open"); - } - - mConnection = connection; - boolean opened = false; - try { - if (1 == mDevice.getInterfaceCount()) { - Log.d(TAG,"device might be castrated ACM device, trying single interface logic"); - openSingleInterface(); - } else { - Log.d(TAG,"trying default interface logic"); - openInterface(); - } - opened = true; - } finally { - if (!opened) { - close(); - } + public void openInt(UsbDeviceConnection connection) throws IOException { + if (1 == mDevice.getInterfaceCount()) { + Log.d(TAG,"device might be castrated ACM device, trying single interface logic"); + openSingleInterface(); + } else { + Log.d(TAG,"trying default interface logic"); + openInterface(); } } @@ -224,9 +211,6 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { if (ep.getDirection() == UsbConstants.USB_DIR_OUT && ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) mWriteEndpoint = ep; } - if (mReadEndpoint == null || mWriteEndpoint == null) { - throw new IOException("Could not get read&write endpoints"); - } } private int sendAcmControlMessage(int request, int value, byte[] buf) throws IOException { diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Ch34xSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Ch34xSerialDriver.java index 481827f..994579f 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Ch34xSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Ch34xSerialDriver.java @@ -90,42 +90,28 @@ public class Ch34xSerialDriver implements UsbSerialDriver { } @Override - public void open(UsbDeviceConnection connection) throws IOException { - if (mConnection != null) { - throw new IOException("Already open"); - } - - mConnection = connection; - boolean opened = false; - try { - for (int i = 0; i < mDevice.getInterfaceCount(); i++) { - UsbInterface usbIface = mDevice.getInterface(i); - if (!mConnection.claimInterface(usbIface, true)) { - throw new IOException("Could not claim data interface"); - } - } - - UsbInterface dataIface = mDevice.getInterface(mDevice.getInterfaceCount() - 1); - for (int i = 0; i < dataIface.getEndpointCount(); i++) { - UsbEndpoint ep = dataIface.getEndpoint(i); - if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { - if (ep.getDirection() == UsbConstants.USB_DIR_IN) { - mReadEndpoint = ep; - } else { - mWriteEndpoint = ep; - } - } - } - - initialize(); - setBaudRate(DEFAULT_BAUD_RATE); - - opened = true; - } finally { - if (!opened) { - close(); + public void openInt(UsbDeviceConnection connection) throws IOException { + for (int i = 0; i < mDevice.getInterfaceCount(); i++) { + UsbInterface usbIface = mDevice.getInterface(i); + if (!mConnection.claimInterface(usbIface, true)) { + throw new IOException("Could not claim data interface"); } } + + UsbInterface dataIface = mDevice.getInterface(mDevice.getInterfaceCount() - 1); + for (int i = 0; i < dataIface.getEndpointCount(); i++) { + UsbEndpoint ep = dataIface.getEndpoint(i); + if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { + if (ep.getDirection() == UsbConstants.USB_DIR_IN) { + mReadEndpoint = ep; + } else { + mWriteEndpoint = ep; + } + } + } + + initialize(); + setBaudRate(DEFAULT_BAUD_RATE); } @Override diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java index 1c454eb..89ea337 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/CommonUsbSerialPort.java @@ -107,26 +107,42 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { } @Override - public abstract void open(UsbDeviceConnection connection) throws IOException; + public void open(UsbDeviceConnection connection) throws IOException { + if (mConnection != null) { + throw new IOException("Already open"); + } + mConnection = connection; + try { + openInt(connection); + if (mReadEndpoint == null || mWriteEndpoint == null) { + throw new IOException("Could not get read & write endpoints"); + } + mUsbRequest = new UsbRequest(); + mUsbRequest.initialize(mConnection, mReadEndpoint); + } catch(Exception e) { + close(); + throw e; + } + } + + protected abstract void openInt(UsbDeviceConnection connection) throws IOException; @Override public void close() throws IOException { if (mConnection == null) { throw new IOException("Already closed"); } - synchronized (this) { - if (mUsbRequest != null) - mUsbRequest.cancel(); - } + try { + mUsbRequest.cancel(); + } catch(Exception ignored) {} + mUsbRequest = null; try { closeInt(); } catch(Exception ignored) {} try { mConnection.close(); - } finally { - mConnection = null; - } - + } catch(Exception ignored) {} + mConnection = null; } protected abstract void closeInt(); @@ -150,26 +166,15 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { nread = mConnection.bulkTransfer(mReadEndpoint, dest, readMax, timeout); } else { - final UsbRequest request = new UsbRequest(); - try { - request.initialize(mConnection, mReadEndpoint); - final ByteBuffer buf = ByteBuffer.wrap(dest); - if (!request.queue(buf, dest.length)) { - throw new IOException("Error queueing request"); - } - mUsbRequest = request; - final UsbRequest response = mConnection.requestWait(); - synchronized (this) { - mUsbRequest = null; - } - if (response == null) { - throw new IOException("Null response"); - } - nread = buf.position(); - } finally { - mUsbRequest = null; - request.close(); + final ByteBuffer buf = ByteBuffer.wrap(dest); + if (!mUsbRequest.queue(buf, dest.length)) { + throw new IOException("Queueing USB request failed"); } + final UsbRequest response = mConnection.requestWait(); + if (response == null) { + throw new IOException("Waiting for USB request failed"); + } + nread = buf.position(); } if (nread > 0) { return readFilter(dest, nread); diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java index 4589e84..c0e0b39 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/Cp21xxSerialDriver.java @@ -138,43 +138,30 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { } @Override - public void open(UsbDeviceConnection connection) throws IOException { - if (mConnection != null) { - throw new IOException("Already open"); - } - - mConnection = connection; - boolean opened = false; + public void openInt(UsbDeviceConnection connection) throws IOException { mIsRestrictedPort = mDevice.getInterfaceCount() == 2 && mPortNumber == 1; - try { - if(mPortNumber >= mDevice.getInterfaceCount()) { - throw new IOException("Unknown port number"); - } - UsbInterface dataIface = mDevice.getInterface(mPortNumber); - if (!mConnection.claimInterface(dataIface, true)) { - throw new IOException("Could not claim interface " + mPortNumber); - } - for (int i = 0; i < dataIface.getEndpointCount(); i++) { - UsbEndpoint ep = dataIface.getEndpoint(i); - if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { - if (ep.getDirection() == UsbConstants.USB_DIR_IN) { - mReadEndpoint = ep; - } else { - mWriteEndpoint = ep; - } + if(mPortNumber >= mDevice.getInterfaceCount()) { + throw new IOException("Unknown port number"); + } + UsbInterface dataIface = mDevice.getInterface(mPortNumber); + if (!mConnection.claimInterface(dataIface, true)) { + throw new IOException("Could not claim interface " + mPortNumber); + } + for (int i = 0; i < dataIface.getEndpointCount(); i++) { + UsbEndpoint ep = dataIface.getEndpoint(i); + if (ep.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) { + if (ep.getDirection() == UsbConstants.USB_DIR_IN) { + mReadEndpoint = ep; + } else { + mWriteEndpoint = ep; } } - - setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_ENABLE); - setConfigSingle(SILABSER_SET_MHS_REQUEST_CODE, MCR_ALL | CONTROL_WRITE_DTR | CONTROL_WRITE_RTS); - setConfigSingle(SILABSER_SET_BAUDDIV_REQUEST_CODE, BAUD_RATE_GEN_FREQ / DEFAULT_BAUD_RATE); - // setParameters(DEFAULT_BAUD_RATE, DEFAULT_DATA_BITS, DEFAULT_STOP_BITS, DEFAULT_PARITY); - opened = true; - } finally { - if (!opened) { - close(); - } } + + setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_ENABLE); + setConfigSingle(SILABSER_SET_MHS_REQUEST_CODE, MCR_ALL | CONTROL_WRITE_DTR | CONTROL_WRITE_RTS); + setConfigSingle(SILABSER_SET_BAUDDIV_REQUEST_CODE, BAUD_RATE_GEN_FREQ / DEFAULT_BAUD_RATE); +// setParameters(DEFAULT_BAUD_RATE, DEFAULT_DATA_BITS, DEFAULT_STOP_BITS, DEFAULT_PARITY); } @Override diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java index a37ee44..14d9ef5 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/FtdiSerialDriver.java @@ -295,32 +295,19 @@ public class FtdiSerialDriver implements UsbSerialDriver { } @Override - public void open(UsbDeviceConnection connection) throws IOException { - if (mConnection != null) { - throw new IOException("Already open"); + public void openInt(UsbDeviceConnection connection) throws IOException { + if (connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { + Log.d(TAG, "claimInterface " + mPortNumber + " SUCCESS"); + } else { + throw new IOException("Error claiming interface " + mPortNumber); } - mConnection = connection; - - boolean opened = false; - try { - if (connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { - Log.d(TAG, "claimInterface " + mPortNumber + " SUCCESS"); - } else { - throw new IOException("Error claiming interface " + mPortNumber); - } - if (mDevice.getInterface(mPortNumber).getEndpointCount() < 2) { - throw new IOException("Insufficient number of endpoints (" + - mDevice.getInterface(mPortNumber).getEndpointCount() + ")"); - } - mReadEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(0); - mWriteEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(1); - reset(); - opened = true; - } finally { - if (!opened) { - close(); - } + if (mDevice.getInterface(mPortNumber).getEndpointCount() < 2) { + throw new IOException("Insufficient number of endpoints (" + + mDevice.getInterface(mPortNumber).getEndpointCount() + ")"); } + mReadEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(0); + mWriteEndpoint = mDevice.getInterface(mPortNumber).getEndpoint(1); + reset(); } @Override diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java index b581702..cd3c548 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/ProlificSerialDriver.java @@ -263,78 +263,63 @@ public class ProlificSerialDriver implements UsbSerialDriver { } @Override - public void open(UsbDeviceConnection connection) throws IOException { - if (mConnection != null) { - throw new IOException("Already open"); - } - + public void openInt(UsbDeviceConnection connection) throws IOException { UsbInterface usbInterface = mDevice.getInterface(0); if (!connection.claimInterface(usbInterface, true)) { throw new IOException("Error claiming Prolific interface 0"); } - mConnection = connection; - boolean opened = false; - try { - for (int i = 0; i < usbInterface.getEndpointCount(); ++i) { - UsbEndpoint currentEndpoint = usbInterface.getEndpoint(i); + for (int i = 0; i < usbInterface.getEndpointCount(); ++i) { + UsbEndpoint currentEndpoint = usbInterface.getEndpoint(i); - switch (currentEndpoint.getAddress()) { - case READ_ENDPOINT: - mReadEndpoint = currentEndpoint; - break; + switch (currentEndpoint.getAddress()) { + case READ_ENDPOINT: + mReadEndpoint = currentEndpoint; + break; - case WRITE_ENDPOINT: - mWriteEndpoint = currentEndpoint; - break; + case WRITE_ENDPOINT: + mWriteEndpoint = currentEndpoint; + break; - case INTERRUPT_ENDPOINT: - mInterruptEndpoint = currentEndpoint; - break; - } - } - - if (mDevice.getDeviceClass() == 0x02) { - mDeviceType = DEVICE_TYPE_0; - } else { - try { - Method getRawDescriptorsMethod - = mConnection.getClass().getMethod("getRawDescriptors"); - byte[] rawDescriptors - = (byte[]) getRawDescriptorsMethod.invoke(mConnection); - byte maxPacketSize0 = rawDescriptors[7]; - if (maxPacketSize0 == 64) { - mDeviceType = DEVICE_TYPE_HX; - } else if ((mDevice.getDeviceClass() == 0x00) - || (mDevice.getDeviceClass() == 0xff)) { - mDeviceType = DEVICE_TYPE_1; - } else { - Log.w(TAG, "Could not detect PL2303 subtype, " - + "Assuming that it is a HX device"); - mDeviceType = DEVICE_TYPE_HX; - } - } catch (NoSuchMethodException e) { - Log.w(TAG, "Method UsbDeviceConnection.getRawDescriptors, " - + "required for PL2303 subtype detection, not " - + "available! Assuming that it is a HX device"); - mDeviceType = DEVICE_TYPE_HX; - } catch (Exception e) { - Log.e(TAG, "An unexpected exception occured while trying " - + "to detect PL2303 subtype", e); - } - } - - setControlLines(mControlLinesValue); - resetDevice(); - - doBlackMagic(); - opened = true; - } finally { - if (!opened) { - close(); + case INTERRUPT_ENDPOINT: + mInterruptEndpoint = currentEndpoint; + break; } } + + if (mDevice.getDeviceClass() == 0x02) { + mDeviceType = DEVICE_TYPE_0; + } else { + try { + Method getRawDescriptorsMethod + = mConnection.getClass().getMethod("getRawDescriptors"); + byte[] rawDescriptors + = (byte[]) getRawDescriptorsMethod.invoke(mConnection); + byte maxPacketSize0 = rawDescriptors[7]; + if (maxPacketSize0 == 64) { + mDeviceType = DEVICE_TYPE_HX; + } else if ((mDevice.getDeviceClass() == 0x00) + || (mDevice.getDeviceClass() == 0xff)) { + mDeviceType = DEVICE_TYPE_1; + } else { + Log.w(TAG, "Could not detect PL2303 subtype, " + + "Assuming that it is a HX device"); + mDeviceType = DEVICE_TYPE_HX; + } + } catch (NoSuchMethodException e) { + Log.w(TAG, "Method UsbDeviceConnection.getRawDescriptors, " + + "required for PL2303 subtype detection, not " + + "available! Assuming that it is a HX device"); + mDeviceType = DEVICE_TYPE_HX; + } catch (Exception e) { + Log.e(TAG, "An unexpected exception occured while trying " + + "to detect PL2303 subtype", e); + } + } + setControlLines(mControlLinesValue); + resetDevice(); + doBlackMagic(); } @Override