make all SerialPort classes public

and test FtdiSerialPort methods
This commit is contained in:
kai-morich 2020-06-08 21:57:16 +02:00
parent 33149b66fd
commit 735fa3d70f
12 changed files with 101 additions and 44 deletions

1
.gitignore vendored
View File

@ -33,6 +33,7 @@ build/
# Gradle: # Gradle:
.idea/gradle.xml .idea/gradle.xml
.idea/libraries .idea/libraries
.idea/jarRepositories.xml
# Eclipse/Android/Misc # Eclipse/Android/Misc
.metadata/ .metadata/

View File

@ -6,7 +6,7 @@ buildscript {
google() google()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.6.2' classpath 'com.android.tools.build:gradle:4.0.0'
} }
} }

View File

@ -1,6 +1,6 @@
#Sat Feb 29 19:14:16 CET 2020 #Wed Jun 10 08:41:47 CEST 2020
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip

View File

@ -1,8 +1,8 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
compileSdkVersion 28 compileSdkVersion 29
buildToolsVersion '28.0.3' buildToolsVersion '29.0.3'
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8

View File

@ -1,8 +1,8 @@
apply plugin: 'com.android.library' apply plugin: 'com.android.library'
android { android {
compileSdkVersion 28 compileSdkVersion 29
buildToolsVersion '28.0.3' buildToolsVersion '29.0.3'
defaultConfig { defaultConfig {
minSdkVersion 17 minSdkVersion 17

View File

@ -65,6 +65,7 @@ import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
@ -1675,4 +1676,57 @@ public class DeviceTest implements SerialInputOutputManager.Listener {
} catch (IOException ignored) { } catch (IOException ignored) {
} }
} }
@Test
public void commonMethods() throws Exception {
String s;
assertNotNull(usbSerialPort.getDriver());
assertNotNull(usbSerialPort.getDevice());
assertEquals(test_device_port, usbSerialPort.getPortNumber());
s = usbSerialDriver.toString();
assertNotEquals(0, s.length());
assertFalse(usbSerialPort.isOpen());
usbOpen();
assertTrue(usbSerialPort.isOpen());
s = usbSerialPort.getSerial();
// with target sdk 29 can throw SecurityException before USB permission dialog is confirmed
// not all devices implement serial numbers. some observed values are:
// FT232 00000000, FTGH4NTX, ...
// FT2232 <null>
// CP2102 0001
// CP2105 0035E46E
// CH340 <null>
// PL2303 <null>
// CDC:Microbit 9900000037024e450034200b0000004a0000000097969901
// CDC:Digispark <null>
}
@Test
public void ftdiMethods() throws Exception {
if(!(usbSerialDriver instanceof FtdiSerialDriver))
return;
byte[] b;
usbOpen();
usbParameters(115200, 8, 1, UsbSerialPort.PARITY_NONE);
telnetParameters(115200, 8, 1, UsbSerialPort.PARITY_NONE);
FtdiSerialDriver.FtdiSerialPort ftdiSerialPort = (FtdiSerialDriver.FtdiSerialPort) usbSerialPort;
int lt = ftdiSerialPort.getLatencyTimer();
ftdiSerialPort.setLatencyTimer(1);
telnetWrite("x".getBytes());
b = usbRead(1);
long t1 = System.currentTimeMillis();
telnetWrite("x".getBytes());
b = usbRead(1);
ftdiSerialPort.setLatencyTimer(100);
long t2 = System.currentTimeMillis();
telnetWrite("x".getBytes());
b = usbRead(1);
long t3 = System.currentTimeMillis();
ftdiSerialPort.setLatencyTimer(lt);
assertEquals("latency 1", 99, Math.max(t2-t1, 99)); // looks strange, but shows actual value
assertEquals("latency 100", 99, Math.min(t3-t2, 99));
}
} }

View File

@ -79,7 +79,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
return mPorts; return mPorts;
} }
class CdcAcmSerialPort extends CommonUsbSerialPort { public class CdcAcmSerialPort extends CommonUsbSerialPort {
private UsbInterface mControlInterface; private UsbInterface mControlInterface;
private UsbInterface mDataInterface; private UsbInterface mDataInterface;
@ -109,7 +109,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
} }
@Override @Override
public void openInt(UsbDeviceConnection connection) throws IOException { protected void openInt(UsbDeviceConnection connection) throws IOException {
if (mPortNumber == -1) { if (mPortNumber == -1) {
Log.d(TAG,"device might be castrated ACM device, trying single interface logic"); Log.d(TAG,"device might be castrated ACM device, trying single interface logic");
openSingleInterface(); openSingleInterface();
@ -210,7 +210,7 @@ public class CdcAcmSerialDriver implements UsbSerialDriver {
} }
@Override @Override
public void closeInt() { protected void closeInt() {
try { try {
mConnection.releaseInterface(mControlInterface); mConnection.releaseInterface(mControlInterface);
mConnection.releaseInterface(mDataInterface); mConnection.releaseInterface(mDataInterface);

View File

@ -90,7 +90,7 @@ public class Ch34xSerialDriver implements UsbSerialDriver {
} }
@Override @Override
public void openInt(UsbDeviceConnection connection) throws IOException { protected void openInt(UsbDeviceConnection connection) throws IOException {
for (int i = 0; i < mDevice.getInterfaceCount(); i++) { for (int i = 0; i < mDevice.getInterfaceCount(); i++) {
UsbInterface usbIface = mDevice.getInterface(i); UsbInterface usbIface = mDevice.getInterface(i);
if (!mConnection.claimInterface(usbIface, true)) { if (!mConnection.claimInterface(usbIface, true)) {
@ -115,7 +115,7 @@ public class Ch34xSerialDriver implements UsbSerialDriver {
} }
@Override @Override
public void closeInt() { protected void closeInt() {
try { try {
for (int i = 0; i < mDevice.getInterfaceCount(); i++) for (int i = 0; i < mDevice.getInterfaceCount(); i++)
mConnection.releaseInterface(mDevice.getInterface(i)); mConnection.releaseInterface(mDevice.getInterface(i));

View File

@ -68,12 +68,8 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort {
mDevice.getDeviceId(), mPortNumber); mDevice.getDeviceId(), mPortNumber);
} }
/** @Override
* Returns the currently-bound USB device. public UsbDevice getDevice() {
*
* @return the device
*/
public final UsbDevice getDevice() {
return mDevice; return mDevice;
} }

View File

@ -137,7 +137,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver {
} }
@Override @Override
public void openInt(UsbDeviceConnection connection) throws IOException { protected void openInt(UsbDeviceConnection connection) throws IOException {
mIsRestrictedPort = mDevice.getInterfaceCount() == 2 && mPortNumber == 1; mIsRestrictedPort = mDevice.getInterfaceCount() == 2 && mPortNumber == 1;
if(mPortNumber >= mDevice.getInterfaceCount()) { if(mPortNumber >= mDevice.getInterfaceCount()) {
throw new IOException("Unknown port number"); throw new IOException("Unknown port number");
@ -164,7 +164,7 @@ public class Cp21xxSerialDriver implements UsbSerialDriver {
} }
@Override @Override
public void closeInt() { protected void closeInt() {
try { try {
setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_DISABLE); setConfigSingle(SILABSER_IFC_ENABLE_REQUEST_CODE, UART_DISABLE);
} catch (Exception ignored) {} } catch (Exception ignored) {}

View File

@ -117,23 +117,23 @@ public class FtdiSerialDriver implements UsbSerialDriver {
return mPorts; return mPorts;
} }
private class FtdiSerialPort extends CommonUsbSerialPort { public class FtdiSerialPort extends CommonUsbSerialPort {
public static final int USB_TYPE_STANDARD = 0x00 << 5; private static final int USB_TYPE_STANDARD = 0x00 << 5;
public static final int USB_TYPE_CLASS = 0x00 << 5; private static final int USB_TYPE_CLASS = 0x00 << 5;
public static final int USB_TYPE_VENDOR = 0x00 << 5; private static final int USB_TYPE_VENDOR = 0x00 << 5;
public static final int USB_TYPE_RESERVED = 0x00 << 5; private static final int USB_TYPE_RESERVED = 0x00 << 5;
public static final int USB_RECIP_DEVICE = 0x00; private static final int USB_RECIP_DEVICE = 0x00;
public static final int USB_RECIP_INTERFACE = 0x01; private static final int USB_RECIP_INTERFACE = 0x01;
public static final int USB_RECIP_ENDPOINT = 0x02; private static final int USB_RECIP_ENDPOINT = 0x02;
public static final int USB_RECIP_OTHER = 0x03; private static final int USB_RECIP_OTHER = 0x03;
public static final int USB_ENDPOINT_IN = 0x80; private static final int USB_ENDPOINT_IN = 0x80;
public static final int USB_ENDPOINT_OUT = 0x00; private static final int USB_ENDPOINT_OUT = 0x00;
public static final int USB_WRITE_TIMEOUT_MILLIS = 5000; private static final int USB_WRITE_TIMEOUT_MILLIS = 5000;
public static final int USB_READ_TIMEOUT_MILLIS = 5000; private static final int USB_READ_TIMEOUT_MILLIS = 5000;
// From ftdi.h // From ftdi.h
/** /**
@ -175,10 +175,10 @@ public class FtdiSerialDriver implements UsbSerialDriver {
*/ */
private static final int SIO_GET_MODEM_STATUS_REQUEST = 5; private static final int SIO_GET_MODEM_STATUS_REQUEST = 5;
public static final int SIO_MODEM_STATUS_CTS = 0x10; private static final int SIO_MODEM_STATUS_CTS = 0x10;
public static final int SIO_MODEM_STATUS_DSR = 0x20; private static final int SIO_MODEM_STATUS_DSR = 0x20;
public static final int SIO_MODEM_STATUS_RI = 0x40; private static final int SIO_MODEM_STATUS_RI = 0x40;
public static final int SIO_MODEM_STATUS_RLSD = 0x80; private static final int SIO_MODEM_STATUS_RLSD = 0x80;
/** /**
* Set the latency timer. * Set the latency timer.
@ -190,10 +190,10 @@ public class FtdiSerialDriver implements UsbSerialDriver {
*/ */
private static final int SIO_GET_LATENCY_TIMER_REQUEST = 10; private static final int SIO_GET_LATENCY_TIMER_REQUEST = 10;
public static final int FTDI_DEVICE_OUT_REQTYPE = private static final int FTDI_DEVICE_OUT_REQTYPE =
UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT; UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT;
public static final int FTDI_DEVICE_IN_REQTYPE = private static final int FTDI_DEVICE_IN_REQTYPE =
UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN; UsbConstants.USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN;
/** /**
@ -246,7 +246,7 @@ public class FtdiSerialDriver implements UsbSerialDriver {
return totalBytesRead - (packetsCount * 2); return totalBytesRead - (packetsCount * 2);
} }
void reset() throws IOException { private void reset() throws IOException {
// TODO(mikey): autodetect. // TODO(mikey): autodetect.
mType = DeviceType.TYPE_R; mType = DeviceType.TYPE_R;
if(mDevice.getInterfaceCount() > 1) { if(mDevice.getInterfaceCount() > 1) {
@ -284,7 +284,7 @@ public class FtdiSerialDriver implements UsbSerialDriver {
return data[0]; return data[0];
} }
public int getModemStatus() throws IOException { private int getModemStatus() throws IOException {
byte[] data = new byte[2]; byte[] data = new byte[2];
int result = mConnection.controlTransfer(FTDI_DEVICE_IN_REQTYPE, SIO_GET_MODEM_STATUS_REQUEST, int result = mConnection.controlTransfer(FTDI_DEVICE_IN_REQTYPE, SIO_GET_MODEM_STATUS_REQUEST,
0, mIndex, data, data.length, USB_WRITE_TIMEOUT_MILLIS); 0, mIndex, data, data.length, USB_WRITE_TIMEOUT_MILLIS);
@ -295,7 +295,7 @@ public class FtdiSerialDriver implements UsbSerialDriver {
} }
@Override @Override
public void openInt(UsbDeviceConnection connection) throws IOException { protected void openInt(UsbDeviceConnection connection) throws IOException {
if (connection.claimInterface(mDevice.getInterface(mPortNumber), true)) { if (connection.claimInterface(mDevice.getInterface(mPortNumber), true)) {
Log.d(TAG, "claimInterface " + mPortNumber + " SUCCESS"); Log.d(TAG, "claimInterface " + mPortNumber + " SUCCESS");
} else { } else {
@ -311,7 +311,7 @@ public class FtdiSerialDriver implements UsbSerialDriver {
} }
@Override @Override
public void closeInt() { protected void closeInt() {
try { try {
mConnection.releaseInterface(mDevice.getInterface(mPortNumber)); mConnection.releaseInterface(mDevice.getInterface(mPortNumber));
} catch(Exception ignored) {} } catch(Exception ignored) {}

View File

@ -21,6 +21,7 @@
package com.hoho.android.usbserial.driver; package com.hoho.android.usbserial.driver;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection; import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbManager; import android.hardware.usb.UsbManager;
@ -86,7 +87,12 @@ public interface UsbSerialPort extends Closeable {
public static final int STOPBITS_2 = 2; public static final int STOPBITS_2 = 2;
public UsbSerialDriver getDriver(); public UsbSerialDriver getDriver();
/**
* Returns the currently-bound USB device.
*/
public UsbDevice getDevice();
/** /**
* Port number within driver. * Port number within driver.
*/ */