mirror of
				https://github.com/mik3y/usb-serial-for-android
				synced 2025-10-31 02:17:23 +00:00 
			
		
		
		
	FTDI read() now waits until timeout
previously returned after periodic FTDI status response (default 16 msec)
This commit is contained in:
		
							parent
							
								
									80e8eb8a60
								
							
						
					
					
						commit
						6f4cd0313c
					
				| @ -1101,9 +1101,6 @@ public class DeviceTest { | |||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     public void writeAsync() throws Exception { |     public void writeAsync() throws Exception { | ||||||
|         if (usb.serialDriver instanceof FtdiSerialDriver) |  | ||||||
|             return; // periodically sends status messages, so does not block here |  | ||||||
| 
 |  | ||||||
|         byte[] data, buf = new byte[]{1}; |         byte[] data, buf = new byte[]{1}; | ||||||
| 
 | 
 | ||||||
|         // w/o timeout: write delayed until something is read |         // w/o timeout: write delayed until something is read | ||||||
| @ -1134,8 +1131,6 @@ public class DeviceTest { | |||||||
| 
 | 
 | ||||||
|     @Test |     @Test | ||||||
|     public void readTimeout() throws Exception { |     public void readTimeout() throws Exception { | ||||||
|         if (usb.serialDriver instanceof FtdiSerialDriver) |  | ||||||
|             return; // periodically sends status messages, so does not block here |  | ||||||
|         final Boolean[] closed = {Boolean.FALSE}; |         final Boolean[] closed = {Boolean.FALSE}; | ||||||
| 
 | 
 | ||||||
|         Runnable closeThread = new Runnable() { |         Runnable closeThread = new Runnable() { | ||||||
| @ -1155,19 +1150,22 @@ public class DeviceTest { | |||||||
|         usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); |         usb.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
|         telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); |         telnet.setParameters(19200, 8, 1, UsbSerialPort.PARITY_NONE); | ||||||
| 
 | 
 | ||||||
|         byte[] buf = new byte[]{1}; |         byte[] writeBuf = new byte[]{1}; | ||||||
|  |         byte[] readBuf = new byte[1]; | ||||||
|  |         if (usb.serialDriver instanceof FtdiSerialDriver) | ||||||
|  |             readBuf = new byte[3]; // include space for 2 header bytes | ||||||
|         int len,i,j; |         int len,i,j; | ||||||
|         long time; |         long time; | ||||||
| 
 | 
 | ||||||
|         // w/o timeout |         // w/o timeout | ||||||
|         telnet.write(buf); |         telnet.write(writeBuf); | ||||||
|         len = usb.serialPort.read(buf, 0); // not blocking because data is available |         len = usb.serialPort.read(readBuf, 0); // not blocking because data is available | ||||||
|         assertEquals(1, len); |         assertEquals(1, len); | ||||||
| 
 | 
 | ||||||
|         time = System.currentTimeMillis(); |         time = System.currentTimeMillis(); | ||||||
|         closed[0] = false; |         closed[0] = false; | ||||||
|         Executors.newSingleThreadExecutor().submit(closeThread); |         Executors.newSingleThreadExecutor().submit(closeThread); | ||||||
|         len = usb.serialPort.read(buf, 0); // blocking until close() |         len = usb.serialPort.read(readBuf, 0); // blocking until close() | ||||||
|         assertEquals(0, len); |         assertEquals(0, len); | ||||||
|         assertTrue(System.currentTimeMillis()-time >= 100); |         assertTrue(System.currentTimeMillis()-time >= 100); | ||||||
|         // wait for usbClose |         // wait for usbClose | ||||||
| @ -1185,7 +1183,7 @@ public class DeviceTest { | |||||||
|         int longTimeout = 1000; |         int longTimeout = 1000; | ||||||
|         int shortTimeout = 10; |         int shortTimeout = 10; | ||||||
|         time = System.currentTimeMillis(); |         time = System.currentTimeMillis(); | ||||||
|         len = usb.serialPort.read(buf, shortTimeout); |         len = usb.serialPort.read(readBuf, shortTimeout); | ||||||
|         assertEquals(0, len); |         assertEquals(0, len); | ||||||
|         assertTrue(System.currentTimeMillis()-time < 100); |         assertTrue(System.currentTimeMillis()-time < 100); | ||||||
| 
 | 
 | ||||||
| @ -1193,9 +1191,10 @@ public class DeviceTest { | |||||||
|         time = System.currentTimeMillis(); |         time = System.currentTimeMillis(); | ||||||
|         for(i=0; i<50; i++) { |         for(i=0; i<50; i++) { | ||||||
|             Thread.sleep(10); |             Thread.sleep(10); | ||||||
|             telnet.write(buf); |             telnet.write(writeBuf); | ||||||
|  |             Log.d(TAG,"telnet write 1"); | ||||||
|             for(j=0; j<20; j++) { |             for(j=0; j<20; j++) { | ||||||
|                 len = usb.serialPort.read(buf, shortTimeout); |                 len = usb.serialPort.read(readBuf, shortTimeout); | ||||||
|                 if (len > 0) |                 if (len > 0) | ||||||
|                     break; |                     break; | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -158,14 +158,11 @@ public abstract class CommonUsbSerialPort implements UsbSerialPort { | |||||||
|             } |             } | ||||||
|             nread = buf.position(); |             nread = buf.position(); | ||||||
|         } |         } | ||||||
|         if (nread > 0) { |         if (nread > 0) | ||||||
|             return readFilter(dest, nread); |             return nread; | ||||||
|         } else { |         else | ||||||
|             return 0; |             return 0; | ||||||
|     } |     } | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     protected int readFilter(final byte[] buffer, int len) throws IOException { return len; } |  | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public int write(final byte[] src, final int timeout) throws IOException { |     public int write(final byte[] src, final int timeout) throws IOException { | ||||||
|  | |||||||
| @ -136,7 +136,22 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         @Override |         @Override | ||||||
|         protected int readFilter(byte[] buffer, int totalBytesRead) throws IOException { |         public int read(final byte[] dest, final int timeout) throws IOException { | ||||||
|  |             int nread; | ||||||
|  |             if (timeout != 0) { | ||||||
|  |                 long endTime = System.currentTimeMillis() + timeout; | ||||||
|  |                 do { | ||||||
|  |                     nread = super.read(dest, Math.max(1, (int)(endTime - System.currentTimeMillis()))); | ||||||
|  |                 } while (nread == READ_HEADER_LENGTH && System.currentTimeMillis() < endTime); | ||||||
|  |             } else { | ||||||
|  |                 do { | ||||||
|  |                     nread = super.read(dest, timeout); | ||||||
|  |                 } while (nread == READ_HEADER_LENGTH); | ||||||
|  |             } | ||||||
|  |             return readFilter(dest, nread); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private int readFilter(byte[] buffer, int totalBytesRead) throws IOException { | ||||||
|             final int maxPacketSize = mReadEndpoint.getMaxPacketSize(); |             final int maxPacketSize = mReadEndpoint.getMaxPacketSize(); | ||||||
|             int destPos = 0; |             int destPos = 0; | ||||||
|             for(int srcPos = 0; srcPos < totalBytesRead; srcPos += maxPacketSize) { |             for(int srcPos = 0; srcPos < totalBytesRead; srcPos += maxPacketSize) { | ||||||
| @ -146,6 +161,7 @@ public class FtdiSerialDriver implements UsbSerialDriver { | |||||||
|                 System.arraycopy(buffer, srcPos + READ_HEADER_LENGTH, buffer, destPos, length); |                 System.arraycopy(buffer, srcPos + READ_HEADER_LENGTH, buffer, destPos, length); | ||||||
|                 destPos += length; |                 destPos += length; | ||||||
|             } |             } | ||||||
|  |             //Log.d(TAG, "read filter " + totalBytesRead + " -> " + destPos); | ||||||
|             return destPos; |             return destPos; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user