diff options
author | Keith Packard <keithp@keithp.com> | 2014-07-10 17:27:43 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-07-10 17:35:44 -0700 |
commit | 59702e5ff8d0522b0aa9dcca863309eaafbcda09 (patch) | |
tree | c55a101785c8529f81cdb8463b738883a5b0e470 /altoslib/AltosTelemetry.java | |
parent | 6dc58c63d202e918f16d5fbe9b188d422edcdd9c (diff) |
altoslib: Extend telemetry heights from 16 to 32 bits
Uses the GPS data and/or previous kalman data to compute the upper 16
bits of the truncated telemetry altitude value.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altoslib/AltosTelemetry.java')
-rw-r--r-- | altoslib/AltosTelemetry.java | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/altoslib/AltosTelemetry.java b/altoslib/AltosTelemetry.java index 4d50a059..2f15cd89 100644 --- a/altoslib/AltosTelemetry.java +++ b/altoslib/AltosTelemetry.java @@ -114,6 +114,35 @@ public abstract class AltosTelemetry implements AltosStateUpdate { return telem; } + public static int extend_height(AltosState state, int height_16) { + double compare_height; + int height = height_16; + + System.out.printf("state kalman height %g altitude %g ground_altitude %g gps_height %g\n", + state.kalman_height.value(), state.altitude(), state.ground_altitude(), state.gps_height()); + if (state.gps != null && state.gps.alt != AltosLib.MISSING) { + compare_height = state.gps_height(); + } else { + compare_height = state.height(); + } + + if (compare_height != AltosLib.MISSING) { + int high_bits = (int) Math.floor (compare_height / 65536.0); + + height = (high_bits << 16) | (height_16 & 0xffff); + + if (Math.abs(height + 65536 - compare_height) < Math.abs(height - compare_height)) + height += 65536; + else if (Math.abs(height - 65536 - compare_height) < Math.abs(height - compare_height)) + height -= 65536; + if (height != height_16) { + System.out.printf("Height adjusted from %d to %d with %g\n", + height_16, height, compare_height); + } + } + return height; + } + public static AltosTelemetry parse(String line) throws ParseException, AltosCRCException { String[] word = line.split("\\s+"); int i =0; |