Testing out the PPD42 Air Quality Sensor, with an MSP430 Launchpad and graphing the data with GNUplot.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

281 lines
7.8 KiB

/*
* This class is one end of a test pair of programs
* SimpleSnuV1.class is the other end.
* To run the test requires two com ports
* and a null modem cable.
* Start SimpleSnuV1 and then run SimpleRead
* on the other machine/com port.
* This code is supplied for demonstration purposes only.
* You are free to use it as you please.
*/
import java.io.*;
import java.util.*;
import gnu.io.*;
public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;
SerialPort serialPort = null;
InputStream inputStream;
OutputStream outputStream;
Thread readThread;
String aS = "";
int numBytes = 0;
String num = "021891383";
String rst = "atz";
String dial ="atd";
String outData = "";
String outDataBuff = "";
boolean running = true;
boolean process = true;
boolean waitForInput = true;
boolean fatalErr = false;
String errMessage = "";
public static void main(String[] args) {
if (args.length < 1) {
System.out.print("SimpleRead.class /dev/ttyxx\n");
System.exit(-1);
}
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
// if (portId.getName().equals("COM1")) {
if (portId.getName().equals(args[0])) {
SimpleRead reader = new SimpleRead();
}
}
}
}
public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}
try {
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
} catch (IOException e) {}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
readThread = new Thread(this);
readThread.start();
}
public void run() {
int resetCount = 0;
while (running) {
if (fatalErr) {
System.out.print("Fatal Error...\n");
System.exit(1);
}
if (!process) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
continue;
}
if (num.equals("Nil")) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {}
continue;
}
if (reset()) {
if (dial()) {
num = "Nil";
System.out.print("Yahoooo OK...\n");
//Here goes a class to handle any coms it gets passed the stuff it needs...
// SNHdlcMessage myMess = new SNHdlcMessage();
// String rply = myMess.processInput("loc1", "text", inputStream, outputStream);
// System.out.print(rply + "\n");
process = false;
running = false;
System.out.print("Normal Exit...\n");
System.exit(1);
} else {
System.out.print("Dial Error...\n");
process = false;
running = false;
System.exit(1);
}
} else {
System.out.print("Reset Error...\n");
resetCount ++;
if (resetCount > 2 ) {
System.out.print("Reset To Many Times Error ...\n");
System.exit(1);
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
}
}
public void closePort(SerialPort serialPort) {
if (serialPort != null) {
serialPort.notifyOnDataAvailable(false);
serialPort.removeEventListener();
if (inputStream != null) {
try {
inputStream.close();
inputStream = null;
}
catch (IOException e) {}
}
if (outputStream != null) {
try {
outputStream.close();
outputStream = null;
}
catch (IOException e) {}
}
serialPort.close();
serialPort = null;
}
}
public boolean reset() {
try {
outputStream.write(new String("atz").getBytes());
outputStream.write((byte)0x0D);
System.out.print("--> atz\n");
} catch (IOException e) {
System.out.print("Reset Output IO Exception");
return false;
}
int waitingCount = 0;
waitForInput = true;
while (waitForInput) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
waitingCount ++;
//2 seconds for it to reset
if (waitingCount > 20) {
return false;
}
}
int numBytesTotal = 0;
byte[] readBuffer = new byte[20];
String sReadBuff = "";
boolean dLoop = true;
while (dLoop) {
try {
while (inputStream.available() > 0) {
numBytes = inputStream.read(readBuffer);
numBytesTotal += numBytes;
String tmpR = new String(readBuffer);
sReadBuff += tmpR.substring(0, numBytes);
}
if (sReadBuff.indexOf("NO CARRIER") != -1) {
dLoop = false;
} else if (sReadBuff.indexOf("BUSY") != -1) {
dLoop = false;
} else if (sReadBuff.indexOf("NO DIALTONE") != -1) {
dLoop = false;
} else if (sReadBuff.indexOf("OK") != -1) {
dLoop = false;
System.out.print("<-- " + new String(sReadBuff));
return true;
} else if (sReadBuff.indexOf("CONNECT") != -1) {
dLoop = false;
}
} catch (IOException e) {
System.out.print("Reset Input IO Exception");
return false;
}
}
System.out.print("<-- " + new String(sReadBuff));
return false;
}
public boolean dial() {
try {
outputStream.write(new String("atd").getBytes());
outputStream.write(num.getBytes());
outputStream.write((byte)0x0D);
System.out.print("--> atdxxxxx\n");
} catch (IOException e) {
System.out.print("Dial Output IO Exception");
return false;
}
int waitingCount = 0;
waitForInput = true;
while (waitForInput) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
waitingCount ++;
if (waitingCount > 1000) {
return false;
}
}
int numBytesTotal = 0;
byte[] readBuffer = new byte[20];
String sReadBuff = "";
boolean dLoop = true;
while (dLoop) {
try {
while (inputStream.available() > 0) {
numBytes = inputStream.read(readBuffer);
numBytesTotal += numBytes;
String tmpR = new String(readBuffer);
sReadBuff += tmpR.substring(0, numBytes);
}
if (sReadBuff.indexOf("NO CARRIER") != -1) {
dLoop = false;
} else if (sReadBuff.indexOf("BUSY") != -1) {
dLoop = false;
} else if (sReadBuff.indexOf("NO DIALTONE") != -1) {
dLoop = false;
} else if (sReadBuff.indexOf("OK") != -1) {
dLoop = false;
} else if (sReadBuff.indexOf("CONNECT") != -1) {
System.out.print("<-- " + new String(sReadBuff));
dLoop = false;
return true;
}
} catch (IOException e) {
System.out.print("Dial Input IO Exception");
return false;
}
}
System.out.print("<-- " + new String(sReadBuff));
return false;
}
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
case SerialPortEvent.BI:
System.out.print("BI\n");
case SerialPortEvent.OE:
System.out.print("OE\n");
case SerialPortEvent.FE:
System.out.print("FE\n");
case SerialPortEvent.PE:
System.out.print("PE\n");
case SerialPortEvent.CD:
System.out.print("CD\n");
case SerialPortEvent.CTS:
System.out.print("CTS\n");
case SerialPortEvent.DSR:
System.out.print("DSR\n");
case SerialPortEvent.RI:
System.out.print("RI\n");
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
System.out.print("Out Buff Empty\n");
break;
case SerialPortEvent.DATA_AVAILABLE:
waitForInput = false;
// System.out.print("Data Available\n");
break;
}
}
}