View Single Post
Old 12-13-10, 03:39 AM   #19
strider3700
Master EcoRenovator
 
Join Date: Dec 2008
Location: Vancouver Island BC
Posts: 745
Thanks: 23
Thanked 37 Times in 30 Posts
Default

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.
strider3700 is offline