rusefi/android/app/src/main/java/com/rusefi/app/serial/AndroidSerial.java

111 lines
4.0 KiB
Java
Raw Normal View History

2020-08-15 15:05:50 -07:00
package com.rusefi.app.serial;
2020-07-03 10:20:11 -07:00
2020-08-16 14:51:23 -07:00
import android.annotation.SuppressLint;
import android.hardware.usb.UsbDevice;
2020-08-15 17:05:09 -07:00
import android.hardware.usb.UsbDeviceConnection;
2020-07-03 10:20:11 -07:00
import android.hardware.usb.UsbManager;
2020-08-15 17:05:09 -07:00
import android.widget.TextView;
2020-07-03 10:20:11 -07:00
import com.hoho.android.usbserial.driver.CdcAcmSerialDriver;
import com.hoho.android.usbserial.driver.ProbeTable;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
2020-07-05 11:29:59 -07:00
import com.hoho.android.usbserial.driver.UsbSerialPort;
2020-07-03 10:20:11 -07:00
import com.hoho.android.usbserial.driver.UsbSerialProber;
2020-07-05 11:29:59 -07:00
import com.opensr5.io.DataListener;
import com.rusefi.app.PermissionGrantedAction;
import com.rusefi.app.rusEFI;
2020-07-08 16:58:23 -07:00
import com.rusefi.binaryprotocol.IncomingDataBuffer;
2020-07-03 10:20:11 -07:00
import com.rusefi.dfu.DfuLogic;
2020-07-05 11:29:59 -07:00
import com.rusefi.io.ByteReader;
2020-07-22 12:22:56 -07:00
import com.rusefi.io.serial.AbstractIoStream;
2020-07-03 10:20:11 -07:00
2020-08-15 17:05:09 -07:00
import org.jetbrains.annotations.Nullable;
2020-07-05 11:29:59 -07:00
import java.io.IOException;
2020-08-15 17:05:09 -07:00
import java.util.Date;
2020-07-03 10:20:11 -07:00
import java.util.List;
2020-07-22 12:22:56 -07:00
public class AndroidSerial extends AbstractIoStream {
2020-07-03 10:20:11 -07:00
private static final int ST_CDC = 0x5740;
2020-07-09 08:51:52 -07:00
private final IncomingDataBuffer dataBuffer;
2020-07-03 10:20:11 -07:00
2020-07-05 11:29:59 -07:00
private UsbSerialPort usbSerialPort;
2020-08-15 15:05:50 -07:00
public static List<UsbSerialDriver> findUsbSerial(UsbManager usbManager) {
2020-07-03 10:20:11 -07:00
ProbeTable customTable = UsbSerialProber.getDefaultProbeTable();
customTable.addProduct(DfuLogic.ST_VENDOR, ST_CDC, CdcAcmSerialDriver.class);
UsbSerialProber prober = new UsbSerialProber(customTable);
return prober.findAllDrivers(usbManager);
}
2020-07-05 11:29:59 -07:00
2020-07-24 09:44:29 -07:00
public AndroidSerial(UsbSerialPort usbSerialPort) {
2020-07-05 11:29:59 -07:00
this.usbSerialPort = usbSerialPort;
2023-07-08 18:07:59 -07:00
dataBuffer = createDataBuffer();
2020-07-18 21:14:59 -07:00
}
private static UsbSerialDriver getSerialDriver(rusEFI rusEFI, TextView mStatusView, UsbManager usbManager, PermissionGrantedAction action) {
2020-08-15 17:05:09 -07:00
List<UsbSerialDriver> availableDrivers = findUsbSerial(usbManager);
if (availableDrivers.isEmpty()) {
mStatusView.setText("Serial not found");
rusEFI.visibleLogAppend("No serial devices " + new Date() + "\n");
2020-08-15 17:05:09 -07:00
return null;
}
mStatusView.setText("rusEFI: " + availableDrivers.size() + " device(s)");
UsbSerialDriver driver = availableDrivers.get(0);
UsbDevice usbDevice = driver.getDevice();
if (!usbManager.hasPermission(usbDevice)) {
mStatusView.setText("Need permission");
rusEFI.requestUsbPermission(usbDevice, action);
return null;
}
return driver;
}
@SuppressLint("SetTextI18n")
@Nullable
public static AndroidSerial getAndroidSerial(rusEFI rusEFI, TextView mStatusView, UsbManager usbManager) {
// todo: should support separate actions not default to dashboard!
UsbSerialDriver driver = getSerialDriver(rusEFI, mStatusView, usbManager, PermissionGrantedAction.DASHBOARD);
if (driver == null) {
// error already reported to UI or permission request was fired
return null;
}
2020-08-15 17:05:09 -07:00
UsbDeviceConnection connection = usbManager.openDevice(driver.getDevice());
if (connection == null) {
// add UsbManager.requestPermission(driver.getDevice(), ..) handling here
mStatusView.setText("Unable to open serial");
return null;
}
UsbSerialPort port = driver.getPorts().get(0); // Most devices have just one port (port 0)
try {
port.open(connection);
port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
} catch (IOException e) {
2020-08-16 14:51:23 -07:00
mStatusView.append("Error opening " + e);
return null;
2020-08-15 17:05:09 -07:00
}
return new AndroidSerial(port);
}
2020-07-08 16:58:23 -07:00
@Override
public IncomingDataBuffer getDataBuffer() {
2020-07-09 08:51:52 -07:00
return dataBuffer;
2020-07-08 16:58:23 -07:00
}
2020-07-05 11:29:59 -07:00
@Override
public void setInputListener(DataListener listener) {
ByteReader reader = buffer -> usbSerialPort.read(buffer, 5000);
2020-07-25 17:11:34 -07:00
ByteReader.runReaderLoop("", listener, reader, this);
2020-07-05 11:29:59 -07:00
}
@Override
public void write(byte[] bytes) throws IOException {
usbSerialPort.write(bytes, 1000);
}
2020-07-03 10:20:11 -07:00
}