private static Library createLibrary(File libFolder) throws IOException { // Parse metadata File propertiesFile = new File(libFolder, "library.properties"); PreferencesMap properties = new PreferencesMap(); properties.load(propertiesFile); // Library sanity checks // --------------------- // 1. Check mandatory properties for (String p : MANDATORY_PROPERTIES) if (!properties.containsKey(p)) throw new IOException("Missing '" + p + "' from library"); // 2. Check mandatory folders File srcFolder = new File(libFolder, "src"); if (!srcFolder.exists() || !srcFolder.isDirectory()) throw new IOException("Missing 'src' folder"); // 3. check if root folder contains prohibited stuff for (File file : libFolder.listFiles()) { if (file.isDirectory()) { if (!OPTIONAL_FOLDERS.contains(file.getName())) throw new IOException("Invalid folder '" + file.getName() + "'."); } else { if (!OPTIONAL_FILES.contains(file.getName())) throw new IOException("Invalid file '" + file.getName() + "'."); } } // Extract metadata info List<String> archs = new ArrayList<String>(); for (String arch : properties.get("architectures").split(",")) archs.add(arch.trim()); List<String> coreDeps = new ArrayList<String>(); for (String dep : properties.get("core-dependencies").split(",")) coreDeps.add(dep.trim()); List<String> dependencies = new ArrayList<String>(); for (String dependency : properties.get("dependencies").split(",")) { dependency = dependency.trim(); if (!dependency.equals("")) { dependencies.add(dependency); } } Library res = new Library(); res.folder = libFolder; res.srcFolder = srcFolder; res.archFolder = new File(libFolder, "arch"); res.name = properties.get("name").trim(); res.author = properties.get("author").trim(); res.email = properties.get("email").trim(); res.sentence = properties.get("sentence").trim(); res.paragraph = properties.get("paragraph").trim(); res.url = properties.get("url").trim(); res.architectures = archs; res.coreDependencies = coreDeps; res.dependencies = dependencies; res.version = properties.get("version").trim(); res.pre15Lib = false; return res; }
public boolean uploadUsingPreferences(File sourcePath, String buildPath, String className, boolean usingProgrammer, List<String> warningsAccumulator) throws Exception { // FIXME: Preferences should be reorganized TargetPlatform targetPlatform = BaseNoGui.getTargetPlatform(); PreferencesMap prefs = PreferencesData.getMap(); prefs.putAll(BaseNoGui.getBoardPreferences()); String tool = prefs.getOrExcept("upload.tool"); if (tool.contains(":")) { String[] split = tool.split(":", 2); targetPlatform = BaseNoGui.getCurrentTargetPlatformFromPackage(split[0]); tool = split[1]; } prefs.putAll(targetPlatform.getTool(tool)); // if no protocol is specified for this board, assume it lacks a // bootloader and upload using the selected programmer. if (usingProgrammer || prefs.get("upload.protocol") == null) { return uploadUsingProgrammer(buildPath, className); } if (noUploadPort) { prefs.put("build.path", buildPath); prefs.put("build.project_name", className); if (verbose) prefs.put("upload.verbose", prefs.getOrExcept("upload.params.verbose")); else prefs.put("upload.verbose", prefs.getOrExcept("upload.params.quiet")); boolean uploadResult; try { String pattern = prefs.getOrExcept("upload.pattern"); String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); uploadResult = executeUploadCommand(cmd); } catch (Exception e) { throw new RunnerException(e); } return uploadResult; } // need to do a little dance for Leonardo and derivatives: // open then close the port at the magic baudrate (usually 1200 bps) first // to signal to the sketch that it should reset into bootloader. after doing // this wait a moment for the bootloader to enumerate. On Windows, also must // deal with the fact that the COM port number changes from bootloader to // sketch. String t = prefs.get("upload.use_1200bps_touch"); boolean doTouch = t != null && t.equals("true"); t = prefs.get("upload.wait_for_upload_port"); boolean waitForUploadPort = (t != null) && t.equals("true"); if (doTouch) { String uploadPort = prefs.getOrExcept("serial.port"); try { // Toggle 1200 bps on selected serial port to force board reset. List<String> before = Serial.list(); if (before.contains(uploadPort)) { if (verbose) System.out.println(_("Forcing reset using 1200bps open/close on port ") + uploadPort); Serial.touchPort(uploadPort, 1200); } Thread.sleep(400); if (waitForUploadPort) { // Scanning for available ports seems to open the port or // otherwise assert DTR, which would cancel the WDT reset if // it happened within 250 ms. So we wait until the reset should // have already occured before we start scanning. uploadPort = waitForUploadPort(uploadPort, before); } } catch (SerialException e) { throw new RunnerException(e); } catch (InterruptedException e) { throw new RunnerException(e.getMessage()); } prefs.put("serial.port", uploadPort); if (uploadPort.startsWith("/dev/")) prefs.put("serial.port.file", uploadPort.substring(5)); else prefs.put("serial.port.file", uploadPort); } prefs.put("build.path", buildPath); prefs.put("build.project_name", className); if (verbose) prefs.put("upload.verbose", prefs.getOrExcept("upload.params.verbose")); else prefs.put("upload.verbose", prefs.getOrExcept("upload.params.quiet")); boolean uploadResult; try { // if (prefs.get("upload.disable_flushing") == null // || prefs.get("upload.disable_flushing").toLowerCase().equals("false")) { // flushSerialBuffer(); // } String pattern = prefs.getOrExcept("upload.pattern"); String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); uploadResult = executeUploadCommand(cmd); } catch (RunnerException e) { throw e; } catch (Exception e) { throw new RunnerException(e); } try { if (uploadResult && doTouch) { String uploadPort = PreferencesData.get("serial.port"); if (waitForUploadPort) { // For Due/Leonardo wait until the bootloader serial port disconnects and the // sketch serial port reconnects (or timeout after a few seconds if the // sketch port never comes back). Doing this saves users from accidentally // opening Serial Monitor on the soon-to-be-orphaned bootloader port. Thread.sleep(1000); long started = System.currentTimeMillis(); while (System.currentTimeMillis() - started < 2000) { List<String> portList = Serial.list(); if (portList.contains(uploadPort)) break; Thread.sleep(250); } } } } catch (InterruptedException ex) { // noop } return uploadResult; }
public boolean uploadUsingProgrammer(String buildPath, String className) throws Exception { TargetPlatform targetPlatform = BaseNoGui.getTargetPlatform(); String programmer = PreferencesData.get("programmer"); if (programmer.contains(":")) { String[] split = programmer.split(":", 2); targetPlatform = BaseNoGui.getCurrentTargetPlatformFromPackage(split[0]); programmer = split[1]; } PreferencesMap prefs = PreferencesData.getMap(); prefs.putAll(BaseNoGui.getBoardPreferences()); PreferencesMap programmerPrefs = targetPlatform.getProgrammer(programmer); if (programmerPrefs == null) throw new RunnerException( _("Please select a programmer from Tools->Programmer menu")); prefs.putAll(programmerPrefs); prefs.putAll(targetPlatform.getTool(prefs.getOrExcept("program.tool"))); prefs.put("build.path", buildPath); prefs.put("build.project_name", className); if (verbose) prefs.put("program.verbose", prefs.getOrExcept("program.params.verbose")); else prefs.put("program.verbose", prefs.getOrExcept("program.params.quiet")); try { // if (prefs.get("program.disable_flushing") == null // || prefs.get("program.disable_flushing").toLowerCase().equals("false")) // { // flushSerialBuffer(); // } String pattern = prefs.getOrExcept("program.pattern"); String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); return executeUploadCommand(cmd); } catch (RunnerException e) { throw e; } catch (Exception e) { throw new RunnerException(e); } }
public boolean burnBootloader() throws Exception { TargetPlatform targetPlatform = BaseNoGui.getTargetPlatform(); // Find preferences for the selected programmer PreferencesMap programmerPrefs; String programmer = PreferencesData.get("programmer"); if (programmer.contains(":")) { String[] split = programmer.split(":", 2); TargetPlatform platform = BaseNoGui.getCurrentTargetPlatformFromPackage(split[0]); programmer = split[1]; programmerPrefs = platform.getProgrammer(programmer); } else { programmerPrefs = targetPlatform.getProgrammer(programmer); } if (programmerPrefs == null) throw new RunnerException( _("Please select a programmer from Tools->Programmer menu")); // Build configuration for the current programmer PreferencesMap prefs = PreferencesData.getMap(); prefs.putAll(BaseNoGui.getBoardPreferences()); prefs.putAll(programmerPrefs); // Create configuration for bootloader tool PreferencesMap toolPrefs = new PreferencesMap(); String tool = prefs.getOrExcept("bootloader.tool"); if (tool.contains(":")) { String[] split = tool.split(":", 2); TargetPlatform platform = BaseNoGui.getCurrentTargetPlatformFromPackage(split[0]); tool = split[1]; toolPrefs.putAll(platform.getTool(tool)); if (toolPrefs.size() == 0) throw new RunnerException(I18n.format(_("Could not find tool {0} from package {1}"), tool, split[0])); } toolPrefs.putAll(targetPlatform.getTool(tool)); if (toolPrefs.size() == 0) throw new RunnerException(I18n.format(_("Could not find tool {0}"), tool)); // Merge tool with global configuration prefs.putAll(toolPrefs); if (verbose) { prefs.put("erase.verbose", prefs.getOrExcept("erase.params.verbose")); prefs.put("bootloader.verbose", prefs.getOrExcept("bootloader.params.verbose")); } else { prefs.put("erase.verbose", prefs.getOrExcept("erase.params.quiet")); prefs.put("bootloader.verbose", prefs.getOrExcept("bootloader.params.quiet")); } try { String pattern = prefs.getOrExcept("erase.pattern"); String[] cmd = StringReplacer.formatAndSplit(pattern, prefs, true); if (!executeUploadCommand(cmd)) return false; pattern = prefs.getOrExcept("bootloader.pattern"); cmd = StringReplacer.formatAndSplit(pattern, prefs, true); return executeUploadCommand(cmd); } catch (RunnerException e) { throw e; } catch (Exception e) { throw new RunnerException(e); } }
public static UserLibrary create(File libFolder) throws IOException { // Parse metadata File propertiesFile = new File(libFolder, "library.properties"); PreferencesMap properties = new PreferencesMap(); properties.load(propertiesFile); // Library sanity checks // --------------------- // Compatibility with 1.5 rev.1 libraries: // "email" field changed to "maintainer" if (!properties.containsKey("maintainer") && properties.containsKey("email")) { properties.put("maintainer", properties.get("email")); } // Compatibility with 1.5 rev.1 libraries: // "arch" folder no longer supported File archFolder = new File(libFolder, "arch"); if (archFolder.isDirectory()) throw new IOException( "'arch' folder is no longer supported! See http://goo.gl/gfFJzU for more information"); // Check mandatory properties for (String p : Constants.LIBRARY_MANDATORY_PROPERTIES) if (!properties.containsKey(p)) throw new IOException("Missing '" + p + "' from library"); // Check layout LibraryLayout layout; File srcFolder = new File(libFolder, "src"); if (srcFolder.exists() && srcFolder.isDirectory()) { // Layout with a single "src" folder and recursive compilation layout = LibraryLayout.RECURSIVE; } else { // Layout with source code on library's root and "utility" folders layout = LibraryLayout.FLAT; } // Warn if root folder contains development leftovers File[] files = libFolder.listFiles(); if (files == null) { throw new IOException("Unable to list files of library in " + libFolder); } // Extract metadata info String architectures = properties.get("architectures"); if (architectures == null) architectures = "*"; // defaults to "any" List<String> archs = new ArrayList<>(); for (String arch : architectures.split(",")) archs.add(arch.trim()); String category = properties.get("category"); if (category == null) { category = "Uncategorized"; } if (!Constants.LIBRARY_CATEGORIES.contains(category)) { category = "Uncategorized"; } String license = properties.get("license"); if (license == null) { license = "Unspecified"; } String types = properties.get("types"); if (types == null) { types = "Contributed"; } List<String> typesList = new LinkedList<>(); for (String type : types.split(",")) { typesList.add(type.trim()); } List<String> includes = null; if (properties.containsKey("includes")) { includes = new ArrayList<>(); for (String i : properties.get("includes").split(",")) includes.add(i.trim()); } UserLibrary res = new UserLibrary(); res.setInstalledFolder(libFolder); res.setInstalled(true); res.name = properties.get("name").trim(); res.version = properties.get("version").trim(); res.author = properties.get("author").trim(); res.maintainer = properties.get("maintainer").trim(); res.sentence = properties.get("sentence").trim(); res.paragraph = properties.get("paragraph").trim(); res.website = properties.get("url").trim(); res.category = category.trim(); res.license = license.trim(); res.architectures = archs; res.layout = layout; res.declaredTypes = typesList; res.onGoingDevelopment = Files.exists( Paths.get(libFolder.getAbsolutePath(), Constants.LIBRARY_DEVELOPMENT_FLAG_FILE)); res.includes = includes; return res; }