diff --git a/usbSerialExamples/src/main/res/xml/device_filter.xml b/usbSerialExamples/src/main/res/xml/device_filter.xml
index fef6f00..e1b53da 100644
--- a/usbSerialExamples/src/main/res/xml/device_filter.xml
+++ b/usbSerialExamples/src/main/res/xml/device_filter.xml
@@ -5,6 +5,7 @@
+
diff --git a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java
index 5be6bf3..614978f 100644
--- a/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java
+++ b/usbSerialForAndroid/src/androidTest/java/com/hoho/android/usbserial/DeviceTest.java
@@ -25,6 +25,7 @@ import com.hoho.android.usbserial.driver.Cp21xxSerialDriver;
import com.hoho.android.usbserial.driver.FtdiSerialDriver;
import com.hoho.android.usbserial.driver.ProbeTable;
import com.hoho.android.usbserial.driver.ProlificSerialDriver;
+import com.hoho.android.usbserial.driver.UsbId;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
@@ -1284,6 +1285,7 @@ public class DeviceTest {
RTS -> CTS
DTR -> DTS/DSR
both -> CD
+ for onlyRtsCts devices these two lines are connected directly
*/
public void controlLines() throws Exception {
byte[] data;
@@ -1293,18 +1295,26 @@ public class DeviceTest {
// input lines are supported by all drivers except CDC
boolean inputLinesSupported = false;
boolean inputLinesConnected = false;
+ boolean onlyRtsCts = false;
if (usb.serialDriver instanceof FtdiSerialDriver) {
inputLinesSupported = true;
- inputLinesConnected = usb.serialDriver.getPorts().size() == 2; // I only have 74LS138 connected at FT2232
+ if(usb.serialDriver.getDevice().getProductId() == UsbId.FTDI_FT2232H)
+ inputLinesConnected = true; // I only have 74LS138 connected at FT2232, not at FT232
+ if(usb.serialDriver.getDevice().getProductId() == UsbId.FTDI_FT231X) {
+ inputLinesConnected = true;
+ onlyRtsCts = true; // I only test with FT230X that has only these 2 control lines. DTR is silently ignored
+ }
} else if (usb.serialDriver instanceof Cp21xxSerialDriver) {
inputLinesSupported = true;
- inputLinesConnected = usb.serialDriver.getPorts().size()==1; // I only have 74LS138 connected at CP2102
+ if(usb.serialDriver.getPorts().size() == 1)
+ inputLinesConnected = true; // I only have 74LS138 connected at CP2102, not at CP2105
} else if (usb.serialDriver instanceof ProlificSerialDriver) {
inputLinesSupported = true;
inputLinesConnected = true;
} else if (usb.serialDriver instanceof Ch34xSerialDriver) {
inputLinesSupported = true;
- inputLinesConnected = true;
+ if(usb.serialDriver.getDevice().getProductId() == UsbId.QINHENG_CH340)
+ inputLinesConnected = true; // I only have 74LS138 connected at CH230, not connected at CH341A
}
Boolean inputLineFalse = inputLinesSupported ? Boolean.FALSE : null;
Boolean inputLineTrue = inputLinesConnected ? Boolean.TRUE : inputLineFalse;
@@ -1337,7 +1347,7 @@ public class DeviceTest {
// control lines reset on initial open
data = "none".getBytes();
- assertEquals(inputLinesConnected
+ assertEquals(inputLinesConnected && !onlyRtsCts
? EnumSet.of(UsbSerialPort.ControlLine.RI)
: EnumSet.noneOf(UsbSerialPort.ControlLine.class),
usb.serialPort.getControlLines());
@@ -1346,7 +1356,7 @@ public class DeviceTest {
assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.FALSE));
assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse));
assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse));
- assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineTrue));
+ assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(onlyRtsCts ? Boolean.FALSE : inputLineTrue));
telnet.write(data);
if(usb.serialDriver instanceof CdcAcmSerialDriver)
// arduino: control line feedback as serial_state notification is not implemented.
@@ -1378,15 +1388,17 @@ public class DeviceTest {
data = "both".getBytes();
usb.serialPort.setDTR(true);
Thread.sleep(sleep);
- assertEquals(inputLinesConnected
- ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.CD)
- : EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR),
+ assertEquals(onlyRtsCts
+ ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.CTS)
+ : inputLinesConnected
+ ? EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.CD)
+ : EnumSet.of(UsbSerialPort.ControlLine.RTS, UsbSerialPort.ControlLine.DTR),
usb.serialPort.getControlLines());
assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.TRUE));
- assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse));
+ assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(onlyRtsCts ? Boolean.TRUE : inputLineFalse));
assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.TRUE));
assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse));
- assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineTrue));
+ assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(onlyRtsCts ? Boolean.FALSE : inputLineTrue));
assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse));
telnet.write(data);
assertThat(Arrays.toString(data), usb.read(4), equalTo(data));
@@ -1396,14 +1408,14 @@ public class DeviceTest {
data = "dtr ".getBytes();
usb.serialPort.setRTS(false);
Thread.sleep(sleep);
- assertEquals(inputLinesConnected
+ assertEquals(inputLinesConnected && !onlyRtsCts
? EnumSet.of(UsbSerialPort.ControlLine.DTR, UsbSerialPort.ControlLine.DSR)
: EnumSet.of(UsbSerialPort.ControlLine.DTR),
usb.serialPort.getControlLines());
assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.FALSE));
assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse));
assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.TRUE));
- assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineTrue));
+ assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(onlyRtsCts ? Boolean.FALSE : inputLineTrue));
assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse));
assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse));
telnet.write(data);
@@ -1414,18 +1426,20 @@ public class DeviceTest {
// control lines retained over close+open
boolean inputRetained = inputLinesConnected;
boolean outputRetained = true;
+ usb.serialPort.setRTS(true);
+ usb.serialPort.setDTR(false);
usb.close(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT));
usb.open(EnumSet.of(UsbWrapper.OpenCloseFlags.NO_CONTROL_LINE_INIT, UsbWrapper.OpenCloseFlags.NO_IOMANAGER_THREAD));
usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE);
EnumSet retainedControlLines = EnumSet.noneOf(UsbSerialPort.ControlLine.class);
- if(outputRetained) retainedControlLines.add(UsbSerialPort.ControlLine.DTR);
- if(inputRetained) retainedControlLines.add(UsbSerialPort.ControlLine.DSR);
+ if(outputRetained) retainedControlLines.add(UsbSerialPort.ControlLine.RTS);
+ if(inputRetained) retainedControlLines.add(UsbSerialPort.ControlLine.CTS);
assertEquals(retainedControlLines, usb.serialPort.getControlLines());
- assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(Boolean.FALSE));
- assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputLineFalse));
- assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(outputRetained));
- assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputRetained ? inputLineTrue : inputLineFalse));
+ assertThat(usb.getControlLine(usb.serialPort::getRTS), equalTo(outputRetained));
+ assertThat(usb.getControlLine(usb.serialPort::getCTS), equalTo(inputRetained ? inputLineTrue : inputLineFalse));
+ assertThat(usb.getControlLine(usb.serialPort::getDTR), equalTo(Boolean.FALSE));
+ assertThat(usb.getControlLine(usb.serialPort::getDSR), equalTo(inputLineFalse));
assertThat(usb.getControlLine(usb.serialPort::getCD), equalTo(inputLineFalse));
assertThat(usb.getControlLine(usb.serialPort::getRI), equalTo(inputLineFalse));
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 9c5c3f8..0578d0e 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
@@ -383,6 +383,7 @@ public class FtdiSerialDriver implements UsbSerialDriver {
UsbId.FTDI_FT232H,
UsbId.FTDI_FT2232H,
UsbId.FTDI_FT4232H,
+ UsbId.FTDI_FT231X, // same ID for FT230X, FT231X, FT234XD
});
return supportedDevices;
}
diff --git a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java
index 9e289d7..d066d11 100644
--- a/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java
+++ b/usbSerialForAndroid/src/main/java/com/hoho/android/usbserial/driver/UsbId.java
@@ -21,6 +21,7 @@ public final class UsbId {
public static final int FTDI_FT2232H = 0x6010;
public static final int FTDI_FT4232H = 0x6011;
public static final int FTDI_FT232H = 0x6014;
+ public static final int FTDI_FT231X = 0x6015; // same ID for FT230X, FT231X, FT234XD
public static final int VENDOR_ATMEL = 0x03EB;
public static final int ATMEL_LUFA_CDC_DEMO_APP = 0x2044;