kopia lustrzana https://github.com/felHR85/UsbSerial
CTS and DSR callbacks for FTDI devices added
rodzic
d671a91518
commit
d31789c94d
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue