package context.arch.connection;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;
public class SerialConnection implements Connection {
protected SerialPort serialPort;
protected String port;
private static final String PORT_NAMES[] = {
"/dev/cu.usbmodem411", // Mac OS X
"/dev/tty.usbmodem411", // Mac OS X
"/dev/tty.usbserial", // Mac OS X
"/dev/ttyUSB0", // Linux
"/dev/usbdev", // Linux
"/dev/tty", // Linux
"/dev/serial", // Linux
"COM3", // Windows
};
protected InputStream input;
protected OutputStream output;
private static final int TIME_OUT = 2000;
private static final int DATA_RATE = 9600;
public SerialConnection() {}
public SerialConnection(String port) {
this.port = port;
}
public boolean addEventListener(SerialPortEventListener serialPortEventListener){
if (serialPort != null) {
try {
serialPort.addEventListener(serialPortEventListener);
serialPort.notifyOnDataAvailable(true);
return true;
} catch (TooManyListenersException e) {
System.err.println(e.toString());
}
}
return false;
}
@Override
public boolean open() {
if(serialPort != null) { return true; };
CommPortIdentifier portId = getSerialPort();
if (portId != null) {
try {
serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);
serialPort.setSerialPortParams(DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
return true;
} catch (PortInUseException p) {
System.err.println(p.toString());
} catch (UnsupportedCommOperationException u) {
System.err.println(u.toString());
} catch (IOException io) {
System.err.println(io.toString());
}
}
return false;
}
@Override
public boolean isOpen() {
return (serialPort != null);
}
@Override
public boolean close() {
if (serialPort != null) {
try {
input.close();
output.close();
serialPort.removeEventListener();
serialPort.close();
serialPort = null;
return true;
} catch (IOException e) {
System.err.println(e.toString());
}
}
return false;
}
@Override
public boolean write(String data) {
try {
output.write( data.getBytes() );
return true;
} catch (IOException e) {
System.err.println(e.toString());
}
return false;
}
@Override
public InputStreamReader read() {
return new InputStreamReader(input);
}
private CommPortIdentifier getSerialPort() {
if (port != null) {
try {
return CommPortIdentifier.getPortIdentifier(port);
} catch (NoSuchPortException e) {
e.printStackTrace();
}
return null;
}
Enumeration<?> portEnum = CommPortIdentifier.getPortIdentifiers();
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
for (String portName : PORT_NAMES) {
if (currPortId.getName().equals(portName)) {
return currPortId;
}
}
}
return null;
}
}