From 1c0c0fe69b16626a1454d0fe7df19d202c2fb412 Mon Sep 17 00:00:00 2001 From: "David A. Mellis" Date: Thu, 21 Jun 2007 22:24:57 +0000 Subject: [PATCH] Factoring out uisp from the uploader in preparation for also allowing avrdude. --- app/Base.java | 2 +- app/Editor.java | 2 +- app/Sketch.java | 2 +- app/UispUploader.java | 134 ++++++++++++++++++++++++++++++++++++++++++ app/Uploader.java | 123 ++++++++++---------------------------- 5 files changed, 168 insertions(+), 95 deletions(-) create mode 100755 app/UispUploader.java diff --git a/app/Base.java b/app/Base.java index 56603f25a..87f2c69a8 100644 --- a/app/Base.java +++ b/app/Base.java @@ -53,7 +53,7 @@ import com.ice.jni.registry.*; */ public class Base { static final int VERSION = 3; - static final String VERSION_NAME = "0008 Alpha"; + static final String VERSION_NAME = "0009 Alpha"; // platform IDs for PApplet.platform diff --git a/app/Editor.java b/app/Editor.java index 97f3a891b..ad9ad9716 100644 --- a/app/Editor.java +++ b/app/Editor.java @@ -2013,7 +2013,7 @@ public class Editor extends JFrame try { //boolean success = sketch.isLibrary() ? //sketch.exportLibrary() : sketch.exportApplet(); - Uploader uploader = new Uploader(); + Uploader uploader = new UispUploader(); boolean success = parallel ? uploader.burnBootloaderParallel() : uploader.burnBootloaderAVRISP(); diff --git a/app/Sketch.java b/app/Sketch.java index b45725cca..ba52b0b2a 100644 --- a/app/Sketch.java +++ b/app/Sketch.java @@ -1675,7 +1675,7 @@ public class Sketch { // download the program // - Uploader uploader = new Uploader(); + Uploader uploader = new UispUploader(); // macos9 now officially broken.. see PdeCompilerJavac //PdeCompiler compiler = // ((PdeBase.platform == PdeBase.MACOS9) ? diff --git a/app/UispUploader.java b/app/UispUploader.java new file mode 100755 index 000000000..55fec638c --- /dev/null +++ b/app/UispUploader.java @@ -0,0 +1,134 @@ +/* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Uploader - default downloader class that connects to uisp + Part of the Arduino project - http://www.arduino.cc/ + + Copyright (c) 2004-05 + Hernando Barragan + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + $Id$ +*/ + +package processing.app; +import java.io.*; +import java.util.*; +import java.util.zip.*; +import javax.swing.*; +//#ifndef RXTX +//import javax.comm.*; +//#else +// rxtx uses package gnu.io, but all the class names +// are the same as those used by javax.comm +import gnu.io.*; +//#endif + + +public class UispUploader extends Uploader { + //PdePreferences preferences; + + //Serial serialPort; + static InputStream serialInput; + static OutputStream serialOutput; + //int serial; // last byte of data received + + public UispUploader() { + } + + public boolean uploadUsingPreferences(String buildPath, String className) + throws RunnerException { + List commandDownloader = new ArrayList(); + commandDownloader.add("-dprog=" + Preferences.get("upload.programmer")); + if (Preferences.get("upload.programmer").equals("dapa")) + commandDownloader.add("-dlpt=" + Preferences.get("parallel.port")); + else { + commandDownloader.add( + "-dserial=" + (Base.isWindows() ? + "/dev/" + Preferences.get("serial.port").toLowerCase() : + Preferences.get("serial.port"))); + commandDownloader.add( + "-dspeed=" + Preferences.getInteger("serial.download_rate")); + } + if (Preferences.getBoolean("upload.erase")) + commandDownloader.add("--erase"); + commandDownloader.add("--upload"); + if (Preferences.getBoolean("upload.verify")) + commandDownloader.add("--verify"); + commandDownloader.add("if=" + buildPath + File.separator + className + ".hex"); + return uisp(commandDownloader); + } + + public boolean burnBootloaderAVRISP() throws RunnerException { + List commandDownloader = new ArrayList(); + commandDownloader.add("-dprog=" + Preferences.get("bootloader.programmer")); + commandDownloader.add( + "-dserial=" + (Base.isWindows() ? + "/dev/" + Preferences.get("serial.port").toLowerCase() : + Preferences.get("serial.port"))); + commandDownloader.add("-dspeed=" + Preferences.get("serial.burn_rate")); + return burnBootloader(commandDownloader); + } + + public boolean burnBootloaderParallel() throws RunnerException { + List commandDownloader = new ArrayList(); + commandDownloader.add("-dprog=dapa"); + commandDownloader.add("-dlpt=" + Preferences.get("parallel.port")); + return burnBootloader(commandDownloader); + } + + protected boolean burnBootloader(Collection params) throws RunnerException { + // I know this is ugly; apologies - that's what happens when you try to + // write Lisp-style code in Java. + return + // unlock bootloader segment of flash memory + uisp(params, Arrays.asList(new String[] { + "--wr_lock=" + Preferences.get("bootloader.unlock_bits") })) && + // write fuses: + // bootloader size of 512 words; from 0xE00-0xFFF + // clock speed of 16 MHz, external quartz + uisp(params, Arrays.asList(new String[] { + "--wr_fuse_l=" + Preferences.get("bootloader.low_fuses"), + "--wr_fuse_h=" + Preferences.get("bootloader.high_fuses") })) && + // upload bootloader + uisp(params, Arrays.asList(new String[] { + "--erase", "--upload", "--verify", + "if=" + Preferences.get("bootloader.path") + File.separator + + Preferences.get("bootloader.file") })) && + // lock bootloader segment + uisp(params, Arrays.asList(new String[] { + "--wr_lock=" + Preferences.get("bootloader.lock_bits") })); + } + + public boolean uisp(Collection p1, Collection p2) throws RunnerException { + ArrayList p = new ArrayList(p1); + p.addAll(p2); + return uisp(p); + } + + public boolean uisp(Collection params) throws RunnerException { + flushSerialBuffer(); + + List commandDownloader = new ArrayList(); + commandDownloader.add("uisp"); + if (Preferences.getBoolean("upload.verbose")) + commandDownloader.add("-v=4"); + commandDownloader.add("-dpart=" + Preferences.get("build.mcu")); + commandDownloader.addAll(params); + + return executeUploadCommand(commandDownloader); + } +} diff --git a/app/Uploader.java b/app/Uploader.java index f95930576..f9ac7867f 100755 --- a/app/Uploader.java +++ b/app/Uploader.java @@ -1,7 +1,7 @@ /* -*- mode: jde; c-basic-offset: 2; indent-tabs-mode: nil -*- */ /* - Uploader - default downloader class that connects to uisp + Uploader - abstract uploading baseclass (common to both uisp and avrdude) Part of the Arduino project - http://www.arduino.cc/ Copyright (c) 2004-05 @@ -38,7 +38,7 @@ import gnu.io.*; //#endif -public class Uploader implements MessageConsumer { +public abstract class Uploader implements MessageConsumer { static final String BUGS_URL = "https://developer.berlios.de/bugs/?group_id=3590"; static final String SUPER_BADNESS = @@ -55,85 +55,40 @@ public class Uploader implements MessageConsumer { public Uploader() { } - public boolean uploadUsingPreferences(String buildPath, String className) - throws RunnerException { - List commandDownloader = new ArrayList(); - commandDownloader.add("-dprog=" + Preferences.get("upload.programmer")); - if (Preferences.get("upload.programmer").equals("dapa")) - commandDownloader.add("-dlpt=" + Preferences.get("parallel.port")); - else { - commandDownloader.add( - "-dserial=" + (Base.isWindows() ? - "/dev/" + Preferences.get("serial.port").toLowerCase() : - Preferences.get("serial.port"))); - commandDownloader.add( - "-dspeed=" + Preferences.getInteger("serial.download_rate")); + public abstract boolean uploadUsingPreferences(String buildPath, String className) + throws RunnerException; + + public abstract boolean burnBootloaderAVRISP() throws RunnerException; + + public abstract boolean burnBootloaderParallel() throws RunnerException; + + protected void flushSerialBuffer() { + // Cleanup the serial buffer + Serial serialPort = new Serial(); + byte[] readBuffer; + while(serialPort.available() > 0) { + readBuffer = serialPort.readBytes(); + try { + Thread.sleep(100); + } catch (InterruptedException e) {} } - if (Preferences.getBoolean("upload.erase")) - commandDownloader.add("--erase"); - commandDownloader.add("--upload"); - if (Preferences.getBoolean("upload.verify")) - commandDownloader.add("--verify"); - commandDownloader.add("if=" + buildPath + File.separator + className + ".hex"); - return uisp(commandDownloader); + serialPort.dispose(); } - public boolean burnBootloaderAVRISP() throws RunnerException { - List commandDownloader = new ArrayList(); - commandDownloader.add("-dprog=" + Preferences.get("bootloader.programmer")); - commandDownloader.add( - "-dserial=" + (Base.isWindows() ? - "/dev/" + Preferences.get("serial.port").toLowerCase() : - Preferences.get("serial.port"))); - commandDownloader.add("-dspeed=" + Preferences.get("serial.burn_rate")); - return burnBootloader(commandDownloader); - } - - public boolean burnBootloaderParallel() throws RunnerException { - List commandDownloader = new ArrayList(); - commandDownloader.add("-dprog=dapa"); - commandDownloader.add("-dlpt=" + Preferences.get("parallel.port")); - return burnBootloader(commandDownloader); - } - - protected boolean burnBootloader(Collection params) throws RunnerException { - // I know this is ugly; apologies - that's what happens when you try to - // write Lisp-style code in Java. - return - // unlock bootloader segment of flash memory - uisp(params, Arrays.asList(new String[] { - "--wr_lock=" + Preferences.get("bootloader.unlock_bits") })) && - // write fuses: - // bootloader size of 512 words; from 0xE00-0xFFF - // clock speed of 16 MHz, external quartz - uisp(params, Arrays.asList(new String[] { - "--wr_fuse_l=" + Preferences.get("bootloader.low_fuses"), - "--wr_fuse_h=" + Preferences.get("bootloader.high_fuses") })) && - // upload bootloader - uisp(params, Arrays.asList(new String[] { - "--erase", "--upload", "--verify", - "if=" + Preferences.get("bootloader.path") + File.separator + - Preferences.get("bootloader.file") })) && - // lock bootloader segment - uisp(params, Arrays.asList(new String[] { - "--wr_lock=" + Preferences.get("bootloader.lock_bits") })); - } - - public boolean uisp(Collection p1, Collection p2) throws RunnerException { - ArrayList p = new ArrayList(p1); - p.addAll(p2); - return uisp(p); - } - - public boolean uisp(Collection params) throws RunnerException { - String userdir = System.getProperty("user.dir") + File.separator; - + protected boolean executeUploadCommand(Collection commandDownloader) + throws RunnerException + { firstErrorFound = false; // haven't found any errors yet secondErrorFound = false; notFoundError = false; int result=0; // pre-initialized to quiet a bogus warning from jikes + + String userdir = System.getProperty("user.dir") + File.separator; + try { - List commandDownloader = new ArrayList(); + String[] commandArray = new String[commandDownloader.size()]; + commandDownloader.toArray(commandArray); + String avrBasePath; if(Base.isMacOS()) { avrBasePath = new String("tools/avr/bin/"); @@ -144,25 +99,9 @@ public class Uploader implements MessageConsumer { else { avrBasePath = new String(userdir + "tools/avr/bin/"); } - commandDownloader.add(avrBasePath + "uisp"); - //commandDownloader.add((!Base.isMacOS() ? "" : userdir) + "tools/avr/bin/uisp"); - if (Preferences.getBoolean("upload.verbose")) - commandDownloader.add("-v=4"); - commandDownloader.add("-dpart=" + Preferences.get("build.mcu")); - commandDownloader.addAll(params); - //commandDownloader.add("-v=4"); // extra verbosity for help debugging. - - // Cleanup the serial buffer - Serial serialPort = new Serial(); - byte[] readBuffer; - while(serialPort.available() > 0) { - readBuffer = serialPort.readBytes(); - Thread.sleep(100); - } - serialPort.dispose(); - - String[] commandArray = new String[commandDownloader.size()]; - commandDownloader.toArray(commandArray); + + commandArray[0] = avrBasePath + commandArray[0]; + if (Preferences.getBoolean("upload.verbose")) { for(int i = 0; i < commandArray.length; i++) { System.out.print(commandArray[i] + " ");