diff --git a/java_console/io/src/main/java/com/rusefi/autodetect/PortDetector.java b/java_console/io/src/main/java/com/rusefi/autodetect/PortDetector.java index 3fb44f1059..fac3a838a5 100644 --- a/java_console/io/src/main/java/com/rusefi/autodetect/PortDetector.java +++ b/java_console/io/src/main/java/com/rusefi/autodetect/PortDetector.java @@ -9,8 +9,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; @@ -41,19 +41,19 @@ public class PortDetector { public static SerialAutoChecker.AutoDetectResult autoDetectSerial(Function callback, PortDetector.DetectorMode mode) { String rusEfiAddress = System.getProperty("rusefi.address"); if (rusEfiAddress != null) { - return getSignatureFromPorts(mode, callback, new String[] {rusEfiAddress}); + return getSignatureFromPorts(mode, callback, Set.of(rusEfiAddress)); } - String[] serialPorts = getPortNames(); - if (serialPorts.length == 0) { + final Set serialPorts = LinkManager.getCommPorts(); + if (serialPorts.isEmpty()) { log.error("No serial ports detected"); return new SerialAutoChecker.AutoDetectResult(null, null); } - log.info("Trying " + Arrays.toString(serialPorts)); + log.info("Trying [" + String.join(", ", serialPorts) + "]"); return getSignatureFromPorts(mode, callback, serialPorts); } @NotNull - private static SerialAutoChecker.AutoDetectResult getSignatureFromPorts(DetectorMode mode, Function callback, String[] serialPorts) { + private static SerialAutoChecker.AutoDetectResult getSignatureFromPorts(DetectorMode mode, Function callback, Set serialPorts) { List serialFinder = new ArrayList<>(); CountDownLatch portFound = new CountDownLatch(1); AtomicReference result = new AtomicReference<>(); @@ -103,13 +103,6 @@ public class PortDetector { return autoDetectSerial(callback, PortDetector.DetectorMode.DETECT_TS); } - private static String[] getPortNames() { -// long now = System.currentTimeMillis(); - String[] portNames = LinkManager.getCommPorts(); -// log.info("Took " + (System.currentTimeMillis() - now)); - return portNames; - } - @Nullable public static SerialAutoChecker.AutoDetectResult autoDetectPort(JFrame parent) { SerialAutoChecker.AutoDetectResult autoDetectedPort = autoDetectSerial(null); diff --git a/java_console/io/src/main/java/com/rusefi/io/LinkManager.java b/java_console/io/src/main/java/com/rusefi/io/LinkManager.java index 5eb7e251b1..f7246b9607 100644 --- a/java_console/io/src/main/java/com/rusefi/io/LinkManager.java +++ b/java_console/io/src/main/java/com/rusefi/io/LinkManager.java @@ -19,8 +19,10 @@ import org.jetbrains.annotations.NotNull; import java.io.Closeable; import java.util.Arrays; import java.util.Objects; +import java.util.Set; import java.util.TreeSet; import java.util.concurrent.*; +import java.util.stream.Collectors; import static com.devexperts.logging.Logging.getLogging; @@ -109,13 +111,10 @@ public class LinkManager implements Closeable { return COMMUNICATION_EXECUTOR.submit(runnable); } - public static String[] getCommPorts() { + public static Set getCommPorts() { SerialPort[] ports = SerialPort.getCommPorts(); // wow sometimes driver returns same port name more than once?! - TreeSet names = new TreeSet<>(); - for (SerialPort port : ports) - names.add(port.getSystemPortName()); - return names.toArray(new String[0]); + return Arrays.stream(ports).map(SerialPort::getSystemPortName).collect(Collectors.toCollection(TreeSet::new)); } public BinaryProtocol getBinaryProtocol() { @@ -306,8 +305,8 @@ public class LinkManager implements Closeable { return; close(); // Explicitly kill the connection (call connectors destructor??????) - String[] ports = getCommPorts(); - boolean isPortAvailableAgain = Arrays.asList(ports).contains(lastTriedPort); + final Set ports = getCommPorts(); + final boolean isPortAvailableAgain = ports.contains(lastTriedPort); log.info("restart isPortAvailableAgain=" + isPortAvailableAgain); if (isPortAvailableAgain) { connect(lastTriedPort); diff --git a/java_console/ui/src/main/java/com/rusefi/SerialPortScanner.java b/java_console/ui/src/main/java/com/rusefi/SerialPortScanner.java index 412c78dc60..8c251bca15 100644 --- a/java_console/ui/src/main/java/com/rusefi/SerialPortScanner.java +++ b/java_console/ui/src/main/java/com/rusefi/SerialPortScanner.java @@ -212,7 +212,7 @@ public enum SerialPortScanner { boolean stLinkConnected; boolean PCANConnected; - String[] serialPorts = LinkManager.getCommPorts(); + final Set serialPorts = LinkManager.getCommPorts(); List portsToInspect = new ArrayList<>(); @@ -241,7 +241,7 @@ public enum SerialPortScanner { // In any other scenario, auto could have unexpected behavior for the user List toRemove = new ArrayList<>(); for (String x : portCache.keySet()) { - if (Arrays.stream(serialPorts).noneMatch(x::equals)) { + if (!serialPorts.contains(x)) { toRemove.add(x); } } diff --git a/java_console/ui/src/main/java/com/rusefi/maintenance/ProgramSelector.java b/java_console/ui/src/main/java/com/rusefi/maintenance/ProgramSelector.java index 10170ad45d..629fff325c 100644 --- a/java_console/ui/src/main/java/com/rusefi/maintenance/ProgramSelector.java +++ b/java_console/ui/src/main/java/com/rusefi/maintenance/ProgramSelector.java @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -201,9 +202,9 @@ public class ProgramSelector { if (PortDetector.AUTO.equals(ecuPort)) { return true; } else { - final String[] currentPorts = LinkManager.getCommPorts(); + final Set currentPorts = LinkManager.getCommPorts(); log.info("currentPorts: [" + String.join(",", currentPorts) + "]"); - return !Arrays.stream(LinkManager.getCommPorts()).anyMatch(ecuPort::equals); + return !LinkManager.getCommPorts().contains(ecuPort); } }, callbacks @@ -211,17 +212,17 @@ public class ProgramSelector { } private static List waitForNewPortAppeared( - final String[] portsBefore, + final Set portsBefore, final UpdateOperationCallbacks callbacks ) { final List newPorts = new ArrayList<>(); waitForPredicate( "Waiting for new port to appear...", () -> { - final String[] portsAfter = LinkManager.getCommPorts(); + final Set portsAfter = LinkManager.getCommPorts(); log.info("portsAfter: [" + String.join(",", portsAfter) + "]"); for (String s : portsAfter) { - if (!Arrays.stream(portsBefore).anyMatch(s::equals)) { + if (!portsBefore.contains(s)) { // This item is in the after list but not before list newPorts.add(s); } @@ -235,7 +236,7 @@ public class ProgramSelector { private static void flashOpenbltSerialAutomatic(JComponent parent, String ecuPort, UpdateOperationCallbacks callbacks) { AutoupdateUtil.assertNotAwtThread(); - final String[] portsBefore = LinkManager.getCommPorts(); + final Set portsBefore = LinkManager.getCommPorts(); rebootToOpenblt(parent, ecuPort, callbacks); // invoking blocking method @@ -261,7 +262,7 @@ public class ProgramSelector { if (newItems.size() > 1) { // More than one port appeared? whattt? - callbacks.logLine("Unable to find ECU after reboot as multiple serial ports appeared. Before: " + portsBefore.length); + callbacks.logLine("Unable to find ECU after reboot as multiple serial ports appeared. Before: " + portsBefore.size()); callbacks.error(); return; }