diff --git a/app/src/cc/arduino/view/preferences/Preferences.java b/app/src/cc/arduino/view/preferences/Preferences.java index 4ecbd26c122..c8690d99e8e 100644 --- a/app/src/cc/arduino/view/preferences/Preferences.java +++ b/app/src/cc/arduino/view/preferences/Preferences.java @@ -131,6 +131,7 @@ private void initComponents() { verifyUploadBox = new javax.swing.JCheckBox(); externalEditorBox = new javax.swing.JCheckBox(); cacheCompiledCore = new javax.swing.JCheckBox(); + autoselectBoard = new javax.swing.JCheckBox(); checkUpdatesBox = new javax.swing.JCheckBox(); updateExtensionBox = new javax.swing.JCheckBox(); saveVerifyUploadBox = new javax.swing.JCheckBox(); @@ -275,6 +276,9 @@ public void mouseEntered(java.awt.event.MouseEvent evt) { cacheCompiledCore.setText(tr("Aggressively cache compiled core")); checkboxesContainer.add(cacheCompiledCore); + autoselectBoard.setText(tr("Automatically use the correct target when selecting a known serial port")); + checkboxesContainer.add(autoselectBoard); + checkUpdatesBox.setText(tr("Check for updates on startup")); checkboxesContainer.add(checkUpdatesBox); @@ -710,6 +714,7 @@ private void autoScaleCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {// private javax.swing.JButton extendedAdditionalUrlFieldWindow; private javax.swing.JCheckBox externalEditorBox; private javax.swing.JCheckBox cacheCompiledCore; + private javax.swing.JCheckBox autoselectBoard; private javax.swing.JTextField fontSizeField; private javax.swing.JLabel fontSizeLabel; private javax.swing.JLabel jLabel1; @@ -806,6 +811,8 @@ private void savePreferencesData() { PreferencesData.setBoolean("compiler.cache_core", cacheCompiledCore.isSelected()); + PreferencesData.setBoolean("editor.autoselectboard", autoselectBoard.isSelected()); + PreferencesData.setBoolean("update.check", checkUpdatesBox.isSelected()); PreferencesData.setBoolean("editor.update_extension", updateExtensionBox.isSelected()); @@ -868,6 +875,8 @@ private void showPrerefencesData() { cacheCompiledCore.setSelected(PreferencesData.get("compiler.cache_core") == null || PreferencesData.getBoolean("compiler.cache_core")); + autoselectBoard.setSelected(PreferencesData.getBoolean("editor.autoselectboard")); + checkUpdatesBox.setSelected(PreferencesData.getBoolean("update.check")); updateExtensionBox.setSelected(PreferencesData.get("editor.update_extension") == null || PreferencesData.getBoolean("editor.update_extension")); diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 3134a07914a..14fc6ef9c34 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -109,6 +109,8 @@ public class Base { // int editorCount; List editors = Collections.synchronizedList(new ArrayList()); Editor activeEditor; + + private static JMenu boardMenu; // these menus are shared so that the board and serial port selections // are the same for all windows (since the board and serial port that are @@ -1312,6 +1314,28 @@ public void rebuildExamplesMenu(JMenu menu) { private static String priorPlatformFolder; private static boolean newLibraryImported; + + public void selectTargetBoard(TargetBoard targetBoard) { + for (int i = 0; i < boardMenu.getItemCount(); i++) { + JMenuItem menuItem = boardMenu.getItem(i); + if (!(menuItem instanceof JRadioButtonMenuItem)) { + continue; + } + + JRadioButtonMenuItem radioButtonMenuItem = ((JRadioButtonMenuItem) menuItem); + if (targetBoard.getName().equals(radioButtonMenuItem.getText())) { + radioButtonMenuItem.setSelected(true); + break; + } + } + + BaseNoGui.selectBoard(targetBoard); + filterVisibilityOfSubsequentBoardMenus(boardsCustomMenus, targetBoard, 1); + + onBoardOrPortChange(); + rebuildImportMenu(Editor.importMenu); + rebuildExamplesMenu(Editor.examplesMenu); + } public void onBoardOrPortChange() { BaseNoGui.onBoardOrPortChange(); @@ -1406,7 +1430,7 @@ public void rebuildBoardsMenu() throws Exception { boardsCustomMenus = new LinkedList<>(); // The first custom menu is the "Board" selection submenu - JMenu boardMenu = new JMenu(tr("Board")); + boardMenu = new JMenu(tr("Board")); boardMenu.putClientProperty("removeOnWindowDeactivation", true); MenuScroller.setScrollerFor(boardMenu).setTopFixedCount(1); @@ -1512,12 +1536,7 @@ private JRadioButtonMenuItem createBoardMenusAndCustomMenus( @SuppressWarnings("serial") Action action = new AbstractAction(board.getName()) { public void actionPerformed(ActionEvent actionevent) { - BaseNoGui.selectBoard((TargetBoard) getValue("b")); - filterVisibilityOfSubsequentBoardMenus(boardsCustomMenus, (TargetBoard) getValue("b"), 1); - - onBoardOrPortChange(); - rebuildImportMenu(Editor.importMenu); - rebuildExamplesMenu(Editor.examplesMenu); + selectTargetBoard((TargetBoard) getValue("b")); } }; action.putValue("b", board); diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 99e53e488dc..f205b99f00a 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -33,6 +33,9 @@ import com.jcraft.jsch.JSchException; import jssc.SerialPortException; import processing.app.debug.RunnerException; +import processing.app.debug.TargetBoard; +import processing.app.debug.TargetPackage; +import processing.app.debug.TargetPlatform; import processing.app.forms.PasswordAuthorizationDialog; import processing.app.helpers.DocumentTextChangeListener; import processing.app.helpers.Keys; @@ -1006,19 +1009,21 @@ private void addInternalTools(JMenu menu) { class SerialMenuListener implements ActionListener { private final String serialPort; + private final String boardId; - public SerialMenuListener(String serialPort) { + public SerialMenuListener(String serialPort, String boardId) { this.serialPort = serialPort; + this.boardId = boardId; } public void actionPerformed(ActionEvent e) { - selectSerialPort(serialPort); + selectSerialPort(serialPort, boardId); base.onBoardOrPortChange(); } } - private void selectSerialPort(String name) { + private void selectSerialPort(String name, String boardId) { if(portMenu == null) { System.out.println(tr("serialMenu is null")); return; @@ -1059,6 +1064,13 @@ private void selectSerialPort(String name) { } } + if (boardId != null && PreferencesData.getBoolean("editor.autoselectboard")) { + TargetBoard targetBoard = BaseNoGui.getPlatform().resolveBoardById(BaseNoGui.packages, boardId); + if (targetBoard != null) { + base.selectTargetBoard(targetBoard); + } + } + onBoardOrPortChange(); base.onBoardOrPortChange(); @@ -1102,9 +1114,10 @@ public int compare(BoardPort o1, BoardPort o2) { } String address = port.getAddress(); String label = port.getLabel(); + String boardId = port.getBoardId(); JCheckBoxMenuItem item = new JCheckBoxMenuItem(label, address.equals(selectedPort)); - item.addActionListener(new SerialMenuListener(address)); + item.addActionListener(new SerialMenuListener(address, boardId)); portMenu.add(item); } @@ -2111,7 +2124,7 @@ private boolean serialPrompt() { names, 0); if (result == null) return false; - selectSerialPort(result); + selectSerialPort(result, null); base.onBoardOrPortChange(); return true; } diff --git a/arduino-core/src/cc/arduino/packages/BoardPort.java b/arduino-core/src/cc/arduino/packages/BoardPort.java index 0e85ffe135d..e46bba2ff6d 100644 --- a/arduino-core/src/cc/arduino/packages/BoardPort.java +++ b/arduino-core/src/cc/arduino/packages/BoardPort.java @@ -36,6 +36,7 @@ public class BoardPort { private String address; private String protocol; private String boardName; + private String boardId; private String vid; private String pid; private String iserial; @@ -71,6 +72,14 @@ public void setBoardName(String boardName) { this.boardName = boardName; } + public String getBoardId() { + return boardId; + } + + public void setBoardId(String boardId) { + this.boardId = boardId; + } + public PreferencesMap getPrefs() { return prefs; } diff --git a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java index 4ed374a57f5..ff70b0cd99f 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/NetworkDiscovery.java @@ -124,6 +124,7 @@ public void serviceResolved(ServiceEvent serviceEvent) { port.setAddress(address); port.setBoardName(name); + port.setBoardId(board); port.setProtocol("network"); port.setLabel(label); diff --git a/arduino-core/src/cc/arduino/packages/discoverers/serial/SerialBoardsLister.java b/arduino-core/src/cc/arduino/packages/discoverers/serial/SerialBoardsLister.java index d055a921ab4..bfa9a0310d5 100644 --- a/arduino-core/src/cc/arduino/packages/discoverers/serial/SerialBoardsLister.java +++ b/arduino-core/src/cc/arduino/packages/discoverers/serial/SerialBoardsLister.java @@ -155,6 +155,7 @@ public synchronized void retriggerDiscovery(boolean polled) { label += " (" + boardName + ")"; } boardPort.setBoardName(boardName); + boardPort.setBoardId(board.getId()); } } else { if (!parts[1].equals("0000")) { diff --git a/arduino-core/src/processing/app/Platform.java b/arduino-core/src/processing/app/Platform.java index 28a7ba0f550..08d8019120d 100644 --- a/arduino-core/src/processing/app/Platform.java +++ b/arduino-core/src/processing/app/Platform.java @@ -269,14 +269,14 @@ public synchronized Map resolveDeviceByVendorIdProductId(String return null; } - public String resolveDeviceByBoardID(Map packages, String boardId) { + public TargetBoard resolveBoardById(Map packages, String boardId) { assert packages != null; assert boardId != null; for (TargetPackage targetPackage : packages.values()) { for (TargetPlatform targetPlatform : targetPackage.getPlatforms().values()) { for (TargetBoard board : targetPlatform.getBoards().values()) { if (boardId.equals(board.getId())) { - return board.getName(); + return board; } } } @@ -284,6 +284,14 @@ public String resolveDeviceByBoardID(Map packages, String return null; } + public String resolveDeviceByBoardID(Map packages, String boardId) { + TargetBoard targetBoard = resolveBoardById(packages, boardId); + if (targetBoard != null) { + return targetBoard.getName(); + } + return null; + } + // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . public String getName() {