added disconnectDevice method and finishing example

pull/177/head
Felipe Herranz 2018-11-11 16:46:08 +01:00
rodzic 274cf71f62
commit 8846e3d9ce
4 zmienionych plików z 120 dodań i 1 usunięć

Wyświetl plik

@ -16,6 +16,12 @@ android {
}
compileOptions {
encoding "UTF-8"
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {
minifyEnabled false
@ -33,4 +39,7 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation project(':usbserial')
implementation 'com.annimon:stream:1.2.1'
}

Wyświetl plik

@ -1,11 +1,25 @@
package com.felhr.examplemultipleports;
import android.app.Service;
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.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;
import com.annimon.stream.Stream;
import com.felhr.usbserial.SerialPortBuilder;
import com.felhr.usbserial.SerialPortCallback;
import com.felhr.usbserial.UsbSerialDevice;
import com.felhr.usbserial.UsbSerialInterface;
import java.util.List;
/**
* Created by Felipe Herranz(felhr85@gmail.com) on 09/11/2018.
@ -30,10 +44,75 @@ public class UsbService extends Service {
private static final int BAUD_RATE = 9600; // BaudRate. Change this value if you need
public static boolean SERVICE_CONNECTED = false;
private List<UsbSerialDevice> serialPorts;
private Context context;
private UsbManager usbManager;
private SerialPortBuilder builder;
private IBinder binder = new UsbBinder();
private Handler mHandler;
/*
* Different notifications from OS will be received here (USB attached, detached, permission responses...)
* About BroadcastReceiver: http://developer.android.com/reference/android/content/BroadcastReceiver.html
*/
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context arg0, Intent arg1) {
if (arg1.getAction().equals(ACTION_USB_ATTACHED)) {
boolean ret = builder.openSerialPorts(context, BAUD_RATE,
UsbSerialInterface.DATA_BITS_8,
UsbSerialInterface.STOP_BITS_1,
UsbSerialInterface.PARITY_NONE,
UsbSerialInterface.FLOW_CONTROL_OFF);
if(ret)
Toast.makeText(context, "Couldnt open the device", Toast.LENGTH_SHORT).show();
} else if (arg1.getAction().equals(ACTION_USB_DETACHED)) {
UsbDevice usbDevice = arg1.getParcelableExtra(UsbManager.EXTRA_DEVICE);
List<UsbSerialDevice> filteredDevice = Stream.of(serialPorts)
.filter(p -> usbDevice.getDeviceId() == p.getDeviceId())
.toList();
if(filteredDevice.size() == 1){
UsbSerialDevice disconnectedDevice = filteredDevice.get(0);
disconnectedDevice.syncClose();
}
Intent intent = new Intent(ACTION_USB_DISCONNECTED);
arg0.sendBroadcast(intent);
}
}
};
private final SerialPortCallback serialPortCallback = new SerialPortCallback() {
@Override
public void onSerialPortsDetected(List<UsbSerialDevice> serialPorts, boolean opened) {
//TODO!!
}
};
@Override
public void onCreate() {
this.context = this;
UsbService.SERVICE_CONNECTED = true;
setFilter();
usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
builder = SerialPortBuilder.createSerialPortBuilder(serialPortCallback);
boolean ret = builder.openSerialPorts(context, BAUD_RATE,
UsbSerialInterface.DATA_BITS_8,
UsbSerialInterface.STOP_BITS_1,
UsbSerialInterface.PARITY_NONE,
UsbSerialInterface.FLOW_CONTROL_OFF);
if(!ret)
Toast.makeText(context, "No Usb serial ports available", Toast.LENGTH_SHORT).show();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
@ -44,6 +123,15 @@ public class UsbService extends Service {
this.mHandler = mHandler;
}
private void setFilter() {
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_USB_PERMISSION);
filter.addAction(ACTION_USB_DETACHED);
filter.addAction(ACTION_USB_ATTACHED);
registerReceiver(usbReceiver, filter);
}
public class UsbBinder extends Binder {
public UsbService getService() {
return UsbService.this;

Wyświetl plik

@ -93,6 +93,17 @@ public class SerialPortBuilder {
return getSerialPorts(context);
}
public void disconnectDevice(UsbDevice usbDevice){
List<UsbSerialDevice> filteredDevice = Stream.of(serialDevices)
.filter(p -> usbDevice.getDeviceId() == p.getDeviceId())
.toList();
if(filteredDevice.size() == 1){
UsbSerialDevice disconnectedDevice = filteredDevice.get(0);
disconnectedDevice.syncClose();
}
}
private boolean requestPermission(Context context){
if(!devices.get(index).open) {
PendingIntent mPendingIntent = PendingIntent.getBroadcast(context, 0, new Intent(ACTION_USB_PERMISSION), 0);

Wyświetl plik

@ -3,7 +3,6 @@ package com.felhr.usbserial;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
import com.annimon.stream.Stream;
import com.felhr.deviceids.CH34xIds;
@ -247,6 +246,18 @@ public abstract class UsbSerialDevice implements UsbSerialInterface
return outputStream;
}
public int getVid(){
return device.getVendorId();
}
public int getPid(){
return device.getProductId();
}
public int getDeviceId(){
return device.getDeviceId();
}
//Debug options
public void debug(boolean value)
{