From 30ccfee1e30ed62dee0cdb8f3611ec2cde57d41e Mon Sep 17 00:00:00 2001 From: rusefi Date: Sun, 5 Jul 2020 14:29:59 -0400 Subject: [PATCH] DFU switch works! --- android/app/build.gradle | 1 + .../java/com/rusefi/app/AndroidSerial.java | 36 ++++++++++++- .../src/main/java/com/rusefi/app/rusEFI.java | 51 ++++++++----------- 3 files changed, 56 insertions(+), 32 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index 79d9fd5637..ed135c3cd0 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -28,6 +28,7 @@ android { dependencies { implementation project(':ecu_io') + implementation project(':logging-api') implementation project(':shared_io') implementation files('lib/dfu_java.jar') diff --git a/android/app/src/main/java/com/rusefi/app/AndroidSerial.java b/android/app/src/main/java/com/rusefi/app/AndroidSerial.java index 57354db08e..7ec4a93838 100644 --- a/android/app/src/main/java/com/rusefi/app/AndroidSerial.java +++ b/android/app/src/main/java/com/rusefi/app/AndroidSerial.java @@ -5,14 +5,23 @@ import android.hardware.usb.UsbManager; import com.hoho.android.usbserial.driver.CdcAcmSerialDriver; import com.hoho.android.usbserial.driver.ProbeTable; import com.hoho.android.usbserial.driver.UsbSerialDriver; +import com.hoho.android.usbserial.driver.UsbSerialPort; import com.hoho.android.usbserial.driver.UsbSerialProber; +import com.opensr5.Logger; +import com.opensr5.io.DataListener; import com.rusefi.dfu.DfuLogic; +import com.rusefi.io.ByteReader; +import com.rusefi.io.IoStream; +import java.io.IOException; import java.util.List; -public class AndroidSerial { +public class AndroidSerial implements IoStream { private static final int ST_CDC = 0x5740; + private boolean isClosed; + private UsbSerialPort usbSerialPort; + static List findUsbSerial(UsbManager usbManager) { ProbeTable customTable = UsbSerialProber.getDefaultProbeTable(); customTable.addProduct(DfuLogic.ST_VENDOR, ST_CDC, CdcAcmSerialDriver.class); @@ -20,4 +29,29 @@ public class AndroidSerial { return prober.findAllDrivers(usbManager); } + + public AndroidSerial(UsbSerialPort usbSerialPort) { + this.usbSerialPort = usbSerialPort; + } + + @Override + public void setInputListener(DataListener listener) { + ByteReader reader = buffer -> usbSerialPort.read(buffer, 5000); + ByteReader.runReaderLoop(listener, reader, Logger.CONSOLE); + } + + @Override + public boolean isClosed() { + return isClosed; + } + + @Override + public void close() { + isClosed = true; + } + + @Override + public void write(byte[] bytes) throws IOException { + usbSerialPort.write(bytes, 1000); + } } diff --git a/android/app/src/main/java/com/rusefi/app/rusEFI.java b/android/app/src/main/java/com/rusefi/app/rusEFI.java index e87c8ab1f2..865f262002 100644 --- a/android/app/src/main/java/com/rusefi/app/rusEFI.java +++ b/android/app/src/main/java/com/rusefi/app/rusEFI.java @@ -32,8 +32,10 @@ import android.widget.TextView; import com.hoho.android.usbserial.driver.UsbSerialDriver; import com.hoho.android.usbserial.driver.UsbSerialPort; import com.hoho.android.usbserial.util.SerialInputOutputManager; +import com.opensr5.Logger; import com.rusefi.dfu.DfuImage; import com.rusefi.dfu.android.DfuDeviceLocator; +import com.rusefi.io.DfuHelper; import com.rusefi.shared.ConnectionAndMeta; import com.rusefi.shared.FileUtil; import com.rusefi.*; @@ -175,22 +177,16 @@ public class rusEFI extends Activity { UsbDevice dfuDevice = DfuDeviceLocator.findDevice(usbManager); - if (dfuDevice == null) { - mResultView.append("No DFU device\n"); - } else if (usbManager.hasPermission(dfuDevice)) { - dfuUpdate(dfuDevice); + if (dfuDevice != null) { + handleDfuDevice(dfuDevice); } else { - PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); - usbManager.requestPermission(dfuDevice, mPermissionIntent); + mResultView.append("No DFU device\n"); + handleSerialDevice(); } - - - if (1 == 1) - return; - - // listDevices(manager); + } + private void handleSerialDevice() { List availableDrivers = AndroidSerial.findUsbSerial(usbManager); if (availableDrivers.isEmpty()) { mStatusView.setText("Not connected"); @@ -212,27 +208,20 @@ public class rusEFI extends Activity { port.open(connection); port.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); - port.write("t".getBytes(), 500); - - SerialInputOutputManager usbIoManager = new SerialInputOutputManager(port, new SerialInputOutputManager.Listener() { - @Override - public void onNewData(final byte[] data) { - runOnUiThread(new Runnable() { - @Override - public void run() { - mResultView.append("WE GOT DATA: " + new String(data) + "\n"); - } - }); - } - - @Override - public void onRunError(Exception e) { - } - }); - Executors.newSingleThreadExecutor().submit(usbIoManager); + AndroidSerial serial = new AndroidSerial(port); + DfuHelper.sendDfuRebootCommand(serial, new StringBuilder(), Logger.CONSOLE); } catch (IOException e) { - e.printStackTrace(); + throw new IllegalStateException(e); + } + } + + private void handleDfuDevice(UsbDevice dfuDevice) { + if (usbManager.hasPermission(dfuDevice)) { + dfuUpdate(dfuDevice); + } else { + PendingIntent mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0); + usbManager.requestPermission(dfuDevice, mPermissionIntent); } }