Steal C code from ao-view
[fw/altos] / ao-tools / altosui / AltosGPS.java
diff --git a/ao-tools/altosui/AltosGPS.java b/ao-tools/altosui/AltosGPS.java
new file mode 100644 (file)
index 0000000..d242ad5
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright © 2010 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package altosui;
+
+import java.lang.*;
+import java.text.*;
+import altosui.AltosParse;
+
+
+public class AltosGPS {
+       public class AltosGPSTime {
+               int year;
+               int month;
+               int day;
+               int hour;
+               int minute;
+               int second;
+
+               public AltosGPSTime(String date, String time) throws ParseException {
+                       String[] ymd = date.split("-");
+                       if (ymd.length != 3)
+                               throw new ParseException("error parsing GPS date " + date + " got " + ymd.length, 0);
+                       year = AltosParse.parse_int(ymd[0]);
+                       month = AltosParse.parse_int(ymd[1]);
+                       day = AltosParse.parse_int(ymd[2]);
+
+                       String[] hms = time.split(":");
+                       if (hms.length != 3)
+                               throw new ParseException("Error parsing GPS time " + time + " got " + hms.length, 0);
+                       hour = AltosParse.parse_int(hms[0]);
+                       minute = AltosParse.parse_int(hms[1]);
+                       second = AltosParse.parse_int(hms[2]);
+               }
+
+               public AltosGPSTime() {
+                       year = month = day = 0;
+                       hour = minute = second = 0;
+               }
+
+       }
+
+       public class AltosGPSSat {
+               int     svid;
+               int     c_n0;
+       }
+
+       int     nsat;
+       boolean gps_locked;
+       boolean gps_connected;
+       AltosGPSTime gps_time;
+       double  lat;            /* degrees (+N -S) */
+       double  lon;            /* degrees (+E -W) */
+       int     alt;            /* m */
+
+       int     gps_extended;   /* has extra data */
+       double  ground_speed;   /* m/s */
+       int     course;         /* degrees */
+       double  climb_rate;     /* m/s */
+       double  hdop;           /* unitless? */
+       int     h_error;        /* m */
+       int     v_error;        /* m */
+
+       AltosGPSSat[] cc_gps_sat;       /* tracking data */
+
+       public AltosGPS(String[] words, int i) throws ParseException {
+               AltosParse.word(words[i++], "GPS");
+               nsat = AltosParse.parse_int(words[i++]);
+               AltosParse.word(words[i++], "sat");
+
+               gps_connected = false;
+               gps_locked = false;
+               lat = lon = 0;
+               alt = 0;
+               if ((words[i]).equals("unlocked")) {
+                       gps_connected = true;
+                       gps_time = new AltosGPSTime();
+                       i++;
+               } else if (words.length >= 40) {
+                       gps_locked = true;
+                       gps_connected = true;
+
+                       gps_time = new AltosGPSTime(words[i], words[i+1]); i += 2;
+                       lat = AltosParse.parse_coord(words[i++]);
+                       lon = AltosParse.parse_coord(words[i++]);
+                       alt = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "m"));
+                       ground_speed = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "m/s(H)"));
+                       course = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "°"));
+                       climb_rate = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "m/s(V)"));
+                       hdop = AltosParse.parse_double(AltosParse.strip_suffix(words[i++], "(hdop)"));
+                       h_error = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "(herr)"));
+                       v_error = AltosParse.parse_int(AltosParse.strip_suffix(words[i++], "(verr)"));
+               } else {
+                       gps_time = new AltosGPSTime();
+               }
+               AltosParse.word(words[i++], "SAT");
+               int tracking_channels = AltosParse.parse_int(words[i++]);
+               cc_gps_sat = new AltosGPS.AltosGPSSat[tracking_channels];
+               for (int chan = 0; chan < tracking_channels; chan++) {
+                       cc_gps_sat[chan].svid = AltosParse.parse_int(words[i++]);
+                       cc_gps_sat[chan].c_n0 = AltosParse.parse_int(words[i++]);
+               }
+       }
+}