From 6302a6645e6f97d4f0ccead0ba3418846d7f5cc6 Mon Sep 17 00:00:00 2001 From: rusEFI LLC Date: Thu, 31 Oct 2024 10:18:59 -0400 Subject: [PATCH] MassUpdater to deal with manual DFU only:mre_f4 --- .../java/com/rusefi/core/rusEFIVersion.java | 2 +- .../ui/src/main/java/MassUpdater.java | 35 ++++++++++++++++++- .../java/com/rusefi/SerialPortScanner.java | 1 + .../maintenance/jobs/AsyncJobExecutor.java | 8 ++++- 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/java_console/shared_io/src/main/java/com/rusefi/core/rusEFIVersion.java b/java_console/shared_io/src/main/java/com/rusefi/core/rusEFIVersion.java index d4cc2341f1..f723813884 100644 --- a/java_console/shared_io/src/main/java/com/rusefi/core/rusEFIVersion.java +++ b/java_console/shared_io/src/main/java/com/rusefi/core/rusEFIVersion.java @@ -10,7 +10,7 @@ public interface rusEFIVersion { * *** BE CAREFUL WE HAVE SEPARATE AUTOUPDATE_VERSION also managed manually *** * @see com.rusefi.autoupdate.Autoupdate#AUTOUPDATE_VERSION */ - int CONSOLE_VERSION = 20241028; + int CONSOLE_VERSION = 20241031; AtomicReference firmwareVersion = new AtomicReference<>("N/A"); static long classBuildTimeMillis() { diff --git a/java_console/ui/src/main/java/MassUpdater.java b/java_console/ui/src/main/java/MassUpdater.java index db32f43fab..6d1ad96b82 100644 --- a/java_console/ui/src/main/java/MassUpdater.java +++ b/java_console/ui/src/main/java/MassUpdater.java @@ -1,5 +1,8 @@ import com.rusefi.SerialPortScanner; +import com.rusefi.core.rusEFIVersion; +import com.rusefi.io.UpdateOperationCallbacks; import com.rusefi.maintenance.jobs.AsyncJobExecutor; +import com.rusefi.maintenance.jobs.DfuManualJob; import com.rusefi.maintenance.jobs.OpenBltManualJob; import com.rusefi.ui.StatusWindow; import com.rusefi.ui.widgets.ToolButtons; @@ -10,6 +13,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import static com.rusefi.SerialPortScanner.SerialPortType.OpenBlt; @@ -19,9 +23,38 @@ public class MassUpdater { private final Set knownBlts = new HashSet<>(); public MassUpdater() { - mainStatus.showFrame("Mass Updater"); + mainStatus.showFrame("Mass Updater " + rusEFIVersion.CONSOLE_VERSION); + + final AtomicBoolean previousDfuState = new AtomicBoolean(); + AtomicBoolean isUsingDfu = new AtomicBoolean(); // it seems like DFU detection is not 100% reliable? a work-around to avoid double-DFU SerialPortScanner.INSTANCE.addListener(currentHardware -> { + + if (!isUsingDfu.get() && currentHardware.isDfuFound() != previousDfuState.get()) { + mainStatus.append(currentHardware.isDfuFound() ? "I see a DFU device!" : "No DFU..."); + if (currentHardware.isDfuFound()) { + isUsingDfu.set(true); + UpdateOperationCallbacks releaseSemaphore = new UpdateOperationCallbacks() { + @Override + public void log(String message, boolean breakLineOnTextArea, boolean sendToLogger) { + + } + + @Override + public void done() { + isUsingDfu.set(false); + } + + @Override + public void error() { + isUsingDfu.set(false); + } + }; + SwingUtilities.invokeLater(() -> AsyncJobExecutor.INSTANCE.executeJob(new DfuManualJob(), releaseSemaphore)); + } + previousDfuState.set(currentHardware.isDfuFound()); + } + List currentBltList = currentHardware.getKnownPorts().stream().filter(portResult -> portResult.type == OpenBlt).collect(Collectors.toList()); Set currentSet = currentBltList.stream().map(portResult -> portResult.port).collect(Collectors.toSet()); for (Iterator it = knownBlts.iterator(); it.hasNext(); ) { 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 805c04eb77..256832e4d2 100644 --- a/java_console/ui/src/main/java/com/rusefi/SerialPortScanner.java +++ b/java_console/ui/src/main/java/com/rusefi/SerialPortScanner.java @@ -47,6 +47,7 @@ public enum SerialPortScanner { OpenBlt("OpenBLT Bootloader", 10), CAN("CAN", 30), Unknown("Unknown", 100), + // note that somewhere down we have DFU detection but not handled using this enum ; public final String friendlyString; diff --git a/java_console/ui/src/main/java/com/rusefi/maintenance/jobs/AsyncJobExecutor.java b/java_console/ui/src/main/java/com/rusefi/maintenance/jobs/AsyncJobExecutor.java index c7dca6b356..e841effdbf 100644 --- a/java_console/ui/src/main/java/com/rusefi/maintenance/jobs/AsyncJobExecutor.java +++ b/java_console/ui/src/main/java/com/rusefi/maintenance/jobs/AsyncJobExecutor.java @@ -1,6 +1,7 @@ package com.rusefi.maintenance.jobs; import com.rusefi.Launcher; +import com.rusefi.io.DoubleCallbacks; import com.rusefi.io.UpdateOperationCallbacks; import com.rusefi.maintenance.ExecHelper; import com.rusefi.maintenance.UpdateStatusWindow; @@ -11,8 +12,13 @@ public enum AsyncJobExecutor { INSTANCE; public void executeJob(final AsyncJob job) { + executeJob(job, UpdateOperationCallbacks.DUMMY); + } + + public void executeJob(final AsyncJob job, UpdateOperationCallbacks secondary) { final UpdateOperationCallbacks callbacks = new UpdateStatusWindow(appendBundleName(job.getName() + " " + Launcher.CONSOLE_VERSION)); - final Runnable jobWithSuspendedPortScanning = () -> job.doJob(callbacks); + final UpdateOperationCallbacks doubleCallbacks = new DoubleCallbacks(callbacks, secondary); + final Runnable jobWithSuspendedPortScanning = () -> job.doJob(doubleCallbacks); ExecHelper.submitAction(jobWithSuspendedPortScanning, "mx"); } }