diff options
author | Christof Arnosti <charno@charno.ch> | 2020-03-08 15:25:55 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2020-03-08 11:22:55 -0700 |
commit | b15b9c6cd0e8d83ec12a868c10cf184217f51309 (patch) | |
tree | 78ea1cf9a3772745222830053545af080e667c8d | |
parent | fe932059fe0e989089bd259c541db41d358cfa47 (diff) | |
download | subsurface-b15b9c6cd0e8d83ec12a868c10cf184217f51309.tar.gz |
usb-serial-for-android: Implement timeout-handling
Since the Android USB stack and subsequently the usb-serial-for-android
driver have problems with read-timeouts, the read-timeout is now
implemented in AndroidSerial.java. Also, DC_STATUS_TIMEOUT is returned
if there are less bytes returned than expected.
Different chipsets seem to behave differently with
usb-serial-for-android. On CP210x the read blocks until there is some
data here, but on FTDI the chip seems to return whatever is currently in
the buffer (so 0 bytes if the buffer is empty). This different behaviour
should be mitigated by the changes by this commit.
Signed-off-by: Christof Arnosti <charno@charno.ch>
-rw-r--r-- | android-mobile/src/org/subsurfacedivelog/mobile/AndroidSerial.java | 12 | ||||
-rw-r--r-- | core/serial_usb_android.cpp | 6 |
2 files changed, 13 insertions, 5 deletions
diff --git a/android-mobile/src/org/subsurfacedivelog/mobile/AndroidSerial.java b/android-mobile/src/org/subsurfacedivelog/mobile/AndroidSerial.java index 59b8dc9e9..1193b0ceb 100644 --- a/android-mobile/src/org/subsurfacedivelog/mobile/AndroidSerial.java +++ b/android-mobile/src/org/subsurfacedivelog/mobile/AndroidSerial.java @@ -19,6 +19,7 @@ import java.util.Queue; import java.util.List; import java.util.LinkedList; import java.lang.Math; +import java.util.Date; public class AndroidSerial { @@ -221,17 +222,20 @@ public class AndroidSerial { Log.d(TAG, "read length: " + data.length); int toReadFromHwLength = data.length - readBuffer.size(); - int arraylength = (toReadFromHwLength % 64) != 0 ? toReadFromHwLength + (64 - (toReadFromHwLength % 64)): toReadFromHwLength; // use blocks of 64 for reading - // When we don't have enough in the buffer, try to read from HW - if (toReadFromHwLength > 0) { + long startTime = (new Date()).getTime(); + + // while we don't have enough in the buffer, try to read from HW until there is enough or timeout is reached. + while (toReadFromHwLength > 0 && (startTime + timeout > (new Date()).getTime() || timeout == 0)) { // Read and append to buffer byte[] readFromHwData = new byte[arraylength]; - int actuallyReadFromHwLength = usbSerialPort.read(readFromHwData, 0); // With this it works... But the timeout is ignored! Fix this! + int actuallyReadFromHwLength = usbSerialPort.read(readFromHwData, 0); // This behaves differently on different chipsets. CP210x blocks, FTDI seems to return instantly. for (int i = 0; i < actuallyReadFromHwLength; i++ ) { readBuffer.add(readFromHwData[i]); } + toReadFromHwLength = data.length - readBuffer.size(); + arraylength = (toReadFromHwLength % 64) != 0 ? toReadFromHwLength + (64 - (toReadFromHwLength % 64)): toReadFromHwLength; // use blocks of 64 for reading } //Log.d(TAG, "read buffer: " + printQueue(readBuffer)); diff --git a/core/serial_usb_android.cpp b/core/serial_usb_android.cpp index a5db132ae..8f53c56bb 100644 --- a/core/serial_usb_android.cpp +++ b/core/serial_usb_android.cpp @@ -141,7 +141,11 @@ static dc_status_t serial_usb_android_read(void *io, void *data, size_t size, si env->GetByteArrayRegion(array, 0, retval, (jbyte *) data); env->DeleteLocalRef(array); TRACE (device->context, "%s: actual read size: %i", __FUNCTION__, retval); - return DC_STATUS_SUCCESS; + + if (retval < size) + return DC_STATUS_TIMEOUT; + else + return DC_STATUS_SUCCESS; } |