import static org.junit.Assert.assertNotNull;
-import org.eclipse.cdt.arduino.core.internal.board.ArduinoBoardManager;
+import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager;
import org.junit.Test;
public class BoardManagerTests {
@Test
public void loadPackagesTest() throws Exception {
- assertNotNull(ArduinoBoardManager.instance.getPackageIndex());
+ assertNotNull(ArduinoManager.instance.getPackageIndex());
}
}
import java.util.Map;
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.ArduinoManager;
import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuildConfiguration;
import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuilder;
import org.eclipse.cdt.core.CCProjectNature;
IBuildConfiguration config = project.getBuildConfig("uno"); //$NON-NLS-1$
ArduinoBuildConfiguration arduinoConfig = config.getAdapter(ArduinoBuildConfiguration.class);
- ArduinoBoard board = ArduinoBoardManager.instance.getBoard("Arduino Uno", "Arduino AVR Boards", "arduino"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ ArduinoBoard board = ArduinoManager.instance.getBoard("Arduino Uno", "Arduino AVR Boards", "arduino"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
arduinoConfig.setBoard(board);
// Generate files
--- /dev/null
+package org.eclipse.cdt.arduino.core.internal.board;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences;
+import org.eclipse.cdt.core.model.CoreModel;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+public class ArduinoLibrary {
+
+ private String name;
+ private String version;
+ private String author;
+ private String maintainer;
+ private String sentence;
+ private String paragraph;
+ private String website;
+ private String category;
+ private List<String> architectures;
+ private List<String> types;
+ private String url;
+ private String archiveFileName;
+ private int size;
+ private String checksum;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public String getMaintainer() {
+ return maintainer;
+ }
+
+ public void setMaintainer(String maintainer) {
+ this.maintainer = maintainer;
+ }
+
+ public String getSentence() {
+ return sentence;
+ }
+
+ public void setSentence(String sentence) {
+ this.sentence = sentence;
+ }
+
+ public String getParagraph() {
+ return paragraph;
+ }
+
+ public void setParagraph(String paragraph) {
+ this.paragraph = paragraph;
+ }
+
+ public String getWebsite() {
+ return website;
+ }
+
+ public void setWebsite(String website) {
+ this.website = website;
+ }
+
+ public String getCategory() {
+ return category;
+ }
+
+ public void setCategory(String category) {
+ this.category = category;
+ }
+
+ public List<String> getArchitectures() {
+ return architectures;
+ }
+
+ public void setArchitectures(List<String> architectures) {
+ this.architectures = architectures;
+ }
+
+ public List<String> getTypes() {
+ return types;
+ }
+
+ public void setTypes(List<String> types) {
+ this.types = types;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getArchiveFileName() {
+ return archiveFileName;
+ }
+
+ public void setArchiveFileName(String archiveFileName) {
+ this.archiveFileName = archiveFileName;
+ }
+
+ public int getSize() {
+ return size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+
+ public String getChecksum() {
+ return checksum;
+ }
+
+ public void setChecksum(String checksum) {
+ this.checksum = checksum;
+ }
+
+ public Path getInstallPath() {
+ return ArduinoPreferences.getArduinoHome().resolve("libraries").resolve(name.replace(' ', '_')) //$NON-NLS-1$
+ .resolve(version);
+ }
+
+ public boolean isInstalled() {
+ return getInstallPath().toFile().exists();
+ }
+
+ public IStatus install(IProgressMonitor monitor) {
+ if (isInstalled()) {
+ return Status.OK_STATUS;
+ }
+
+ return ArduinoManager.downloadAndInstall(url, archiveFileName, getInstallPath(), monitor);
+ }
+
+ public Collection<Path> getIncludePath() {
+ Path installPath = getInstallPath();
+ Path srcPath = installPath.resolve("src"); //$NON-NLS-1$
+ if (srcPath.toFile().isDirectory()) {
+ return Collections.singletonList(srcPath);
+ } else {
+ // TODO do I need the 'utility' directory?
+ return Collections.singletonList(installPath);
+ }
+ }
+
+ private void getSources(IProject project, Collection<Path> sources, Path dir, boolean recurse) {
+ for (File file : dir.toFile().listFiles()) {
+ if (file.isDirectory()) {
+ if (recurse) {
+ getSources(project, sources, file.toPath(), recurse);
+ }
+ } else {
+ if (CoreModel.isValidSourceUnitName(project, file.getName())) {
+ sources.add(file.toPath());
+ }
+ }
+ }
+ }
+
+ public Collection<Path> getSources(IProject project) {
+ List<Path> sources = new ArrayList<>();
+ Path installPath = getInstallPath();
+ Path srcPath = installPath.resolve("src"); //$NON-NLS-1$
+ if (srcPath.toFile().isDirectory()) {
+ getSources(project, sources, srcPath, true);
+ } else {
+ getSources(project, sources, installPath, false);
+ Path utilityPath = installPath.resolve("utility"); //$NON-NLS-1$
+ if (utilityPath.toFile().isDirectory()) {
+ getSources(project, sources, utilityPath, false);
+ }
+ }
+ return sources;
+ }
+
+}
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.reflect.Type;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.nio.file.attribute.PosixFilePermission;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.cdt.arduino.core.internal.Activator;
import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences;
import org.eclipse.cdt.arduino.core.internal.Messages;
+import org.eclipse.cdt.arduino.core.internal.build.ArduinoBuildConfiguration;
+import org.eclipse.core.resources.IBuildConfiguration;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ProjectScope;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.osgi.service.prefs.BackingStoreException;
import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
-// Closeable isn't API yet but it's recommended.
-public class ArduinoBoardManager {
+public class ArduinoManager {
- public static final ArduinoBoardManager instance = new ArduinoBoardManager();
+ public static final ArduinoManager instance = new ArduinoManager();
// Build tool ids
public static final String BOARD_OPTION_ID = "org.eclipse.cdt.arduino.option.board"; //$NON-NLS-1$
private Path packageIndexPath = ArduinoPreferences.getArduinoHome().resolve("package_index.json"); //$NON-NLS-1$
private PackageIndex packageIndex;
- public ArduinoBoardManager() {
+ private Path libraryIndexPath = ArduinoPreferences.getArduinoHome().resolve("library_index.json"); //$NON-NLS-1$
+ private LibraryIndex libraryIndex;
+
+ public ArduinoManager() {
new Job(Messages.ArduinoBoardManager_0) {
protected IStatus run(IProgressMonitor monitor) {
try {
- URL url = new URL("http://downloads.arduino.cc/packages/package_index.json"); //$NON-NLS-1$
+ // library index has the same parent right now
Files.createDirectories(packageIndexPath.getParent());
- Files.copy(url.openStream(), packageIndexPath, StandardCopyOption.REPLACE_EXISTING);
+
+ URL packageUrl = new URL("http://downloads.arduino.cc/packages/package_index.json"); //$NON-NLS-1$
+ try (InputStream in = packageUrl.openStream()) {
+ Files.copy(in, packageIndexPath, StandardCopyOption.REPLACE_EXISTING);
+ }
+
+ URL libraryUrl = new URL("http://downloads.arduino.cc/libraries/library_index.json"); //$NON-NLS-1$
+ try (InputStream in = libraryUrl.openStream()) {
+ Files.copy(in, libraryIndexPath, StandardCopyOption.REPLACE_EXISTING);
+ }
} catch (IOException e) {
return new Status(IStatus.ERROR, Activator.getId(), e.getLocalizedMessage(), e);
}
return packageIndex;
}
+ public LibraryIndex getLibraryIndex() throws CoreException {
+ if (libraryIndex == null) {
+ try (FileReader reader = new FileReader(libraryIndexPath.toFile())) {
+ libraryIndex = new Gson().fromJson(reader, LibraryIndex.class);
+ libraryIndex.resolve();
+ } catch (IOException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Reading library index", e));
+ }
+ }
+ return libraryIndex;
+ }
+
public ArduinoBoard getBoard(String boardName, String platformName, String packageName) throws CoreException {
return getPackageIndex().getPackage(packageName).getPlatform(platformName).getBoard(boardName);
}
return pkg != null ? pkg.getTool(toolName, version) : null;
}
+ private static final String LIBRARIES = "libraries"; //$NON-NLS-1$
+
+ private IEclipsePreferences getSettings(IProject project) {
+ return (IEclipsePreferences) new ProjectScope(project).getNode(Activator.getId());
+ }
+
+ public Collection<ArduinoLibrary> getLibraries(IProject project) throws CoreException {
+ IEclipsePreferences settings = getSettings(project);
+ String librarySetting = settings.get(LIBRARIES, "[]"); //$NON-NLS-1$
+ Type stringSet = new TypeToken<Set<String>>() {
+ }.getType();
+ Set<String> libraryNames = new Gson().fromJson(librarySetting, stringSet);
+ LibraryIndex index = ArduinoManager.instance.getLibraryIndex();
+ List<ArduinoLibrary> libraries = new ArrayList<>(libraryNames.size());
+ for (String name : libraryNames) {
+ libraries.add(index.getLibrary(name));
+ }
+ return libraries;
+ }
+
+ public void setLibraries(final IProject project, final Collection<ArduinoLibrary> libraries) throws CoreException {
+ List<String> libraryNames = new ArrayList<>(libraries.size());
+ for (ArduinoLibrary library : libraries) {
+ libraryNames.add(library.getName());
+ }
+ IEclipsePreferences settings = getSettings(project);
+ settings.put(LIBRARIES, new Gson().toJson(libraryNames));
+ try {
+ settings.flush();
+ } catch (BackingStoreException e) {
+ throw new CoreException(new Status(IStatus.ERROR, Activator.getId(), "Saving preferences", e));
+ }
+
+ new Job("Install libraries") {
+ protected IStatus run(IProgressMonitor monitor) {
+ MultiStatus mstatus = new MultiStatus(Activator.getId(), 0, "Installing libraries", null);
+ for (ArduinoLibrary library : libraries) {
+ IStatus status = library.install(monitor);
+ if (!status.isOK()) {
+ mstatus.add(status);
+ }
+ }
+
+ // Clear the scanner info caches to pick up new includes
+ try {
+ for (IBuildConfiguration config : project.getBuildConfigs()) {
+ ArduinoBuildConfiguration arduinoConfig = config.getAdapter(ArduinoBuildConfiguration.class);
+ arduinoConfig.clearScannerInfoCache();
+ }
+ } catch (CoreException e) {
+ mstatus.add(e.getStatus());
+ }
+ return mstatus;
+ }
+ }.schedule();
+ }
+
public static IStatus downloadAndInstall(String url, String archiveFileName, Path installPath,
IProgressMonitor monitor) {
try {
import java.util.List;
import java.util.Map;
-import org.eclipse.core.runtime.IProgressMonitor;
-
public class ArduinoPackage {
private String name;
private List<ArduinoPlatform> platforms;
private List<ArduinoTool> tools;
- private transient ArduinoBoardManager manager;
+ private transient ArduinoManager manager;
- void setOwner(ArduinoBoardManager manager) {
+ void setOwner(ArduinoManager manager) {
this.manager = manager;
for (ArduinoPlatform platform : platforms) {
platform.setOwner(this);
}
}
- ArduinoBoardManager getManager() {
+ ArduinoManager getManager() {
return manager;
}
return Collections.unmodifiableCollection(platformMap.values());
}
- private int compareVersions(String version1, String version2) {
+ // TODO move somewhere.
+ public static int compareVersions(String version1, String version2) {
if (version1 == null) {
return version2 == null ? 0 : -1;
}
return null;
}
- public void install(IProgressMonitor monitor) {
-
- }
-
@Override
public boolean equals(Object obj) {
if (obj instanceof ArduinoPackage) {
}
// Download platform archive
- IStatus status = ArduinoBoardManager.downloadAndInstall(url, archiveFileName, getInstallPath(), monitor);
+ IStatus status = ArduinoManager.downloadAndInstall(url, archiveFileName, getInstallPath(), monitor);
if (!status.isOK()) {
return status;
}
}
public IStatus install(IProgressMonitor monitor) {
- return ArduinoBoardManager.downloadAndInstall(url, archiveFileName, tool.getInstallPath(), monitor);
+ return ArduinoManager.downloadAndInstall(url, archiveFileName, tool.getInstallPath(), monitor);
}
}
--- /dev/null
+package org.eclipse.cdt.arduino.core.internal.board;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class LibraryIndex {
+
+ private List<ArduinoLibrary> libraries;
+
+ // category name to library name
+ private Map<String, Set<String>> categories = new HashMap<>();
+ // library name to latest version of library
+ private Map<String, ArduinoLibrary> latestLibs = new HashMap<>();
+
+ public void resolve() {
+ for (ArduinoLibrary library : libraries) {
+ String name = library.getName();
+
+ String category = library.getCategory();
+ if (category == null) {
+ category = "Uncategorized"; //$NON-NLS-1$
+ }
+
+ Set<String> categoryLibs = categories.get(category);
+ if (categoryLibs == null) {
+ categoryLibs = new HashSet<>();
+ categories.put(category, categoryLibs);
+ }
+ categoryLibs.add(name);
+
+ ArduinoLibrary current = latestLibs.get(name);
+ if (current != null) {
+ if (ArduinoPackage.compareVersions(library.getVersion(), current.getVersion()) > 0) {
+ latestLibs.put(name, library);
+ }
+ } else {
+ latestLibs.put(name, library);
+ }
+ }
+ }
+
+ public ArduinoLibrary getLibrary(String name) {
+ return latestLibs.get(name);
+ }
+
+ public Collection<String> getCategories() {
+ return Collections.unmodifiableCollection(categories.keySet());
+ }
+
+ public Collection<ArduinoLibrary> getLibraries(String category) {
+ Set<String> categoryLibs = categories.get(category);
+ if (categoryLibs == null) {
+ return new ArrayList<>(0);
+ }
+
+ List<ArduinoLibrary> libs = new ArrayList<>(categoryLibs.size());
+ for (String name : categoryLibs) {
+ libs.add(latestLibs.get(name));
+ }
+ return libs;
+ }
+
+}
return null;
}
- void setOwners(ArduinoBoardManager manager) {
+ void setOwners(ArduinoManager manager) {
for (ArduinoPackage pkg : packages) {
pkg.setOwner(manager);
}
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.eclipse.cdt.arduino.core.internal.ArduinoPreferences;
import org.eclipse.cdt.arduino.core.internal.ArduinoTemplateGenerator;
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.ArduinoLibrary;
+import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager;
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.board.ArduinoTool;
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);
+ board = ArduinoManager.instance.getBoard(boardName, platformName, packageName);
}
return board;
}
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("runtime.ide.version", "10607"); //$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$
}
}
buildModel.put("project_srcs", sourceFiles); //$NON-NLS-1$
+ // The list of library sources
+ List<String> librarySources = new ArrayList<>();
+ for (ArduinoLibrary lib : ArduinoManager.instance.getLibraries(project)) {
+ for (Path path : lib.getSources(project)) {
+ librarySources.add(path.toString());
+ }
+ }
+ buildModel.put("libraries_srcs", librarySources); //$NON-NLS-1$
+ buildModel.put("libraries_path", ArduinoPreferences.getArduinoHome().resolve("libraries")); //$NON-NLS-1$ //$NON-NLS-2$
+
// the recipes
Properties properties = new Properties();
properties.putAll(getProperties());
}
includes += '"' + include.toString() + '"';
}
+ for (ArduinoLibrary lib : ArduinoManager.instance.getLibraries(project)) {
+ for (Path include : lib.getIncludePath()) {
+ includes += " -I\"" + include.toString() + '"'; //$NON-NLS-1$
+ }
+ }
properties.put("includes", includes); //$NON-NLS-1$
Path platformPath = platform.getInstallPath();
properties.put("object_file", "$@"); //$NON-NLS-1$ //$NON-NLS-2$
properties.put("source_file", "$<"); //$NON-NLS-1$ //$NON-NLS-2$
- properties.put("archive_file", "libc.a"); //$NON-NLS-1$ //$NON-NLS-2$
- properties.put("object_files", "$(PROJECT_OBJS)"); //$NON-NLS-1$ //$NON-NLS-2$
+ properties.put("archive_file", "core.a"); //$NON-NLS-1$ //$NON-NLS-2$
+ properties.put("object_files", "$(PROJECT_OBJS) $(LIBRARIES_OBJS)"); //$NON-NLS-1$ //$NON-NLS-2$
buildModel.put("recipe_cpp_o_pattern", resolveProperty("recipe.cpp.o.pattern", properties)); //$NON-NLS-1$ //$NON-NLS-2$
buildModel.put("recipe_c_o_pattern", resolveProperty("recipe.c.o.pattern", properties)); //$NON-NLS-1$ //$NON-NLS-2$
}
}
+ public void clearScannerInfoCache() {
+ cppScannerInfo = null;
+ cScannerInfo = null;
+ }
+
private IScannerInfo calculateScannerInfo(String recipe, IResource resource) throws CoreException {
try {
ArduinoPlatform platform = getBoard().getPlatform();
for (Path include : platform.getIncludePath()) {
includes += " -I\"" + include.toString() + '"'; //$NON-NLS-1$
}
+ Collection<ArduinoLibrary> libs = ArduinoManager.instance.getLibraries(config.getProject());
+ for (ArduinoLibrary lib : libs) {
+ for (Path path : lib.getIncludePath()) {
+ includes += " -I\"" + path.toString() + '"'; //$NON-NLS-1$
+ }
+ }
properties.put("includes", includes); //$NON-NLS-1$
// TODO Windows
public ArduinoConsoleParser[] getBuildConsoleParsers() {
// ../src/Test.cpp:4:1: error: 'x' was not declared in this scope
- return new ArduinoConsoleParser[] { new ArduinoErrorParser("(.*?):(\\d+):(\\d+:)? error: (.*)") { //$NON-NLS-1$
+ return new ArduinoConsoleParser[] { new ArduinoErrorParser("(.*?):(\\d+):(\\d+:)? (fatal )?error: (.*)") { //$NON-NLS-1$
@Override
protected int getSeverity(Matcher matcher) {
return IMarker.SEVERITY_ERROR;
@Override
protected String getMessage(Matcher matcher) {
- return matcher.group(4);
+ return matcher.group(5);
}
@Override
import org.eclipse.cdt.arduino.core.internal.Activator;
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.ArduinoManager;
import org.eclipse.cdt.serial.SerialPort;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.remote.core.IRemoteCommandShellService;
}
public ArduinoBoard getBoard() throws CoreException {
- return ArduinoBoardManager.instance.getBoard(remoteConnection.getAttribute(BOARD_NAME),
+ return ArduinoManager.instance.getBoard(remoteConnection.getAttribute(BOARD_NAME),
remoteConnection.getAttribute(PLATFORM_NAME), remoteConnection.getAttribute(PACKAGE_NAME));
}
</#if>
</#list>
+LIBRARIES_OBJS = \
+<#list libraries_srcs as file>
+<#assign cpp = file?matches("${libraries_path}/(.*?)/.*?/(.*)\\.cpp")>
+<#if cpp>
+ ${build_path}/libraries/${cpp?groups[1]}/${cpp?groups[2]}.o \
+</#if>
+<#assign c = file?matches("${libraries_path}/(.*?)/.*?/(.*)\\.c")>
+<#if c>
+ ${build_path}/libraries/${c?groups[1]}/${c?groups[2]}.o \
+</#if>
+</#list>
+
all: ${build_path}/${project_name}.hex ${build_path}/${project_name}.eep
${build_path}/${project_name}.hex: ${build_path}/${project_name}.elf
${build_path}/${project_name}.eep: ${build_path}/${project_name}.elf
${recipe_objcopy_eep_pattern}
-${build_path}/${project_name}.elf: $(PROJECT_OBJS) ${build_path}/libc.a
+${build_path}/${project_name}.elf: $(PROJECT_OBJS) $(LIBRARIES_OBJS) ${build_path}/core.a
${recipe_c_combine_pattern}
-${build_path}/libc.a: $(PLATFORM_OBJS)
+${build_path}/core.a: $(PLATFORM_OBJS)
clean:
$(RMDIR) ${build_path}
</#if>
</#list>
+
+<#list libraries_srcs as file>
+<#assign cpp = file?matches("${libraries_path}/(.*?)/.*?/(.*)\\.cpp")>
+<#if cpp>
+${build_path}/libraries/${cpp?groups[1]}/${cpp?groups[2]}.o: ${file}
+ @$(call mymkdir,$(dir $@))
+ ${recipe_cpp_o_pattern}
+
+</#if>
+<#assign c = file?matches("${libraries_path}/(.*?)/.*?/(.*)\\.c")>
+<#if c>
+${build_path}/libraries/${c?groups[1]}/${c?groups[2]}.o: ${file}
+ @$(call mymkdir,$(dir $@))
+ ${recipe_c_o_pattern}
+
+</#if>
+</#list>
\ No newline at end of file
</adapt>
</enabledWhen>
</page>
+ <page
+ class="org.eclipse.cdt.arduino.ui.internal.project.LibrariesPropertyPage"
+ id="org.eclipse.cdt.arduino.ui.librariesPropertyPage"
+ name="Libraries">
+ <enabledWhen>
+ <and>
+ <instanceof
+ value="org.eclipse.core.resources.IProject">
+ </instanceof>
+ <test
+ property="org.eclipse.core.resources.projectNature"
+ value="org.eclipse.cdt.arduino.core.arduinoNature">
+ </test>
+ </and>
+ </enabledWhen>
+ </page>
</extension>
<extension
point="org.eclipse.launchbar.ui.launchBarUIContributions">
import java.util.Set;
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.ArduinoManager;
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.board.PackageIndex;
table.removeAll();
try {
- PackageIndex packageIndex = ArduinoBoardManager.instance.getPackageIndex();
+ PackageIndex packageIndex = ArduinoManager.instance.getPackageIndex();
List<ArduinoBoard> boards = new ArrayList<>();
for (ArduinoPackage pkg : packageIndex.getPackages()) {
for (ArduinoPlatform platform : pkg.getLatestPlatforms()) {
--- /dev/null
+package org.eclipse.cdt.arduino.ui.internal.project;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.cdt.arduino.core.internal.board.ArduinoLibrary;
+import org.eclipse.cdt.arduino.core.internal.board.ArduinoManager;
+import org.eclipse.cdt.arduino.core.internal.board.LibraryIndex;
+import org.eclipse.cdt.arduino.ui.internal.Activator;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.BaseLabelProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeColumn;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
+import org.eclipse.ui.dialogs.FilteredTree;
+import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.dialogs.PropertyPage;
+
+public class LibrariesPropertyPage extends PropertyPage {
+
+ private static class ContentProvider implements ITreeContentProvider {
+ private LibraryIndex index;
+
+ @Override
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ index = (LibraryIndex) newInput;
+ }
+
+ @Override
+ public void dispose() {
+ }
+
+ @Override
+ public boolean hasChildren(Object element) {
+ if (element instanceof LibraryIndex) {
+ return !index.getCategories().isEmpty();
+ } else if (element instanceof String) { // category
+ return !index.getLibraries((String) element).isEmpty();
+ } else if (element instanceof ArduinoLibrary) {
+ return false;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public Object getParent(Object element) {
+ if (element instanceof ArduinoLibrary) {
+ return ((ArduinoLibrary) element).getCategory();
+ } else if (element instanceof String) {
+ return index;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public Object[] getElements(Object inputElement) {
+ return ((LibraryIndex) inputElement).getCategories().toArray(new String[0]);
+ }
+
+ @Override
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof String) {
+ return index.getLibraries((String) parentElement).toArray(new ArduinoLibrary[0]);
+ } else {
+ return null;
+ }
+ }
+ }
+
+ private static class LabelProvider extends BaseLabelProvider implements ITableLabelProvider {
+ @Override
+ public Image getColumnImage(Object element, int columnIndex) {
+ return null;
+ }
+
+ @Override
+ public String getColumnText(Object element, int columnIndex) {
+ if (element instanceof String) {
+ return columnIndex == 0 ? (String) element : null;
+ } else if (element instanceof ArduinoLibrary) {
+ switch (columnIndex) {
+ case 0:
+ return ((ArduinoLibrary) element).getName();
+ case 1:
+ return ((ArduinoLibrary) element).getSentence();
+ default:
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ }
+
+ private FilteredTree filteredTree;
+
+ @Override
+ protected Control createContents(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NULL);
+ comp.setLayout(new GridLayout());
+
+ filteredTree = new FilteredTree(comp, SWT.CHECK | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL,
+ new PatternFilter() {
+ @Override
+ protected boolean isLeafMatch(Viewer viewer, Object element) {
+ if (element instanceof String) {
+ return wordMatches((String) element);
+ } else if (element instanceof ArduinoLibrary) {
+ ArduinoLibrary lib = (ArduinoLibrary) element;
+ return wordMatches(lib.getName()) || wordMatches(lib.getSentence())
+ || wordMatches(lib.getParagraph());
+ } else {
+ return false;
+ }
+ }
+ }, true) {
+ @Override
+ protected TreeViewer doCreateTreeViewer(Composite parent, int style) {
+ return new ContainerCheckedTreeViewer(parent, style);
+ }
+ };
+ filteredTree.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ ContainerCheckedTreeViewer viewer = (ContainerCheckedTreeViewer) filteredTree.getViewer();
+
+ Tree tree = viewer.getTree();
+ tree.setHeaderVisible(true);
+ TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
+ column1.setText("Name");
+ column1.setWidth(200);
+ TreeColumn column2 = new TreeColumn(tree, SWT.LEFT);
+ column2.setText("Description");
+ column2.setWidth(200);
+
+ viewer.setContentProvider(new ContentProvider());
+ viewer.setLabelProvider(new LabelProvider());
+
+ try {
+ viewer.setInput(ArduinoManager.instance.getLibraryIndex());
+ // Set the check states for currently selected libraries
+ IProject project = getElement().getAdapter(IProject.class);
+ Collection<ArduinoLibrary> libraries = ArduinoManager.instance.getLibraries(project);
+ for (ArduinoLibrary lib : libraries) {
+ viewer.setChecked(lib, true);
+ }
+ } catch (CoreException e) {
+ Activator.log(e);
+ }
+
+ return comp;
+ }
+
+ @Override
+ public boolean performOk() {
+ List<ArduinoLibrary> libs = new ArrayList<>();
+ for (TreeItem categoryItem : filteredTree.getViewer().getTree().getItems()) {
+ for (TreeItem libItem : categoryItem.getItems()) {
+ ArduinoLibrary lib = (ArduinoLibrary) libItem.getData();
+ if (libItem.getChecked()) {
+ libs.add(lib);
+ }
+ }
+ }
+ try {
+ ArduinoManager.instance.setLibraries(getElement().getAdapter(IProject.class), libs);
+ } catch (CoreException e) {
+ Activator.log(e);
+ }
+ return true;
+ }
+
+}
import java.util.Collection;
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.ArduinoManager;
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;
try {
ArduinoBoard currentBoard = arduinoRemote.getBoard();
- Collection<ArduinoBoard> boardList = ArduinoBoardManager.instance.getBoards();
+ Collection<ArduinoBoard> boardList = ArduinoManager.instance.getBoards();
boards = new ArduinoBoard[boardList.size()];
i = 0;
int boardSel = 0;
import java.util.List;
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.ArduinoManager;
import org.eclipse.cdt.arduino.ui.internal.Activator;
import org.eclipse.cdt.arduino.ui.internal.Messages;
import org.eclipse.cdt.serial.SerialPort;
boardCombo = new Combo(comp, SWT.READ_ONLY);
boardCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
try {
- List<ArduinoBoard> boardList = ArduinoBoardManager.instance.getInstalledBoards();
+ List<ArduinoBoard> boardList = ArduinoManager.instance.getInstalledBoards();
Collections.sort(boardList, new Comparator<ArduinoBoard>() {
@Override
public int compare(ArduinoBoard o1, ArduinoBoard o2) {