From 50884cfa3404c5a34bc0143cbdb2eb182330330c Mon Sep 17 00:00:00 2001 From: Jason Lefley Date: Thu, 3 Mar 2016 17:25:07 -0800 Subject: [PATCH] add jSSC based serial implementation --- JsscSerial/pom.xml | 40 +++++ .../firmata/serial/JsscSerial.java | 157 ++++++++++++++++++ pom.xml | 3 +- 3 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 JsscSerial/pom.xml create mode 100644 JsscSerial/src/main/java/name/antonsmirnov/firmata/serial/JsscSerial.java diff --git a/JsscSerial/pom.xml b/JsscSerial/pom.xml new file mode 100644 index 0000000..0c6edc1 --- /dev/null +++ b/JsscSerial/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + + + name.antonsmirnov.firmata + parent + 1.0 + + + name.antonsmirnov.firmata.serial + JsscSerial + 1.0 + JsscSerial + + Serial API implementation using jSSC serial library + + + + name.antonsmirnov.firmata.serial + Serial + 1.1 + + + + org.scream3r + jssc + 2.8.0 + + + + org.slf4j + slf4j-api + 1.6.4 + + + + diff --git a/JsscSerial/src/main/java/name/antonsmirnov/firmata/serial/JsscSerial.java b/JsscSerial/src/main/java/name/antonsmirnov/firmata/serial/JsscSerial.java new file mode 100644 index 0000000..6a55ce8 --- /dev/null +++ b/JsscSerial/src/main/java/name/antonsmirnov/firmata/serial/JsscSerial.java @@ -0,0 +1,157 @@ +package name.antonsmirnov.firmata.serial; + +import jssc.SerialPort; +import jssc.SerialPortEvent; +import jssc.SerialPortException; +import jssc.SerialPortEventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.List; +import java.util.LinkedList; +import java.util.Collections; + +/** + * "ISerial" implementation using jSSC serial library + */ +public class JsscSerial implements ISerial, SerialPortEventListener { + + private final static String defaultPortName = "COM1"; + private final static int defaultBaudRate = 9600; + private final static char defaultParity = 'N'; + private final static int defaultDataBits = 8; + private final static float defaultStopBits = 1; + private static final Logger logger = LoggerFactory.getLogger(JsscSerial.class); + + private int baudRate; + private int parity; + private int dataBits; + private int stopBits; + private SerialPort port; + private boolean isStopping; + private List listeners; + private List buffer; + + public JsscSerial() { + this(defaultPortName, defaultBaudRate, defaultParity, defaultDataBits, defaultStopBits); + } + + public JsscSerial(int baudRate) { + this(defaultPortName, baudRate, defaultParity, defaultDataBits, defaultStopBits); + } + + public JsscSerial(String portName, int baudRate) { + this(portName, baudRate, defaultParity, defaultDataBits, defaultStopBits); + } + + public JsscSerial(String portName) { + this(portName, defaultBaudRate, defaultParity, defaultDataBits, defaultStopBits); + } + + public JsscSerial(String portName, int baudRate, char parity, int dataBits, float stopBits) { + this.baudRate = baudRate; + this.dataBits = dataBits; + + this.parity = SerialPort.PARITY_NONE; + if (parity == 'O') this.parity = SerialPort.PARITY_ODD; + if (parity == 'E') this.parity = SerialPort.PARITY_EVEN; + if (parity == 'M') this.parity = SerialPort.PARITY_MARK; + if (parity == 'S') this.parity = SerialPort.PARITY_SPACE; + + this.stopBits = SerialPort.STOPBITS_1; + if (stopBits == 1.5f) this.stopBits = SerialPort.STOPBITS_1_5; + if (stopBits == 2) this.stopBits = SerialPort.STOPBITS_2; + + this.dataBits = SerialPort.DATABITS_8; + if (dataBits == 5) this.dataBits = SerialPort.DATABITS_5; + if (dataBits == 6) this.dataBits = SerialPort.DATABITS_6; + if (dataBits == 7) this.dataBits = SerialPort.DATABITS_7; + + port = new SerialPort(portName); + buffer = Collections.synchronizedList(new LinkedList()); + listeners = new ArrayList(); + } + + public void start() throws SerialException { + isStopping = false; + try { + port.openPort(); + port.setParams(baudRate, dataBits, stopBits, parity); + port.setEventsMask(SerialPort.MASK_RXCHAR); + port.addEventListener(this); + } catch (SerialPortException e) { + throw new SerialException(e); + } + } + + public void stop() throws SerialException { + isStopping = true; + try { + port.closePort(); + } catch (SerialPortException e) { + throw new SerialException(e); + } + } + + public boolean isStopping() { + return isStopping; + } + + public void addListener(ISerialListener listener) { + listeners.add(listener); + } + + public void removeListener(ISerialListener listener) { + listeners.remove(listener); + } + + public void write(byte[] outcomingBytes) throws SerialException { + try { + port.writeBytes(outcomingBytes); + } catch (SerialPortException e) { + throw new SerialException(e); + } + } + + public void write(int outcomingByte) throws SerialException { + try { + port.writeInt(outcomingByte); + } catch (SerialPortException e) { + throw new SerialException(e); + } + } + + public int read() { + if (buffer.isEmpty()) { + return -1; + } + return buffer.remove(0) & 0xFF; + } + + public void clear() { + buffer.clear(); + } + + public int available() { + return buffer.size(); + } + + public void serialEvent(SerialPortEvent event) { + if (event.isRXCHAR()) { + int bytesAvailable = event.getEventValue(); + try { + byte available[] = port.readBytes(bytesAvailable); + for (int i = 0; i < bytesAvailable; i++) { + buffer.add(available[i]); + + for (ISerialListener listener : listeners) { + listener.onDataReceived(this); + } + } + } catch (SerialPortException e) { + logger.error("Error encountered handling serial event: " + e); + } + } + } + +} diff --git a/pom.xml b/pom.xml index 212222c..e460735 100644 --- a/pom.xml +++ b/pom.xml @@ -39,6 +39,7 @@ ./FirmataTests ./ProcessingSerial ./IndepProcessingSerial + ./JsscSerial - \ No newline at end of file +