kopia lustrzana https://github.com/felHR85/UsbSerial
added SerialPortBuilder
rodzic
8b5a23c57f
commit
e6a7062242
|
@ -0,0 +1,167 @@
|
|||
package com.felhr.usbserial;
|
||||
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.hardware.usb.UsbDevice;
|
||||
import android.hardware.usb.UsbManager;
|
||||
import android.os.Handler;
|
||||
|
||||
import com.annimon.stream.Stream;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class SerialPortBuilder {
|
||||
private static final String ACTION_USB_PERMISSION = "com.felhr.usbserial.USB_PERMISSION";
|
||||
private static final int MODE_START = 0;
|
||||
private static final int MODE_OPEN = 1;
|
||||
|
||||
private static SerialPortBuilder SerialPortBuilder;
|
||||
|
||||
private List<UsbDevice> devices;
|
||||
private List<UsbSerialDevice> serialDevices = new ArrayList<>();
|
||||
|
||||
private int index = 0;
|
||||
|
||||
private UsbManager usbManager;
|
||||
private SerialPortCallback serialPortCallback;
|
||||
|
||||
private InitSerialPortThread initSerialPortThread;
|
||||
|
||||
private int baudRate, dataBits, stopBits, parity, flowControl;
|
||||
private int mode = 0;
|
||||
|
||||
private SerialPortBuilder(SerialPortCallback serialPortCallback){
|
||||
this.serialPortCallback = serialPortCallback;
|
||||
}
|
||||
|
||||
|
||||
public static SerialPortBuilder createSerialPortBuilder(SerialPortCallback serialPortCallback){
|
||||
if(SerialPortBuilder == null) {
|
||||
SerialPortBuilder = new SerialPortBuilder(serialPortCallback);
|
||||
return SerialPortBuilder;
|
||||
}else {
|
||||
return SerialPortBuilder;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<UsbDevice> getPossibleSerialPorts(){
|
||||
HashMap<String, UsbDevice> allDevices = usbManager.getDeviceList();
|
||||
|
||||
return Stream.of(allDevices.values()).filter(
|
||||
p -> UsbSerialDevice.isSupported(p))
|
||||
.toList();
|
||||
}
|
||||
|
||||
public boolean getSerialPorts(Context context){
|
||||
devices = getPossibleSerialPorts();
|
||||
|
||||
if(devices == null || devices.size() == 0)
|
||||
return false;
|
||||
|
||||
initReceiver(context);
|
||||
|
||||
usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
|
||||
requestPermission(context);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean openSerialPorts(Context context, int baudRate, int dataBits,
|
||||
int stopBits, int parity, int flowControl){
|
||||
this.baudRate = baudRate;
|
||||
this.dataBits = dataBits;
|
||||
this.stopBits = stopBits;
|
||||
this.parity = parity;
|
||||
this.flowControl = flowControl;
|
||||
this.mode = MODE_OPEN;
|
||||
return getSerialPorts(context);
|
||||
}
|
||||
|
||||
private void requestPermission(Context context){
|
||||
PendingIntent mPendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);
|
||||
usbManager.requestPermission(devices.get(index), mPendingIntent);
|
||||
}
|
||||
|
||||
private void initReceiver(Context context){
|
||||
IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(ACTION_USB_PERMISSION);
|
||||
context.registerReceiver(usbReceiver, filter);
|
||||
}
|
||||
|
||||
private void createAllPorts(UsbDevice usbDevice){
|
||||
int interfaceCount = usbDevice.getInterfaceCount();
|
||||
for(int i=0;i<=interfaceCount-1;i++) {
|
||||
//TODO: Maybe opening the same device more than once causes troubles!!!
|
||||
UsbSerialDevice usbSerialDevice = UsbSerialDevice.createUsbSerialDevice(usbDevice,
|
||||
usbManager.openDevice(usbDevice),
|
||||
i);
|
||||
|
||||
serialDevices.add(usbSerialDevice);
|
||||
}
|
||||
}
|
||||
|
||||
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (intent.getAction().equals(ACTION_USB_PERMISSION)) {
|
||||
boolean granted = intent.getExtras().getBoolean(UsbManager.EXTRA_PERMISSION_GRANTED);
|
||||
if (granted) {
|
||||
createAllPorts(devices.get(index));
|
||||
index++;
|
||||
if(index < devices.size()){
|
||||
requestPermission(context);
|
||||
}else{
|
||||
if(mode == MODE_START) {
|
||||
serialPortCallback.onSerialPortsDetected(serialDevices, false);
|
||||
}else{
|
||||
initSerialPortThread = new InitSerialPortThread(serialDevices);
|
||||
initSerialPortThread.start();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
index++;
|
||||
if(index < devices.size()){
|
||||
requestPermission(context);
|
||||
}else{
|
||||
if(mode == MODE_START) {
|
||||
serialPortCallback.onSerialPortsDetected(serialDevices, false);
|
||||
}else{
|
||||
initSerialPortThread = new InitSerialPortThread(serialDevices);
|
||||
initSerialPortThread.start();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private class InitSerialPortThread extends Thread {
|
||||
|
||||
private List<UsbSerialDevice> usbSerialDevices;
|
||||
|
||||
public InitSerialPortThread(List<UsbSerialDevice> usbSerialDevices) {
|
||||
this.usbSerialDevices = usbSerialDevices;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
for (UsbSerialDevice usbSerialDevice : usbSerialDevices) {
|
||||
if (usbSerialDevice.syncOpen()) {
|
||||
usbSerialDevice.setBaudRate(baudRate);
|
||||
usbSerialDevice.setDataBits(dataBits);
|
||||
usbSerialDevice.setStopBits(stopBits);
|
||||
usbSerialDevice.setParity(parity);
|
||||
usbSerialDevice.setFlowControl(flowControl);
|
||||
}
|
||||
}
|
||||
serialPortCallback.onSerialPortsDetected(serialDevices, true);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package com.felhr.usbserial;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public interface SerialPortCallback {
|
||||
void onSerialPortsDetected(List<UsbSerialDevice> serialPorts, boolean opened);
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
package com.felhr.usbserial;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public interface UsbPermissionInterface {
|
||||
void permissionsCallback(List<UsbSerialDevice> serialPorts);
|
||||
}
|
Ładowanie…
Reference in New Issue