summaryrefslogtreecommitdiff
path: root/altoslib
diff options
context:
space:
mode:
Diffstat (limited to 'altoslib')
-rw-r--r--altoslib/AltosEepromMega.java4
-rw-r--r--altoslib/AltosLink.java8
-rw-r--r--altoslib/AltosState.java94
3 files changed, 91 insertions, 15 deletions
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;
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);
diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java
index 08dafbb4..758fd636 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;
@@ -759,7 +838,6 @@ public class AltosState implements Cloneable {
void update_gps() {
elevation = 0;
range = -1;
- gps_height = 0;
if (gps == null)
return;
@@ -771,14 +849,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 +870,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;
}
}