1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-24 17:35:35 +02:00

[Arduino] Fix up derivation of upload command.

Change-Id: I97caa1e9ca954d1a60a1fe9e73daa3cf2e0d439e
This commit is contained in:
Doug Schaefer 2016-06-06 14:01:00 -04:00
parent 66f822e464
commit 8990e95620
3 changed files with 59 additions and 16 deletions

View file

@ -53,14 +53,14 @@ public class FullIntegration {
ArduinoPreferences.setBoardUrlList(urls);
}
private Set<ArduinoBoard> getSkipBoards() throws Exception {
Set<ArduinoBoard> boards = new HashSet<ArduinoBoard>();
private Set<ArduinoBoard> getSkipBuild() throws Exception {
Set<ArduinoBoard> boards = new HashSet<>();
// Fails in arduino too
boards.add(arduinoManager.getBoard("arduino", "avr", "robotControl"));
boards.add(arduinoManager.getBoard("arduino", "avr", "robotMotor"));
boards.add(arduinoManager.getBoard("adafruit", "avr", "adafruit32u4"));
// TODO Need to add support for menu specific build properties
boards.add(arduinoManager.getBoard("arduino", "avr", "mini"));
boards.add(arduinoManager.getBoard("arduino", "avr", "lilypad"));
@ -73,7 +73,7 @@ public class FullIntegration {
boards.add(arduinoManager.getBoard("TeeOnArdu", "avr", "CirPlayTeensyCore"));
boards.add(arduinoManager.getBoard("TeeOnArdu", "avr", "FloraTeensyCore"));
boards.add(arduinoManager.getBoard("TeeOnArdu", "avr", "TeeOnArdu"));
// TODO build.system.path missing
boards.add(arduinoManager.getBoard("arduino", "sam", "arduino_due_x"));
boards.add(arduinoManager.getBoard("arduino", "sam", "arduino_due_x_dbg"));
@ -82,6 +82,22 @@ public class FullIntegration {
return boards;
}
private Set<ArduinoBoard> getSkipUpload() throws Exception {
Set<ArduinoBoard> boards = new HashSet<>();
// missing upload.protocol
boards.add(arduinoManager.getBoard("arduino", "avr", "gemma"));
boards.add(arduinoManager.getBoard("adafruit", "avr", "gemma"));
boards.add(arduinoManager.getBoard("adafruit", "avr", "trinket5"));
boards.add(arduinoManager.getBoard("adafruit", "avr", "trinket3"));
// usbtiny missing
boards.add(arduinoManager.getBoard("adafruit", "avr", "protrinket3"));
boards.add(arduinoManager.getBoard("adafruit", "avr", "protrinket5"));
return boards;
}
@Test
public void runTest() throws Exception {
IProgressMonitor monitor = new SysoutProgressMonitor();
@ -90,11 +106,12 @@ public class FullIntegration {
setBoardUrls();
loadPlatforms(monitor);
Set<ArduinoBoard> skipBuild = getSkipBuild();
Set<ArduinoBoard> skipUpload = getSkipUpload();
IProject project = createProject(monitor);
Set<ArduinoBoard> skip = getSkipBoards();
for (ArduinoBoard board : arduinoManager.getInstalledBoards()) {
if (!skip.contains(board)) {
buildBoard(project, board, monitor);
if (!skipBuild.contains(board)) {
buildBoard(project, board, !skipUpload.contains(board), monitor);
}
}
}
@ -138,7 +155,7 @@ public class FullIntegration {
return generator.getProject();
}
private void buildBoard(IProject project, ArduinoBoard board, IProgressMonitor monitor) throws Exception {
private void buildBoard(IProject project, ArduinoBoard board, boolean upload, IProgressMonitor monitor) throws Exception {
ArduinoRemoteConnection arduinoTarget = createTarget(board);
ArduinoBuildConfigurationProvider provider = (ArduinoBuildConfigurationProvider) buildConfigManager
.getProvider(ArduinoBuildConfigurationProvider.ID);
@ -156,6 +173,11 @@ public class FullIntegration {
if (rc != 0) {
throw new Exception("Build failed");
}
// Test to make sure we can get the upload command cleanly
if (upload) {
System.out.println(String.join(" ", config.getUploadCommand("port1")));
}
}
private ArduinoRemoteConnection createTarget(ArduinoBoard board) throws Exception {

View file

@ -20,7 +20,6 @@ import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
@ -31,7 +30,6 @@ import org.eclipse.cdt.arduino.core.internal.Activator;
import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences;
import org.eclipse.cdt.arduino.core.internal.HierarchicalProperties;
import org.eclipse.cdt.arduino.core.internal.Messages;
import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuildConfiguration;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;

View file

@ -225,13 +225,17 @@ public class ArduinoBuildConfiguration extends CBuildConfiguration implements Te
properties.put("build.variant.path", //$NON-NLS-1$
platform.getInstallPath().resolve("variants").resolve("{build.variant}").toString()); //$NON-NLS-1$ //$NON-NLS-2$
// Everyone seems to want to use the avr-gcc tool.
// Everyone seems to want to use the avr-gcc and avrdude tools
ArduinoPackage arduinoPackage = manager.getPackage("arduino"); //$NON-NLS-1$
ArduinoTool avrgcc = arduinoPackage.getLatestTool("avr-gcc"); //$NON-NLS-1$
if (avrgcc != null) {
properties.put("runtime.tools.avr-gcc.path", avrgcc.getInstallPath().toString()); //$NON-NLS-1$
}
ArduinoTool avrdude = arduinoPackage.getLatestTool("avrdude"); //$NON-NLS-1$
if (avrdude != null) {
properties.put("runtime.tools.avrdude.path", avrdude.getInstallPath().toString()); //$NON-NLS-1$
}
// Super Platform
String core = board.getBoardProperties().getProperty("build.core"); //$NON-NLS-1$
if (core.contains(":")) { //$NON-NLS-1$
@ -471,6 +475,11 @@ public class ArduinoBuildConfiguration extends CBuildConfiguration implements Te
last = value;
for (int i = value.indexOf('{'); i >= 0; i = value.indexOf('{', i)) {
i++;
if (value.charAt(i) == '{') {
i++;
continue;
}
int n = value.indexOf('}', i);
if (n >= 0) {
String p2 = value.substring(i, n);
@ -485,7 +494,7 @@ public class ArduinoBuildConfiguration extends CBuildConfiguration implements Te
}
} while (!value.equals(last));
return value;
return value.replace("}}", "}").replace("{{", "{"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
private String resolveProperty(String property, Properties dict) throws CoreException {
@ -531,8 +540,21 @@ public class ArduinoBuildConfiguration extends CBuildConfiguration implements Te
public String[] getUploadCommand(String serialPort) throws CoreException {
String toolName = getProperties().getProperty("upload.tool"); //$NON-NLS-1$
ArduinoPlatform platform = getBoard().getPlatform();
if (toolName.contains(":")) { //$NON-NLS-1$
String[] segments = toolName.split(":"); //$NON-NLS-1$
if (segments.length == 2) {
platform = manager.getInstalledPlatform(segments[0], platform.getArchitecture());
toolName = segments[1];
}
}
Properties properties = getProperties();
ArduinoTool uploadTool = platform.getPackage().getLatestTool(toolName);
if (uploadTool != null) {
properties.putAll(uploadTool.getToolProperties());
}
properties.put("serial.port", serialPort); //$NON-NLS-1$
// Little bit of weirdness needed for the bossac tool
@ -547,7 +569,7 @@ public class ArduinoBuildConfiguration extends CBuildConfiguration implements Te
properties.put("config.path", "{tools." + toolName + ".config.path}"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// properties for the tool flattened
HierarchicalProperties toolsProps = new HierarchicalProperties(getBoard().getPlatform().getPlatformProperties())
HierarchicalProperties toolsProps = new HierarchicalProperties(platform.getPlatformProperties())
.getChild("tools"); //$NON-NLS-1$
if (toolsProps != null) {
HierarchicalProperties toolProps = toolsProps.getChild(toolName);
@ -558,13 +580,14 @@ public class ArduinoBuildConfiguration extends CBuildConfiguration implements Te
// TODO make this a preference
properties.put("upload.verbose", properties.getProperty("upload.params.verbose", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
properties.put("upload.verify", properties.getProperty("upload.params.verify", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// TODO needed this for esptool
properties.put("upload.resetmethod", "ck"); //$NON-NLS-1$ //$NON-NLS-2$
String command = resolveProperty("upload.pattern", properties); //$NON-NLS-1$
if (command == null) {
return new String[] { "command not specified" }; //$NON-NLS-1$
throw Activator.coreException("Upload command not specified", null);
}
if (isWindows) {
return splitCommand(command);