CTS and DSR callbacks for FTDI devices added

pull/26/head
Felipe Herranz 2016-01-31 19:47:28 +01:00
rodzic d671a91518
commit d31789c94d
2 zmienionych plików z 62 dodań i 13 usunięć

Wyświetl plik

@ -53,11 +53,25 @@ public class FTDISerialDevice extends UsbSerialDevice
private int currentSioSetData = 0x0000;
/**
* Flow control variables
*/
private boolean rtsCtsEnabled;
private boolean dtrDsrEnabled;
private boolean ctsState;
private boolean dsrState;
private UsbCTSCallback ctsCallback;
private UsbDSRCallback dsrCallback;
private UsbInterface mInterface;
private UsbEndpoint inEndpoint;
private UsbEndpoint outEndpoint;
private UsbRequest requestIN;
public FTDIUtilities ftdiUtilities;
public FTDISerialDevice(UsbDevice device, UsbDeviceConnection connection)
{
@ -67,6 +81,11 @@ public class FTDISerialDevice extends UsbSerialDevice
public FTDISerialDevice(UsbDevice device, UsbDeviceConnection connection, int iface)
{
super(device, connection);
ftdiUtilities = new FTDIUtilities();
rtsCtsEnabled = false;
dtrDsrEnabled = false;
ctsState = true;
dsrState = true;
mInterface = device.getInterface(iface >= 0 ? iface : 0);
}
@ -337,13 +356,13 @@ public class FTDISerialDevice extends UsbSerialDevice
@Override
public void getCTS(UsbCTSCallback ctsCallback)
{
//TODO
this.ctsCallback = ctsCallback;
}
@Override
public void getDSR(UsbDSRCallback dsrCallback)
{
//TODO
this.dsrCallback = dsrCallback;
}
@Override
@ -382,10 +401,10 @@ public class FTDISerialDevice extends UsbSerialDevice
return response;
}
public static class FTDIUtilities
public class FTDIUtilities
{
// Special treatment needed to FTDI devices
public static byte[] adaptArray(byte[] ftdiData)
public byte[] adaptArray(byte[] ftdiData)
{
int length = ftdiData.length;
if(length > 64)
@ -408,8 +427,29 @@ public class FTDISerialDevice extends UsbSerialDevice
}
}
public void checkModemStatus(byte[] data)
{
if(data.length == 0) // Safeguard for zero length arrays
return;
boolean cts = (data[0] & 0x10) == 0x10;
boolean dsr = (data[0] & 0x20) == 0x20;
if(cts != ctsState) //CTS
{
ctsState = !ctsState;
ctsCallback.onCTSChanged(ctsState);
}
if(dsr != dsrState) //DSR
{
dsrState = ! dsrState;
dsrCallback.onDSRChanged(dsrState);
}
}
// Copy data without FTDI headers
private static void copyData(byte[] src, byte[] dst)
private void copyData(byte[] src, byte[] dst)
{
int i = 0; // src index
int j = 0; // dst index

Wyświetl plik

@ -146,12 +146,15 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
*/
protected class WorkerThread extends Thread
{
private UsbSerialDevice usbSerialDevice;
private UsbReadCallback callback;
private UsbRequest requestIN;
private AtomicBoolean working;
public WorkerThread()
public WorkerThread(UsbSerialDevice usbSerialDevice)
{
this.usbSerialDevice = usbSerialDevice;
working = new AtomicBoolean(true);
}
@ -170,11 +173,12 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
// modem and Line.
if(isFTDIDevice())
{
((FTDISerialDevice) usbSerialDevice).ftdiUtilities.checkModemStatus(data); //Check the Modem status
serialBuffer.clearReadBuffer();
if(data.length > 2)
{
data = FTDISerialDevice.FTDIUtilities.adaptArray(data);
// Clear buffer, execute the callback
serialBuffer.clearReadBuffer();
data = ((FTDISerialDevice) usbSerialDevice).ftdiUtilities.adaptArray(data);
onReceivedData(data);
}
}else
@ -249,12 +253,15 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
protected class ReadThread extends Thread
{
private UsbSerialDevice usbSerialDevice;
private UsbReadCallback callback;
private UsbEndpoint inEndpoint;
private AtomicBoolean working;
public ReadThread()
public ReadThread(UsbSerialDevice usbSerialDevice)
{
this.usbSerialDevice = usbSerialDevice;
working = new AtomicBoolean(true);
}
@ -285,9 +292,11 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
// modem and Line.
if(isFTDIDevice())
{
((FTDISerialDevice) usbSerialDevice).ftdiUtilities.checkModemStatus(dataReceived);
if(dataReceived.length > 2)
{
dataReceived = FTDISerialDevice.FTDIUtilities.adaptArray(dataReceived);
dataReceived = ((FTDISerialDevice) usbSerialDevice).ftdiUtilities.adaptArray(dataReceived);
onReceivedData(dataReceived);
}
}else
@ -351,12 +360,12 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
{
if(mr1Version && workerThread == null)
{
workerThread = new WorkerThread();
workerThread = new WorkerThread(this);
workerThread.start();
while(!workerThread.isAlive()){} // Busy waiting
}else if(!mr1Version && readThread == null)
{
readThread = new ReadThread();
readThread = new ReadThread(this);
readThread.start();
while(!readThread.isAlive()){} // Busy waiting
}