stupid maximum length rule
SerialHandler.java - handles the data on the serial port and passes it formatted to Logger
Code:
package datalogger;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;
public class SerialHandling implements SerialPortEventListener {
SerialPort serialPort;
/** The port we're normally going to use. */
private static final String PORT_NAMES[] = {
"/dev/ttyUSB0", // Linux
};
/** Buffered input stream from the port */
private InputStream input;
/** The output stream to the port */
private OutputStream output;
/** Milliseconds to block while waiting for port open */
private static final int TIME_OUT = 2000;
/** Default bits per second for COM port. */
private static final int DATA_RATE = 9600;
private String line = new String();
public void initialize() {
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
// iterate through, looking for the port
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
for (String portName : PORT_NAMES) {
if (currPortId.getName().equals(portName)) {
portId = currPortId;
break;
}
}
}
if (portId == null) {
System.out.println("Could not find COM port.");
return;
}
try {
// open serial port, and use class name for the appName.
serialPort = (SerialPort) portId.open(this.getClass().getName(),
TIME_OUT);
// set port parameters
serialPort.setSerialPortParams(DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
// open the streams
input = serialPort.getInputStream();
output = serialPort.getOutputStream();
// add event listeners
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
} catch (Exception e) {
System.err.println(e.toString());
}
}
/**
* This should be called when you stop using the port.
* This will prevent port locking on platforms like Linux.
*/
public synchronized void close() {
if (serialPort != null) {
serialPort.removeEventListener();
serialPort.close();
}
}
/**
* Handle an event on the serial port. Read the data and print it.
*/
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
int available = input.available();
byte chunk[] = new byte[available];
input.read(chunk, 0, available);
// Displayed results are codepage dependent
//System.out.print(new String(chunk));
//writeText(chunk);
parseText(new String(chunk));
//System.out.println(line);
} catch (Exception e) {
System.err.println(e.toString());
}
}
// Ignore all the other eventTypes, but you should consider the other ones.
}
public synchronized void parseText(String chunk)
{
String newline = System.getProperty("line.separator");
line+= chunk;
if (line.contains("\\n") || line.contains("\\r") || line.contains(newline))
{
line = removeReturns(line);
if (line.contains("Unable to find address for Device"))
{
System.out.println(" Connection failed retry"); // sometimes the arduino fails to recognize the sensor ID's
}
Logger.parseText(line);
line =""; // line is dealt with so clear it
}
}
// removes the multiple return characters from the incoming line.
private String removeReturns(String inLine){
String newline = System.getProperty("line.separator");
inLine = inLine.replaceAll(newline,"");
inLine = inLine.replaceAll("\\n", ""); // replacing the newline characters with blank.
inLine = inLine.replaceAll("\\r", ""); // It is getting both \n and \r so both need handled.
return(inLine);
}
// for writing the raw byte array to file
public synchronized void writeText(byte[] inChunk){
String strFilePath = "/home/strider/Logs/tempData.csv";
try
{
FileOutputStream fos = new FileOutputStream(strFilePath,true); //true to append
/*
* To write byte array to a file, use
* void write(byte[] bArray) method of Java FileOutputStream class.
*
* This method writes given byte array to a file.
*/
fos.write(inChunk);
/*
* Close FileOutputStream using,
* void close() method of Java FileOutputStream class.
*
*/
fos.close();
}
catch(FileNotFoundException ex)
{
System.out.println("FileNotFoundException : " + ex);
}
catch(IOException ioe)
{
System.out.println("IOException : " + ioe);
}
}
}
Sensor.java - I think it's the same as before, basically everything to do with the sensor objects.
Code:
package datalogger;
public class Sensor {
private String sensorID;
private String sensorName;
private float value;
private int averageCount;
Sensor(String inID,String inName)
{
sensorID = inID;
sensorName = inName;
value =0;
averageCount = 0;
}
public String getID(){
return sensorID;
}
public String getID(String inName){
return sensorID;
}
public String getName(){
return sensorName;
}
public String getName(String inID){
return sensorName;
}
public void setName(String inName)
{
sensorName = inName;
}
public void setID(String inID){
sensorID = inID;
}
public void resetValue()
{
value =0;
averageCount =0;
}
public void addValueToAverage(float inValue)
{
value += inValue;
averageCount++;
}
public String returnAverage()
{
float average = value/averageCount;
return (String.valueOf(average));
}
}
If anyone wants/needs anything or has any questions just let me know.