kopia lustrzana https://github.com/felHR85/UsbSerial
UsbSpiDevice class added
rodzic
7cd6434ad1
commit
277c8dc4a4
|
@ -0,0 +1,199 @@
|
||||||
|
package com.felhr.usbserial;
|
||||||
|
|
||||||
|
import android.hardware.usb.UsbDevice;
|
||||||
|
import android.hardware.usb.UsbDeviceConnection;
|
||||||
|
import android.hardware.usb.UsbEndpoint;
|
||||||
|
import android.hardware.usb.UsbRequest;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
public abstract class UsbSpiDevice implements UsbSpiInterface
|
||||||
|
{
|
||||||
|
private static final String CLASS_ID = UsbSerialDevice.class.getSimpleName();
|
||||||
|
|
||||||
|
protected static final int USB_TIMEOUT = 5000;
|
||||||
|
|
||||||
|
protected final UsbDevice device;
|
||||||
|
protected final UsbDeviceConnection connection;
|
||||||
|
|
||||||
|
protected SerialBuffer serialBuffer;
|
||||||
|
|
||||||
|
protected WriteThread writeThread;
|
||||||
|
protected ReadThread readThread;
|
||||||
|
|
||||||
|
// Endpoints for synchronous read and write operations
|
||||||
|
private UsbEndpoint inEndpoint;
|
||||||
|
private UsbEndpoint outEndpoint;
|
||||||
|
|
||||||
|
public UsbSpiDevice(UsbDevice device, UsbDeviceConnection connection)
|
||||||
|
{
|
||||||
|
this.device = device;
|
||||||
|
this.connection = connection;
|
||||||
|
this.serialBuffer = new SerialBuffer(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: Factory methods
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract void connectSPI();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract void writeMOSI(byte[] buffer);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract void readMISO(int lengthBuffer);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract void setClock(int clockDivider);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract void selectSlave(int nSlave);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMISOCallback(UsbMISOCallback misoCallback)
|
||||||
|
{
|
||||||
|
readThread.setCallback(misoCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract int getClockDivider();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract int getSelectedSlave();
|
||||||
|
|
||||||
|
protected class WriteThread extends Thread
|
||||||
|
{
|
||||||
|
private UsbEndpoint outEndpoint;
|
||||||
|
private AtomicBoolean working;
|
||||||
|
|
||||||
|
public WriteThread()
|
||||||
|
{
|
||||||
|
working = new AtomicBoolean(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
while(working.get())
|
||||||
|
{
|
||||||
|
byte[] data = serialBuffer.getWriteBuffer();
|
||||||
|
connection.bulkTransfer(outEndpoint, data, data.length, USB_TIMEOUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsbEndpoint(UsbEndpoint outEndpoint)
|
||||||
|
{
|
||||||
|
this.outEndpoint = outEndpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopWriteThread()
|
||||||
|
{
|
||||||
|
working.set(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected class ReadThread extends Thread
|
||||||
|
{
|
||||||
|
private UsbMISOCallback misoCallback;
|
||||||
|
private UsbEndpoint inEndpoint;
|
||||||
|
private AtomicBoolean working;
|
||||||
|
|
||||||
|
public ReadThread()
|
||||||
|
{
|
||||||
|
working = new AtomicBoolean(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCallback(UsbMISOCallback misoCallback)
|
||||||
|
{
|
||||||
|
this.misoCallback = misoCallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
byte[] dataReceived = null;
|
||||||
|
|
||||||
|
while(working.get())
|
||||||
|
{
|
||||||
|
int numberBytes;
|
||||||
|
if(inEndpoint != null)
|
||||||
|
numberBytes = connection.bulkTransfer(inEndpoint, serialBuffer.getBufferCompatible(),
|
||||||
|
SerialBuffer.DEFAULT_READ_BUFFER_SIZE, 0);
|
||||||
|
else
|
||||||
|
numberBytes = 0;
|
||||||
|
|
||||||
|
if(numberBytes > 0)
|
||||||
|
{
|
||||||
|
dataReceived = serialBuffer.getDataReceivedCompatible(numberBytes);
|
||||||
|
onReceivedData(dataReceived);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsbEndpoint(UsbEndpoint inEndpoint)
|
||||||
|
{
|
||||||
|
this.inEndpoint = inEndpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopReadThread()
|
||||||
|
{
|
||||||
|
working.set(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onReceivedData(byte[] data)
|
||||||
|
{
|
||||||
|
if(misoCallback != null)
|
||||||
|
misoCallback.onReceivedData(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setThreadsParams(UsbRequest request, UsbEndpoint endpoint)
|
||||||
|
{
|
||||||
|
readThread.setUsbEndpoint(request.getEndpoint());
|
||||||
|
writeThread.setUsbEndpoint(endpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Kill workingThread; This must be called when closing a device
|
||||||
|
*/
|
||||||
|
protected void killWorkingThread()
|
||||||
|
{
|
||||||
|
if(readThread != null)
|
||||||
|
{
|
||||||
|
readThread.stopReadThread();
|
||||||
|
readThread = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restart workingThread if it has been killed before
|
||||||
|
*/
|
||||||
|
protected void restartWorkingThread()
|
||||||
|
{
|
||||||
|
readThread = new ReadThread();
|
||||||
|
readThread.start();
|
||||||
|
while(!readThread.isAlive()){} // Busy waiting
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void killWriteThread()
|
||||||
|
{
|
||||||
|
if(writeThread != null)
|
||||||
|
{
|
||||||
|
writeThread.stopWriteThread();
|
||||||
|
writeThread = null;
|
||||||
|
serialBuffer.resetWriteBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void restartWriteThread()
|
||||||
|
{
|
||||||
|
if(writeThread == null)
|
||||||
|
{
|
||||||
|
writeThread = new WriteThread();
|
||||||
|
writeThread.start();
|
||||||
|
while(!writeThread.isAlive()){} // Busy waiting
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Ładowanie…
Reference in New Issue