avoiding 16kb limit in bulktransfers

pull/197/head
Felipe Herranz 2019-01-06 20:44:45 +01:00
rodzic 9a30dfb93b
commit ff9f314406
3 zmienionych plików z 89 dodań i 27 usunięć

Wyświetl plik

@ -7,8 +7,9 @@ import junit.framework.TestCase;
import org.junit.Assert;
import org.junit.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Random;
@ -37,46 +38,96 @@ public class SerialBufferTest extends TestCase {
@Test
public void testBigSimpleWriteBuffer(){
Arrays.fill(bigBuffer, (byte) 0x0A);
serialBuffer = new SerialBuffer(true);
serialBuffer.putWriteBuffer(bigBuffer);
byte[] dataReceived = serialBuffer.getWriteBuffer();
Assert.assertArrayEquals(bigBuffer, dataReceived);
try {
new Random().nextBytes(bigBuffer);
serialBuffer = new SerialBuffer(true);
serialBuffer.putWriteBuffer(bigBuffer);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
while(outputStream.size() < bigBuffer.length){
byte[] srcData = serialBuffer.getWriteBuffer();
outputStream.write(srcData);
}
byte[] srcBuffered = outputStream.toByteArray();
Assert.assertArrayEquals(bigBuffer, srcBuffered);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testSuperBigSimpleWriteBuffer(){
new Random().nextBytes(bigBuffer2);
serialBuffer = new SerialBuffer(true);
serialBuffer.putWriteBuffer(bigBuffer2);
byte[] dataReceived = serialBuffer.getWriteBuffer();
Assert.assertArrayEquals(bigBuffer2, dataReceived);
try {
new Random().nextBytes(bigBuffer2);
serialBuffer = new SerialBuffer(true);
serialBuffer.putWriteBuffer(bigBuffer2);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
while(outputStream.size() < bigBuffer2.length){
byte[] srcData = serialBuffer.getWriteBuffer();
outputStream.write(srcData);
}
byte[] srcBuffered = outputStream.toByteArray();
Assert.assertArrayEquals(bigBuffer2, srcBuffered);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testSimpleWriteBufferAsync1(){
new Random().nextBytes(bigBuffer2);
serialBuffer = new SerialBuffer(true);
try {
new Random().nextBytes(bigBuffer2);
serialBuffer = new SerialBuffer(true);
WriterThread writerThread = new WriterThread(serialBuffer, bigBuffer2);
writerThread.start();
WriterThread writerThread = new WriterThread(serialBuffer, bigBuffer2);
writerThread.start();
while(writerThread.getState() != Thread.State.TERMINATED){/*Busy waiting*/}
while(writerThread.getState() != Thread.State.TERMINATED){/*Busy waiting*/}
byte[] dataReceived = serialBuffer.getWriteBuffer();
Assert.assertArrayEquals(bigBuffer2, dataReceived);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
while(outputStream.size() < bigBuffer2.length){
byte[] srcData = serialBuffer.getWriteBuffer();
outputStream.write(srcData);
}
byte[] dataReceived = outputStream.toByteArray();
Assert.assertArrayEquals(bigBuffer2, dataReceived);
} catch (IOException e) {
e.printStackTrace();
}
}
@Test
public void testSimpleWriteBufferAsync2(){
new Random().nextBytes(bigBuffer2);
serialBuffer = new SerialBuffer(true);
try {
new Random().nextBytes(bigBuffer2);
serialBuffer = new SerialBuffer(true);
WriterThread writerThread = new WriterThread(serialBuffer, bigBuffer2, Thread.currentThread());
writerThread.start();
WriterThread writerThread = new WriterThread(serialBuffer, bigBuffer2, Thread.currentThread());
writerThread.start();
byte[] dataReceived = serialBuffer.getWriteBuffer();
Assert.assertArrayEquals(bigBuffer2, dataReceived);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream( );
while(outputStream.size() < bigBuffer2.length){
byte[] srcData = serialBuffer.getWriteBuffer();
outputStream.write(srcData);
}
byte[] dataReceived = outputStream.toByteArray();
Assert.assertArrayEquals(bigBuffer2, dataReceived);
} catch (IOException e) {
e.printStackTrace();
}
}
// Testing ReadBuffer

Wyświetl plik

@ -1,5 +1,6 @@
package com.felhr.usbserial;
import java.io.EOFException;
import java.nio.ByteBuffer;
import java.util.Arrays;
@ -8,6 +9,7 @@ import okio.Buffer;
public class SerialBuffer
{
static final int DEFAULT_READ_BUFFER_SIZE = 16 * 1024;
static final int MAX_BULK_BUFFER = 16 * 1024;
private ByteBuffer readBuffer;
private SynchronizedBuffer writeBuffer;
private byte[] readBufferCompatible; // Read buffer for android < 4.2
@ -117,8 +119,17 @@ public class SerialBuffer
e.printStackTrace();
}
}
byte[] dst = buffer.readByteArray();
byte[] dst;
if(buffer.size() <= MAX_BULK_BUFFER){
dst = buffer.readByteArray();
}else{
try {
dst = buffer.readByteArray(MAX_BULK_BUFFER);
} catch (EOFException e) {
e.printStackTrace();
return new byte[0];
}
}
if(debugging)
UsbSerialDebugger.printLogGet(dst, true);

Wyświetl plik

@ -29,7 +29,7 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
protected final UsbDevice device;
protected final UsbDeviceConnection connection;
protected static final int USB_TIMEOUT = 5000;
protected static final int USB_TIMEOUT = 0;
protected SerialBuffer serialBuffer;