From 6869eff88aebd838c6ecd2483ee7a805c3d0cd71 Mon Sep 17 00:00:00 2001 From: kai-morich Date: Sat, 2 Nov 2019 11:24:58 +0100 Subject: [PATCH] revert previous usbRequest.cancel() removal Combine usbRequest.cancel() and releaseInterface to interrupt read() and terminate SerialInputOutputManager. UsbRequest.cancel() immediately interrupts read() on newer Android versions. With releaseInterface() only, some hickup are observed on fast reconnect. Keep releaseInterface() as only this interrupts read() on older Androids. --- .../usbserial/driver/CdcAcmSerialDriver.java | 12 ++++++++++++ .../usbserial/driver/Ch34xSerialDriver.java | 12 ++++++++++++ .../usbserial/driver/Cp21xxSerialDriver.java | 16 ++++++++++++++-- .../usbserial/driver/FtdiSerialDriver.java | 2 ++ .../usbserial/driver/ProlificSerialDriver.java | 2 ++ 5 files changed, 42 insertions(+), 2 deletions(-) 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 33eb17e..773f355 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 @@ -50,6 +50,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { private final UsbDevice mDevice; private final UsbSerialPort mPort; + private UsbRequest mUsbRequest; public CdcAcmSerialDriver(UsbDevice device) { mDevice = device; @@ -253,9 +254,15 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { if (mConnection == null) { throw new IOException("Already closed"); } + synchronized (this) { + if (mUsbRequest != null) + mUsbRequest.cancel(); + } try { mConnection.releaseInterface(mControlInterface); mConnection.releaseInterface(mDataInterface); + } catch(Exception ignored) {} + try { mConnection.close(); } finally { mConnection = null; @@ -273,7 +280,11 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { 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"); } @@ -286,6 +297,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver { return 0; } } finally { + mUsbRequest = null; request.close(); } } 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 31c36ed..7b36171 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 @@ -85,6 +85,7 @@ public class Ch34xSerialDriver implements UsbSerialDriver { private UsbEndpoint mReadEndpoint; private UsbEndpoint mWriteEndpoint; + private UsbRequest mUsbRequest; public Ch340SerialPort(UsbDevice device, int portNumber) { super(device, portNumber); @@ -143,9 +144,15 @@ public class Ch34xSerialDriver implements UsbSerialDriver { if (mConnection == null) { throw new IOException("Already closed"); } + synchronized (this) { + if (mUsbRequest != null) + mUsbRequest.cancel(); + } try { for (int i = 0; i < mDevice.getInterfaceCount(); i++) mConnection.releaseInterface(mDevice.getInterface(i)); + } catch(Exception ignored) {} + try { mConnection.close(); } finally { mConnection = null; @@ -164,7 +171,11 @@ public class Ch34xSerialDriver implements UsbSerialDriver { 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"); } @@ -177,6 +188,7 @@ public class Ch34xSerialDriver implements UsbSerialDriver { return 0; } } finally { + mUsbRequest = null; request.close(); } } 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 67fa528..11d9823 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 @@ -108,6 +108,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { private UsbEndpoint mReadEndpoint; private UsbEndpoint mWriteEndpoint; + private UsbRequest mUsbRequest; // second port of Cp2105 has limited baudRate, dataBits, stopBits, parity // unsupported baudrate returns error at controlTransfer(), other parameters are silently ignored @@ -176,12 +177,18 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { if (mConnection == null) { throw new IOException("Already closed"); } + synchronized (this) { + if(mUsbRequest != null) { + mUsbRequest.cancel(); + } + } try { setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_DISABLE); - } catch (Exception ignored) - {} + } catch (Exception ignored) {} try { mConnection.releaseInterface(mDevice.getInterface(mPortNumber)); + } catch(Exception ignored) {} + try { mConnection.close(); } finally { mConnection = null; @@ -199,7 +206,11 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { 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"); } @@ -212,6 +223,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver { return 0; } } finally { + mUsbRequest = null; request.close(); } } 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 585b84b..8dbdfd4 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 @@ -269,6 +269,8 @@ public class FtdiSerialDriver implements UsbSerialDriver { } try { mConnection.releaseInterface(mDevice.getInterface(mPortNumber)); + } catch(Exception ignored) {} + try { mConnection.close(); } finally { mConnection = null; 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 9830b56..d4928fc 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 @@ -362,6 +362,8 @@ public class ProlificSerialDriver implements UsbSerialDriver { } finally { try { mConnection.releaseInterface(mDevice.getInterface(0)); + } catch(Exception ignored) {} + try { mConnection.close(); } finally { mConnection = null;