From fb9547a46c414467efe5b644bbbb98ab2afd9182 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Wed, 12 Aug 2015 23:11:35 -0400 Subject: [PATCH] Hooked up Arduino launch to new build configs. Wow, this is slick. Launch delegate gets upload command from build config. Change-Id: I779625407877610f1405a48eab851b25d886165f --- .../META-INF/MANIFEST.MF | 3 +- .../org.eclipse.cdt.arduino.core/plugin.xml | 2 +- .../internal/ArduinoProjectGenerator.java | 8 +- .../internal/IArduinoRemoteConnection.java | 46 -------- .../core/internal/board/ArduinoBoard.java | 31 +++++ .../internal/board/ArduinoBoardManager.java | 15 ++- .../core/internal/board/ArduinoPackage.java | 12 ++ .../core/internal/board/ArduinoPlatform.java | 52 ++++++++- .../build/ArduinoBuildConfiguration.java | 106 +++++++++++++++--- .../ArduinoLaunchConfigurationDelegate.java | 41 ++++--- .../remote/ArduinoRemoteConnection.java | 38 +++---- .../templates/Makefile | 6 - .../templates/board.mk | 26 ++--- .../cdt/arduino/ui/internal/Activator.java | 17 ++- .../remote/ArduinoTargetPropertyPage.java | 19 ++-- .../remote/NewArduinoTargetWizard.java | 20 +++- .../remote/NewArduinoTargetWizardPage.java | 15 ++- 17 files changed, 296 insertions(+), 161 deletions(-) delete mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/IArduinoRemoteConnection.java delete mode 100644 toolchains/arduino/org.eclipse.cdt.arduino.core/templates/Makefile diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF b/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF index d6302fb05c0..80f6b32876c 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/META-INF/MANIFEST.MF @@ -24,5 +24,6 @@ Bundle-ClassPath: libs/freemarker-2.3.22.jar, Export-Package: org.eclipse.cdt.arduino.core.internal;x-friends:="org.eclipse.cdt.arduino.ui", org.eclipse.cdt.arduino.core.internal.board;x-friends:="org.eclipse.cdt.arduino.ui", org.eclipse.cdt.arduino.core.internal.build;x-friends:="org.eclipse.cdt.arduino.ui", - org.eclipse.cdt.arduino.core.internal.console;x-friends:="org.eclipse.cdt.arduino.ui" + org.eclipse.cdt.arduino.core.internal.console;x-friends:="org.eclipse.cdt.arduino.ui", + org.eclipse.cdt.arduino.core.internal.remote;x-friends:="org.eclipse.cdt.arduino.ui" Bundle-Localization: plugin diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.xml b/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.xml index 9f194ebf6cd..676505ab53b 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.xml +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/plugin.xml @@ -20,7 +20,7 @@ + service="org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection"> getBoards() throws CoreException { List boards = new ArrayList<>(); - for (ArduinoPackage pkg : packageIndex.getPackages()) { - for (ArduinoPlatform platform : pkg.getPlatforms()) { + for (ArduinoPackage pkg : getPackageIndex().getPackages()) { + for (ArduinoPlatform platform : pkg.getLatestPlatforms()) { + boards.addAll(platform.getBoards()); + } + } + return boards; + } + + public List getInstalledBoards() throws CoreException { + List boards = new ArrayList<>(); + for (ArduinoPackage pkg : getPackageIndex().getPackages()) { + for (ArduinoPlatform platform : pkg.getInstalledPlatforms()) { boards.addAll(platform.getBoards()); } } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java index 70c6e00e069..168e6aff76f 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoPackage.java @@ -78,7 +78,19 @@ public class ArduinoPackage { platformMap.put(platform.getName(), platform); } } + return Collections.unmodifiableCollection(platformMap.values()); + } + public Collection getInstalledPlatforms() { + Map platformMap = new HashMap<>(); + for (ArduinoPlatform platform : platforms) { + if (platform.isInstalled()) { + ArduinoPlatform p = platformMap.get(platform.getName()); + if (p == null || compareVersions(platform.getVersion(), p.getVersion()) > 0) { + platformMap.put(platform.getName(), platform); + } + } + } return Collections.unmodifiableCollection(platformMap.values()); } 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 6b6d87c3e5f..9d733f82b05 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 @@ -41,9 +41,9 @@ public class ArduinoPlatform { private List boards; private List toolsDependencies; - private transient ArduinoPackage pkg; - private transient HierarchicalProperties boardsFile; - private transient Properties platformProperties; + private ArduinoPackage pkg; + private HierarchicalProperties boardsFile; + private Properties platformProperties; void setOwner(ArduinoPackage pkg) { this.pkg = pkg; @@ -127,6 +127,15 @@ public class ArduinoPlatform { return toolsDependencies; } + public ArduinoTool getTool(String name) throws CoreException { + for (ToolDependency toolDep : toolsDependencies) { + if (toolDep.getName().equals(name)) { + return toolDep.getTool(); + } + } + return null; + } + public Properties getPlatformProperties() throws CoreException { if (platformProperties == null) { platformProperties = new Properties(); @@ -194,4 +203,41 @@ public class ArduinoPlatform { return mstatus != null ? mstatus : Status.OK_STATUS; } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((pkg == null) ? 0 : pkg.hashCode()); + result = prime * result + ((version == null) ? 0 : version.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ArduinoPlatform other = (ArduinoPlatform) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (pkg == null) { + if (other.pkg != null) + return false; + } else if (!pkg.equals(other.pkg)) + return false; + if (version == null) { + if (other.version != null) + return false; + } else if (!version.equals(other.version)) + return false; + return true; + } + } 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 6b51fc128ae..164a7e0260a 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 @@ -9,9 +9,11 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -36,6 +38,7 @@ import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceProxy; import org.eclipse.core.resources.IResourceProxyVisitor; @@ -50,12 +53,13 @@ import org.osgi.service.prefs.BackingStoreException; public class ArduinoBuildConfiguration { - private static final String PACKAGE_NAME = "packageId"; //$NON-NLS-1$ + private static final String PACKAGE_NAME = "packageName"; //$NON-NLS-1$ private static final String PLATFORM_NAME = "platformName"; //$NON-NLS-1$ private static final String BOARD_NAME = "boardName"; //$NON-NLS-1$ private final IBuildConfiguration config; + private ArduinoBoard board; private Properties properties; // Cache for scanner info @@ -90,12 +94,59 @@ public class ArduinoBuildConfiguration { } } + public static ArduinoBuildConfiguration getConfig(IProject project, ArduinoBoard board, IProgressMonitor monitor) + throws CoreException { + // return it if it exists already + for (IBuildConfiguration config : project.getBuildConfigs()) { + ArduinoBuildConfiguration arduinoConfig = config.getAdapter(ArduinoBuildConfiguration.class); + if (board.equals(arduinoConfig.getBoard())) { + return arduinoConfig; + } + } + + // Not found, need to create one + Set configNames = new HashSet<>(); + for (IBuildConfiguration config : project.getBuildConfigs()) { + configNames.add(config.getName()); + } + String newName = board.getId(); + int n = 0; + while (configNames.contains(newName)) { + newName = board.getId() + (++n); + } + configNames.add(newName); + IProjectDescription projectDesc = project.getDescription(); + projectDesc.setBuildConfigs(configNames.toArray(new String[configNames.size()])); + project.setDescription(projectDesc, monitor); + + // set it up for the board + IBuildConfiguration config = project.getBuildConfig(newName); + ArduinoBuildConfiguration arduinoConfig = config.getAdapter(ArduinoBuildConfiguration.class); + arduinoConfig.setBoard(board); + + return arduinoConfig; + } + + public void setActive(IProgressMonitor monitor) throws CoreException { + IProject project = config.getProject(); + if (config.equals(project.getActiveBuildConfig())) { + // already set + return; + } + + IProjectDescription projectDesc = project.getDescription(); + projectDesc.setActiveBuildConfig(config.getName()); + project.setDescription(projectDesc, monitor); + } + public IEclipsePreferences getSettings() { return (IEclipsePreferences) new ProjectScope(config.getProject()).getNode(Activator.getId()).node("config") //$NON-NLS-1$ .node(config.getName()); } public void setBoard(ArduinoBoard board) throws CoreException { + this.board = board; + ArduinoPlatform platform = board.getPlatform(); ArduinoPackage pkg = platform.getPackage(); @@ -111,11 +162,14 @@ public class ArduinoBuildConfiguration { } public ArduinoBoard getBoard() throws CoreException { - IEclipsePreferences settings = getSettings(); - String packageName = settings.get(PACKAGE_NAME, ""); //$NON-NLS-1$ - String platformName = settings.get(PLATFORM_NAME, ""); //$NON-NLS-1$ - String boardName = settings.get(BOARD_NAME, ""); //$NON-NLS-1$ - return ArduinoBoardManager.instance.getBoard(boardName, platformName, packageName); + if (board == null) { + IEclipsePreferences settings = getSettings(); + String packageName = settings.get(PACKAGE_NAME, ""); //$NON-NLS-1$ + String platformName = settings.get(PLATFORM_NAME, ""); //$NON-NLS-1$ + String boardName = settings.get(BOARD_NAME, ""); //$NON-NLS-1$ + board = ArduinoBoardManager.instance.getBoard(boardName, platformName, packageName); + } + return board; } private Properties getProperties() throws CoreException { @@ -127,7 +181,12 @@ public class ArduinoBuildConfiguration { for (ToolDependency toolDep : platform.getToolsDependencies()) { properties.putAll(toolDep.getTool().getToolProperties()); } + properties.put("runtime.ide.version", "1.6.7"); //$NON-NLS-1$ //$NON-NLS-2$ + properties.put("build.arch", platform.getArchitecture().toUpperCase()); //$NON-NLS-1$ + properties.put("build.path", config.getName()); //$NON-NLS-1$ } + // always do this in case the project changes names + properties.put("build.project_name", config.getProject().getName()); //$NON-NLS-1$ return properties; } @@ -150,7 +209,6 @@ public class ArduinoBuildConfiguration { public IFile generateMakeFile(IProgressMonitor monitor) throws CoreException { final IProject project = config.getProject(); - // Make sure build folder exists IFolder buildFolder = getBuildFolder(); if (!buildFolder.exists()) { buildFolder.create(true, true, monitor); @@ -194,10 +252,7 @@ public class ArduinoBuildConfiguration { // the recipes Properties properties = new Properties(); properties.putAll(getProperties()); - properties.put("runtime.ide.version", "1.6.7"); //$NON-NLS-1$ //$NON-NLS-2$ - properties.put("build.arch", platform.getArchitecture().toUpperCase()); //$NON-NLS-1$ - properties.put("build.path", "$(OUTPUT_DIR)"); //$NON-NLS-1$ //$NON-NLS-2$ - properties.put("build.project_name", project.getName()); //$NON-NLS-1$ + buildModel.put("build_path", properties.get("build.path")); //$NON-NLS-1$ //$NON-NLS-2$ buildModel.put("project_name", project.getName()); //$NON-NLS-1$ String includes = null; @@ -218,7 +273,7 @@ public class ArduinoBuildConfiguration { File[] platformFiles = corePath.toFile().listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { - return name.endsWith(".cpp") || name.endsWith(".c"); + return name.endsWith(".cpp") || name.endsWith(".c"); //$NON-NLS-1$ //$NON-NLS-2$ } }); @@ -325,6 +380,8 @@ public class ArduinoBuildConfiguration { } public String[] getSizeCommand() throws CoreException { + // TODO this shouldn't be in the makefile + // should be like the upload command return new String[] { "make", "-f", getMakeFile().getName(), "size" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } @@ -346,6 +403,25 @@ public class ArduinoBuildConfiguration { return sizeStr != null ? Integer.parseInt(sizeStr) : -1; } + public String[] getUploadCommand(String serialPort) throws CoreException { + String toolName = getProperties().getProperty("upload.tool"); //$NON-NLS-1$ + ArduinoTool tool = board.getPlatform().getTool(toolName); + + Properties properties = getProperties(); + properties.put("runtime.tools." + toolName + ".path", tool.getInstallPath().toString()); //$NON-NLS-1$ //$NON-NLS-2$ + properties.put("serial.port", serialPort); //$NON-NLS-1$ + // to make up for some cheating in the platform.txt file + properties.put("path", "{tools." + toolName + ".path}"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + properties.put("cmd.path", "{tools." + toolName + ".cmd.path}"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + properties.put("config.path", "{tools." + toolName + ".config.path}"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + properties.put("upload.verbose", "{tools." + toolName + ".upload.params.quiet}"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + String command = resolveProperty("tools." + toolName + ".upload.pattern", properties); //$NON-NLS-1$ //$NON-NLS-2$ + // TODO Windows + return new String[] { "sh", "-c", command }; //$NON-NLS-1$ //$NON-NLS-2$ + } + public IScannerInfo getScannerInfo(IResource resource) throws CoreException { // what language is this resource and pick the right path; switch (CCorePlugin.getContentType(resource.getProject(), resource.getName()).getId()) { @@ -368,10 +444,8 @@ public class ArduinoBuildConfiguration { ArduinoPlatform platform = getBoard().getPlatform(); Properties properties = new Properties(); properties.putAll(getProperties()); - properties.put("runtime.ide.version", "1.6.7"); //$NON-NLS-1$ //$NON-NLS-2$ - properties.put("build.arch", platform.getArchitecture().toUpperCase()); //$NON-NLS-1$ - Path tmpFile = Files.createTempFile("cdt", ".cpp"); + Path tmpFile = Files.createTempFile("cdt", ".cpp"); //$NON-NLS-1$ //$NON-NLS-2$ properties.put("source_file", tmpFile.toString()); //$NON-NLS-1$ properties.put("object_file", "-"); //$NON-NLS-1$ //$NON-NLS-2$ @@ -383,7 +457,7 @@ public class ArduinoBuildConfiguration { // TODO Windows String[] command = new String[] { "sh", "-c", resolveProperty(recipe, properties) }; //$NON-NLS-1$ //$NON-NLS-2$ - ProcessBuilder processBuilder = new ProcessBuilder(command).directory(getBuildDirectory()) + ProcessBuilder processBuilder = new ProcessBuilder(command).directory(tmpFile.getParent().toFile()) .redirectErrorStream(true); setEnvironment(processBuilder.environment()); Process process = processBuilder.start(); diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationDelegate.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationDelegate.java index 585444ce8eb..f87935f8fcf 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationDelegate.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationDelegate.java @@ -10,14 +10,12 @@ *******************************************************************************/ package org.eclipse.cdt.arduino.core.internal.launch; -import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import org.eclipse.cdt.arduino.core.internal.Activator; -import org.eclipse.cdt.arduino.core.internal.IArduinoRemoteConnection; import org.eclipse.cdt.arduino.core.internal.Messages; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; +import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuildConfiguration; import org.eclipse.cdt.arduino.core.internal.console.ArduinoConsoleService; import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection; import org.eclipse.core.resources.IProject; @@ -50,10 +48,13 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException { IRemoteConnection target = getTarget(configuration); + ArduinoRemoteConnection arduinoTarget = target.getService(ArduinoRemoteConnection.class); + ArduinoBoard targetBoard = arduinoTarget.getBoard(); // 1. make sure proper build config is set active IProject project = configuration.getMappedResources()[0].getProject(); - // TODO set active build config for the selected target + ArduinoBuildConfiguration arduinoConfig = ArduinoBuildConfiguration.getConfig(project, targetBoard, monitor); + arduinoConfig.setActive(monitor); // 2. Run the build return super.buildForLaunch(configuration, mode, monitor); @@ -78,42 +79,40 @@ public class ArduinoLaunchConfigurationDelegate extends LaunchConfigurationDeleg return new Status(IStatus.ERROR, Activator.getId(), Messages.ArduinoLaunchConfigurationDelegate_2); } + ArduinoRemoteConnection arduinoTarget = target.getService(ArduinoRemoteConnection.class); // The project IProject project = (IProject) configuration.getMappedResources()[0]; - // The build environment - List envVarList = new ArrayList<>(); - - // Add in the serial port based on launch config - IArduinoRemoteConnection arduinoRemote = target.getService(IArduinoRemoteConnection.class); - envVarList.add("SERIAL_PORT=" + arduinoRemote.getPortName()); //$NON-NLS-1$ - String[] envp = envVarList.toArray(new String[envVarList.size()]); - - // The project directory to launch from - File projectDir = new File(project.getLocationURI()); - - // The build command - String command = "make"; + // The build config + ArduinoBuildConfiguration arduinoConfig = ArduinoBuildConfiguration.getConfig(project, + arduinoTarget.getBoard(), monitor); + String[] uploadCmd = arduinoConfig.getUploadCommand(arduinoTarget.getPortName()); // If opened, temporarily close the connection so we can use // it to download the firmware. boolean wasOpened = target.isOpen(); if (wasOpened) { - arduinoRemote.pause(); + arduinoTarget.pause(); } // Run the process and capture the results in the console - Process process = Runtime.getRuntime().exec(command + " load", envp, projectDir); //$NON-NLS-1$ + ProcessBuilder processBuilder = new ProcessBuilder(uploadCmd) + .directory(arduinoConfig.getBuildDirectory()); + arduinoConfig.setEnvironment(processBuilder.environment()); + Process process = processBuilder.start(); + consoleService.monitor(process, null); try { process.waitFor(); } catch (InterruptedException e) { } + consoleService.writeOutput("Upload complete\n"); + // Reopen the connection if (wasOpened) { - arduinoRemote.resume(); + arduinoTarget.resume(); } } catch (CoreException e) { return e.getStatus(); diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/remote/ArduinoRemoteConnection.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/remote/ArduinoRemoteConnection.java index 1d58f14f959..088b35996de 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/remote/ArduinoRemoteConnection.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/remote/ArduinoRemoteConnection.java @@ -15,8 +15,10 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.cdt.arduino.core.internal.Activator; -import org.eclipse.cdt.arduino.core.internal.IArduinoRemoteConnection; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; import org.eclipse.cdt.serial.SerialPort; +import org.eclipse.core.runtime.CoreException; import org.eclipse.remote.core.IRemoteCommandShellService; import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.remote.core.IRemoteConnectionChangeListener; @@ -25,8 +27,14 @@ import org.eclipse.remote.core.IRemoteProcess; import org.eclipse.remote.core.RemoteConnectionChangeEvent; import org.eclipse.remote.serial.core.SerialPortCommandShell; -public class ArduinoRemoteConnection implements IRemoteConnectionPropertyService, IRemoteCommandShellService, - IArduinoRemoteConnection, IRemoteConnectionChangeListener { +public class ArduinoRemoteConnection + implements IRemoteConnectionPropertyService, IRemoteCommandShellService, IRemoteConnectionChangeListener { + + public static final String TYPE_ID = "org.eclipse.cdt.arduino.core.connectionType"; //$NON-NLS-1$ + public static final String PORT_NAME = "ardiuno.portname"; //$NON-NLS-1$ + public static final String PACKAGE_NAME = "packageName"; //$NON-NLS-1$ + public static final String PLATFORM_NAME = "platformName"; //$NON-NLS-1$ + public static final String BOARD_NAME = "boardName"; //$NON-NLS-1$ private final IRemoteConnection remoteConnection; private SerialPort serialPort; @@ -53,7 +61,7 @@ public class ArduinoRemoteConnection implements IRemoteConnectionPropertyService @Override public T getService(IRemoteConnection remoteConnection, Class service) { - if (IArduinoRemoteConnection.class.equals(service)) { + if (ArduinoRemoteConnection.class.equals(service)) { synchronized (connectionMap) { ArduinoRemoteConnection connection = connectionMap.get(remoteConnection); if (connection == null) { @@ -64,7 +72,7 @@ public class ArduinoRemoteConnection implements IRemoteConnectionPropertyService } } else if (IRemoteConnectionPropertyService.class.equals(service) || IRemoteCommandShellService.class.equals(service)) { - return (T) remoteConnection.getService(IArduinoRemoteConnection.class); + return (T) remoteConnection.getService(ArduinoRemoteConnection.class); } return null; } @@ -86,27 +94,15 @@ public class ArduinoRemoteConnection implements IRemoteConnectionPropertyService } } - @Override - public String getBoardName() { - return remoteConnection.getAttribute(BOARD_ID); + public ArduinoBoard getBoard() throws CoreException { + return ArduinoBoardManager.instance.getBoard(remoteConnection.getAttribute(BOARD_NAME), + remoteConnection.getAttribute(PLATFORM_NAME), remoteConnection.getAttribute(PACKAGE_NAME)); } - @Override - public String getPlatformName() { - return remoteConnection.getAttribute(PLATFORM_ID); - } - - @Override - public String getPackageName() { - return remoteConnection.getAttribute(PACKAGE_ID); - } - - @Override public String getPortName() { return remoteConnection.getAttribute(PORT_NAME); } - @Override public IRemoteProcess getCommandShell(int flags) throws IOException { if (serialPort != null && serialPort.isOpen()) { // can only have one open at a time @@ -118,7 +114,6 @@ public class ArduinoRemoteConnection implements IRemoteConnectionPropertyService return commandShell; } - @Override public void pause() { if (serialPort != null) { try { @@ -130,7 +125,6 @@ public class ArduinoRemoteConnection implements IRemoteConnectionPropertyService } } - @Override public void resume() { if (serialPort != null) { try { diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/Makefile b/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/Makefile deleted file mode 100644 index 3806df0356f..00000000000 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -EXE = ${projectName} -LIBS = -BOARD ?= uno -OUTPUT_DIR ?= build/$(BOARD) - -include arduino.mk diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk b/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk index 3d648ec9e89..51f22ea9994 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/templates/board.mk @@ -1,5 +1,3 @@ -OUTPUT_DIR = ${boardId} - ifeq ($(OS),Windows_NT) RMDIR = rmdir /s /q mymkdir = if not exist "$(call fixpath,$1)" mkdir $(call fixpath,$1) @@ -12,7 +10,7 @@ PROJECT_OBJS = \ <#list project_srcs as file> <#assign cpp = file?matches("(.*)\\.cpp")> <#if cpp> - $(OUTPUT_DIR)/project/${cpp?groups[1]}.o \ + ${build_path}/project/${cpp?groups[1]}.o \ @@ -20,29 +18,29 @@ PLATFORM_OBJS = \ <#list platform_srcs as file> <#assign cpp = file?matches("${platform_path}/(.*)\\.cpp")> <#if cpp> - $(OUTPUT_DIR)/platform/${cpp?groups[1]}.o \ + ${build_path}/platform/${cpp?groups[1]}.o \ <#assign c = file?matches("${platform_path}/(.*)\\.c")> <#if c> - $(OUTPUT_DIR)/platform/${c?groups[1]}.o \ + ${build_path}/platform/${c?groups[1]}.o \ -all: $(OUTPUT_DIR)/${project_name}.hex $(OUTPUT_DIR)/${project_name}.eep +all: ${build_path}/${project_name}.hex ${build_path}/${project_name}.eep -$(OUTPUT_DIR)/${project_name}.hex: $(OUTPUT_DIR)/${project_name}.elf +${build_path}/${project_name}.hex: ${build_path}/${project_name}.elf ${recipe_objcopy_hex_pattern} -$(OUTPUT_DIR)/${project_name}.eep: $(OUTPUT_DIR)/${project_name}.elf +${build_path}/${project_name}.eep: ${build_path}/${project_name}.elf ${recipe_objcopy_eep_pattern} -$(OUTPUT_DIR)/${project_name}.elf: $(PROJECT_OBJS) $(OUTPUT_DIR)/libc.a +${build_path}/${project_name}.elf: $(PROJECT_OBJS) ${build_path}/libc.a ${recipe_c_combine_pattern} -$(OUTPUT_DIR)/libc.a: $(PLATFORM_OBJS) +${build_path}/libc.a: $(PLATFORM_OBJS) clean: - $(RMDIR) $(OUTPUT_DIR) + $(RMDIR) ${build_path} size: ${recipe_size_pattern} @@ -50,7 +48,7 @@ size: <#list project_srcs as file> <#assign cpp = file?matches("(.*)\\.cpp")> <#if cpp> -$(OUTPUT_DIR)/project/${cpp?groups[1]}.o: ../${file} +${build_path}/project/${cpp?groups[1]}.o: ../${file} @$(call mymkdir,$(dir $@)) ${recipe_cpp_o_pattern} @@ -60,7 +58,7 @@ $(OUTPUT_DIR)/project/${cpp?groups[1]}.o: ../${file} <#list platform_srcs as file> <#assign cpp = file?matches("${platform_path}/(.*)\\.cpp")> <#if cpp> -$(OUTPUT_DIR)/platform/${cpp?groups[1]}.o: ${file} +${build_path}/platform/${cpp?groups[1]}.o: ${file} @$(call mymkdir,$(dir $@)) ${recipe_cpp_o_pattern} ${recipe_ar_pattern} @@ -68,7 +66,7 @@ $(OUTPUT_DIR)/platform/${cpp?groups[1]}.o: ${file} <#assign c = file?matches("${platform_path}/(.*)\\.c")> <#if c> -$(OUTPUT_DIR)/platform/${c?groups[1]}.o: ${file} +${build_path}/platform/${c?groups[1]}.o: ${file} @$(call mymkdir,$(dir $@)) ${recipe_c_o_pattern} ${recipe_ar_pattern} diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/Activator.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/Activator.java index 21222da7b30..c76e0d30919 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/Activator.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/Activator.java @@ -42,15 +42,6 @@ public class Activator extends AbstractUIPlugin { public void start(BundleContext context) throws Exception { super.start(context); plugin = this; - - new UIJob("Arduino UI Startup") { - public IStatus runInUIThread(IProgressMonitor monitor) { - ImageRegistry imageRegistry = getImageRegistry(); - imageRegistry.put(IMG_ARDUINO, imageDescriptorFromPlugin(PLUGIN_ID, "icons/cprojects.gif")); //$NON-NLS-1$ - imageRegistry.put(IMG_CONNECTION_TYPE, imageDescriptorFromPlugin(PLUGIN_ID, "icons/arduino.png")); //$NON-NLS-1$ - return Status.OK_STATUS; - } - }.schedule(); } public void stop(BundleContext context) throws Exception { @@ -58,6 +49,14 @@ public class Activator extends AbstractUIPlugin { super.stop(context); } + @Override + protected ImageRegistry createImageRegistry() { + ImageRegistry registry = super.createImageRegistry(); + registry.put(IMG_ARDUINO, imageDescriptorFromPlugin(PLUGIN_ID, "icons/cprojects.gif")); //$NON-NLS-1$ + registry.put(IMG_CONNECTION_TYPE, imageDescriptorFromPlugin(PLUGIN_ID, "icons/arduino.png")); //$NON-NLS-1$ + return registry; + } + /** * Returns the shared instance * diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/ArduinoTargetPropertyPage.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/ArduinoTargetPropertyPage.java index 37e7682b99c..0e9eae0003b 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/ArduinoTargetPropertyPage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/ArduinoTargetPropertyPage.java @@ -3,9 +3,11 @@ package org.eclipse.cdt.arduino.ui.internal.remote; import java.io.IOException; import java.util.Collection; -import org.eclipse.cdt.arduino.core.internal.IArduinoRemoteConnection; -import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoPackage; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform; +import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection; import org.eclipse.cdt.arduino.ui.internal.Activator; import org.eclipse.cdt.arduino.ui.internal.Messages; import org.eclipse.cdt.serial.SerialPort; @@ -36,7 +38,7 @@ public class ArduinoTargetPropertyPage extends PropertyPage implements IWorkbenc comp.setLayout(new GridLayout(2, false)); IRemoteConnection remoteConnection = (IRemoteConnection) getElement().getAdapter(IRemoteConnection.class); - IArduinoRemoteConnection arduinoRemote = remoteConnection.getService(IArduinoRemoteConnection.class); + ArduinoRemoteConnection arduinoRemote = remoteConnection.getService(ArduinoRemoteConnection.class); Label portLabel = new Label(comp, SWT.NONE); portLabel.setText(Messages.ArduinoTargetPropertyPage_0); @@ -73,8 +75,7 @@ public class ArduinoTargetPropertyPage extends PropertyPage implements IWorkbenc boardSelector.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); try { - ArduinoBoard currentBoard = ArduinoBoardManager.instance.getBoard(arduinoRemote.getBoardName(), - arduinoRemote.getPlatformName(), arduinoRemote.getPackageName()); + ArduinoBoard currentBoard = arduinoRemote.getBoard(); Collection boardList = ArduinoBoardManager.instance.getBoards(); boards = new ArduinoBoard[boardList.size()]; i = 0; @@ -101,10 +102,14 @@ public class ArduinoTargetPropertyPage extends PropertyPage implements IWorkbenc IRemoteConnectionWorkingCopy workingCopy = remoteConnection.getWorkingCopy(); String portName = portSelector.getItem(portSelector.getSelectionIndex()); - workingCopy.setAttribute(IArduinoRemoteConnection.PORT_NAME, portName); + workingCopy.setAttribute(ArduinoRemoteConnection.PORT_NAME, portName); ArduinoBoard board = boards[boardSelector.getSelectionIndex()]; - workingCopy.setAttribute(IArduinoRemoteConnection.BOARD_ID, board.getId()); + workingCopy.setAttribute(ArduinoRemoteConnection.BOARD_NAME, board.getName()); + ArduinoPlatform platform = board.getPlatform(); + workingCopy.setAttribute(ArduinoRemoteConnection.PLATFORM_NAME, platform.getName()); + ArduinoPackage pkg = platform.getPackage(); + workingCopy.setAttribute(ArduinoRemoteConnection.PACKAGE_NAME, pkg.getName()); try { workingCopy.save(); diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizard.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizard.java index 3f6c5a0d9e7..4d45c347a1a 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizard.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizard.java @@ -2,7 +2,10 @@ package org.eclipse.cdt.arduino.ui.internal.remote; import java.util.Set; -import org.eclipse.cdt.arduino.core.internal.IArduinoRemoteConnection; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoPackage; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoPlatform; +import org.eclipse.cdt.arduino.core.internal.remote.ArduinoRemoteConnection; import org.eclipse.cdt.arduino.ui.internal.Activator; import org.eclipse.jface.wizard.Wizard; import org.eclipse.remote.core.IRemoteConnectionType; @@ -27,9 +30,16 @@ public class NewArduinoTargetWizard extends Wizard implements IRemoteUIConnectio if (getConnection() == null) { return false; } - - workingCopy.setAttribute(IArduinoRemoteConnection.PORT_NAME, page.portName); - workingCopy.setAttribute(IArduinoRemoteConnection.BOARD_ID, page.board.getId()); + + workingCopy.setAttribute(ArduinoRemoteConnection.PORT_NAME, page.portName); + + ArduinoBoard board = page.board; + workingCopy.setAttribute(ArduinoRemoteConnection.BOARD_NAME, board.getName()); + ArduinoPlatform platform = board.getPlatform(); + workingCopy.setAttribute(ArduinoRemoteConnection.PLATFORM_NAME, platform.getName()); + ArduinoPackage pkg = platform.getPackage(); + workingCopy.setAttribute(ArduinoRemoteConnection.PACKAGE_NAME, pkg.getName()); + return true; } @@ -42,7 +52,7 @@ public class NewArduinoTargetWizard extends Wizard implements IRemoteUIConnectio public IRemoteConnectionWorkingCopy getConnection() { if (workingCopy == null) { IRemoteServicesManager remoteManager = Activator.getService(IRemoteServicesManager.class); - IRemoteConnectionType connectionType = remoteManager.getConnectionType(IArduinoRemoteConnection.TYPE_ID); + IRemoteConnectionType connectionType = remoteManager.getConnectionType(ArduinoRemoteConnection.TYPE_ID); try { workingCopy = connectionType.newConnection(page.name); } catch (RemoteConnectionException e) { diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizardPage.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizardPage.java index 92272ba925e..2e791ef44b3 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizardPage.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/NewArduinoTargetWizardPage.java @@ -1,9 +1,12 @@ package org.eclipse.cdt.arduino.ui.internal.remote; import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; -import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoard; +import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager; import org.eclipse.cdt.arduino.ui.internal.Activator; import org.eclipse.cdt.arduino.ui.internal.Messages; import org.eclipse.cdt.serial.SerialPort; @@ -90,7 +93,15 @@ public class NewArduinoTargetWizardPage extends WizardPage { boardCombo = new Combo(comp, SWT.READ_ONLY); boardCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); try { - boards = ArduinoBoardManager.instance.getBoards().toArray(new ArduinoBoard[0]); + List boardList = ArduinoBoardManager.instance.getInstalledBoards(); + Collections.sort(boardList, new Comparator() { + @Override + public int compare(ArduinoBoard o1, ArduinoBoard o2) { + return o1.getName().compareTo(o2.getName()); + } + }); + boards = boardList.toArray(new ArduinoBoard[0]); + for (ArduinoBoard board : boards) { boardCombo.add(board.getName()); }