Skip to content

Fix unneeded "Select port on upload" message #8194

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Nov 14, 2018
171 changes: 68 additions & 103 deletions app/src/processing/app/Editor.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
Expand Down Expand Up @@ -226,8 +225,8 @@ public boolean test(SketchController sketch) {
Runnable presentHandler;
private Runnable runAndSaveHandler;
private Runnable presentAndSaveHandler;
Runnable exportHandler;
private Runnable exportAppHandler;
private UploadHandler uploadHandler;
private UploadHandler uploadUsingProgrammerHandler;
private Runnable timeoutUploadHandler;

private Map<String, Tool> internalToolCache = new HashMap<String, Tool>();
Expand Down Expand Up @@ -983,21 +982,6 @@ private void addInternalTools(JMenu menu) {
}


class SerialMenuListener implements ActionListener {

private final String serialPort;

public SerialMenuListener(String serialPort) {
this.serialPort = serialPort;
}

public void actionPerformed(ActionEvent e) {
selectSerialPort(serialPort);
base.onBoardOrPortChange();
}

}

private void selectSerialPort(String name) {
if(portMenu == null) {
System.out.println(tr("serialMenu is null"));
Expand Down Expand Up @@ -1045,6 +1029,24 @@ private void selectSerialPort(String name) {
//System.out.println("set to " + get("serial.port"));
}

class BoardPortJCheckBoxMenuItem extends JCheckBoxMenuItem {
private BoardPort port;

public BoardPortJCheckBoxMenuItem(BoardPort port) {
super(port.getLabel());
addActionListener(e -> {
selectSerialPort(port.getAddress());
base.onBoardOrPortChange();
});
this.port = port;
}

@Override
public String toString() {
// This is required for serialPrompt()
return port.getLabel();
}
}

private void populatePortMenu() {
portMenu.removeAll();
Expand All @@ -1058,7 +1060,8 @@ private void populatePortMenu() {
Collections.sort(ports, new Comparator<BoardPort>() {
@Override
public int compare(BoardPort o1, BoardPort o2) {
return BOARD_PROTOCOLS_ORDER.indexOf(o1.getProtocol()) - BOARD_PROTOCOLS_ORDER.indexOf(o2.getProtocol());
return (BOARD_PROTOCOLS_ORDER.indexOf(o1.getProtocol()) - BOARD_PROTOCOLS_ORDER.indexOf(o2.getProtocol())) * 10 +
o1.getAddress().compareTo(o2.getAddress());
}
});

Expand All @@ -1081,10 +1084,9 @@ public int compare(BoardPort o1, BoardPort o2) {
portMenu.add(lastProtocolMenuItem);
}
String address = port.getAddress();
String label = port.getLabel();

JCheckBoxMenuItem item = new JCheckBoxMenuItem(label, address.equals(selectedPort));
item.addActionListener(new SerialMenuListener(address));
BoardPortJCheckBoxMenuItem item = new BoardPortJCheckBoxMenuItem(port);
item.setSelected(address.equals(selectedPort));
portMenu.add(item);
}

Expand Down Expand Up @@ -1376,8 +1378,10 @@ private void resetHandlers() {
presentHandler = new BuildHandler(true);
runAndSaveHandler = new BuildHandler(false, true);
presentAndSaveHandler = new BuildHandler(true, true);
exportHandler = new DefaultExportHandler();
exportAppHandler = new DefaultExportAppHandler();
uploadHandler = new UploadHandler();
uploadHandler.setUsingProgrammer(false);
uploadUsingProgrammerHandler = new UploadHandler();
uploadUsingProgrammerHandler.setUsingProgrammer(true);
timeoutUploadHandler = new TimeoutUploadHandler();
}

Expand Down Expand Up @@ -1953,32 +1957,30 @@ public boolean handleSaveAs() {


private boolean serialPrompt() {
int count = portMenu.getItemCount();
Object[] names = new Object[count];
for (int i = 0; i < count; i++) {
names[i] = portMenu.getItem(i).getText();
}

// FIXME: This is horribly unreadable
String result = (String)
JOptionPane.showInputDialog(this,
I18n.format(
tr("Serial port {0} not found.\n" +
"Retry the upload with another serial port?"),
PreferencesData.get("serial.port")
),
"Serial port not found",
JOptionPane.PLAIN_MESSAGE,
null,
names,
0);
if (result == null) return false;
selectSerialPort(result);
List<BoardPortJCheckBoxMenuItem> items = new ArrayList<>();
for (int i = 0; i < portMenu.getItemCount(); i++) {
if (portMenu.getItem(i) instanceof BoardPortJCheckBoxMenuItem)
items.add((BoardPortJCheckBoxMenuItem) portMenu.getItem(i));
}

String port = PreferencesData.get("serial.port");
String title;
if (port == null || port.isEmpty()) {
title = tr("Serial port not selected.");
} else {
title = I18n.format(tr("Serial port {0} not found."), port);
}
String question = tr("Retry the upload with another serial port?");
BoardPortJCheckBoxMenuItem result = (BoardPortJCheckBoxMenuItem) JOptionPane
.showInputDialog(this, title + "\n" + question, title,
JOptionPane.PLAIN_MESSAGE, null, items.toArray(), 0);
if (result == null)
return false;
result.doClick();
base.onBoardOrPortChange();
return true;
}


/**
* Called by Sketch &rarr; Export.
* Handles calling the export() function on sketch, and
Expand Down Expand Up @@ -2007,13 +2009,17 @@ synchronized public void handleExport(final boolean usingProgrammer) {
avoidMultipleOperations = true;

new Thread(timeoutUploadHandler).start();
new Thread(usingProgrammer ? exportAppHandler : exportHandler).start();
new Thread(usingProgrammer ? uploadUsingProgrammerHandler : uploadHandler).start();
}

// DAM: in Arduino, this is upload
class DefaultExportHandler implements Runnable {
public void run() {
class UploadHandler implements Runnable {
boolean usingProgrammer = false;

public void setUsingProgrammer(boolean usingProgrammer) {
this.usingProgrammer = usingProgrammer;
}

public void run() {
try {
removeAllLineHighlights();
if (serialMonitor != null) {
Expand All @@ -2025,14 +2031,20 @@ public void run() {

uploading = true;

boolean success = sketchController.exportApplet(false);
boolean success = sketchController.exportApplet(usingProgrammer);
if (success) {
statusNotice(tr("Done uploading."));
}
} catch (SerialNotFoundException e) {
if (portMenu.getItemCount() == 0) statusError(e);
else if (serialPrompt()) run();
else statusNotice(tr("Upload canceled."));
if (portMenu.getItemCount() == 0) {
statusError(tr("Serial port not selected."));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this be "no serial ports available" or something?

} else {
if (serialPrompt()) {
run();
} else {
statusNotice(tr("Upload canceled."));
}
}
} catch (PreferencesMapException e) {
statusError(I18n.format(
tr("Error while uploading: missing '{0}' configuration parameter"),
Expand Down Expand Up @@ -2108,55 +2120,6 @@ private void resumeOrCloseSerialPlotter() {
}
}

// DAM: in Arduino, this is upload (with verbose output)
class DefaultExportAppHandler implements Runnable {
public void run() {

try {
if (serialMonitor != null) {
serialMonitor.suspend();
}
if (serialPlotter != null) {
serialPlotter.suspend();
}

uploading = true;

boolean success = sketchController.exportApplet(true);
if (success) {
statusNotice(tr("Done uploading."));
}
} catch (SerialNotFoundException e) {
if (portMenu.getItemCount() == 0) statusError(e);
else if (serialPrompt()) run();
else statusNotice(tr("Upload canceled."));
} catch (PreferencesMapException e) {
statusError(I18n.format(
tr("Error while uploading: missing '{0}' configuration parameter"),
e.getMessage()));
} catch (RunnerException e) {
//statusError("Error during upload.");
//e.printStackTrace();
status.unprogress();
statusError(e);
} catch (Exception e) {
e.printStackTrace();
} finally {
avoidMultipleOperations = false;
populatePortMenu();
}
status.unprogress();
uploading = false;
//toolbar.clear();
toolbar.deactivateExport();

resumeOrCloseSerialMonitor();
resumeOrCloseSerialPlotter();

base.onBoardOrPortChange();
}
}

class TimeoutUploadHandler implements Runnable {

public void run() {
Expand Down Expand Up @@ -2388,6 +2351,8 @@ private void handleBurnBootloader() {
SwingUtilities.invokeLater(() -> statusError(tr("Error while burning bootloader.")));
// error message will already be visible
}
} catch (SerialNotFoundException e) {
SwingUtilities.invokeLater(() -> statusError(tr("Error while burning bootloader: please select a serial port.")));
} catch (PreferencesMapException e) {
SwingUtilities.invokeLater(() -> {
statusError(I18n.format(
Expand Down
16 changes: 11 additions & 5 deletions app/src/processing/app/EditorLineStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,17 @@ public void paintComponent(Graphics graphics) {
g.drawString(text, scale(6), baseline);

g.setColor(messageForeground);
String tmp = I18n.format(tr("{0} on {1}"), name, serialport);

Rectangle2D bounds = g.getFontMetrics().getStringBounds(tmp, null);

g.drawString(tmp, size.width - (int) bounds.getWidth() - RESIZE_IMAGE_SIZE,

String statusText;
if (serialport != null && !serialport.isEmpty()) {
statusText = I18n.format(tr("{0} on {1}"), name, serialport);
} else {
statusText = name;
}

Rectangle2D bounds = g.getFontMetrics().getStringBounds(statusText, null);

g.drawString(statusText, size.width - (int) bounds.getWidth() - RESIZE_IMAGE_SIZE,
baseline);

if (OSUtils.isMacOS()) {
Expand Down
4 changes: 0 additions & 4 deletions app/src/processing/app/SketchController.java
Original file line number Diff line number Diff line change
Expand Up @@ -709,10 +709,6 @@ private boolean upload(String suggestedClassName, boolean usingProgrammer) throw

UploaderUtils uploaderInstance = new UploaderUtils();
Uploader uploader = uploaderInstance.getUploaderByPreferences(false);
if (uploader == null) {
editor.statusError(tr("Please select a Port before Upload"));
return false;
}

EditorConsole.setCurrentEditorConsole(editor.console);

Expand Down
2 changes: 1 addition & 1 deletion arduino-core/src/cc/arduino/Compiler.java
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ private void runRecipe(String recipe, PreferencesMap prefs) throws RunnerExcepti
String[] cmdArray;
String cmd = prefs.getOrExcept(recipe);
try {
cmdArray = StringReplacer.formatAndSplit(cmd, dict, true);
cmdArray = StringReplacer.formatAndSplit(cmd, dict);
} catch (Exception e) {
throw new RunnerException(e);
}
Expand Down
11 changes: 3 additions & 8 deletions arduino-core/src/cc/arduino/UploaderUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
import processing.app.BaseNoGui;
import processing.app.PreferencesData;
import processing.app.Sketch;
import processing.app.debug.TargetPlatform;
import processing.app.debug.TargetBoard;

import java.util.LinkedList;
import java.util.List;
Expand All @@ -45,19 +45,14 @@
public class UploaderUtils {

public Uploader getUploaderByPreferences(boolean noUploadPort) {
TargetPlatform target = BaseNoGui.getTargetPlatform();
String board = PreferencesData.get("board");

BoardPort boardPort = null;
if (!noUploadPort) {
String port = PreferencesData.get("serial.port");
if (port == null || port.isEmpty()) {
return null;
}
boardPort = BaseNoGui.getDiscoveryManager().find(port);
}

return new UploaderFactory().newUploader(target.getBoards().get(board), boardPort, noUploadPort);
TargetBoard board = BaseNoGui.getTargetBoard();
return new UploaderFactory().newUploader(board, boardPort, noUploadPort);
}

public boolean upload(Sketch data, Uploader uploader, String suggestedClassName, boolean usingProgrammer, boolean noUploadPort, List<String> warningsAccumulator) throws Exception {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ public boolean uploadUsingPreferences(File sourcePath, String buildPath, String
pattern = prefs.get("upload.network_pattern");
if(pattern == null)
pattern = prefs.getOrExcept("upload.pattern");
String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true);
String[] cmd = StringReplacer.formatAndSplit(pattern, prefs);
uploadResult = executeUploadCommand(cmd);
} catch (RunnerException e) {
throw e;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ private boolean runUploadTool(SSH ssh, PreferencesMap prefs) throws Exception {
}

String pattern = prefs.getOrExcept("upload.pattern");
String command = StringUtils.join(StringReplacer.formatAndSplit(pattern, prefs, true), " ");
String command = StringUtils.join(StringReplacer.formatAndSplit(pattern, prefs), " ");
if (verbose) {
System.out.println(command);
}
Expand Down
Loading