altoslib: Handle wide GPS altitude values in eeprom and telemetry
[fw/altos] / altoslib / AltosTelemetryLocation.java
index 67705cde57750df8d724f0011b34ab04383799db..427ae16ebed3552459ebf5487854201320a568c2 100644 (file)
@@ -15,7 +15,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_4;
+package org.altusmetrum.altoslib_5;
 
 
 public class AltosTelemetryLocation extends AltosTelemetryStandard {
@@ -36,13 +36,13 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {
        int     ground_speed;
        int     climb_rate;
        int     course;
-       int     state;
+
+       public static final int AO_GPS_MODE_ALTITUDE_24 = (1 << 0);     /* Reports 24-bits of altitude */
 
        public AltosTelemetryLocation(int[] bytes) {
                super(bytes);
 
                flags          = uint8(5);
-               altitude       = int16(6);
                latitude       = uint32(8);
                longitude      = uint32(12);
                year           = uint8(16);
@@ -58,7 +58,11 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {
                ground_speed   = uint16(26);
                climb_rate     = int16(28);
                course         = uint8(30);
-               state          = uint8(31);
+
+               if ((mode & AO_GPS_MODE_ALTITUDE_24) != 0) {
+                       altitude = (int8(31) << 16) | uint16(6);
+               } else
+                       altitude = int16(6);
        }
 
        public void update_state(AltosState state) {
@@ -68,7 +72,6 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {
                gps.nsat = flags & 0xf;
                gps.locked = (flags & (1 << 4)) != 0;
                gps.connected = (flags & (1 << 5)) != 0;
-               gps.state = this.state;
 
                if (gps.locked) {
                        gps.lat = latitude * 1.0e-7;
@@ -83,8 +86,9 @@ public class AltosTelemetryLocation extends AltosTelemetryStandard {
                        gps.ground_speed = ground_speed * 1.0e-2;
                        gps.course = course * 2;
                        gps.climb_rate = climb_rate * 1.0e-2;
-                       gps.hdop = hdop;
-                       gps.vdop = vdop;
+                       gps.pdop = pdop / 10.0;
+                       gps.hdop = hdop / 10.0;
+                       gps.vdop = vdop / 10.0;
                }
                state.set_temp_gps();
        }