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
+