diff --git a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/CommonUsbSerialDriver.java b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/CommonUsbSerialDriver.java index 9aff588..7c61704 100644 --- a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/CommonUsbSerialDriver.java +++ b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/CommonUsbSerialDriver.java @@ -134,4 +134,9 @@ abstract class CommonUsbSerialDriver implements UsbSerialDriver { @Override public abstract void setRTS(boolean value) throws IOException; + @Override + public boolean purgeHwBuffers(boolean flushReadBuffers, boolean flushWriteBuffers) throws IOException { + return !flushReadBuffers && !flushWriteBuffers; + } + } diff --git a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/Cp2102SerialDriver.java b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/Cp2102SerialDriver.java index fcf8cfc..7e9118b 100644 --- a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/Cp2102SerialDriver.java +++ b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/Cp2102SerialDriver.java @@ -12,7 +12,6 @@ import android.hardware.usb.UsbInterface; import android.util.Log; public class Cp2102SerialDriver extends CommonUsbSerialDriver { - private static final String TAG = Cp2102SerialDriver.class.getSimpleName(); private static final int DEFAULT_BAUD_RATE = 9600; @@ -32,6 +31,10 @@ public class Cp2102SerialDriver extends CommonUsbSerialDriver { private static final int SILABSER_SET_LINE_CTL_REQUEST_CODE = 0x03; private static final int SILABSER_SET_MHS_REQUEST_CODE = 0x07; private static final int SILABSER_SET_BAUDRATE = 0x1E; + private static final int SILABSER_FLUSH_REQUEST_CODE = 0x12; + + private static final int FLUSH_READ_CODE = 0x0a; + private static final int FLUSH_WRITE_CODE = 0x05; /* * SILABSER_IFC_ENABLE_REQUEST_CODE @@ -258,6 +261,19 @@ public class Cp2102SerialDriver extends CommonUsbSerialDriver { return true; } + @Override + public boolean purgeHwBuffers(boolean purgeReadBuffers, + boolean purgeWriteBuffers) throws IOException { + int value = (purgeReadBuffers ? FLUSH_READ_CODE : 0) + | (purgeWriteBuffers ? FLUSH_WRITE_CODE : 0); + + if (value != 0) { + setConfigSingle(SILABSER_FLUSH_REQUEST_CODE, value); + } + + return true; + } + @Override public void setRTS(boolean value) throws IOException { } diff --git a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/FtdiSerialDriver.java b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/FtdiSerialDriver.java index 71e0956..3bc3cc5 100644 --- a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/FtdiSerialDriver.java +++ b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/FtdiSerialDriver.java @@ -132,6 +132,8 @@ public class FtdiSerialDriver extends CommonUsbSerialDriver { private static final int SIO_SET_DATA_REQUEST = 4; private static final int SIO_RESET_SIO = 0; + private static final int SIO_RESET_PURGE_RX = 1; + private static final int SIO_RESET_PURGE_TX = 2; public static final int FTDI_DEVICE_OUT_REQTYPE = UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT; @@ -512,6 +514,27 @@ public class FtdiSerialDriver extends CommonUsbSerialDriver { public void setRTS(boolean value) throws IOException { } + @Override + public boolean purgeHwBuffers(boolean purgeReadBuffers, boolean purgeWriteBuffers) throws IOException { + if (purgeReadBuffers) { + int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST, + SIO_RESET_PURGE_RX, 0 /* index */, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Flushing RX failed: result=" + result); + } + } + + if (purgeWriteBuffers) { + int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST, + SIO_RESET_PURGE_TX, 0 /* index */, null, 0, USB_WRITE_TIMEOUT_MILLIS); + if (result != 0) { + throw new IOException("Flushing RX failed: result=" + result); + } + } + + return true; + } + public static Map getSupportedDevices() { final Map supportedDevices = new LinkedHashMap(); supportedDevices.put(Integer.valueOf(UsbId.VENDOR_FTDI), diff --git a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/ProlificSerialDriver.java b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/ProlificSerialDriver.java index 7846931..3347e53 100644 --- a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/ProlificSerialDriver.java +++ b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/ProlificSerialDriver.java @@ -158,7 +158,7 @@ public class ProlificSerialDriver extends CommonUsbSerialDriver { } private void resetDevice() throws IOException { - flush(true, true); + purgeHwBuffers(true, true); } private void setControlLines(int newControlLinesValue) throws IOException { @@ -494,14 +494,17 @@ public class ProlificSerialDriver extends CommonUsbSerialDriver { setControlLines(newControlLinesValue); } - public void flush(boolean flushRX, boolean flushTX) throws IOException { - if (flushRX) { + @Override + public boolean purgeHwBuffers(boolean purgeReadBuffers, boolean purgeWriteBuffers) throws IOException { + if (purgeReadBuffers) { vendorOut(FLUSH_RX_REQUEST, 0, null); } - if (flushTX) { + if (purgeWriteBuffers) { vendorOut(FLUSH_TX_REQUEST, 0, null); } + + return true; } public static Map getSupportedDevices() { diff --git a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/UsbSerialDriver.java b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/UsbSerialDriver.java index e0e13c0..79a5edc 100644 --- a/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/UsbSerialDriver.java +++ b/UsbSerialLibrary/src/com/hoho/android/usbserial/driver/UsbSerialDriver.java @@ -196,5 +196,15 @@ public interface UsbSerialDriver { * @throws IOException if an error occurred during writing */ public void setRTS(boolean value) throws IOException; + + /** + * Flush non-transmitted output data and / or non-read input data + * @param flushRX {@code true} to flush non-transmitted output data + * @param flushTX {@code true} to flush non-read input data + * @return {@code true} if the operation was successful, or + * {@code false} if the operation is not supported by the driver or device + * @throws IOException if an error occurred during flush + */ + public boolean flush(boolean flushRX, boolean flushTX) throws IOException; }