diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core.tests/src/org/eclipse/cdt/arduino/core/tests/FullIntegration.java b/toolchains/arduino/org.eclipse.cdt.arduino.core.tests/src/org/eclipse/cdt/arduino/core/tests/FullIntegration.java index ba96444e0e8..95f02953e74 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core.tests/src/org/eclipse/cdt/arduino/core/tests/FullIntegration.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core.tests/src/org/eclipse/cdt/arduino/core/tests/FullIntegration.java @@ -53,14 +53,14 @@ public class FullIntegration { ArduinoPreferences.setBoardUrlList(urls); } - private Set getSkipBoards() throws Exception { - Set boards = new HashSet(); - + private Set getSkipBuild() throws Exception { + Set 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 getSkipUpload() throws Exception { + Set 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 skipBuild = getSkipBuild(); + Set skipUpload = getSkipUpload(); IProject project = createProject(monitor); - Set 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 { diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java index c966cce7ed7..26110ac91c0 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPlatform.java @@ -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; diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java index 4295c6c2246..877be21da5c 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/build/ArduinoBuildConfiguration.java @@ -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);