use multimaint-merge to make Debian changelogs less ugly
[fw/altos] / altosui / AltosGPS.java
index 83821842374041f7ec47328d87f0c07a941291f4..b5df7c9a61d4b981553971cfd5842b862a7f86a0 100644 (file)
@@ -21,15 +21,12 @@ import java.lang.*;
 import java.text.*;
 
 public class AltosGPS {
-       public class AltosGPSSat {
-               int     svid;
-               int     c_n0;
-       }
+
+       final static int MISSING = AltosRecord.MISSING;
 
        int     nsat;
        boolean locked;
        boolean connected;
-       boolean date_valid;
        double  lat;            /* degrees (+N -S) */
        double  lon;            /* degrees (+E -W) */
        int     alt;            /* m */
@@ -40,11 +37,11 @@ public class AltosGPS {
        int     minute;
        int     second;
 
-       int     gps_extended;   /* has extra data */
        double  ground_speed;   /* m/s */
        int     course;         /* degrees */
        double  climb_rate;     /* m/s */
-       double  hdop;           /* unitless? */
+       double  hdop;           /* unitless */
+       double  vdop;           /* unitless */
        int     h_error;        /* m */
        int     v_error;        /* m */
 
@@ -73,6 +70,44 @@ public class AltosGPS {
                hour = minute = second = 0;
        }
 
+       public AltosGPS(AltosTelemetryMap map) throws ParseException {
+               String  state = map.get_string(AltosTelemetry.AO_TELEM_GPS_STATE,
+                                              AltosTelemetry.AO_TELEM_GPS_STATE_ERROR);
+
+               nsat = map.get_int(AltosTelemetry.AO_TELEM_GPS_NUM_SAT, 0);
+               if (state.equals(AltosTelemetry.AO_TELEM_GPS_STATE_LOCKED)) {
+                       connected = true;
+                       locked = true;
+                       lat = map.get_double(AltosTelemetry.AO_TELEM_GPS_LATITUDE, MISSING, 1.0e-7);
+                       lon = map.get_double(AltosTelemetry.AO_TELEM_GPS_LONGITUDE, MISSING, 1.0e-7);
+                       alt = map.get_int(AltosTelemetry.AO_TELEM_GPS_ALTITUDE, MISSING);
+                       year = map.get_int(AltosTelemetry.AO_TELEM_GPS_YEAR, MISSING);
+                       if (year != MISSING)
+                               year += 2000;
+                       month = map.get_int(AltosTelemetry.AO_TELEM_GPS_MONTH, MISSING);
+                       day = map.get_int(AltosTelemetry.AO_TELEM_GPS_DAY, MISSING);
+
+                       hour = map.get_int(AltosTelemetry.AO_TELEM_GPS_HOUR, 0);
+                       minute = map.get_int(AltosTelemetry.AO_TELEM_GPS_MINUTE, 0);
+                       second = map.get_int(AltosTelemetry.AO_TELEM_GPS_SECOND, 0);
+
+                       ground_speed = map.get_double(AltosTelemetry.AO_TELEM_GPS_HORIZONTAL_SPEED,
+                                                     AltosRecord.MISSING, 1/100.0);
+                       course = map.get_int(AltosTelemetry.AO_TELEM_GPS_COURSE,
+                                            AltosRecord.MISSING);
+                       hdop = map.get_double(AltosTelemetry.AO_TELEM_GPS_HDOP, MISSING, 1.0);
+                       vdop = map.get_double(AltosTelemetry.AO_TELEM_GPS_VDOP, MISSING, 1.0);
+                       h_error = map.get_int(AltosTelemetry.AO_TELEM_GPS_HERROR, MISSING);
+                       v_error = map.get_int(AltosTelemetry.AO_TELEM_GPS_VERROR, MISSING);
+               } else if (state.equals(AltosTelemetry.AO_TELEM_GPS_STATE_UNLOCKED)) {
+                       connected = true;
+                       locked = false;
+               } else {
+                       connected = false;
+                       locked = false;
+               }
+       }
+
        public AltosGPS(String[] words, int i, int version) throws ParseException {
                AltosParse.word(words[i++], "GPS");
                nsat = AltosParse.parse_int(words[i++]);
@@ -119,9 +154,9 @@ public class AltosGPS {
                        else
                                tracking_channels = AltosParse.parse_int(words[i]);
                        i++;
-                       cc_gps_sat = new AltosGPS.AltosGPSSat[tracking_channels];
+                       cc_gps_sat = new AltosGPSSat[tracking_channels];
                        for (int chan = 0; chan < tracking_channels; chan++) {
-                               cc_gps_sat[chan] = new AltosGPS.AltosGPSSat();
+                               cc_gps_sat[chan] = new AltosGPSSat();
                                cc_gps_sat[chan].svid = AltosParse.parse_int(words[i++]);
                                /* Older versions included SiRF status bits */
                                if (version < 2)
@@ -129,7 +164,7 @@ public class AltosGPS {
                                cc_gps_sat[chan].c_n0 = AltosParse.parse_int(words[i++]);
                        }
                } else
-                       cc_gps_sat = new AltosGPS.AltosGPSSat[0];
+                       cc_gps_sat = new AltosGPSSat[0];
        }
 
        public void set_latitude(int in_lat) {
@@ -162,14 +197,14 @@ public class AltosGPS {
 
        public void add_sat(int svid, int c_n0) {
                if (cc_gps_sat == null) {
-                       cc_gps_sat = new AltosGPS.AltosGPSSat[1];
+                       cc_gps_sat = new AltosGPSSat[1];
                } else {
-                       AltosGPSSat[] new_gps_sat = new AltosGPS.AltosGPSSat[cc_gps_sat.length + 1];
+                       AltosGPSSat[] new_gps_sat = new AltosGPSSat[cc_gps_sat.length + 1];
                        for (int i = 0; i < cc_gps_sat.length; i++)
                                new_gps_sat[i] = cc_gps_sat[i];
                        cc_gps_sat = new_gps_sat;
                }
-               AltosGPS.AltosGPSSat    sat = new AltosGPS.AltosGPSSat();
+               AltosGPSSat     sat = new AltosGPSSat();
                sat.svid = svid;
                sat.c_n0 = c_n0;
                cc_gps_sat[cc_gps_sat.length - 1] = sat;
@@ -184,7 +219,6 @@ public class AltosGPS {
                nsat = old.nsat;
                locked = old.locked;
                connected = old.connected;
-               date_valid = old.date_valid;
                lat = old.lat;          /* degrees (+N -S) */
                lon = old.lon;          /* degrees (+E -W) */
                alt = old.alt;          /* m */
@@ -195,7 +229,6 @@ public class AltosGPS {
                minute = old.minute;
                second = old.second;
 
-               gps_extended = old.gps_extended;        /* has extra data */
                ground_speed = old.ground_speed;        /* m/s */
                course = old.course;            /* degrees */
                climb_rate = old.climb_rate;    /* m/s */