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 f54441581db..6553ab980de 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 @@ -33,7 +33,6 @@ import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.remote.core.IRemoteConnection; @@ -66,9 +65,11 @@ public class FullIntegration { URL[] urls = new URL[] { new URL("http://downloads.arduino.cc/packages/package_index.json"), new URL("https://adafruit.github.io/arduino-board-index/package_adafruit_index.json"), - new URL("http://arduino.esp8266.com/stable/package_esp8266com_index.json"), new URL("http://drazzy.com/package_drazzy.com_index.json"), new URL("https://github.com/chipKIT32/chipKIT-core/raw/master/package_chipkit_index.json"), + // esp8266com and sparkfun overlap with the esp8266 package. + new URL("http://arduino.esp8266.com/stable/package_esp8266com_index.json"), + //new URL("https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json"), }; ArduinoPreferences.setBoardUrlList(urls); diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoManager.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoManager.java index 536c244efae..8d6402c4fa5 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoManager.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/board/ArduinoManager.java @@ -304,8 +304,13 @@ public class ArduinoManager { try (Reader reader = new FileReader(path.toFile())) { PackageIndex index = new Gson().fromJson(reader, PackageIndex.class); for (ArduinoPackage pkg : index.getPackages()) { - pkg.init(); - packages.put(pkg.getName(), pkg); + ArduinoPackage p = packages.get(pkg.getName()); + if (p == null) { + pkg.init(); + packages.put(pkg.getName(), pkg); + } else { + p.merge(pkg); + } } } catch (IOException e) { Activator.log(e); 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 5e0f865e25c..c5d2c7bbdbd 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 @@ -31,6 +31,7 @@ public class ArduinoPackage { // end JSON fields private Map installedPlatforms; + private Map latestTools; public String getName() { return name; @@ -65,6 +66,34 @@ public class ArduinoPackage { } } + void merge(ArduinoPackage other) { + // Redo calculated fields + installedPlatforms = null; + latestTools = null; + + if (other.platforms != null) { + if (platforms != null) { + platforms.addAll(other.platforms); + } else { + platforms = other.platforms; + } + for (ArduinoPlatform platform : other.platforms) { + platform.init(this); + } + } + + if (other.tools != null) { + if (tools != null) { + tools.addAll(other.tools); + } else { + tools = other.tools; + } + for (ArduinoTool tool : other.tools) { + tool.init(this); + } + } + } + public ArduinoPlatform getPlatform(String architecture, String version) { if (platforms != null) { for (ArduinoPlatform plat : platforms) { @@ -129,9 +158,9 @@ public class ArduinoPackage { Map platformMap = new HashMap<>(); for (ArduinoPlatform platform : platforms) { if (!installedPlatforms.containsKey(platform.getArchitecture())) { - ArduinoPlatform p = platformMap.get(platform.getName()); + ArduinoPlatform p = platformMap.get(platform.getArchitecture()); if (p == null || ArduinoManager.compareVersions(platform.getVersion(), p.getVersion()) > 0) { - platformMap.put(platform.getName(), platform); + platformMap.put(platform.getArchitecture(), platform); } } } @@ -151,29 +180,40 @@ public class ArduinoPackage { return null; } - public ArduinoTool getLatestTool(String toolName) { - ArduinoTool latest = null; - for (ArduinoTool tool : tools) { - if (tool.getName().equals(toolName) && tool.isInstalled()) { - if (latest == null || ArduinoManager.compareVersions(tool.getVersion(), latest.getVersion()) > 0) { - latest = tool; + private void initLatestTools() { + if (latestTools == null) { + latestTools = new HashMap<>(); + + for (ArduinoTool tool : tools) { + ArduinoTool current = latestTools.get(tool.getName()); + if (current == null || ArduinoManager.compareVersions(tool.getVersion(), current.getVersion()) > 0) { + latestTools.put(tool.getName(), tool); } } } - return latest; + } + + public ArduinoTool getLatestTool(String toolName) { + initLatestTools(); + return latestTools.get(toolName); + } + + public Collection getLatestTools() { + initLatestTools(); + return latestTools.values(); } @Override public boolean equals(Object obj) { if (obj instanceof ArduinoPackage) { - return ((ArduinoPackage) obj).getName().equals(name); + return ((ArduinoPackage) obj).getName().equals(getName()); } return super.equals(obj); } @Override public int hashCode() { - return name.hashCode(); + return getName().hashCode(); } } 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 ef220101d32..6b5c6ea0c15 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 @@ -231,15 +231,16 @@ 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 and avrdude tools + // Everyone seems to want to use arduino package 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$ + if (arduinoPackage != null) { + for (ArduinoTool tool : arduinoPackage.getLatestTools()) { + properties.put("runtime.tools." + tool.getName() + ".path", tool.getInstallPath().toString()); //$NON-NLS-1$ //$NON-NLS-2$ + } + for (ArduinoTool tool : arduinoPackage.getTools()) { + properties.put("runtime.tools." + tool.getName() + '-' + tool.getVersion() + ".path", //$NON-NLS-1$ //$NON-NLS-2$ + tool.getInstallPath().toString()); + } } // Super Platform diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationProvider.java b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationProvider.java index 9858f1ba956..8e70e209910 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationProvider.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.core/src/org/eclipse/cdt/arduino/core/internal/launch/ArduinoLaunchConfigurationProvider.java @@ -23,9 +23,11 @@ public class ArduinoLaunchConfigurationProvider extends ProjectLaunchConfigProvi @Override public boolean supports(ILaunchDescriptor descriptor, ILaunchTarget target) throws CoreException { - IRemoteConnection connection = target.getAdapter(IRemoteConnection.class); - if (connection != null) { - return connection.getConnectionType().getId().equals(ArduinoRemoteConnection.TYPE_ID); + if (target != null) { + IRemoteConnection connection = target.getAdapter(IRemoteConnection.class); + if (connection != null) { + return connection.getConnectionType().getId().equals(ArduinoRemoteConnection.TYPE_ID); + } } return false; } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/downloads/ArduinoDownloadsManager.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/downloads/ArduinoDownloadsManager.java index dd760c61e63..1cdcd34408b 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/downloads/ArduinoDownloadsManager.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/downloads/ArduinoDownloadsManager.java @@ -19,6 +19,7 @@ import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; public class ArduinoDownloadsManager extends WizardDialog { @@ -83,8 +84,11 @@ public class ArduinoDownloadsManager extends WizardDialog { @Override protected void createButtonsForButtonBar(Composite parent) { super.createButtonsForButtonBar(parent); - getButton(IDialogConstants.CANCEL_ID).dispose(); - getButton(IDialogConstants.FINISH_ID).setText("Done"); + getButton(IDialogConstants.CANCEL_ID).setVisible(false); + Button finishButton = getButton(IDialogConstants.FINISH_ID); + finishButton.setText("Done"); + // make sure it's far right + finishButton.moveBelow(null); } } diff --git a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/BoardPropertyControl.java b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/BoardPropertyControl.java index 84ad9ecc3e3..1da313df26c 100644 --- a/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/BoardPropertyControl.java +++ b/toolchains/arduino/org.eclipse.cdt.arduino.ui/src/org/eclipse/cdt/arduino/ui/internal/remote/BoardPropertyControl.java @@ -192,8 +192,10 @@ public class BoardPropertyControl extends Composite { control.dispose(); } menuControls.clear(); - programmerLabel.dispose(); - programmerCombo.dispose(); + if (programmerLabel != null) { + programmerLabel.dispose(); + programmerCombo.dispose(); + } board = newBoard; updateBoardMenu();