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; 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 UsbInterface mInterface;
private UsbEndpoint inEndpoint; private UsbEndpoint inEndpoint;
private UsbEndpoint outEndpoint; private UsbEndpoint outEndpoint;
private UsbRequest requestIN; private UsbRequest requestIN;
public FTDIUtilities ftdiUtilities;
public FTDISerialDevice(UsbDevice device, UsbDeviceConnection connection) public FTDISerialDevice(UsbDevice device, UsbDeviceConnection connection)
{ {
@ -67,6 +81,11 @@ public class FTDISerialDevice extends UsbSerialDevice
public FTDISerialDevice(UsbDevice device, UsbDeviceConnection connection, int iface) public FTDISerialDevice(UsbDevice device, UsbDeviceConnection connection, int iface)
{ {
super(device, connection); super(device, connection);
ftdiUtilities = new FTDIUtilities();
rtsCtsEnabled = false;
dtrDsrEnabled = false;
ctsState = true;
dsrState = true;
mInterface = device.getInterface(iface >= 0 ? iface : 0); mInterface = device.getInterface(iface >= 0 ? iface : 0);
} }
@ -337,13 +356,13 @@ public class FTDISerialDevice extends UsbSerialDevice
@Override @Override
public void getCTS(UsbCTSCallback ctsCallback) public void getCTS(UsbCTSCallback ctsCallback)
{ {
//TODO this.ctsCallback = ctsCallback;
} }
@Override @Override
public void getDSR(UsbDSRCallback dsrCallback) public void getDSR(UsbDSRCallback dsrCallback)
{ {
//TODO this.dsrCallback = dsrCallback;
} }
@Override @Override
@ -382,10 +401,10 @@ public class FTDISerialDevice extends UsbSerialDevice
return response; return response;
} }
public static class FTDIUtilities public class FTDIUtilities
{ {
// Special treatment needed to FTDI devices // Special treatment needed to FTDI devices
public static byte[] adaptArray(byte[] ftdiData) public byte[] adaptArray(byte[] ftdiData)
{ {
int length = ftdiData.length; int length = ftdiData.length;
if(length > 64) 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 // 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 i = 0; // src index
int j = 0; // dst index int j = 0; // dst index

Wyświetl plik

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