diff --git a/java_console/ui/src/com/rusefi/autodetect/PortDetector.java b/java_console/ui/src/com/rusefi/autodetect/PortDetector.java index 7eacc95bac..d0965ea775 100644 --- a/java_console/ui/src/com/rusefi/autodetect/PortDetector.java +++ b/java_console/ui/src/com/rusefi/autodetect/PortDetector.java @@ -1,6 +1,7 @@ package com.rusefi.autodetect; import com.rusefi.FileLog; +import com.rusefi.io.IoStream; import jssc.SerialPortList; import org.jetbrains.annotations.Nullable; @@ -11,6 +12,7 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; /** * (c) Andrey Belomutskiy 2013-2019 @@ -18,8 +20,9 @@ import java.util.concurrent.atomic.AtomicReference; public class PortDetector { /** * Connect to all serial ports and find out which one respond first + * @param callback */ - public static String autoDetectSerial() { + public static String autoDetectSerial(Function callback) { String[] serialPorts = getPortNames(); if (serialPorts.length == 0) { System.err.println("No serial ports detected"); @@ -30,7 +33,7 @@ public class PortDetector { CountDownLatch portFound = new CountDownLatch(1); AtomicReference result = new AtomicReference<>(); for (String serialPort : serialPorts) { - Thread thread = new Thread(new SerialAutoChecker(serialPort, portFound, result)); + Thread thread = new Thread(new SerialAutoChecker(serialPort, portFound, result, callback)); serialFinder.add(thread); thread.start(); } @@ -55,7 +58,7 @@ public class PortDetector { @Nullable public static String autoDetectPort(JFrame parent) { - String autoDetectedPort = autoDetectSerial(); + String autoDetectedPort = autoDetectSerial(null); if (autoDetectedPort == null) { JOptionPane.showMessageDialog(parent, "Failed to located device"); return null; @@ -64,8 +67,12 @@ public class PortDetector { } public static String autoDetectSerialIfNeeded(String port) { - if (!port.toLowerCase().startsWith("auto")) + if (!isAutoPort(port)) return port; - return autoDetectSerial(); + return autoDetectSerial(null); + } + + public static boolean isAutoPort(String port) { + return port.toLowerCase().startsWith("auto"); } } diff --git a/java_console/ui/src/com/rusefi/autodetect/SerialAutoChecker.java b/java_console/ui/src/com/rusefi/autodetect/SerialAutoChecker.java index 36f57fb42a..c665b8bcc9 100644 --- a/java_console/ui/src/com/rusefi/autodetect/SerialAutoChecker.java +++ b/java_console/ui/src/com/rusefi/autodetect/SerialAutoChecker.java @@ -12,6 +12,7 @@ import com.rusefi.io.serial.SerialIoStreamJSerialComm; import java.io.IOException; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; import static com.rusefi.binaryprotocol.IoHelper.checkResponseCode; @@ -19,12 +20,18 @@ public class SerialAutoChecker implements Runnable { private final String serialPort; private final CountDownLatch portFound; private final AtomicReference result; + private final Function callback; public static String SIGNATURE; - public SerialAutoChecker(String serialPort, CountDownLatch portFound, AtomicReference result) { + public SerialAutoChecker(String serialPort, CountDownLatch portFound, AtomicReference result, Function callback) { this.serialPort = serialPort; this.portFound = portFound; this.result = result; + this.callback = callback; + } + + public SerialAutoChecker(String serialPort, CountDownLatch portFound, AtomicReference result) { + this(serialPort, portFound, result, null); } @Override @@ -42,6 +49,9 @@ public class SerialAutoChecker implements Runnable { System.out.println("Got " + signature + " from " + serialPort); String signatureWithoutMinorVersion = Fields.TS_SIGNATURE.substring(0, Fields.TS_SIGNATURE.length() - 2); if (signature.startsWith(signatureWithoutMinorVersion)) { + if (callback != null) { + callback.apply(stream); + } result.set(serialPort); portFound.countDown(); } diff --git a/java_console/ui/src/com/rusefi/maintenance/DfuFlasher.java b/java_console/ui/src/com/rusefi/maintenance/DfuFlasher.java index cac75c4fcf..b12b43ebc6 100644 --- a/java_console/ui/src/com/rusefi/maintenance/DfuFlasher.java +++ b/java_console/ui/src/com/rusefi/maintenance/DfuFlasher.java @@ -18,6 +18,7 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; +import java.util.function.Function; /** * @see FirmwareFlasher @@ -42,19 +43,42 @@ public class DfuFlasher { public static void doAutoDfu(JComboBox comboPorts) { String port = comboPorts.getSelectedItem().toString(); - port = PortDetector.autoDetectSerialIfNeeded(port); - if (port == null) { - JOptionPane.showMessageDialog(Launcher.getFrame(), "rusEfi serial port not detected"); - return; + StringBuilder messages = new StringBuilder(); + + if (!PortDetector.isAutoPort(port)) { + messages.append("Using selected " + port + "\n"); + IoStream stream = SerialIoStreamJSerialComm.openPort(port); + sendDfuRebootCommand(stream, messages); + } else { + messages.append("Auto-detecting port...\n"); + // instead of opening the just-detected port we execute the command using the same stream we used to discover port + // it's more reliable this way + port = PortDetector.autoDetectSerial(stream -> { + sendDfuRebootCommand(stream, messages); + return null; + }); + if (port == null) { + JOptionPane.showMessageDialog(Launcher.getFrame(), "rusEfi serial port not detected"); + return; + } else { + messages.append("Detected rusEFI on " + port + "\n"); + } } - IoStream stream = SerialIoStreamJSerialComm.openPort(port); + StatusWindow wnd = new StatusWindow(); + wnd.showFrame("DFU status " + Launcher.CONSOLE_VERSION); + wnd.appendMsg(messages.toString()); + ExecHelper.submitAction(() -> executeDFU(wnd), DfuFlasher.class + " thread"); + } + + private static void sendDfuRebootCommand(IoStream stream, StringBuilder messages) { byte[] command = BinaryProtocol.getTextCommandBytes(Fields.CMD_REBOOT_DFU); try { stream.sendPacket(command, FileLog.LOGGER); stream.close(); - } catch (IOException ignored) { + messages.append("Reboot command sent!\n"); + } catch (IOException e) { + messages.append("Error " + e); } - runDfuProgramming(); } public static void runDfuProgramming() { diff --git a/java_console/ui/src/com/rusefi/tools/ConsoleTools.java b/java_console/ui/src/com/rusefi/tools/ConsoleTools.java index a9a91c8317..fbde207f27 100644 --- a/java_console/ui/src/com/rusefi/tools/ConsoleTools.java +++ b/java_console/ui/src/com/rusefi/tools/ConsoleTools.java @@ -142,7 +142,7 @@ public class ConsoleTools { } }); - String autoDetectedPort = PortDetector.autoDetectSerial(); + String autoDetectedPort = PortDetector.autoDetectSerial(null); if (autoDetectedPort == null) { System.err.println("rusEFI not detected"); return; @@ -206,7 +206,7 @@ public class ConsoleTools { @Nullable private static String autoDetectPort() { - String autoDetectedPort = PortDetector.autoDetectSerial(); + String autoDetectedPort = PortDetector.autoDetectSerial(null); if (autoDetectedPort == null) { System.err.println("rusEFI not detected"); return null;