From d69ab6ae055b5db8b2443680e74fdb274ecdb177 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Tue, 26 Feb 2013 14:45:27 +0100 Subject: [PATCH] introducing jSSC: an RXTX replacement --- app/lib/RXTXcomm.jar | Bin 63089 -> 0 bytes app/lib/jssc.jar | Bin 0 -> 13540 bytes app/src/processing/app/Editor.java | 42 +-- app/src/processing/app/Serial.java | 420 +++------------------ app/src/processing/app/debug/Uploader.java | 6 +- 5 files changed, 63 insertions(+), 405 deletions(-) delete mode 100644 app/lib/RXTXcomm.jar create mode 100644 app/lib/jssc.jar diff --git a/app/lib/RXTXcomm.jar b/app/lib/RXTXcomm.jar deleted file mode 100644 index 14de2259b29d251dc14cb88fa43c21af6cff4ada..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63089 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 z 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 diff --git a/app/lib/jssc.jar b/app/lib/jssc.jar new file mode 100644 index 0000000000000000000000000000000000000000..8545759c51f7652ae89aeb00ee2f28fae1a15c63 GIT binary patch literal 13540 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 literal 0 HcmV?d00001 diff --git a/app/src/processing/app/Editor.java b/app/src/processing/app/Editor.java index 0175da235..dd9d1ffe3 100644 --- a/app/src/processing/app/Editor.java +++ b/app/src/processing/app/Editor.java @@ -22,6 +22,7 @@ package processing.app; +import jssc.SerialPortList; import processing.app.debug.*; import processing.app.syntax.*; import processing.app.tools.*; @@ -43,8 +44,6 @@ import javax.swing.event.*; import javax.swing.text.*; import javax.swing.undo.*; -import gnu.io.*; - /** * Main editor panel for the Processing Development Environment. */ @@ -979,36 +978,19 @@ public class Editor extends JFrame implements RunnerListener { serialMenu.removeAll(); boolean empty = true; - try - { - for (Enumeration enumeration = CommPortIdentifier.getPortIdentifiers(); enumeration.hasMoreElements();) - { - CommPortIdentifier commportidentifier = (CommPortIdentifier)enumeration.nextElement(); - //System.out.println("Found communication port: " + commportidentifier); - if (commportidentifier.getPortType() == CommPortIdentifier.PORT_SERIAL) - { - //System.out.println("Adding port to serial port menu: " + commportidentifier); - String curr_port = commportidentifier.getName(); - rbMenuItem = new JCheckBoxMenuItem(curr_port, curr_port.equals(Preferences.get("serial.port"))); - rbMenuItem.addActionListener(serialMenuListener); - //serialGroup.add(rbMenuItem); - serialMenu.add(rbMenuItem); - empty = false; - } - } - if (!empty) { - //System.out.println("enabling the serialMenu"); - serialMenu.setEnabled(true); - } - + String[] portNames = SerialPortList.getPortNames(); + for (String curr_port : portNames) { + rbMenuItem = new JCheckBoxMenuItem(curr_port, curr_port.equals(Preferences.get("serial.port"))); + rbMenuItem.addActionListener(serialMenuListener); + //serialGroup.add(rbMenuItem); + serialMenu.add(rbMenuItem); + empty = false; + } + if (!empty) { + //System.out.println("enabling the serialMenu"); + serialMenu.setEnabled(true); } - catch (Exception exception) - { - System.out.println(_("error retrieving port list")); - exception.printStackTrace(); - } - if (serialMenu.getItemCount() == 0) { serialMenu.setEnabled(false); } diff --git a/app/src/processing/app/Serial.java b/app/src/processing/app/Serial.java index 5537f9275..c1caaec4a 100644 --- a/app/src/processing/app/Serial.java +++ b/app/src/processing/app/Serial.java @@ -25,11 +25,10 @@ package processing.app; //import processing.core.*; +import jssc.*; import processing.app.debug.MessageConsumer; import static processing.app.I18n._; -import gnu.io.*; - import java.io.*; import java.util.*; @@ -53,15 +52,6 @@ public class Serial implements SerialPortEventListener { int stopbits; boolean monitor = false; - // read buffer and streams - - InputStream input; - OutputStream output; - - byte buffer[] = new byte[32768]; - int bufferIndex; - int bufferLast; - MessageConsumer consumer; public Serial(boolean monitor) throws SerialException { @@ -102,30 +92,15 @@ public class Serial implements SerialPortEventListener { } public static boolean touchPort(String iname, int irate) throws SerialException { - SerialPort port; - boolean result = false; + SerialPort port = new SerialPort(iname); try { - @SuppressWarnings("unchecked") - Enumeration portList = CommPortIdentifier.getPortIdentifiers(); - while (portList.hasMoreElements()) { - CommPortIdentifier portId = portList.nextElement(); - if ((CommPortIdentifier.PORT_SERIAL == portId.getPortType()) && (portId.getName().equals(iname))) { - port = (SerialPort) portId.open("tap", 2000); - port.setSerialPortParams(irate, 8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); - port.close(); - result = true; - } - } - } catch (PortInUseException e) { - throw new SerialException( - I18n.format(_("Serial port ''{0}'' already in use. Try quitting any programs that may be using it."), iname) - ); - } catch (Exception e) { - throw new SerialException( - I18n.format(_("Error touching serial port ''{0}''."), iname), e - ); + port.openPort(); + port.setParams(irate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE, false, true); + port.closePort(); + return true; + } catch (SerialPortException e) { + throw new SerialException(I18n.format(_("Error touching serial port ''{0}''."), iname), e); } - return result; } public Serial(String iname, int irate, @@ -148,46 +123,15 @@ public class Serial implements SerialPortEventListener { if (istopbits == 2) stopbits = SerialPort.STOPBITS_2; try { - port = null; - @SuppressWarnings("unchecked") - Enumeration portList = CommPortIdentifier.getPortIdentifiers(); - while (portList.hasMoreElements()) { - CommPortIdentifier portId = portList.nextElement(); + port = new SerialPort(iname); - if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { - //System.out.println("found " + portId.getName()); - if (portId.getName().equals(iname)) { - //System.out.println("looking for "+iname); - port = (SerialPort)portId.open("serial madness", 2000); - port.setDTR(true); - port.setRTS(true); - input = port.getInputStream(); - output = port.getOutputStream(); - port.setSerialPortParams(rate, databits, stopbits, parity); - port.addEventListener(this); - port.notifyOnDataAvailable(true); - //System.out.println("opening, ready to roll"); - } - } - } - } catch (PortInUseException e) { - throw new SerialException( - I18n.format( - _("Serial port ''{0}'' already in use. Try quiting any programs that may be using it."), - iname - ) - ); - } catch (Exception e) { - throw new SerialException( - I18n.format( - _("Error opening serial port ''{0}''."), - iname - ), - e - ); -// //errorMessage("", e); -// //exception = e; -// //e.printStackTrace(); + //System.out.println("looking for "+iname); + port.openPort(); + port.setParams(rate, databits, stopbits, parity, false, true); + port.addEventListener(this); + //System.out.println("opening, ready to roll"); + } catch (SerialPortException e) { + throw new SerialException(I18n.format(_("Error opening serial port ''{0}''."),iname),e); } if (port == null) { @@ -221,18 +165,7 @@ public class Serial implements SerialPortEventListener { public void dispose() { try { - // do io streams need to be closed first? - if (input != null) input.close(); - if (output != null) output.close(); - - } catch (Exception e) { - e.printStackTrace(); - } - input = null; - output = null; - - try { - if (port != null) port.close(); // close the port + if (port != null) port.closePort(); // close the port } catch (Exception e) { e.printStackTrace(); @@ -246,270 +179,34 @@ public class Serial implements SerialPortEventListener { } - synchronized public void serialEvent(SerialPortEvent serialEvent) { - //System.out.println("serial port event"); // " + serialEvent); - //System.out.flush(); - //System.out.println("into"); - //System.out.flush(); - //System.err.println("type " + serialEvent.getEventType()); - //System.err.println("ahoooyey"); - //System.err.println("ahoooyeysdfsdfsdf"); - if (serialEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { - //System.out.println("data available"); - //System.err.flush(); - try { - while (input.available() > 0) { - //if (input.available() > 0) { - //serial = input.read(); - //serialEvent(); - //buffer[bufferCount++] = (byte) serial; - synchronized (buffer) { - if (bufferLast == buffer.length) { - byte temp[] = new byte[bufferLast << 1]; - System.arraycopy(buffer, 0, temp, 0, bufferLast); - buffer = temp; - } - //buffer[bufferLast++] = (byte) input.read(); - if(monitor == true) - System.out.print((char) input.read()); - if (this.consumer != null) - this.consumer.message("" + (char) input.read()); - - /* - System.err.println(input.available() + " " + - ((char) buffer[bufferLast-1])); - */ //} + public synchronized void serialEvent(SerialPortEvent serialEvent) { + switch (serialEvent.getEventType()) { + case SerialPortEvent.RXCHAR: + case SerialPortEvent.RXFLAG: + try { + byte[] bytes = port.readBytes(); + String bytesAsString = new String(bytes); + if(monitor) { + System.out.print(bytesAsString); } + if (this.consumer != null) { + this.consumer.message(bytesAsString); + } + } catch (SerialPortException e) { + errorMessage("serialEvent", e); } - //System.out.println("no more"); - - } catch (IOException e) { - errorMessage("serialEvent", e); - //e.printStackTrace(); - //System.out.println("angry"); - } - catch (Exception e) { - } - } - //System.out.println("out of"); - //System.err.println("out of event " + serialEvent.getEventType()); - } - - - /** - * Returns the number of bytes that have been read from serial - * and are waiting to be dealt with by the user. - */ - public int available() { - return (bufferLast - bufferIndex); - } - - - /** - * Ignore all the bytes read so far and empty the buffer. - */ - public void clear() { - bufferLast = 0; - bufferIndex = 0; - } - - - /** - * Returns a number between 0 and 255 for the next byte that's - * waiting in the buffer. - * Returns -1 if there was no byte (although the user should - * first check available() to see if things are ready to avoid this) - */ - public int read() { - if (bufferIndex == bufferLast) return -1; - - synchronized (buffer) { - int outgoing = buffer[bufferIndex++] & 0xff; - if (bufferIndex == bufferLast) { // rewind - bufferIndex = 0; - bufferLast = 0; - } - return outgoing; } } - /** - * Returns the next byte in the buffer as a char. - * Returns -1, or 0xffff, if nothing is there. - */ - public char readChar() { - if (bufferIndex == bufferLast) return (char)(-1); - return (char) read(); - } - - - /** - * Return a byte array of anything that's in the serial buffer. - * Not particularly memory/speed efficient, because it creates - * a byte array on each read, but it's easier to use than - * readBytes(byte b[]) (see below). - */ - public byte[] readBytes() { - if (bufferIndex == bufferLast) return null; - - synchronized (buffer) { - int length = bufferLast - bufferIndex; - byte outgoing[] = new byte[length]; - System.arraycopy(buffer, bufferIndex, outgoing, 0, length); - - bufferIndex = 0; // rewind - bufferLast = 0; - return outgoing; - } - } - - - /** - * Grab whatever is in the serial buffer, and stuff it into a - * byte buffer passed in by the user. This is more memory/time - * efficient than readBytes() returning a byte[] array. - * - * Returns an int for how many bytes were read. If more bytes - * are available than can fit into the byte array, only those - * that will fit are read. - */ - public int readBytes(byte outgoing[]) { - if (bufferIndex == bufferLast) return 0; - - synchronized (buffer) { - int length = bufferLast - bufferIndex; - if (length > outgoing.length) length = outgoing.length; - System.arraycopy(buffer, bufferIndex, outgoing, 0, length); - - bufferIndex += length; - if (bufferIndex == bufferLast) { - bufferIndex = 0; // rewind - bufferLast = 0; - } - return length; - } - } - - - /** - * Reads from the serial port into a buffer of bytes up to and - * including a particular character. If the character isn't in - * the serial buffer, then 'null' is returned. - */ - public byte[] readBytesUntil(int interesting) { - if (bufferIndex == bufferLast) return null; - byte what = (byte)interesting; - - synchronized (buffer) { - int found = -1; - for (int k = bufferIndex; k < bufferLast; k++) { - if (buffer[k] == what) { - found = k; - break; - } - } - if (found == -1) return null; - - int length = found - bufferIndex + 1; - byte outgoing[] = new byte[length]; - System.arraycopy(buffer, bufferIndex, outgoing, 0, length); - - bufferIndex = 0; // rewind - bufferLast = 0; - return outgoing; - } - } - - - /** - * Reads from the serial port into a buffer of bytes until a - * particular character. If the character isn't in the serial - * buffer, then 'null' is returned. - * - * If outgoing[] is not big enough, then -1 is returned, - * and an error message is printed on the console. - * If nothing is in the buffer, zero is returned. - * If 'interesting' byte is not in the buffer, then 0 is returned. - */ - public int readBytesUntil(int interesting, byte outgoing[]) { - if (bufferIndex == bufferLast) return 0; - byte what = (byte)interesting; - - synchronized (buffer) { - int found = -1; - for (int k = bufferIndex; k < bufferLast; k++) { - if (buffer[k] == what) { - found = k; - break; - } - } - if (found == -1) return 0; - - int length = found - bufferIndex + 1; - if (length > outgoing.length) { - System.err.println( - I18n.format( - _("readBytesUntil() byte buffer is too small for the {0}" + - " bytes up to and including char {1}"), - length, - interesting - ) - ); - return -1; - } - //byte outgoing[] = new byte[length]; - System.arraycopy(buffer, bufferIndex, outgoing, 0, length); - - bufferIndex += length; - if (bufferIndex == bufferLast) { - bufferIndex = 0; // rewind - bufferLast = 0; - } - return length; - } - } - - - /** - * Return whatever has been read from the serial port so far - * as a String. It assumes that the incoming characters are ASCII. - * - * If you want to move Unicode data, you can first convert the - * String to a byte stream in the representation of your choice - * (i.e. UTF8 or two-byte Unicode data), and send it as a byte array. - */ - public String readString() { - if (bufferIndex == bufferLast) return null; - return new String(readBytes()); - } - - - /** - * Combination of readBytesUntil and readString. See caveats in - * each function. Returns null if it still hasn't found what - * you're looking for. - * - * If you want to move Unicode data, you can first convert the - * String to a byte stream in the representation of your choice - * (i.e. UTF8 or two-byte Unicode data), and send it as a byte array. - */ - public String readStringUntil(int interesting) { - byte b[] = readBytesUntil(interesting); - if (b == null) return null; - return new String(b); - } - /** * This will handle both ints, bytes and chars transparently. */ - public void write(int what) { // will also cover char + public void write(int what) { try { - output.write(what & 0xff); // for good measure do the & - output.flush(); // hmm, not sure if a good idea - - } catch (Exception e) { // null pointer or serial port dead + port.writeInt(what & 0xff); // for good measure do the & + } catch (SerialPortException e) { // null pointer or serial port dead errorMessage("write", e); } } @@ -517,12 +214,9 @@ public class Serial implements SerialPortEventListener { public void write(byte bytes[]) { try { - output.write(bytes); - output.flush(); // hmm, not sure if a good idea - - } catch (Exception e) { // null pointer or serial port dead - //errorMessage("write", e); - e.printStackTrace(); + port.writeBytes(bytes); + } catch (SerialPortException e) { + errorMessage("write", e); } } @@ -544,11 +238,19 @@ public class Serial implements SerialPortEventListener { } public void setDTR(boolean state) { - port.setDTR(state); + try { + port.setDTR(state); + } catch (SerialPortException e) { + errorMessage("write", e); + } } public void setRTS(boolean state) { - port.setRTS(state); + try { + port.setRTS(state); + } catch (SerialPortException e) { + errorMessage("write", e); + } } /** @@ -557,33 +259,7 @@ public class Serial implements SerialPortEventListener { * Why the hell that'd be the case, who knows. */ static public List list() { - List list = new ArrayList(); - try { - //System.err.println("trying"); - @SuppressWarnings("unchecked") - Enumeration portList = CommPortIdentifier.getPortIdentifiers(); - //System.err.println("got port list"); - while (portList.hasMoreElements()) { - CommPortIdentifier portId = - (CommPortIdentifier) portList.nextElement(); - //System.out.println(portId); - - if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { - String name = portId.getName(); - list.add(name); - } - } - - } catch (UnsatisfiedLinkError e) { - //System.err.println("1"); - errorMessage("ports", e); - - } catch (Exception e) { - //System.err.println("2"); - errorMessage("ports", e); - } - //System.err.println("move out"); - return list; + return Arrays.asList(SerialPortList.getPortNames()); } diff --git a/app/src/processing/app/debug/Uploader.java b/app/src/processing/app/debug/Uploader.java index 50d7a5e13..d7610ef2d 100644 --- a/app/src/processing/app/debug/Uploader.java +++ b/app/src/processing/app/debug/Uploader.java @@ -34,9 +34,7 @@ import java.util.Collection; import processing.app.I18n; import processing.app.Preferences; -import processing.app.Serial; import processing.app.SerialException; -import processing.app.SerialNotFoundException; public abstract class Uploader implements MessageConsumer { static final String BUGS_URL = @@ -55,7 +53,8 @@ public abstract class Uploader implements MessageConsumer { throws RunnerException, SerialException; public abstract boolean burnBootloader() throws RunnerException; - + + /* protected void flushSerialBuffer() throws RunnerException, SerialException { // Cleanup the serial buffer try { @@ -85,6 +84,7 @@ public abstract class Uploader implements MessageConsumer { throw new RunnerException(e.getMessage()); } } + */ protected boolean executeUploadCommand(Collection commandDownloader) throws RunnerException {