kopia lustrzana https://github.com/felHR85/UsbSerial
Merge pull request #212 from Arneball/reuseempty
Reuse same instance of byte array when the destination array is emptypull/216/head
commit
234c83dd28
|
@ -63,6 +63,7 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
private static final int FTDI_SET_MODEM_CTRL_DEFAULT3 = 0x0100;
|
private static final int FTDI_SET_MODEM_CTRL_DEFAULT3 = 0x0100;
|
||||||
private static final int FTDI_SET_MODEM_CTRL_DEFAULT4 = 0x0200;
|
private static final int FTDI_SET_MODEM_CTRL_DEFAULT4 = 0x0200;
|
||||||
private static final int FTDI_SET_FLOW_CTRL_DEFAULT = 0x0000;
|
private static final int FTDI_SET_FLOW_CTRL_DEFAULT = 0x0000;
|
||||||
|
private static final byte[] EMPTY_BYTE_ARRAY = {};
|
||||||
|
|
||||||
private int currentSioSetData = 0x0000;
|
private int currentSioSetData = 0x0000;
|
||||||
|
|
||||||
|
@ -140,8 +141,8 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
@Override
|
@Override
|
||||||
public void close()
|
public void close()
|
||||||
{
|
{
|
||||||
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT3, 0, null);
|
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT3, 0);
|
||||||
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT4, 0, null);
|
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT4, 0);
|
||||||
currentSioSetData = 0x0000;
|
currentSioSetData = 0x0000;
|
||||||
killWorkingThread();
|
killWorkingThread();
|
||||||
killWriteThread();
|
killWriteThread();
|
||||||
|
@ -175,8 +176,8 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
@Override
|
@Override
|
||||||
public void syncClose()
|
public void syncClose()
|
||||||
{
|
{
|
||||||
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT3, 0, null);
|
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT3, 0);
|
||||||
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT4, 0, null);
|
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT4, 0);
|
||||||
currentSioSetData = 0x0000;
|
currentSioSetData = 0x0000;
|
||||||
connection.releaseInterface(mInterface);
|
connection.releaseInterface(mInterface);
|
||||||
isOpen = false;
|
isOpen = false;
|
||||||
|
@ -216,7 +217,7 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
value = FTDI_BAUDRATE_921600;
|
value = FTDI_BAUDRATE_921600;
|
||||||
else
|
else
|
||||||
value = FTDI_BAUDRATE_9600;
|
value = FTDI_BAUDRATE_9600;
|
||||||
setControlCommand(FTDI_SIO_SET_BAUD_RATE, value, 0, null);
|
setControlCommand(FTDI_SIO_SET_BAUD_RATE, value, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -229,35 +230,35 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
currentSioSetData &= ~(1 << 1);
|
currentSioSetData &= ~(1 << 1);
|
||||||
currentSioSetData |= (1 << 2);
|
currentSioSetData |= (1 << 2);
|
||||||
currentSioSetData &= ~(1 << 3);
|
currentSioSetData &= ~(1 << 3);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.DATA_BITS_6:
|
case UsbSerialInterface.DATA_BITS_6:
|
||||||
currentSioSetData &= ~1;
|
currentSioSetData &= ~1;
|
||||||
currentSioSetData |= (1 << 1);
|
currentSioSetData |= (1 << 1);
|
||||||
currentSioSetData |= (1 << 2);
|
currentSioSetData |= (1 << 2);
|
||||||
currentSioSetData &= ~(1 << 3);
|
currentSioSetData &= ~(1 << 3);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.DATA_BITS_7:
|
case UsbSerialInterface.DATA_BITS_7:
|
||||||
currentSioSetData |= 1;
|
currentSioSetData |= 1;
|
||||||
currentSioSetData |= (1 << 1);
|
currentSioSetData |= (1 << 1);
|
||||||
currentSioSetData |= (1 << 2);
|
currentSioSetData |= (1 << 2);
|
||||||
currentSioSetData &= ~(1 << 3);
|
currentSioSetData &= ~(1 << 3);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.DATA_BITS_8:
|
case UsbSerialInterface.DATA_BITS_8:
|
||||||
currentSioSetData &= ~1;
|
currentSioSetData &= ~1;
|
||||||
currentSioSetData &= ~(1 << 1);
|
currentSioSetData &= ~(1 << 1);
|
||||||
currentSioSetData &= ~(1 << 2);
|
currentSioSetData &= ~(1 << 2);
|
||||||
currentSioSetData |= (1 << 3);
|
currentSioSetData |= (1 << 3);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
currentSioSetData &= ~1;
|
currentSioSetData &= ~1;
|
||||||
currentSioSetData &= ~(1 << 1);
|
currentSioSetData &= ~(1 << 1);
|
||||||
currentSioSetData &= ~(1 << 2);
|
currentSioSetData &= ~(1 << 2);
|
||||||
currentSioSetData |= (1 << 3);
|
currentSioSetData |= (1 << 3);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,25 +273,25 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
currentSioSetData &= ~(1 << 11);
|
currentSioSetData &= ~(1 << 11);
|
||||||
currentSioSetData &= ~(1 << 12);
|
currentSioSetData &= ~(1 << 12);
|
||||||
currentSioSetData &= ~(1 << 13);
|
currentSioSetData &= ~(1 << 13);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.STOP_BITS_15:
|
case UsbSerialInterface.STOP_BITS_15:
|
||||||
currentSioSetData |= (1 << 11);
|
currentSioSetData |= (1 << 11);
|
||||||
currentSioSetData &= ~(1 << 12);
|
currentSioSetData &= ~(1 << 12);
|
||||||
currentSioSetData &= ~(1 << 13);
|
currentSioSetData &= ~(1 << 13);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.STOP_BITS_2:
|
case UsbSerialInterface.STOP_BITS_2:
|
||||||
currentSioSetData &= ~(1 << 11);
|
currentSioSetData &= ~(1 << 11);
|
||||||
currentSioSetData |= (1 << 12);
|
currentSioSetData |= (1 << 12);
|
||||||
currentSioSetData &= ~(1 << 13);
|
currentSioSetData &= ~(1 << 13);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
currentSioSetData &= ~(1 << 11);
|
currentSioSetData &= ~(1 << 11);
|
||||||
currentSioSetData &= ~(1 << 12);
|
currentSioSetData &= ~(1 << 12);
|
||||||
currentSioSetData &= ~(1 << 13);
|
currentSioSetData &= ~(1 << 13);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -304,37 +305,37 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
currentSioSetData &= ~(1 << 8);
|
currentSioSetData &= ~(1 << 8);
|
||||||
currentSioSetData &= ~(1 << 9);
|
currentSioSetData &= ~(1 << 9);
|
||||||
currentSioSetData &= ~(1 << 10);
|
currentSioSetData &= ~(1 << 10);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.PARITY_ODD:
|
case UsbSerialInterface.PARITY_ODD:
|
||||||
currentSioSetData |= (1 << 8);
|
currentSioSetData |= (1 << 8);
|
||||||
currentSioSetData &= ~(1 << 9);
|
currentSioSetData &= ~(1 << 9);
|
||||||
currentSioSetData &= ~(1 << 10);
|
currentSioSetData &= ~(1 << 10);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.PARITY_EVEN:
|
case UsbSerialInterface.PARITY_EVEN:
|
||||||
currentSioSetData &= ~(1 << 8);
|
currentSioSetData &= ~(1 << 8);
|
||||||
currentSioSetData |= (1 << 9);
|
currentSioSetData |= (1 << 9);
|
||||||
currentSioSetData &= ~(1 << 10);
|
currentSioSetData &= ~(1 << 10);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.PARITY_MARK:
|
case UsbSerialInterface.PARITY_MARK:
|
||||||
currentSioSetData |= (1 << 8);
|
currentSioSetData |= (1 << 8);
|
||||||
currentSioSetData |= (1 << 9);
|
currentSioSetData |= (1 << 9);
|
||||||
currentSioSetData &= ~(1 << 10);
|
currentSioSetData &= ~(1 << 10);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.PARITY_SPACE:
|
case UsbSerialInterface.PARITY_SPACE:
|
||||||
currentSioSetData &= ~(1 << 8);
|
currentSioSetData &= ~(1 << 8);
|
||||||
currentSioSetData &= ~(1 << 9);
|
currentSioSetData &= ~(1 << 9);
|
||||||
currentSioSetData |= (1 << 10);
|
currentSioSetData |= (1 << 10);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
currentSioSetData &= ~(1 << 8);
|
currentSioSetData &= ~(1 << 8);
|
||||||
currentSioSetData &= ~(1 << 9);
|
currentSioSetData &= ~(1 << 9);
|
||||||
currentSioSetData &= ~(1 << 10);
|
currentSioSetData &= ~(1 << 10);
|
||||||
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0, null);
|
setControlCommand(FTDI_SIO_SET_DATA, currentSioSetData, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -346,7 +347,7 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
switch(flowControl)
|
switch(flowControl)
|
||||||
{
|
{
|
||||||
case UsbSerialInterface.FLOW_CONTROL_OFF:
|
case UsbSerialInterface.FLOW_CONTROL_OFF:
|
||||||
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, 0, null);
|
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, 0);
|
||||||
rtsCtsEnabled = false;
|
rtsCtsEnabled = false;
|
||||||
dtrDsrEnabled = false;
|
dtrDsrEnabled = false;
|
||||||
break;
|
break;
|
||||||
|
@ -354,21 +355,21 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
rtsCtsEnabled = true;
|
rtsCtsEnabled = true;
|
||||||
dtrDsrEnabled = false;
|
dtrDsrEnabled = false;
|
||||||
int indexRTSCTS = 0x0001;
|
int indexRTSCTS = 0x0001;
|
||||||
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, indexRTSCTS, null);
|
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, indexRTSCTS);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.FLOW_CONTROL_DSR_DTR:
|
case UsbSerialInterface.FLOW_CONTROL_DSR_DTR:
|
||||||
dtrDsrEnabled = true;
|
dtrDsrEnabled = true;
|
||||||
rtsCtsEnabled = false;
|
rtsCtsEnabled = false;
|
||||||
int indexDSRDTR = 0x0002;
|
int indexDSRDTR = 0x0002;
|
||||||
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, indexDSRDTR , null);
|
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, indexDSRDTR);
|
||||||
break;
|
break;
|
||||||
case UsbSerialInterface.FLOW_CONTROL_XON_XOFF:
|
case UsbSerialInterface.FLOW_CONTROL_XON_XOFF:
|
||||||
int indexXONXOFF = 0x0004;
|
int indexXONXOFF = 0x0004;
|
||||||
int wValue = 0x1311;
|
int wValue = 0x1311;
|
||||||
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, wValue, indexXONXOFF , null);
|
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, wValue, indexXONXOFF);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, 0, null);
|
setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -378,10 +379,10 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
{
|
{
|
||||||
if(state)
|
if(state)
|
||||||
{
|
{
|
||||||
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SIO_SET_RTS_HIGH, 0, null);
|
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SIO_SET_RTS_HIGH, 0);
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SIO_SET_RTS_LOW, 0, null);
|
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SIO_SET_RTS_LOW, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -390,10 +391,10 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
{
|
{
|
||||||
if(state)
|
if(state)
|
||||||
{
|
{
|
||||||
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SIO_SET_DTR_HIGH, 0, null);
|
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SIO_SET_DTR_HIGH, 0);
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SIO_SET_DTR_LOW, 0, null);
|
setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SIO_SET_DTR_LOW, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,18 +462,18 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
|
|
||||||
// Default Setup
|
// Default Setup
|
||||||
firstTime = true;
|
firstTime = true;
|
||||||
if(setControlCommand(FTDI_SIO_RESET, 0x00, 0, null) < 0)
|
if(setControlCommand(FTDI_SIO_RESET, 0x00, 0) < 0)
|
||||||
return false;
|
return false;
|
||||||
if(setControlCommand(FTDI_SIO_SET_DATA, FTDI_SET_DATA_DEFAULT, 0, null) < 0)
|
if(setControlCommand(FTDI_SIO_SET_DATA, FTDI_SET_DATA_DEFAULT, 0) < 0)
|
||||||
return false;
|
return false;
|
||||||
currentSioSetData = FTDI_SET_DATA_DEFAULT;
|
currentSioSetData = FTDI_SET_DATA_DEFAULT;
|
||||||
if(setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT1, 0, null) < 0)
|
if(setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT1, 0) < 0)
|
||||||
return false;
|
return false;
|
||||||
if(setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT2, 0, null) < 0)
|
if(setControlCommand(FTDI_SIO_MODEM_CTRL, FTDI_SET_MODEM_CTRL_DEFAULT2, 0) < 0)
|
||||||
return false;
|
return false;
|
||||||
if(setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, 0, null) < 0)
|
if(setControlCommand(FTDI_SIO_SET_FLOW_CTRL, FTDI_SET_FLOW_CTRL_DEFAULT, 0) < 0)
|
||||||
return false;
|
return false;
|
||||||
if(setControlCommand(FTDI_SIO_SET_BAUD_RATE, FTDI_BAUDRATE_9600, 0, null) < 0)
|
if(setControlCommand(FTDI_SIO_SET_BAUD_RATE, FTDI_BAUDRATE_9600, 0) < 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Flow control disabled by default
|
// Flow control disabled by default
|
||||||
|
@ -482,44 +483,62 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int setControlCommand(int request, int value, int index, byte[] data)
|
private int setControlCommand(int request, int value, int index)
|
||||||
{
|
{
|
||||||
int dataLength = 0;
|
int dataLength = 0;
|
||||||
if(data != null)
|
int response = connection.controlTransfer(FTDI_REQTYPE_HOST2DEVICE, request, value, mInterface.getId() + 1 + index, null, dataLength, USB_TIMEOUT);
|
||||||
{
|
|
||||||
dataLength = data.length;
|
|
||||||
}
|
|
||||||
int response = connection.controlTransfer(FTDI_REQTYPE_HOST2DEVICE, request, value, mInterface.getId() + 1 + index, data, dataLength, USB_TIMEOUT);
|
|
||||||
Log.i(CLASS_ID,"Control Transfer Response: " + String.valueOf(response));
|
Log.i(CLASS_ID,"Control Transfer Response: " + String.valueOf(response));
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Special treatment needed to FTDI devices
|
||||||
|
static byte[] adaptArray(byte[] ftdiData)
|
||||||
|
{
|
||||||
|
int length = ftdiData.length;
|
||||||
|
if(length > 64)
|
||||||
|
{
|
||||||
|
int n = 1;
|
||||||
|
int p = 64;
|
||||||
|
// Precalculate length without FTDI headers
|
||||||
|
while(p < length)
|
||||||
|
{
|
||||||
|
n++;
|
||||||
|
p = n*64;
|
||||||
|
}
|
||||||
|
int realLength = length - n*2;
|
||||||
|
byte[] data = new byte[realLength];
|
||||||
|
copyData(ftdiData, data);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
else if (length == 2) // special case optimization that returns the same instance.
|
||||||
|
{
|
||||||
|
return EMPTY_BYTE_ARRAY;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Arrays.copyOfRange(ftdiData, 2, length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy data without FTDI headers
|
||||||
|
private static void copyData(byte[] src, byte[] dst)
|
||||||
|
{
|
||||||
|
int srcPos = 2, dstPos = 0;
|
||||||
|
while(srcPos - 2 <= src.length - 64)
|
||||||
|
{
|
||||||
|
System.arraycopy(src, srcPos, dst, dstPos, 62);
|
||||||
|
srcPos += 64;
|
||||||
|
dstPos += 62;
|
||||||
|
}
|
||||||
|
int remaining = src.length - srcPos + 2;
|
||||||
|
if (remaining > 0)
|
||||||
|
{
|
||||||
|
System.arraycopy(src, srcPos, dst, dstPos, remaining - 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class FTDIUtilities
|
public class FTDIUtilities
|
||||||
{
|
{
|
||||||
// Special treatment needed to FTDI devices
|
|
||||||
public byte[] adaptArray(byte[] ftdiData)
|
|
||||||
{
|
|
||||||
int length = ftdiData.length;
|
|
||||||
if(length > 64)
|
|
||||||
{
|
|
||||||
int n = 1;
|
|
||||||
int p = 64;
|
|
||||||
// Precalculate length without FTDI headers
|
|
||||||
while(p < length)
|
|
||||||
{
|
|
||||||
n++;
|
|
||||||
p = n*64;
|
|
||||||
}
|
|
||||||
int realLength = length - n*2;
|
|
||||||
byte[] data = new byte[realLength];
|
|
||||||
copyData(ftdiData, data);
|
|
||||||
return data;
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
return Arrays.copyOfRange(ftdiData, 2, length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void checkModemStatus(byte[] data)
|
public void checkModemStatus(byte[] data)
|
||||||
{
|
{
|
||||||
if(data.length == 0) // Safeguard for zero length arrays
|
if(data.length == 0) // Safeguard for zero length arrays
|
||||||
|
@ -589,31 +608,6 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy data without FTDI headers
|
|
||||||
private void copyData(byte[] src, byte[] dst)
|
|
||||||
{
|
|
||||||
int i = 0; // src index
|
|
||||||
int j = 0; // dst index
|
|
||||||
while(i <= src.length-1)
|
|
||||||
{
|
|
||||||
if(i != 0 && i != 1)
|
|
||||||
{
|
|
||||||
if(i % 64 == 0 && i >= 64)
|
|
||||||
{
|
|
||||||
i += 2;
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
dst[j] = src[i];
|
|
||||||
i++;
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
}else
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -658,7 +652,7 @@ public class FTDISerialDevice extends UsbSerialDevice
|
||||||
|
|
||||||
if(numberBytes > 2) // Data received
|
if(numberBytes > 2) // Data received
|
||||||
{
|
{
|
||||||
byte[] newBuffer = this.ftdiUtilities.adaptArray(tempBuffer);
|
byte[] newBuffer = adaptArray(tempBuffer);
|
||||||
System.arraycopy(newBuffer, 0, buffer, 0, buffer.length);
|
System.arraycopy(newBuffer, 0, buffer, 0, buffer.length);
|
||||||
|
|
||||||
int p = numberBytes / 64;
|
int p = numberBytes / 64;
|
||||||
|
|
|
@ -331,7 +331,7 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
|
||||||
|
|
||||||
if(data.length > 2)
|
if(data.length > 2)
|
||||||
{
|
{
|
||||||
data = ((FTDISerialDevice) usbSerialDevice).ftdiUtilities.adaptArray(data);
|
data = FTDISerialDevice.adaptArray(data);
|
||||||
onReceivedData(data);
|
onReceivedData(data);
|
||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
|
@ -425,7 +425,7 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
|
||||||
|
|
||||||
if(dataReceived.length > 2)
|
if(dataReceived.length > 2)
|
||||||
{
|
{
|
||||||
dataReceived = ((FTDISerialDevice) usbSerialDevice).ftdiUtilities.adaptArray(dataReceived);
|
dataReceived = FTDISerialDevice.adaptArray(dataReceived);
|
||||||
onReceivedData(dataReceived);
|
onReceivedData(dataReceived);
|
||||||
}
|
}
|
||||||
}else
|
}else
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
package com.felhr.usbserial;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.JUnit4;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
@RunWith(JUnit4.class)
|
||||||
|
public class FTDISerialDeviceTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void adaptEmptyByteArray() {
|
||||||
|
byte[] onlyHeaders = {1, 2};
|
||||||
|
byte[] adapted = FTDISerialDevice.adaptArray(onlyHeaders);
|
||||||
|
Assert.assertEquals("Should be empty", 0, adapted.length);
|
||||||
|
byte[] adaptAgain = FTDISerialDevice.adaptArray(onlyHeaders);
|
||||||
|
Assert.assertSame("Should be the same instance of empty array", adapted, adaptAgain);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void withHeaders() {
|
||||||
|
byte[] withHeaders = {1, 2, 3, 4, 5, 6};
|
||||||
|
byte[] wanted = {3,4,5,6};
|
||||||
|
Assert.assertArrayEquals(wanted, FTDISerialDevice.adaptArray(withHeaders));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void fullWithHeaders() {
|
||||||
|
byte[] withHeaders = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64};
|
||||||
|
byte[] wanted = Arrays.copyOfRange(withHeaders, 2, 64);
|
||||||
|
Assert.assertArrayEquals(wanted, FTDISerialDevice.adaptArray(withHeaders));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultipleFull() {
|
||||||
|
byte[] withHeaders = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64};
|
||||||
|
byte[] wanted = {3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64};
|
||||||
|
Assert.assertArrayEquals(wanted, FTDISerialDevice.adaptArray(withHeaders));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultiplePartial() {
|
||||||
|
byte[] withHeaders = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62};
|
||||||
|
byte[] wanted = {3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, 3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62};
|
||||||
|
Assert.assertArrayEquals(wanted, FTDISerialDevice.adaptArray(withHeaders));
|
||||||
|
}
|
||||||
|
}
|
Ładowanie…
Reference in New Issue