diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index a34296421..02bd6ebd2 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -1019,6 +1019,9 @@ public abstract class Editor extends JFrame implements RunnerListener { addToolMenuItem(menu, "processing.app.tools.Archiver"); if (Base.isMacOS()) { + if (SerialFixer.isNeeded()) { + addToolMenuItem(menu, "processing.app.tools.SerialFixer"); + } addToolMenuItem(menu, "processing.app.tools.InstallCommander"); } diff --git a/app/src/processing/app/tools/SerialFixer.java b/app/src/processing/app/tools/SerialFixer.java new file mode 100644 index 000000000..7065b53bc --- /dev/null +++ b/app/src/processing/app/tools/SerialFixer.java @@ -0,0 +1,89 @@ +/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */ + +/* + Part of the Processing project - http://processing.org + + Copyright (c) 2012 The Processing Foundation + + 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, version 2. + + 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 +*/ + +package processing.app.tools; + +import java.io.File; + +import javax.swing.JOptionPane; + +import processing.app.Base; +import processing.app.Editor; +import processing.core.PApplet; + + +public class SerialFixer implements Tool { + Editor editor; + + + public String getMenuTitle() { + return "Fix the Serial Library"; + } + + + public void init(Editor editor) { + this.editor = editor; + } + + + public void run() { + final String primary = + "Attempt to fix common serial port problems?"; + final String secondary = + "Click “OK” to perform additional installation steps to enable " + + "the Serial library. An administrator password will be required."; + + int result = + JOptionPane.showConfirmDialog(editor, + " " + + "
" + + "" + primary + "" + + "" + secondary + "
", + "Commander", + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE); + + if (result == JOptionPane.OK_OPTION) { + String shellScript = "mkdir -p /var/lock && chmod 777 /var/lock"; + String appleScript = + "do shell script \"" + shellScript + "\" with administrator privileges"; + PApplet.exec(new String[] { "osascript", "-e", appleScript }); + } + editor.statusNotice("Finished."); + } + + + static public boolean isNeeded() { + if (Base.isMacOS()) { + File lockFolder = new File("/var/lock"); + if (!lockFolder.exists() || + !lockFolder.canRead() || + !lockFolder.canWrite() || + !lockFolder.canExecute()) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/java/libraries/serial/src/processing/serial/Serial.java b/java/libraries/serial/src/processing/serial/Serial.java index a247591ab..1d148455c 100644 --- a/java/libraries/serial/src/processing/serial/Serial.java +++ b/java/libraries/serial/src/processing/serial/Serial.java @@ -100,6 +100,7 @@ public class Serial implements SerialPortEventListener { this(parent, dname, drate, dparity, ddatabits, dstopbits); } + /** * @param irate 9600 is the default */ @@ -107,6 +108,7 @@ public class Serial implements SerialPortEventListener { this(parent, dname, irate, dparity, ddatabits, dstopbits); } + /** * @param iname name of the port (COM1 is the default) */ @@ -118,6 +120,7 @@ public class Serial implements SerialPortEventListener { this(parent, iname, drate, dparity, ddatabits, dstopbits); } + /** * @param iparity 'N' for none, 'E' for even, 'O' for odd ('N' is the default) * @param idatabits 8 is the default @@ -143,8 +146,11 @@ public class Serial implements SerialPortEventListener { "sudo mkdir -p /var/lock\n" + "sudo chmod 777 /var/lock"; System.err.println(MESSAGE); - throw new RuntimeException("Additional installation required to " + - "use serial, read the console below."); + //throw new RuntimeException("Additional installation required to " + + // "use serial, read the console below."); + final String msg = + "Please use Tools \u2192 Fix the Serial Library."; + throw new RuntimeException(msg); } } @@ -189,7 +195,7 @@ public class Serial implements SerialPortEventListener { output = null; } - parent.registerDispose(this); + parent.registerMethod("dispose", this); // reflection to check whether host applet has a call for // public void serialEvent(processing.serial.Serial) @@ -240,18 +246,19 @@ public class Serial implements SerialPortEventListener { /** - * Set the DTR line. Addition from Tom Hulbert. - */ + * Set the DTR line. Addition from Tom Hulbert. + */ public void setDTR(boolean state) { - port.setDTR(state); + port.setDTR(state); } -/** - * @generate serialEvent.xml - * @webref serial:events - * @usage web_application - * @param serialEvent the port where new data is available - */ + + /** + * @generate serialEvent.xml + * @webref serial:events + * @usage web_application + * @param serialEvent the port where new data is available + */ synchronized public void serialEvent(SerialPortEvent serialEvent) { if (serialEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try {