crashtest/src/de/ctdo/crashtest/domotics/Relaisboard.java

169 lines
4.9 KiB
Java

package de.ctdo.crashtest.domotics;
import de.ctdo.crashtest.log.Logger;
import gnu.io.*;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
public class Relaisboard implements IRelaisboard {
private SerialPort serialPort;
private OutputStream outputStream;
private Boolean serialPortGeoeffnet = false;
private String portName = "/dev/ttyUSB0";
private Object mLock = new Object();
public Relaisboard(final String port) {
this.portName = port;
}
private void sendData(final int relais, final boolean state) {
if(relais >= 0 && relais < 8 && outputStream != null) {
char charsOff[] = { 'a','b','c','d','e','f','g','h' };
char charsOn[] = { 'A','B','C','D','E','F','G','H' };
try {
if(state) {
outputStream.write(charsOn[relais]);
} else {
outputStream.write(charsOff[relais]);
}
outputStream.flush();
} catch (IOException e) {
Logger.sLog("Fehler beim Senden");
}
}
}
@Override
public boolean open() {
serialPortGeoeffnet = false;
Boolean foundPort = false;
if (serialPortGeoeffnet != false) {
Logger.sLog("Serialport bereits geöffnet");
return false;
}
Enumeration enumComm = CommPortIdentifier.getPortIdentifiers();
CommPortIdentifier serialPortId = null;
while(enumComm.hasMoreElements()) {
serialPortId = (CommPortIdentifier) enumComm.nextElement();
if (portName.contentEquals(serialPortId.getName())) {
foundPort = true;
break;
}
}
if (foundPort != true) {
Logger.sLog("Serialport nicht gefunden: " + portName);
return false;
}
try {
// open port and tell the OS who we are. Wait max 500ms for release if port is currently owned.
serialPort = (SerialPort) serialPortId.open("crashtest app", 500);
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
outputStream = serialPort.getOutputStream();
serialPortGeoeffnet = true;
return true;
} catch (PortInUseException e) {
Logger.sLog("Port belegt");
} catch (IOException e) {
Logger.sLog("Keinen Zugriff auf OutputStream");
} catch(UnsupportedCommOperationException e) {
Logger.sLog("Konnte Schnittstellen-Paramter nicht setzen");
}
return false;
}
@Override
public void close() {
if ( serialPortGeoeffnet ) {
serialPort.close();
serialPortGeoeffnet = false;
outputStream = null;
}
}
@Override
public void setRelais(final int relais, final boolean state) {
if(!serialPortGeoeffnet) return;
synchronized (mLock) {
Runnable r = new Runnable() {
@Override
public void run() {
sendData(relais, state);
}
};
new Thread(r).start();
}
}
@Override
public void toggleRelais(final int relais, final int milliseconds) {
if(!serialPortGeoeffnet) return;
synchronized (mLock) {
Runnable r = new Runnable() {
@Override
public void run() {
sendData(relais, true);
try {
Thread.sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
sendData(relais, false);
}
};
new Thread(r).start();
}
}
@Override
public void blinkRelais(final int relais, final int pause, final int count) {
if(!serialPortGeoeffnet) return;
synchronized (mLock) {
Runnable r = new Runnable() {
@Override
public void run() {
int i;
for(i = 0; i< count; i++) {
sendData(relais, true);
try {
Thread.sleep(pause);
} catch (InterruptedException e) {
e.printStackTrace();
}
sendData(relais, false);
try {
Thread.sleep(pause);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
new Thread(r).start();
}
}
}