00001
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 package gov.lanl.isr.sensix.sensing;
00036
00037 import gnu.io.*;
00038 import java.io.*;
00039
00040
00041 public class SerialGPS extends LocationImpl
00042 {
00043 private static final String CLASS_NAME = "gov.lanl.isr.sensix.SerialGPS";
00044
00045 public static final int DEFAULT_BAUD = 38400;
00046 public static final char END_NMEA_LINE = ';';
00047 public static final int MAX_RPT_ITVL = 100;
00048
00049 private long previous_acq;
00050 private InputStreamReader data_in;
00051 private SerialPort sp;
00052
00053
00054 public SerialGPS(String serial_port) {
00055 this(serial_port, DEFAULT_BAUD);
00056 }
00057
00058 public SerialGPS(String serial_port, int speed) {
00059 super();
00060 have_device = true;
00061 now = System.currentTimeMillis();
00062 previous_acq = 0;
00063 try {
00064 CommPortIdentifier id =
00065 CommPortIdentifier.getPortIdentifier(serial_port);
00066 sp = (SerialPort)id.open(CLASS_NAME, 0);
00067 sp.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
00068 sp.disableReceiveFraming();
00069 sp.setSerialPortParams(speed, SerialPort.DATABITS_8,
00070 SerialPort.STOPBITS_1,
00071 SerialPort.PARITY_NONE);
00072 data_in = new InputStreamReader(sp.getInputStream());
00073 } catch (Exception e) {
00074 e.printStackTrace(System.err);
00075
00076 }
00077 }
00078
00079
00080
00081 protected void getGPS() {
00082 long right_now = System.currentTimeMillis();
00083 if ((previous_acq + MAX_RPT_ITVL) < right_now) {
00084 if (have_device) {
00085 String sentence = null;
00086 try {
00087 int input;
00088 while ((input = data_in.read()) != (int)END_NMEA_LINE)
00089 sentence += (char)input;
00090 sentence = sentence.substring(1, sentence.length() - 1);
00091 } catch(IOException e) {
00092 e.printStackTrace(System.err);
00093 return;
00094 }
00095 if (parseNMEA(sentence))
00096 previous_acq = right_now;
00097 }
00098 else
00099 now = right_now;
00100 }
00101 }
00102
00103 private boolean parseNMEA(String nmea) {
00104 String time;
00105 String lat_deg, lat_min, lat_dir;
00106 String lon_deg, lon_min, lon_dir;
00107 String alt_str;
00108 boolean success = false;
00109
00110 int idx = nmea.indexOf(',');
00111 if (idx >= 0) {
00112 String prefix = nmea.substring(0, idx);
00113 if (prefix.equals("$GPGGA")) {
00114 nmea = nmea.substring(idx+1);
00115
00116
00117 idx = nmea.indexOf(',');
00118 if (idx >= 0) {
00119 time = nmea.substring(0, idx);
00120 nmea = nmea.substring(idx+1);
00121
00122
00123 idx = nmea.indexOf(',');
00124 if (idx >= 0) {
00125 lat_deg = nmea.substring(0, 2);
00126 lat_min = nmea.substring(2, idx);
00127 nmea = nmea.substring(idx+1);
00128
00129 idx = nmea.indexOf(',');
00130 if (idx >= 0) {
00131 lat_dir = nmea.substring(0, idx);
00132 nmea = nmea.substring(idx+1);
00133
00134
00135 idx = nmea.indexOf(',');
00136 if (idx >= 0) {
00137 lon_deg = nmea.substring(0, 3);
00138 lon_min = nmea.substring(3, idx);
00139 nmea = nmea.substring(idx+1);
00140
00141 idx = nmea.indexOf(',');
00142 if (idx >= 0) {
00143 lon_dir = nmea.substring(0, idx);
00144 nmea = nmea.substring(idx+1);
00145
00146
00147 idx = nmea.indexOf(',');
00148 if (idx >= 0) {
00149 nmea = nmea.substring(idx+1);
00150
00151 idx = nmea.indexOf(',');
00152 if (idx >= 0) {
00153 nmea = nmea.substring(idx+1);
00154
00155 idx = nmea.indexOf(',');
00156 if (idx >= 0) {
00157 nmea = nmea.substring(idx+1);
00158
00159
00160 idx = nmea.indexOf(',');
00161 if (idx >= 0) {
00162 alt_str = nmea.substring(0, idx);
00163 nmea = nmea.substring(idx+1);
00164
00165
00166 alt = Double.parseDouble(alt_str);
00167
00168 lon = Double.parseDouble(lon_deg);
00169 lon += Double.parseDouble(lon_min) / 60.0;
00170 if (lon_dir.equals("W"))
00171 lon *= -1.0;
00172
00173 lat = Double.parseDouble(lat_deg);
00174 lat += Double.parseDouble(lat_min) / 60.0;
00175 if (lat_dir.equals("S"))
00176 lat *= -1.0;
00177
00178 success = true;
00179 }}}}}}}}}
00180 }
00181
00182 }
00183 return success;
00184 }
00185 }