package aimax.osm.gps;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
/**
* Abstract class which provides general functionality for reading messages
* from a NMEA input stream.
* @author Ruediger Lunde
*/
public abstract class NmeaReader {
protected InputStream inputStream;
private StringBuffer buffer = new StringBuffer();
private boolean messageReceived;
private List<NmeaMessageListener> listeners = new ArrayList<NmeaMessageListener>();
public void addListener(NmeaMessageListener listener) {
listeners.add(listener);
}
public void removeListener(NmeaMessageListener listener) {
listeners.remove(listener);
}
public abstract void openStream() throws Exception;
public boolean messageReceived() {
return messageReceived;
}
/**
* Reads characters from the stream and informs all interested
* listeners about received NMEA messages. Should be called
* when new data is available on the input stream.
*/
public void readFromStream(boolean onlyNextMessage) {
try {
int newData;
char mybyte;
while((newData = inputStream.read()) != -1) {
mybyte = (char) newData;
if(mybyte == '$' && buffer.length() > 5) {
if (buffer.charAt(0) == '$') {
//System.out.println("Available: " + inputStream.available());
String message = buffer.toString();
for (NmeaMessageListener listener : listeners)
listener.messageReceived(message);
}
messageReceived = true;
buffer.delete(0, buffer.length());
buffer.append(mybyte);
if (onlyNextMessage)
break;
} else {
buffer.append(mybyte);
}
}
} catch(IOException ex) {
System.err.println(ex);
}
}
public void closeStream() throws IOException {
messageReceived = false;
if (inputStream != null)
inputStream.close();
buffer.delete(0, buffer.length());
}
public static interface NmeaMessageListener {
public void messageReceived(String message);
}
/////////////////////////////////////////////////////////////////
// inner classes...
/** Simple listener which writes every received message to file. */
public static class MessageToFileListener implements NmeaMessageListener {
private OutputStreamWriter streamWriter;
int count = 0;
public void openFile(File file) throws IOException {
streamWriter = new OutputStreamWriter(new FileOutputStream(file));
}
public void closeFile() {
try {
streamWriter.close();
streamWriter = null;
} catch (IOException e) {
e.printStackTrace();
}
}
public void messageReceived(String message) {
try {
if (streamWriter != null) {
streamWriter.write(message);
if (++count % 20 == 0)
streamWriter.flush();
}
} catch (IOException e) {
e.printStackTrace();
closeFile();
}
}
}
}