From cab862599dcb2541efcd18c615cf561dc7e5f2fe Mon Sep 17 00:00:00 2001 From: Kai Morich Date: Mon, 27 May 2024 22:06:39 +0200 Subject: [PATCH] write(): throw SerialTimeoutException if connection still valid --- .idea/.gitignore | 6 +++-- usbSerialForAndroid/build.gradle | 2 +- .../usbserial/driver/CommonUsbSerialPort.java | 24 ++++++++++++------- .../driver/SerialTimeoutException.java | 3 ++- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/.idea/.gitignore b/.idea/.gitignore index 5f79908..c38a1d5 100644 --- a/.idea/.gitignore +++ b/.idea/.gitignore @@ -2,5 +2,7 @@ caches codeStyles libraries workspace.xml -androidTestResultsUserPreferences.xml -deploymentTargetDropDown.xml \ No newline at end of file +androidTestResultsUserPreferences.xml +appInsightsSettings.xml +deploymentTargetDropDown.xml +deploymentTargetSelector.xml \ No newline at end of file diff --git a/usbSerialForAndroid/build.gradle b/usbSerialForAndroid/build.gradle index aa7f699..69b0a12 100644 --- a/usbSerialForAndroid/build.gradle +++ b/usbSerialForAndroid/build.gradle @@ -50,7 +50,7 @@ project.afterEvaluate { // values used for local maven repo, jitpack uses github release: groupId 'com.github.mik3y' artifactId 'usb-serial-for-android' - version '3.5.2beta' + version '3.7.3beta' } } } 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 99a912d..aa3d220 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 @@ -159,6 +159,10 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { * use simple USB request supported by all devices to test if connection is still valid */ protected void testConnection(boolean full) throws IOException { + testConnection(full, "USB get_status request failed"); + } + + protected void testConnection(boolean full, String msg) throws IOException { if(mConnection == null) { throw new IOException("Connection closed"); } @@ -168,7 +172,7 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { byte[] buf = new byte[2]; int len = mConnection.controlTransfer(0x80 /*DEVICE*/, 0 /*GET_STATUS*/, 0, 0, buf, buf.length, 200); if(len < 0) - throw new IOException("USB get_status request failed"); + throw new IOException(msg); } @Override @@ -233,7 +237,7 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { @Override public void write(final byte[] src, int length, final int timeout) throws IOException { int offset = 0; - final long endTime = (timeout == 0) ? 0 : (MonotonicClock.millis() + timeout); + long startTime = MonotonicClock.millis(); length = Math.min(length, src.length); if(mConnection == null) { @@ -261,7 +265,7 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { if (timeout == 0 || offset == 0) { requestTimeout = timeout; } else { - requestTimeout = (int)(endTime - MonotonicClock.millis()); + requestTimeout = (int)(startTime + timeout - MonotonicClock.millis()); if(requestTimeout == 0) requestTimeout = -1; } @@ -271,16 +275,18 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { actualLength = mConnection.bulkTransfer(mWriteEndpoint, writeBuffer, requestLength, requestTimeout); } } + long elapsed = MonotonicClock.millis() - startTime; if (DEBUG) { - Log.d(TAG, "Wrote " + actualLength + "/" + requestLength + " offset " + offset + "/" + length + " timeout " + requestTimeout); + Log.d(TAG, "Wrote " + actualLength + "/" + requestLength + " offset " + offset + "/" + length + " time " + elapsed + "/" + requestTimeout); } if (actualLength <= 0) { - if (timeout != 0 && MonotonicClock.millis() >= endTime) { - SerialTimeoutException ex = new SerialTimeoutException("Error writing " + requestLength + " bytes at offset " + offset + " of total " + src.length + ", rc=" + actualLength); - ex.bytesTransferred = offset; - throw ex; + String msg = "Error writing " + requestLength + " bytes at offset " + offset + " of total " + src.length + " after " + elapsed + "msec, rc=" + actualLength; + if (timeout != 0) { + testConnection(elapsed < timeout, msg); + throw new SerialTimeoutException(msg, offset); } else { - throw new IOException("Error writing " + requestLength + " bytes at offset " + offset + " of total " + length); + throw new IOException(msg); + } } offset += actualLength; diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/SerialTimeoutException.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/SerialTimeoutException.java index 12fc0ec..53304bc 100644 --- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/SerialTimeoutException.java +++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/SerialTimeoutException.java @@ -9,7 +9,8 @@ import java.io.InterruptedIOException; * {@see InterruptedIOException#bytesTransferred} may contain bytes transferred */ public class SerialTimeoutException extends InterruptedIOException { - public SerialTimeoutException(String s) { + public SerialTimeoutException(String s, int bytesTransferred) { super(s); + this.bytesTransferred = bytesTransferred; } }