From dd28429405498fca0788ce9c19093898c84b10e5 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 23 Jan 2014 22:16:36 -0800 Subject: altoslib: Validate TeleMega GPS_SAT log packet nsat Make sure nsat is not more than the size of the array Signed-off-by: Keith Packard --- altoslib/AltosEepromMega.java | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'altoslib') diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java index 1ac72b1c..b8a1b9e8 100644 --- a/altoslib/AltosEepromMega.java +++ b/altoslib/AltosEepromMega.java @@ -24,6 +24,8 @@ import java.text.*; public class AltosEepromMega extends AltosEeprom { public static final int record_length = 32; + public static final int max_sat = 12; + public int record_length() { return record_length; } /* AO_LOG_FLIGHT elements */ @@ -176,6 +178,8 @@ public class AltosEepromMega extends AltosEeprom { gps = state.make_temp_gps(true); int n = nsat(); + if (n > max_sat) + n = max_sat; for (int i = 0; i < n; i++) gps.add_sat(svid(i), c_n(i)); break; -- cgit v1.2.3 From e4616233f3942d2796ba6633477670a83669957b Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 24 Jan 2014 22:39:10 -0800 Subject: altoslib: Track GPS altitude values to be able to report max gps height This adds separate GPS altitude and GPS ground altitude values so that the AltosState object can report GPS max height. Signed-off-by: Keith Packard --- altoslib/AltosState.java | 93 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 86 insertions(+), 7 deletions(-) (limited to 'altoslib') diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 08dafbb4..6d52dc40 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -299,6 +299,30 @@ public class AltosState implements Cloneable { ground_altitude.set_measured(a, time); } + class AltosGpsGroundAltitude extends AltosValue { + void set(double a, double t) { + super.set(a, t); + pad_alt = value(); + gps_altitude.set_gps_height(); + } + + void set_filtered(double a, double t) { + super.set_filtered(a, t); + pad_alt = value(); + gps_altitude.set_gps_height(); + } + } + + private AltosGpsGroundAltitude gps_ground_altitude; + + public double gps_ground_altitude() { + return gps_ground_altitude.value(); + } + + public void set_gps_ground_altitude(double a) { + gps_ground_altitude.set(a, time); + } + class AltosGroundPressure extends AltosCValue { void set_filtered(double p, double time) { computed.set_filtered(p, time); @@ -344,26 +368,56 @@ public class AltosState implements Cloneable { private AltosAltitude altitude; + class AltosGpsAltitude extends AltosValue { + + private void set_gps_height() { + double a = value(); + double g = gps_ground_altitude.value(); + + if (a != AltosLib.MISSING && g != AltosLib.MISSING) + gps_height = a - g; + else + gps_height = AltosLib.MISSING; + } + + void set(double a, double t) { + super.set(a, t); + set_gps_height(); + } + } + + private AltosGpsAltitude gps_altitude; + public double altitude() { double a = altitude.value(); if (a != AltosLib.MISSING) return a; - if (gps != null) - return gps.alt; - return AltosLib.MISSING; + return gps_altitude.value(); } public double max_altitude() { double a = altitude.max(); if (a != AltosLib.MISSING) return a; - return AltosLib.MISSING; + return gps_altitude.max(); } public void set_altitude(double new_altitude) { altitude.set_measured(new_altitude, time); } + public double gps_altitude() { + return gps_altitude.value(); + } + + public double max_gps_altitude() { + return gps_altitude.max(); + } + + public void set_gps_altitude(double new_gps_altitude) { + gps_altitude.set(new_gps_altitude, time); + } + class AltosPressure extends AltosValue { void set(double p, double time) { super.set(p, time); @@ -408,6 +462,24 @@ public class AltosState implements Cloneable { return AltosLib.MISSING; } + public double gps_height() { + double a = gps_altitude(); + double g = gps_ground_altitude(); + + if (a != AltosLib.MISSING && g != AltosLib.MISSING) + return a - g; + return AltosLib.MISSING; + } + + public double max_gps_height() { + double a = gps_altitude.max(); + double g = gps_ground_altitude(); + + if (a != AltosLib.MISSING && g != AltosLib.MISSING) + return a - g; + return AltosLib.MISSING; + } + class AltosSpeed extends AltosCValue { void set_accel() { @@ -608,6 +680,9 @@ public class AltosState implements Cloneable { pad_lon = AltosLib.MISSING; pad_alt = AltosLib.MISSING; + gps_altitude = new AltosGpsAltitude(); + gps_ground_altitude = new AltosGpsGroundAltitude(); + speak_tick = AltosLib.MISSING; speak_altitude = AltosLib.MISSING; @@ -730,6 +805,10 @@ public class AltosState implements Cloneable { range = old.range; gps_height = old.gps_height; + + gps_altitude.copy(old.gps_altitude); + gps_ground_altitude.copy(old.gps_ground_altitude); + pad_lat = old.pad_lat; pad_lon = old.pad_lon; pad_alt = old.pad_alt; @@ -771,14 +850,15 @@ public class AltosState implements Cloneable { if (pad_lat != AltosLib.MISSING) { pad_lat = (pad_lat * 31 + gps.lat) / 32; pad_lon = (pad_lon * 31 + gps.lon) / 32; - pad_alt = (pad_alt * 31 + gps.alt) / 32; + gps_ground_altitude.set_filtered(gps.alt, time); } } if (pad_lat == AltosLib.MISSING) { pad_lat = gps.lat; pad_lon = gps.lon; - pad_alt = gps.alt; + gps_ground_altitude.set(gps.alt, time); } + gps_altitude.set(gps.alt, time); } if (gps.lat != 0 && gps.lon != 0 && pad_lat != AltosLib.MISSING && @@ -791,7 +871,6 @@ public class AltosState implements Cloneable { from_pad = new AltosGreatCircle(pad_lat, pad_lon, 0, gps.lat, gps.lon, h); elevation = from_pad.elevation; range = from_pad.range; - gps_height = gps.alt - pad_alt; } } -- cgit v1.2.3 From 6b70b8b6bb4e8eae8159ec966847092d0b1deab3 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 24 Jan 2014 22:43:25 -0800 Subject: altoslib: Don't lose gps_height value between GPS samples gps_height is now reliably updated whenever GPS altitude data is received, so don't try to reset it between samples. Signed-off-by: Keith Packard --- altoslib/AltosState.java | 1 - 1 file changed, 1 deletion(-) (limited to 'altoslib') diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 6d52dc40..758fd636 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -838,7 +838,6 @@ public class AltosState implements Cloneable { void update_gps() { elevation = 0; range = -1; - gps_height = 0; if (gps == null) return; -- cgit v1.2.3 From 0c2f28cbc1cb312d3bcc8951176d79f234a1af04 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 3 Feb 2014 00:26:42 -0800 Subject: altoslib: Use existing unicode Charset in AltosLink Instead of making AltosLink look up the unicode charset, just provide it directly. Signed-off-by: Keith Packard --- altoslib/AltosLink.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'altoslib') diff --git a/altoslib/AltosLink.java b/altoslib/AltosLink.java index 8346d281..97fa7062 100644 --- a/altoslib/AltosLink.java +++ b/altoslib/AltosLink.java @@ -251,13 +251,7 @@ public abstract class AltosLink implements Runnable { public void add_bytes(byte[] bytes, int len) throws InterruptedException { String line; - try { - line = new String(bytes, 0, len, "UTF-8"); - } catch (UnsupportedEncodingException ue) { - line = ""; - for (int i = 0; i < len; i++) - line = line + bytes[i]; - } + line = new String(bytes, 0, len, AltosLib.unicode_set); if (debug) System.out.printf("\t\t\t\t\t%s\n", line); add_string(line); -- cgit v1.2.3