From f52c67a134943cd22c1c86bb9a7e97199f879a34 Mon Sep 17 00:00:00 2001 From: Charles Julian Knight Date: Wed, 26 Jun 2019 13:39:01 -0400 Subject: [PATCH 1/4] added chunked stream methods --- .../java/com/felhr/usbserial/SerialInputStream.java | 12 ++++++++++++ .../java/com/felhr/usbserial/SerialOutputStream.java | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialInputStream.java b/usbserial/src/main/java/com/felhr/usbserial/SerialInputStream.java index afa8448..740a3a6 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialInputStream.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialInputStream.java @@ -54,6 +54,18 @@ public class SerialInputStream extends InputStream return device.syncRead(b, timeout); } + @Override + public int read(byte b[], int off, int len) + { + if (off == 0 && len == b.length) { + return read(b); + } + byte[] slice = new byte[len]; + int ret = device.syncRead(slice, timeout); + System.arraycopy(slice, 0, b, off, ret); + return ret; + } + @Override public int available() throws IOException { if(bufferSize > 0) diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialOutputStream.java b/usbserial/src/main/java/com/felhr/usbserial/SerialOutputStream.java index 31b13cf..e9b13e1 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialOutputStream.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialOutputStream.java @@ -25,6 +25,18 @@ public class SerialOutputStream extends OutputStream device.syncWrite(b, timeout); } + @Override + public void write(byte b[], int off, int len) + { + if (off == 0 && len == b.length) { + write(b); + return; + } + byte[] slice = new byte[len]; + System.arraycopy(b, off, slice, 0, len); + device.syncWrite(slice, timeout); + } + public void setTimeout(int timeout) { this.timeout = timeout; } From fdfb9f10531eceb6d022417018b21ddb6fa5f245 Mon Sep 17 00:00:00 2001 From: Felipe Herranz Date: Sun, 7 Jul 2019 15:41:19 +0200 Subject: [PATCH 2/4] added syncRead with offset except in FTDI --- .../com/felhr/usbserial/FTDISerialDevice.java | 59 +++++++++++++++++++ .../com/felhr/usbserial/UsbSerialDevice.java | 30 ++++++++++ .../felhr/usbserial/UsbSerialInterface.java | 2 + 3 files changed, 91 insertions(+) diff --git a/usbserial/src/main/java/com/felhr/usbserial/FTDISerialDevice.java b/usbserial/src/main/java/com/felhr/usbserial/FTDISerialDevice.java index f44c331..1d5e565 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/FTDISerialDevice.java +++ b/usbserial/src/main/java/com/felhr/usbserial/FTDISerialDevice.java @@ -689,6 +689,65 @@ public class FTDISerialDevice extends UsbSerialDevice return readen; } + @Override + public int syncRead(byte[] buffer, int offset, int length, int timeout) { + /* TODO + long beginTime = System.currentTimeMillis(); + long stopTime = beginTime + timeout; + + if(asyncMode) + { + return -1; + } + + if(buffer == null) + { + return 0; + } + + int n = buffer.length / 62; + if(buffer.length % 62 != 0) + { + n++; + } + + byte[] tempBuffer = new byte[buffer.length + n * 2]; + + int readen = 0; + + do + { + int timeLeft = 0; + if(timeout > 0) + { + timeLeft = (int) (stopTime - System.currentTimeMillis()); + if (timeLeft <= 0) + { + break; + } + } + + int numberBytes = connection.bulkTransfer(inEndpoint, tempBuffer, tempBuffer.length, timeLeft); + + if(numberBytes > 2) // Data received + { + byte[] newBuffer = this.ftdiUtilities.adaptArray(tempBuffer); + System.arraycopy(newBuffer, 0, buffer, 0, buffer.length); + + int p = numberBytes / 64; + if(numberBytes % 64 != 0) + { + p++; + } + readen = numberBytes - p * 2; + } + }while(readen <= 0); + + return readen; + */ + return 0; + } + private static final byte[] skip = new byte[2]; /** diff --git a/usbserial/src/main/java/com/felhr/usbserial/UsbSerialDevice.java b/usbserial/src/main/java/com/felhr/usbserial/UsbSerialDevice.java index 7d9f008..20258f9 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/UsbSerialDevice.java +++ b/usbserial/src/main/java/com/felhr/usbserial/UsbSerialDevice.java @@ -5,6 +5,7 @@ import com.felhr.deviceids.CP210xIds; import com.felhr.deviceids.FTDISioIds; import com.felhr.deviceids.PL2303Ids; +import android.annotation.TargetApi; import android.hardware.usb.UsbConstants; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbDeviceConnection; @@ -216,6 +217,35 @@ public abstract class UsbSerialDevice implements UsbSerialInterface return connection.bulkTransfer(inEndpoint, buffer, buffer.length, timeout); } + @TargetApi(18) + @Override + public int syncWrite(byte[] buffer, int offset, int length, int timeout) { + if(!asyncMode) + { + if(buffer == null) + return 0; + + return connection.bulkTransfer(outEndpoint, buffer, offset, length, timeout); + }else + { + return -1; + } + } + + @TargetApi(18) + @Override + public int syncRead(byte[] buffer, int offset, int length, int timeout) { + if(asyncMode) + { + return -1; + } + + if (buffer == null) + return 0; + + return connection.bulkTransfer(inEndpoint, buffer, offset, length, timeout); + } + // Serial port configuration @Override public abstract void setBaudRate(int baudRate); diff --git a/usbserial/src/main/java/com/felhr/usbserial/UsbSerialInterface.java b/usbserial/src/main/java/com/felhr/usbserial/UsbSerialInterface.java index 952b184..ffcbb34 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/UsbSerialInterface.java +++ b/usbserial/src/main/java/com/felhr/usbserial/UsbSerialInterface.java @@ -38,6 +38,8 @@ public interface UsbSerialInterface boolean syncOpen(); int syncWrite(byte[] buffer, int timeout); int syncRead(byte[] buffer, int timeout); + int syncWrite(byte[] buffer, int offset, int length, int timeout); + int syncRead(byte[] buffer, int offset, int length, int timeout); void syncClose(); // Serial port configuration From 90396ab436ca99b912e41e20c74902b85447e826 Mon Sep 17 00:00:00 2001 From: Felipe Herranz Date: Sun, 7 Jul 2019 22:36:22 +0200 Subject: [PATCH 3/4] ftdi adapted for syncRead with offset method --- .../java/com/felhr/usbserial/FTDISerialDevice.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/usbserial/src/main/java/com/felhr/usbserial/FTDISerialDevice.java b/usbserial/src/main/java/com/felhr/usbserial/FTDISerialDevice.java index 1d5e565..9aa824b 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/FTDISerialDevice.java +++ b/usbserial/src/main/java/com/felhr/usbserial/FTDISerialDevice.java @@ -691,7 +691,7 @@ public class FTDISerialDevice extends UsbSerialDevice @Override public int syncRead(byte[] buffer, int offset, int length, int timeout) { - /* TODO + long beginTime = System.currentTimeMillis(); long stopTime = beginTime + timeout; @@ -705,13 +705,13 @@ public class FTDISerialDevice extends UsbSerialDevice return 0; } - int n = buffer.length / 62; - if(buffer.length % 62 != 0) + int n = length / 62; + if(length % 62 != 0) { n++; } - byte[] tempBuffer = new byte[buffer.length + n * 2]; + byte[] tempBuffer = new byte[length + n * 2]; int readen = 0; @@ -732,7 +732,7 @@ public class FTDISerialDevice extends UsbSerialDevice if(numberBytes > 2) // Data received { byte[] newBuffer = this.ftdiUtilities.adaptArray(tempBuffer); - System.arraycopy(newBuffer, 0, buffer, 0, buffer.length); + System.arraycopy(newBuffer, 0, buffer, offset, length); int p = numberBytes / 64; if(numberBytes % 64 != 0) @@ -744,8 +744,6 @@ public class FTDISerialDevice extends UsbSerialDevice }while(readen <= 0); return readen; - */ - return 0; } private static final byte[] skip = new byte[2]; From 538e2e04839d1c75c468e3455b61f15f6ff6e2aa Mon Sep 17 00:00:00 2001 From: Felipe Herranz Date: Sun, 7 Jul 2019 23:07:42 +0200 Subject: [PATCH 4/4] using syncWrite and syncRead new methods in Streams --- .../src/main/java/com/felhr/usbserial/SerialInputStream.java | 5 +---- .../main/java/com/felhr/usbserial/SerialOutputStream.java | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialInputStream.java b/usbserial/src/main/java/com/felhr/usbserial/SerialInputStream.java index c4fc4eb..458e28e 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialInputStream.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialInputStream.java @@ -73,10 +73,7 @@ public class SerialInputStream extends InputStream return read(b); } - byte[] slice = new byte[len]; - int ret = device.syncRead(slice, timeout); - System.arraycopy(slice, 0, b, off, ret); - return ret; + return device.syncRead(b, off, len, timeout); } @Override diff --git a/usbserial/src/main/java/com/felhr/usbserial/SerialOutputStream.java b/usbserial/src/main/java/com/felhr/usbserial/SerialOutputStream.java index 1fce8aa..b1da2fd 100644 --- a/usbserial/src/main/java/com/felhr/usbserial/SerialOutputStream.java +++ b/usbserial/src/main/java/com/felhr/usbserial/SerialOutputStream.java @@ -45,9 +45,7 @@ public class SerialOutputStream extends OutputStream return; } - byte[] slice = new byte[len]; - System.arraycopy(b, off, slice, 0, len); - device.syncWrite(slice, timeout); + device.syncWrite(b, off, len, timeout); } public void setTimeout(int timeout) {