more coverage tests

purgeHwBuffers: adjust parameter names to match read/write methods and actual behavior
This commit is contained in:
Kai Morich 2019-10-24 22:25:36 +02:00
parent 37059b1a27
commit f7399c2aad
8 changed files with 215 additions and 90 deletions

View File

@ -73,8 +73,9 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
private static int test_device_port;
private final static int TELNET_READ_WAIT = 500;
private final static int USB_READ_WAIT = 500;
private final static int USB_WRITE_WAIT = 500;
private final static int TELNET_COMMAND_WAIT = 2000;
private final static int USB_READ_WAIT = 500;
private final static int USB_WRITE_WAIT = 500;
private final static Integer SERIAL_INPUT_OUTPUT_MANAGER_THREAD_PRIORITY = Process.THREAD_PRIORITY_URGENT_AUDIO;
private final static String TAG = "DeviceTest";
@ -83,13 +84,16 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
private final static byte RFC2217_SET_DATASIZE = 2;
private final static byte RFC2217_SET_PARITY = 3;
private final static byte RFC2217_SET_STOPSIZE = 4;
private final static byte RFC2217_PURGE_DATA = 12;
private Context context;
private UsbManager usbManager;
private UsbSerialDriver usbSerialDriver;
private UsbDeviceConnection usbDeviceConnection;
private UsbSerialPort usbSerialPort;
private SerialInputOutputManager usbIoManager;
private final Deque<byte[]> usbReadBuffer = new LinkedList<>();
private Exception usbReadError;
private boolean usbReadBlock = false;
private long usbReadTime = 0;
@ -137,10 +141,18 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
setUpFixtureInt();
telnetClient.sendAYT(1000); // not correctly handled by rfc2217_server.py, but WARNING output "ignoring Telnet command: '\xf6'" is a nice separator between tests
telnetComPortOptionCounter[0] = 0;
telnetClient.sendCommand((byte)TelnetCommand.SB);
telnetWriteStream.write(new byte[] {RFC2217_COM_PORT_OPTION, RFC2217_PURGE_DATA, 3});
telnetClient.sendCommand((byte)TelnetCommand.SE);
for(int i=0; i<TELNET_COMMAND_WAIT; i++) {
if(telnetComPortOptionCounter[0] == 1) break;
Thread.sleep(1);
}
assertEquals("telnet connection lost", 1, telnetComPortOptionCounter[0].intValue());
telnetWriteDelay = 0;
context = InstrumentationRegistry.getContext();
final UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
List<UsbSerialDriver> availableDrivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager);
assertEquals("no USB device found", 1, availableDrivers.size());
usbSerialDriver = availableDrivers.get(0);
@ -173,24 +185,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
}
assertTrue("USB permission dialog not confirmed", granted[0]);
}
usbDeviceConnection = usbManager.openDevice(usbSerialDriver.getDevice());
usbSerialPort.open(usbDeviceConnection);
usbSerialPort.setDTR(true);
usbSerialPort.setRTS(true);
usbIoManager = new SerialInputOutputManager(usbSerialPort, this) {
@Override
public void run() {
if(SERIAL_INPUT_OUTPUT_MANAGER_THREAD_PRIORITY != null)
Process.setThreadPriority(SERIAL_INPUT_OUTPUT_MANAGER_THREAD_PRIORITY);
super.run();
}
};
Executors.newSingleThreadExecutor().submit(usbIoManager);
synchronized (usbReadBuffer) {
usbReadBuffer.clear();
}
usbOpen(true);
}
@After
@ -266,6 +261,46 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
}
}
private void usbClose() {
if (usbIoManager != null) {
usbIoManager.stop();
usbIoManager = null;
}
if (usbSerialPort != null) {
try {
usbSerialPort.close();
} catch (IOException ignored) {
}
usbSerialPort = null;
}
if(usbDeviceConnection != null)
usbDeviceConnection.close();
usbDeviceConnection = null;
}
private void usbOpen(boolean withIoManager) throws Exception {
usbDeviceConnection = usbManager.openDevice(usbSerialDriver.getDevice());
usbSerialPort = usbSerialDriver.getPorts().get(test_device_port);
usbSerialPort.open(usbDeviceConnection);
usbSerialPort.setDTR(true);
usbSerialPort.setRTS(true);
if(withIoManager) {
usbIoManager = new SerialInputOutputManager(usbSerialPort, this) {
@Override
public void run() {
if (SERIAL_INPUT_OUTPUT_MANAGER_THREAD_PRIORITY != null)
Process.setThreadPriority(SERIAL_INPUT_OUTPUT_MANAGER_THREAD_PRIORITY);
super.run();
}
};
Executors.newSingleThreadExecutor().submit(usbIoManager);
}
synchronized (usbReadBuffer) {
usbReadBuffer.clear();
}
usbReadError = null;
}
// wait full time
private byte[] usbRead() throws Exception {
return usbRead(-1);
@ -276,6 +311,8 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
ByteBuffer buf = ByteBuffer.allocate(8192);
if(usbIoManager != null) {
while (System.currentTimeMillis() < end) {
if(usbReadError != null)
throw usbReadError;
synchronized (usbReadBuffer) {
while(usbReadBuffer.peek() != null)
buf.put(usbReadBuffer.remove());
@ -336,7 +373,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
telnetClient.sendCommand((byte)TelnetCommand.SE);
// windows does not like nonstandard baudrates. rfc2217_server.py terminates w/o response
for(int i=0; i<2000; i++) {
for(int i=0; i<TELNET_COMMAND_WAIT; i++) {
if(telnetComPortOptionCounter[0] == 4) break;
Thread.sleep(1);
}
@ -368,7 +405,8 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
@Override
public void onRunError(Exception e) {
fail("usb connection lost");
usbReadError = e;
//fail("usb connection lost");
}
// clone of org.apache.commons.lang3.StringUtils.indexOfDifference + optional startpos
@ -419,6 +457,79 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
}
}
private void doReadWrite(String reason) throws Exception {
byte[] buf1 = new byte[]{ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16};
byte[] buf2 = new byte[]{ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26};
byte[] data;
telnetWrite(buf1);
data = usbRead(buf1.length);
assertThat(reason, data, equalTo(buf1)); // includes array content in output
//assertArrayEquals("net2usb".getBytes(), data); // only includes array length in output
usbWrite(buf2);
data = telnetRead(buf2.length);
assertThat(reason, data, equalTo(buf2));
}
@Test
public void openClose() throws Exception {
byte[] data;
telnetParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE);
usbParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE);
doReadWrite("");
try {
usbSerialPort.open(usbDeviceConnection);
fail("already open expected");
} catch (IOException ignored) {
}
doReadWrite("");
usbSerialPort.close();
try {
usbSerialPort.close();
fail("already closed expected");
} catch (IOException ignored) {
}
try {
usbWrite(new byte[]{0x00});
fail("write error expected");
} catch (IOException ignored) {
} catch (NullPointerException ignored) {
}
try {
usbRead(1);
//fail("read error expected");
} catch (IOException ignored) {
} catch (NullPointerException ignored) {
}
try {
usbParameters(9600, 8, 1, UsbSerialPort.PARITY_NONE);
fail("error expected");
} catch (IOException ignored) {
} catch (NullPointerException ignored) {
}
// partial re-open not supported
try {
usbSerialPort.open(usbDeviceConnection);
//usbParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE);
doReadWrite("");
fail("re-open not supported");
} catch (IOException ignored) {
}
try {
usbSerialPort.close();
} catch (IOException ignored) {
}
// full re-open supported
usbClose();
usbOpen(true);
telnetParameters(9600, 8, 1, UsbSerialPort.PARITY_NONE);
usbParameters(9600, 8, 1, UsbSerialPort.PARITY_NONE);
doReadWrite("");
}
@Test
public void baudRate() throws Exception {
byte[] data;
@ -428,13 +539,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
// PL2303, FTDI: it's not 9600
telnetParameters(9600, 8, 1, UsbSerialPort.PARITY_NONE);
telnetWrite("net2usb".getBytes());
data = usbRead(7);
assertThat(data, equalTo("net2usb".getBytes())); // includes array content in output
//assertArrayEquals("net2usb".getBytes(), data); // only includes array length in output
usbWrite("usb2net".getBytes());
data = telnetRead(7);
assertThat(data, equalTo("usb2net".getBytes()));
doReadWrite("");
}
// invalid values
@ -452,8 +557,8 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
; // todo: add range check in driver
else
fail("invalid baudrate 0");
} catch (java.io.IOException ignored) { // cp2105 second port
} catch (java.lang.IllegalArgumentException ignored) {
} catch (IOException ignored) { // cp2105 second port
} catch (IllegalArgumentException ignored) {
}
try {
usbParameters(0, 8, 1, UsbSerialPort.PARITY_NONE);
@ -465,9 +570,9 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
; // todo: add range check in driver
else
fail("invalid baudrate 0");
} catch (java.lang.ArithmeticException ignored) { // ch340
} catch (java.io.IOException ignored) { // cp2105 second port
} catch (java.lang.IllegalArgumentException ignored) {
} catch (ArithmeticException ignored) { // ch340
} catch (IOException ignored) { // cp2105 second port
} catch (IllegalArgumentException ignored) {
}
try {
usbParameters(1, 8, 1, UsbSerialPort.PARITY_NONE);
@ -481,8 +586,8 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
;
else
fail("invalid baudrate 0");
} catch (java.io.IOException ignored) { // ch340
} catch (java.lang.IllegalArgumentException ignored) {
} catch (IOException ignored) { // ch340
} catch (IllegalArgumentException ignored) {
}
try {
usbParameters(2<<31, 8, 1, UsbSerialPort.PARITY_NONE);
@ -494,9 +599,9 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
;
else
fail("invalid baudrate 2^31");
} catch (java.lang.ArithmeticException ignored) { // ch340
} catch (java.io.IOException ignored) { // cp2105 second port
} catch (java.lang.IllegalArgumentException ignored) {
} catch (ArithmeticException ignored) { // ch340
} catch (IOException ignored) { // cp2105 second port
} catch (IllegalArgumentException ignored) {
}
for(int baudRate : new int[] {300, 2400, 19200, 42000, 115200} ) {
@ -506,19 +611,14 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
try {
usbParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE);
fail("baudrate 300 on cp21xx restricted port");
} catch (java.io.IOException ignored) {
} catch (IOException ignored) {
}
continue;
}
telnetParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE);
usbParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE);
telnetWrite("net2usb".getBytes());
data = usbRead(7);
assertThat(baudRate+"/8N1", data, equalTo("net2usb".getBytes()));
usbWrite("usb2net".getBytes());
data = telnetRead(7);
assertThat(baudRate+"/8N1", data, equalTo("usb2net".getBytes()));
doReadWrite(baudRate+"/8N1");
}
{ // non matching baud rate
telnetParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE);
@ -546,7 +646,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
; // todo: add range check in driver
else
fail("invalid databits "+i);
} catch (java.lang.IllegalArgumentException ignored) {
} catch (IllegalArgumentException ignored) {
}
}
@ -582,7 +682,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
usbWrite(new byte[]{(byte) 0xff});
data = telnetRead(2);
assertThat("19000/7N1", data, equalTo(new byte[]{(byte) 0x80, (byte) 0xff}));
} catch (java.lang.IllegalArgumentException e) {
} catch (IllegalArgumentException e) {
if(!isCp21xxRestrictedPort)
throw e;
}
@ -593,7 +693,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
usbWrite(new byte[]{(byte) 0xff});
data = telnetRead(2);
assertThat("19000/6N1", data, equalTo(new byte[]{(byte) 0xc0, (byte) 0xff}));
} catch (java.lang.IllegalArgumentException e) {
} catch (IllegalArgumentException e) {
if (!(isCp21xxRestrictedPort || usbSerialDriver instanceof FtdiSerialDriver))
throw e;
}
@ -604,7 +704,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
usbWrite(new byte[] {(byte)0xff});
data = telnetRead(2);
assertThat("19000/5N1", data, equalTo(new byte[] {(byte)0xe0, (byte)0xff}));
} catch (java.lang.IllegalArgumentException e) {
} catch (IllegalArgumentException e) {
if (!(isCp21xxRestrictedPort || usbSerialDriver instanceof FtdiSerialDriver))
throw e;
}
@ -624,7 +724,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
try {
usbParameters(19200, 8, 1, i);
fail("invalid parity "+i);
} catch (java.lang.IllegalArgumentException ignored) {
} catch (IllegalArgumentException ignored) {
}
}
if(isCp21xxRestrictedPort) {
@ -634,11 +734,11 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
try {
usbParameters(19200, 8, 1, UsbSerialPort.PARITY_MARK);
fail("parity mark");
} catch (java.lang.IllegalArgumentException ignored) {}
} catch (IllegalArgumentException ignored) {}
try {
usbParameters(19200, 8, 1, UsbSerialPort.PARITY_SPACE);
fail("parity space");
} catch (java.lang.IllegalArgumentException ignored) {}
} catch (IllegalArgumentException ignored) {}
return;
// test below not possible as it requires unsupported 7 dataBits
}
@ -721,7 +821,7 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
try {
usbParameters(19200, 8, i, UsbSerialPort.PARITY_NONE);
fail("invalid stopbits " + i);
} catch (java.lang.IllegalArgumentException ignored) {
} catch (IllegalArgumentException ignored) {
}
}
@ -754,12 +854,16 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
usbWrite(new byte[]{(byte) 0x41, (byte) 0xf9});
data = telnetRead(2);
assertThat("19200/8N1", data, equalTo(new byte[]{1, 11}));
} catch(java.lang.IllegalArgumentException e) {
} catch(IllegalArgumentException e) {
if(!isCp21xxRestrictedPort)
throw e;
}
// todo: could create similar test for 1.5 stopbits, by reading at double speed
// but only some devices support 1.5 stopbits and it is basically not used any more
try {
usbParameters(19200, 8, UsbSerialPort.STOPBITS_1_5, UsbSerialPort.PARITY_NONE);
// todo: could create similar test for 1.5 stopbits, by reading at double speed
// but only some devices support 1.5 stopbits and it is basically not used any more
} catch(IllegalArgumentException ignored) {
}
}
}
@ -953,4 +1057,31 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
}
}
@Test
public void purgeHwBuffers() throws Exception {
// 2400 is slowest baud rate for isCp21xxRestrictedPort
usbParameters(2400, 8, 1, UsbSerialPort.PARITY_NONE);
telnetParameters(2400, 8, 1, UsbSerialPort.PARITY_NONE);
byte[] buf = new byte[64];
for(int i=0; i<buf.length; i++) buf[i]='a';
StringBuilder data = new StringBuilder();
// purge send buffer
usbWrite(buf);
Thread.sleep(50); // ~ 12 characters
boolean purged = usbSerialPort.purgeHwBuffers(true, false);
usbWrite("bcd".getBytes());
Thread.sleep(50);
while(data.length()==0 || data.charAt(data.length()-1)!='d')
data.append(new String(telnetRead()));
Log.i(TAG, "purgeHwBuffers " + purged + ": " + buf.length+1 + " -> " + data.length());
assertTrue(data.length() > 5);
if(purged)
assertTrue(data.length() < buf.length+1);
else
assertEquals(data.length(), buf.length + 3);
// todo: purge receive buffer
}
}

View File

@ -401,7 +401,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
public static Map<Integer, int[]> getSupportedDevices() {
final Map<Integer, int[]> supportedDevices = new LinkedHashMap<Integer, int[]>();
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_ARDUINO),
supportedDevices.put(UsbId.VENDOR_ARDUINO,
new int[] {
UsbId.ARDUINO_UNO,
UsbId.ARDUINO_UNO_R3,
@ -414,19 +414,19 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
UsbId.ARDUINO_LEONARDO,
UsbId.ARDUINO_MICRO,
});
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_VAN_OOIJEN_TECH),
supportedDevices.put(UsbId.VENDOR_VAN_OOIJEN_TECH,
new int[] {
UsbId.VAN_OOIJEN_TECH_TEENSYDUINO_SERIAL,
});
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_ATMEL),
supportedDevices.put(UsbId.VENDOR_ATMEL,
new int[] {
UsbId.ATMEL_LUFA_CDC_DEMO_APP,
});
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_LEAFLABS),
supportedDevices.put(UsbId.VENDOR_LEAFLABS,
new int[] {
UsbId.LEAFLABS_MAPLE,
});
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_ARM),
supportedDevices.put(UsbId.VENDOR_ARM,
new int[] {
UsbId.ARM_MBED,
});

View File

@ -426,11 +426,6 @@ public class Ch34xSerialDriver implements UsbSerialDriver {
writeHandshakeByte();
}
@Override
public boolean purgeHwBuffers(boolean purgeReadBuffers, boolean purgeWriteBuffers) throws IOException {
return true;
}
}
public static Map<Integer, int[]> getSupportedDevices() {

View File

@ -160,8 +160,8 @@ abstract class CommonUsbSerialPort implements UsbSerialPort {
public abstract void setRTS(boolean value) throws IOException;
@Override
public boolean purgeHwBuffers(boolean flushReadBuffers, boolean flushWriteBuffers) throws IOException {
return !flushReadBuffers && !flushWriteBuffers;
public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException {
return false;
}
}

View File

@ -379,8 +379,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver {
}
@Override
public boolean purgeHwBuffers(boolean purgeReadBuffers,
boolean purgeWriteBuffers) throws IOException {
public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException {
int value = (purgeReadBuffers ? FLUSH_READ_CODE : 0)
| (purgeWriteBuffers ? FLUSH_WRITE_CODE : 0);
@ -395,7 +394,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver {
public static Map<Integer, int[]> getSupportedDevices() {
final Map<Integer, int[]> supportedDevices = new LinkedHashMap<Integer, int[]>();
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_SILABS),
supportedDevices.put(UsbId.VENDOR_SILABS,
new int[] {
UsbId.SILABS_CP2102,
UsbId.SILABS_CP2105,

View File

@ -165,7 +165,7 @@ public class FtdiSerialDriver implements UsbSerialDriver {
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_RX = 1; // RX @ FTDI device = write @ usb-serial-for-android library
private static final int SIO_RESET_PURGE_TX = 2;
public static final int FTDI_DEVICE_OUT_REQTYPE =
@ -534,20 +534,20 @@ public class FtdiSerialDriver implements UsbSerialDriver {
}
@Override
public boolean purgeHwBuffers(boolean purgeReadBuffers, boolean purgeWriteBuffers) throws IOException {
if (purgeReadBuffers) {
public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException {
if (purgeWriteBuffers) {
int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST,
SIO_RESET_PURGE_RX, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS);
if (result != 0) {
throw new IOException("Flushing RX failed: result=" + result);
throw new IOException("purge write buffer failed: result=" + result);
}
}
if (purgeWriteBuffers) {
if (purgeReadBuffers) {
int result = mConnection.controlTransfer(FTDI_DEVICE_OUT_REQTYPE, SIO_RESET_REQUEST,
SIO_RESET_PURGE_TX, mIndex, null, 0, USB_WRITE_TIMEOUT_MILLIS);
if (result != 0) {
throw new IOException("Flushing RX failed: result=" + result);
throw new IOException("purge read buffer failed: result=" + result);
}
}
return true;
@ -556,7 +556,7 @@ public class FtdiSerialDriver implements UsbSerialDriver {
public static Map<Integer, int[]> getSupportedDevices() {
final Map<Integer, int[]> supportedDevices = new LinkedHashMap<Integer, int[]>();
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_FTDI),
supportedDevices.put(UsbId.VENDOR_FTDI,
new int[] {
UsbId.FTDI_FT232R,
UsbId.FTDI_FT232H,

View File

@ -88,7 +88,7 @@ public class ProlificSerialDriver implements UsbSerialDriver {
private static final int READ_ENDPOINT = 0x83;
private static final int INTERRUPT_ENDPOINT = 0x81;
private static final int FLUSH_RX_REQUEST = 0x08;
private static final int FLUSH_RX_REQUEST = 0x08; // RX @ Prolific device = write @ usb-serial-for-android library
private static final int FLUSH_TX_REQUEST = 0x09;
private static final int SET_LINE_REQUEST = 0x20;
@ -553,22 +553,22 @@ public class ProlificSerialDriver implements UsbSerialDriver {
}
@Override
public boolean purgeHwBuffers(boolean purgeReadBuffers, boolean purgeWriteBuffers) throws IOException {
if (purgeReadBuffers) {
public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException {
if (purgeWriteBuffers) {
vendorOut(FLUSH_RX_REQUEST, 0, null);
}
if (purgeWriteBuffers) {
if (purgeReadBuffers) {
vendorOut(FLUSH_TX_REQUEST, 0, null);
}
return purgeReadBuffers || purgeWriteBuffers;
return true;
}
}
public static Map<Integer, int[]> getSupportedDevices() {
final Map<Integer, int[]> supportedDevices = new LinkedHashMap<Integer, int[]>();
supportedDevices.put(Integer.valueOf(UsbId.VENDOR_PROLIFIC),
supportedDevices.put(UsbId.VENDOR_PROLIFIC,
new int[] { UsbId.PROLIFIC_PL2303, });
return supportedDevices;
}

View File

@ -216,13 +216,13 @@ public interface UsbSerialPort {
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
* purge non-transmitted output data and / or non-read input data
* @param purgeWriteBuffers {@code true} to discard non-transmitted output data
* @param purgeReadBuffers {@code true} to discard 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 purgeHwBuffers(boolean flushRX, boolean flushTX) throws IOException;
public boolean purgeHwBuffers(boolean purgeWriteBuffers, boolean purgeReadBuffers) throws IOException;
}