diff options
Diffstat (limited to 'altoslib')
| -rw-r--r-- | altoslib/AltosEepromMega.java | 4 | ||||
| -rw-r--r-- | altoslib/AltosLink.java | 8 | ||||
| -rw-r--r-- | altoslib/AltosState.java | 94 | 
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;  		}  	}  | 
