From 3777b7662ffa720a0608fb1ffb9677e42f51cc0a Mon Sep 17 00:00:00 2001 From: rusefi Date: Sat, 14 Sep 2019 10:39:14 -0400 Subject: [PATCH] console usability: DFU buttons #921 --- .../ui/resources/com/rusefi/connect48.png | Bin 0 -> 3498 bytes .../ui/resources/com/rusefi/erase.png | Bin 0 -> 4093 bytes java_console/ui/src/com/rusefi/Launcher.java | 2 +- .../ui/src/com/rusefi/StartupFrame.java | 44 +++++++----- .../com/rusefi/maintenance/DfuFlasher.java | 44 ++++++------ .../src/com/rusefi/maintenance/EraseChip.java | 3 +- .../rusefi/maintenance/FirmwareFlasher.java | 24 +++---- .../rusefi/maintenance/ProgramSelector.java | 67 ++++++++++++++++++ .../ui/src/com/rusefi/ui/util/UiUtils.java | 1 - 9 files changed, 130 insertions(+), 55 deletions(-) create mode 100644 java_console/ui/resources/com/rusefi/connect48.png create mode 100644 java_console/ui/resources/com/rusefi/erase.png create mode 100644 java_console/ui/src/com/rusefi/maintenance/ProgramSelector.java diff --git a/java_console/ui/resources/com/rusefi/connect48.png b/java_console/ui/resources/com/rusefi/connect48.png new file mode 100644 index 0000000000000000000000000000000000000000..e873e64566d8a1b83e379c9ddc38b9bc8c7b426e GIT binary patch literal 3498 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 Y003=UXN44YY5)KL07*qoM6N<$f?lq$`Tzg` literal 0 HcmV?d00001 diff --git a/java_console/ui/resources/com/rusefi/erase.png b/java_console/ui/resources/com/rusefi/erase.png new file mode 100644 index 0000000000000000000000000000000000000000..1a75cab17dd23aa69a59e6eb5b1ae85bd931cff9 GIT binary patch literal 4093 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 literal 0 HcmV?d00001 diff --git a/java_console/ui/src/com/rusefi/Launcher.java b/java_console/ui/src/com/rusefi/Launcher.java index 951620eafc..534e674df6 100644 --- a/java_console/ui/src/com/rusefi/Launcher.java +++ b/java_console/ui/src/com/rusefi/Launcher.java @@ -48,7 +48,7 @@ import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; * @see EngineSnifferPanel */ public class Launcher { - public static final int CONSOLE_VERSION = 20190909; + public static final int CONSOLE_VERSION = 20190914; public static final String INI_FILE_PATH = System.getProperty("ini_file_path", ".."); public static final String INPUT_FILES_PATH = System.getProperty("input_files_path", ".."); public static final String TOOLS_PATH = System.getProperty("tools_path", "."); diff --git a/java_console/ui/src/com/rusefi/StartupFrame.java b/java_console/ui/src/com/rusefi/StartupFrame.java index 68d6088339..fc81141881 100644 --- a/java_console/ui/src/com/rusefi/StartupFrame.java +++ b/java_console/ui/src/com/rusefi/StartupFrame.java @@ -7,6 +7,7 @@ import com.rusefi.maintenance.*; import com.rusefi.ui.util.HorizontalLine; import com.rusefi.ui.util.URLLabel; import com.rusefi.ui.util.UiUtils; +import net.miginfocom.swing.MigLayout; import org.jetbrains.annotations.NotNull; import org.putgemin.VerticalFlowLayout; @@ -40,6 +41,7 @@ public class StartupFrame { private static final String LOGO = "logo.gif"; public static final String LINK_TEXT = "rusEfi (c) 2012-2019"; private static final String URI = "http://rusefi.com/?java_console"; + // private static final int RUSEFI_ORANGE = 0xff7d03; private final JFrame frame; private final JPanel connectPanel = new JPanel(new FlowLayout()); @@ -50,8 +52,8 @@ public class StartupFrame { private boolean isFirstTimeApplyingPorts = true; private JPanel leftPanel = new JPanel(new VerticalFlowLayout()); - private JPanel realHardwarePanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.LEADING, 5, 10)); - private JPanel miscPanel = new JPanel(new VerticalFlowLayout(VerticalFlowLayout.TRAILING)) { + private JPanel realHardwarePanel = new JPanel(new MigLayout()); + private JPanel miscPanel = new JPanel(new MigLayout()) { @Override public Dimension getPreferredSize() { // want miscPanel and realHardwarePanel to be the same width @@ -104,11 +106,11 @@ public class StartupFrame { comboSpeeds.setToolTipText("For 'STMicroelectronics Virtual COM Port' device any speed setting would work the same"); connectPanel.add(comboSpeeds); - final JButton connect = new JButton("Connect"); - connect.setBackground(new Color(0xff7d03)); // custom orange - setToolTip(connect, "Connect to real hardware"); - connectPanel.add(connect); - connect.addActionListener(new ActionListener() { + final JButton connectButton = new JButton("Connect", new ImageIcon(getClass().getResource("/com/rusefi/connect48.png"))); + //connectButton.setBackground(new Color(RUSEFI_ORANGE)); // custom orange + setToolTip(connectButton, "Connect to real hardware"); + connectPanel.add(connectButton); + connectButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { PortHolder.BAUD_RATE = Integer.parseInt((String) comboSpeeds.getSelectedItem()); @@ -131,23 +133,29 @@ public class StartupFrame { JPanel topButtons = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0)); topButtons.add(createShowDeviceManagerButton()); topButtons.add(DriverInstall.createButton()); - realHardwarePanel.add(topButtons); + realHardwarePanel.add(topButtons, "right, wrap"); } - realHardwarePanel.add(connectPanel); - realHardwarePanel.add(noPortsMessage); + realHardwarePanel.add(connectPanel, "right, wrap"); + realHardwarePanel.add(noPortsMessage, "right, wrap"); installMessage(noPortsMessage, "Check you cables. Check your drivers. Do you want to start simulator maybe?"); if (FileLog.isWindows()) { - realHardwarePanel.add(new HorizontalLine()); - realHardwarePanel.add(new DfuFlasher(comboPorts).getAutoButton()); - realHardwarePanel.add(new DfuFlasher(comboPorts).getManualButton()); + realHardwarePanel.add(new HorizontalLine(), "right, wrap"); + + ProgramSelector selector = new ProgramSelector(comboPorts); + realHardwarePanel.add(selector.getControl(), "right, wrap"); + + +// realHardwarePanel.add(new DfuFlasher(comboPorts).getAutoButton()); +// realHardwarePanel.add(new DfuFlasher(comboPorts).getManualButton()); // for F7 builds we just build one file at the moment - realHardwarePanel.add(new FirmwareFlasher(FirmwareFlasher.IMAGE_FILE, "ST-LINK Program Firmware", "Default firmware version for most users").getButton()); +// realHardwarePanel.add(new FirmwareFlasher(FirmwareFlasher.IMAGE_FILE, "ST-LINK Program Firmware", "Default firmware version for most users").getButton()); if (new File(FirmwareFlasher.IMAGE_NO_ASSERTS_FILE).exists()) { // 407 build - realHardwarePanel.add(new FirmwareFlasher(FirmwareFlasher.IMAGE_NO_ASSERTS_FILE, "ST-LINK Program Firmware/NoAsserts", "Please only use this version if you know that you need this version").getButton()); + FirmwareFlasher firmwareFlasher = new FirmwareFlasher(FirmwareFlasher.IMAGE_NO_ASSERTS_FILE, "ST-LINK Program Firmware/NoAsserts", "Please only use this version if you know that you need this version"); + realHardwarePanel.add(firmwareFlasher.getButton(), "right, wrap"); } - realHardwarePanel.add(new EraseChip().getButton()); + realHardwarePanel.add(new EraseChip().getButton(), "right, wrap"); } SerialPortScanner.INSTANCE.listeners.add(new SerialPortScanner.Listener() { @@ -184,8 +192,8 @@ public class StartupFrame { } }); - miscPanel.add(buttonLogViewer); - miscPanel.add(new HorizontalLine()); + miscPanel.add(buttonLogViewer, "wrap"); + miscPanel.add(new HorizontalLine(), "wrap"); miscPanel.add(SimulatorHelper.createSimulatorComponent(this)); diff --git a/java_console/ui/src/com/rusefi/maintenance/DfuFlasher.java b/java_console/ui/src/com/rusefi/maintenance/DfuFlasher.java index d9d9cec63a..cd3316ace5 100644 --- a/java_console/ui/src/com/rusefi/maintenance/DfuFlasher.java +++ b/java_console/ui/src/com/rusefi/maintenance/DfuFlasher.java @@ -34,35 +34,37 @@ public class DfuFlasher { button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { - String port = comboPorts.getSelectedItem().toString(); - port = PortDetector.autoDetectSerialIfNeeded(port); - if (port == null) { - JOptionPane.showMessageDialog(Launcher.getFrame(), "rusEfi serial port not detected"); - return; - } - IoStream stream = SerialIoStreamJSerialComm.open(port, PortHolder.BAUD_RATE, FileLog.LOGGER); - byte[] command = BinaryProtocol.getTextCommandBytes(Fields.CMD_REBOOT_DFU); - try { - stream.sendPacket(command, FileLog.LOGGER); - stream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - runDfuProgramming(); + doAutoDfu(comboPorts); } }); manualButton.addActionListener(e -> runDfuProgramming()); } - private void runDfuProgramming() { - StatusWindow wnd = new StatusWindow(); - wnd.showFrame("DFU status"); - ExecHelper.submitAction(() -> executeDFU(wnd), getClass() + " thread"); + 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; + } + IoStream stream = SerialIoStreamJSerialComm.open(port, PortHolder.BAUD_RATE, FileLog.LOGGER); + byte[] command = BinaryProtocol.getTextCommandBytes(Fields.CMD_REBOOT_DFU); + try { + stream.sendPacket(command, FileLog.LOGGER); + stream.close(); + } catch (IOException ignored) { + } + runDfuProgramming(); } - private void executeDFU(StatusWindow wnd) { + public static void runDfuProgramming() { + StatusWindow wnd = new StatusWindow(); + wnd.showFrame("DFU status"); + ExecHelper.submitAction(() -> executeDFU(wnd), DfuFlasher.class + " thread"); + } + + private static void executeDFU(StatusWindow wnd) { wnd.appendMsg("Giving time for USB enumeration..."); try { Thread.sleep(3 * Timeouts.SECOND); diff --git a/java_console/ui/src/com/rusefi/maintenance/EraseChip.java b/java_console/ui/src/com/rusefi/maintenance/EraseChip.java index 9176ff3b70..5a51e5cf28 100644 --- a/java_console/ui/src/com/rusefi/maintenance/EraseChip.java +++ b/java_console/ui/src/com/rusefi/maintenance/EraseChip.java @@ -1,6 +1,7 @@ package com.rusefi.maintenance; import com.rusefi.ui.StatusWindow; +import com.rusefi.ui.util.UiUtils; import org.jetbrains.annotations.NotNull; import javax.swing.*; @@ -15,7 +16,7 @@ public class EraseChip { private static final String FLASH_SIZE = "0x0100000"; private static final String ERASE_COMMAND_SUFFIX = " -c init -c targets -c \"halt\" -c \"flash erase_address 0x08000000 " + FLASH_SIZE + "\" -c shutdown"; - private final JButton button = new JButton("ST-LINK Erase Chip"); + private final JButton button = new JButton("ST-LINK Erase Chip", UiUtils.loadIcon("/com/rusefi/erase.png")); private StatusWindow wnd = new StatusWindow(); public EraseChip() { diff --git a/java_console/ui/src/com/rusefi/maintenance/FirmwareFlasher.java b/java_console/ui/src/com/rusefi/maintenance/FirmwareFlasher.java index 6c945d55e6..3d7c70dd64 100644 --- a/java_console/ui/src/com/rusefi/maintenance/FirmwareFlasher.java +++ b/java_console/ui/src/com/rusefi/maintenance/FirmwareFlasher.java @@ -36,26 +36,24 @@ public class FirmwareFlasher { private final JButton button; private String fileName; - private StatusWindow wnd = new StatusWindow(); public FirmwareFlasher(String fileName, String buttonTest, String tooltip) { this.fileName = fileName; button = new JButton(buttonTest); button.setToolTipText(tooltip); - button.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent event) { - int dialogResult = JOptionPane.showConfirmDialog(button, "Do you really want to update firmware? Please disconnect vehicle battery before erasing.", - "Please disconnect from vehicle", JOptionPane.YES_NO_OPTION); - if (dialogResult != JOptionPane.YES_OPTION) - return; + button.addActionListener(event -> doUpdateFirmware(fileName, button)); + } + public static void doUpdateFirmware(String fileName, JComponent component) { + StatusWindow wnd = new StatusWindow(); + int dialogResult = JOptionPane.showConfirmDialog(component, "Do you really want to update firmware? Please disconnect vehicle battery before erasing.", + "Please disconnect from vehicle", JOptionPane.YES_NO_OPTION); + if (dialogResult != JOptionPane.YES_OPTION) + return; - wnd.showFrame(TITLE); + wnd.showFrame(TITLE); - ExecHelper.submitAction(() -> doFlashFirmware(), getClass() + " extProcessThread"); - } - }); + ExecHelper.submitAction(() -> doFlashFirmware(wnd, fileName), FirmwareFlasher.class + " extProcessThread"); } public static String getOpenocdCommand() { @@ -69,7 +67,7 @@ public class FirmwareFlasher { OPENOCD_EXE, wnd); } - private void doFlashFirmware() { + private static void doFlashFirmware(StatusWindow wnd, String fileName) { if (!new File(fileName).exists()) { wnd.appendMsg(fileName + " not found, cannot proceed !!!"); wnd.setStatus("ERROR"); diff --git a/java_console/ui/src/com/rusefi/maintenance/ProgramSelector.java b/java_console/ui/src/com/rusefi/maintenance/ProgramSelector.java new file mode 100644 index 0000000000..9a60505e7a --- /dev/null +++ b/java_console/ui/src/com/rusefi/maintenance/ProgramSelector.java @@ -0,0 +1,67 @@ +package com.rusefi.maintenance; + +import com.rusefi.ui.util.UiUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Arrays; + +import static com.rusefi.ui.storage.PersistentConfiguration.getConfig; + +public class ProgramSelector { + + private static final String AUTO_DFU = "Auto DFU"; + private static final String MANUAL_DFU = "Manual DFU"; + private static final String ST_LINK = "ST-LINK"; + + private final JPanel controls = new JPanel(new FlowLayout()); + private final JComboBox mode = new JComboBox(); + + public ProgramSelector(JComboBox comboPorts) { + /** + * todo: add FULL AUTO mode which would fire up DFU and ST-LINK in parallel hoping that one of those would work? + */ + mode.addItem(AUTO_DFU); + mode.addItem(MANUAL_DFU); + mode.addItem(ST_LINK); + + controls.add(mode); + + String persistedMode = getConfig().getRoot().getProperty(getClass().getSimpleName()); + if (Arrays.asList(AUTO_DFU, MANUAL_DFU, ST_LINK).contains(persistedMode)) + mode.setSelectedItem(persistedMode); + + JButton updateFirmware = new JButton("Update Firmware", + UiUtils.loadIcon("/com/rusefi/upload48.jpg")); + controls.add(updateFirmware); + + updateFirmware.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String selectedMode = (String) mode.getSelectedItem(); + + getConfig().getRoot().setProperty(getClass().getSimpleName(), selectedMode); + + + boolean isAutoDfu = selectedMode.equals(AUTO_DFU); + boolean isManualDfu = selectedMode.equals(MANUAL_DFU); + // todo: add ST-LINK no-assert mode + + if (isAutoDfu) { + DfuFlasher.doAutoDfu(comboPorts); + } else if (isManualDfu){ + DfuFlasher.runDfuProgramming(); + } else { + FirmwareFlasher.doUpdateFirmware(FirmwareFlasher.IMAGE_FILE, updateFirmware); + } + } + }); + + } + + public JPanel getControl() { + return controls; + } +} diff --git a/java_console/ui/src/com/rusefi/ui/util/UiUtils.java b/java_console/ui/src/com/rusefi/ui/util/UiUtils.java index fbce437c7e..74caba77af 100644 --- a/java_console/ui/src/com/rusefi/ui/util/UiUtils.java +++ b/java_console/ui/src/com/rusefi/ui/util/UiUtils.java @@ -5,7 +5,6 @@ import org.jetbrains.annotations.NotNull; import javax.imageio.ImageIO; import javax.swing.*; -import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; import java.awt.image.BufferedImage;