package at.medevit.elexis.cobasmira.connection;
import java.io.IOException;
import java.io.InputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import at.medevit.elexis.cobasmira.model.CobasMiraLog;
import at.medevit.elexis.cobasmira.model.CobasMiraMessage;
import gnu.io.SerialPort;
public class CobasMiraSerialReader implements Runnable {
private static final Logger logger = LoggerFactory.getLogger(CobasMiraSerialReader.class);
private static final int SOH = 0x01; // Start of Heading
private static final int STX = 0x02; // Start of Text within a Cobas Mira Measurement
private static final int ETX = 0x03; // End of Text within a Cobas Mira Measurement (see sampledata/cobaslogsingle.txt for info)
private static final int EOT = 0x04; // End of Transmission
private InputStream in;
private SerialPort serialPort;
private boolean keepRunning = true;
public boolean isKeepRunning(){
return keepRunning;
}
public void setKeepRunning(boolean keepRunning){
this.keepRunning = keepRunning;
}
public CobasMiraSerialReader(InputStream in, SerialPort serialPort){
this.serialPort = serialPort;
this.in = in;
}
public void run(){
logger.debug("Starting reader thread");
try {
CobasMiraLog cobasMiraLog = CobasMiraLog.getInstance();
int data;
int state = 0;
StringBuffer headerBuf = new StringBuffer();
StringBuffer textBuf = new StringBuffer();
CobasMiraMessage message = null;
while(keepRunning) {
data = in.read();
if(data==-1) {
try {
Thread.sleep(1000);
logger.trace("Waiting for serial input...");
} catch (InterruptedException e) {
logger.warn("Sleep interrupted", e);
}
} else if (data == SOH) {
logger.trace("SOH");
headerBuf = new StringBuffer();
state = SOH;
} else if (data == STX) {
logger.trace("STX");
message = new CobasMiraMessage();
message.setHeader(headerBuf.toString());
textBuf = new StringBuffer();
state = STX;
} else if (data == ETX) {
logger.trace("ETX");
if(message!=null) {
message.setText(textBuf.toString());
} else {
logger.warn("message is null, programmatic error");
}
state = ETX;
} else if (data == EOT) {
logger.trace("EOT");
cobasMiraLog.addMessage(message);
state = EOT;
} else {
switch (state) {
case SOH:
headerBuf.append((char) data);
break;
case STX:
textBuf.append((char) data);
break;
default:
logger.debug("Invalid state! Ignoring " + data);
break;
}
}
}
logger.debug("Exiting reader");
if(serialPort!=null) serialPort.close();
} catch (IOException e) {
logger.error("Error receveiving data", e);
e.printStackTrace();
}
}
}