diff options
Diffstat (limited to 'altoslib')
| -rw-r--r-- | altoslib/AltosConfigData.java | 17 | ||||
| -rw-r--r-- | altoslib/AltosEepromMega.java | 59 | ||||
| -rw-r--r-- | altoslib/AltosEepromMegaIterable.java | 195 | ||||
| -rw-r--r-- | altoslib/AltosIdleMonitor.java | 2 | ||||
| -rw-r--r-- | altoslib/AltosLib.java | 2 | ||||
| -rw-r--r-- | altoslib/AltosOrderedMegaRecord.java | 12 | ||||
| -rw-r--r-- | altoslib/AltosPyro.java | 293 | ||||
| -rw-r--r-- | altoslib/AltosRecord.java | 99 | ||||
| -rw-r--r-- | altoslib/AltosRecordMM.java | 14 | ||||
| -rw-r--r-- | altoslib/AltosRecordNone.java | 34 | ||||
| -rw-r--r-- | altoslib/AltosRecordTM.java | 21 | ||||
| -rw-r--r-- | altoslib/AltosState.java | 69 | ||||
| -rw-r--r-- | altoslib/AltosTelemetryRecordLegacy.java | 24 | ||||
| -rw-r--r-- | altoslib/AltosTelemetryRecordMegaData.java | 6 | ||||
| -rw-r--r-- | altoslib/AltosTelemetryRecordRaw.java | 2 | ||||
| -rw-r--r-- | altoslib/AltosTelemetryRecordSensor.java | 6 | ||||
| -rw-r--r-- | altoslib/Makefile.am | 4 | 
17 files changed, 539 insertions, 320 deletions
| diff --git a/altoslib/AltosConfigData.java b/altoslib/AltosConfigData.java index a962b105..45a88783 100644 --- a/altoslib/AltosConfigData.java +++ b/altoslib/AltosConfigData.java @@ -50,6 +50,8 @@ public class AltosConfigData implements Iterable<String> {  	public int	storage_size;  	public int	storage_erase_unit; +	public AltosPyro[]	pyros; +  	public static String get_string(String line, String label) throws  ParseException {  		if (line.startsWith(label)) {  			String	quoted = line.substring(label.length()).trim(); @@ -135,6 +137,10 @@ public class AltosConfigData implements Iterable<String> {  		radio_frequency = 0;  		stored_flight = 0;  		serial = -1; +		pyros = null; + +		int npyro = 0; +		int pyro = 0;  		for (;;) {  			String line = link.get_reply();  			if (line == null) @@ -142,6 +148,16 @@ public class AltosConfigData implements Iterable<String> {  			if (line.contains("Syntax error"))  				continue;  			lines.add(line); +			if (pyro < npyro - 1) { +				if (pyros == null) +					pyros = new AltosPyro[npyro]; +				try { +					pyros[pyro] = new AltosPyro(pyro, line); +				} catch (ParseException e) { +				} +				++pyro; +				continue; +			}  			try { serial = get_int(line, "serial-number"); } catch (Exception e) {}  			try { log_format = get_int(line, "log-format"); } catch (Exception e) {}  			try { main_deploy = get_int(line, "Main deploy:"); } catch (Exception e) {} @@ -173,6 +189,7 @@ public class AltosConfigData implements Iterable<String> {  			try { get_int(line, "flight"); stored_flight++; }  catch (Exception e) {}  			try { storage_size = get_int(line, "Storage size:"); } catch (Exception e) {}  			try { storage_erase_unit = get_int(line, "Storage erase unit"); } catch (Exception e) {} +			try { npyro = get_int(line, "Pyro-count:"); pyro = 0; } catch (Exception e) {}  			/* signals the end of the version info */  			if (line.startsWith("software-version")) diff --git a/altoslib/AltosEepromMega.java b/altoslib/AltosEepromMega.java index 26bacf8d..af4f8aca 100644 --- a/altoslib/AltosEepromMega.java +++ b/altoslib/AltosEepromMega.java @@ -24,7 +24,7 @@ public class AltosEepromMega {  	public int	tick;  	public boolean	valid;  	public String	data; -	public int	a, b; +	public int	config_a, config_b;  	public int	data8[]; @@ -66,12 +66,7 @@ public class AltosEepromMega {  	public int mag_x() { return data16(20); }  	public int mag_y() { return data16(22); }  	public int mag_z() { return data16(24); } -	public int accel() { -		int a = data16(26); -		if (a != 0xffff) -			return a; -		return accel_y(); -	} +	public int accel() { return data16(26); }  	/* AO_LOG_VOLT elements */  	public int v_batt() { return data16(0); } @@ -79,6 +74,22 @@ public class AltosEepromMega {  	public int nsense() { return data16(4); }  	public int sense(int i) { return data16(6 + i * 2); } +	/* AO_LOG_GPS_TIME elements */ +	public int latitude() { return data32(0); } +	public int longitude() { return data32(4); } +	public int altitude() { return data16(8); } +	public int hour() { return data8(10); } +	public int minute() { return data8(11); } +	public int second() { return data8(12); } +	public int flags() { return data8(13); } +	public int year() { return data8(14); } +	public int month() { return data8(15); } +	public int day() { return data8(16); } +	 +	/* AO_LOG_GPS_SAT elements */ +	public int nsat() { return data16(0); } +	public int svid(int n) { return data8(2 + n * 2); } +	public int c_n(int n) { return data8(2 + n * 2 + 1); }  	public AltosEepromMega (AltosEepromChunk chunk, int start) throws ParseException {  		cmd = chunk.data(start); @@ -126,26 +137,26 @@ public class AltosEepromMega {  					data = tokens[2];  				} else if (tokens[0].equals("Main") && tokens[1].equals("deploy:")) {  					cmd = AltosLib.AO_LOG_MAIN_DEPLOY; -					a = Integer.parseInt(tokens[2]); +					config_a = Integer.parseInt(tokens[2]);  				} else if (tokens[0].equals("Apogee") && tokens[1].equals("delay:")) {  					cmd = AltosLib.AO_LOG_APOGEE_DELAY; -					a = Integer.parseInt(tokens[2]); +					config_a = Integer.parseInt(tokens[2]);  				} else if (tokens[0].equals("Radio") && tokens[1].equals("channel:")) {  					cmd = AltosLib.AO_LOG_RADIO_CHANNEL; -					a = Integer.parseInt(tokens[2]); +					config_a = Integer.parseInt(tokens[2]);  				} else if (tokens[0].equals("Callsign:")) {  					cmd = AltosLib.AO_LOG_CALLSIGN;  					data = tokens[1].replaceAll("\"","");  				} else if (tokens[0].equals("Accel") && tokens[1].equals("cal")) {  					cmd = AltosLib.AO_LOG_ACCEL_CAL; -					a = Integer.parseInt(tokens[3]); -					b = Integer.parseInt(tokens[5]); +					config_a = Integer.parseInt(tokens[3]); +					config_b = Integer.parseInt(tokens[5]);  				} else if (tokens[0].equals("Radio") && tokens[1].equals("cal:")) {  					cmd = AltosLib.AO_LOG_RADIO_CAL; -					a = Integer.parseInt(tokens[2]); +					config_a = Integer.parseInt(tokens[2]);  				} else if (tokens[0].equals("Max") && tokens[1].equals("flight") && tokens[2].equals("log:")) {  					cmd = AltosLib.AO_LOG_MAX_FLIGHT_LOG; -					a = Integer.parseInt(tokens[3]); +					config_a = Integer.parseInt(tokens[3]);  				} else if (tokens[0].equals("manufacturer")) {  					cmd = AltosLib.AO_LOG_MANUFACTURER;  					data = tokens[1]; @@ -154,38 +165,38 @@ public class AltosEepromMega {  					data = tokens[1];  				} else if (tokens[0].equals("serial-number")) {  					cmd = AltosLib.AO_LOG_SERIAL_NUMBER; -					a = Integer.parseInt(tokens[1]); +					config_a = Integer.parseInt(tokens[1]);  				} else if (tokens[0].equals("log-format")) {  					cmd = AltosLib.AO_LOG_LOG_FORMAT; -					a = Integer.parseInt(tokens[1]); +					config_a = Integer.parseInt(tokens[1]);  				} else if (tokens[0].equals("software-version")) {  					cmd = AltosLib.AO_LOG_SOFTWARE_VERSION;  					data = tokens[1];  				} else if (tokens[0].equals("ms5607")) {  					if (tokens[1].equals("reserved:")) {  						cmd = AltosLib.AO_LOG_BARO_RESERVED; -						a = Integer.parseInt(tokens[2]); +						config_a = Integer.parseInt(tokens[2]);  					} else if (tokens[1].equals("sens:")) {  						cmd = AltosLib.AO_LOG_BARO_SENS; -						a = Integer.parseInt(tokens[2]); +						config_a = Integer.parseInt(tokens[2]);  					} else if (tokens[1].equals("off:")) {  						cmd = AltosLib.AO_LOG_BARO_OFF; -						a = Integer.parseInt(tokens[2]); +						config_a = Integer.parseInt(tokens[2]);  					} else if (tokens[1].equals("tcs:")) {  						cmd = AltosLib.AO_LOG_BARO_TCS; -						a = Integer.parseInt(tokens[2]); +						config_a = Integer.parseInt(tokens[2]);  					} else if (tokens[1].equals("tco:")) {  						cmd = AltosLib.AO_LOG_BARO_TCO; -						a = Integer.parseInt(tokens[2]); +						config_a = Integer.parseInt(tokens[2]);  					} else if (tokens[1].equals("tref:")) {  						cmd = AltosLib.AO_LOG_BARO_TREF; -						a = Integer.parseInt(tokens[2]); +						config_a = Integer.parseInt(tokens[2]);  					} else if (tokens[1].equals("tempsens:")) {  						cmd = AltosLib.AO_LOG_BARO_TEMPSENS; -						a = Integer.parseInt(tokens[2]); +						config_a = Integer.parseInt(tokens[2]);  					} else if (tokens[1].equals("crc:")) {  						cmd = AltosLib.AO_LOG_BARO_CRC; -						a = Integer.parseInt(tokens[2]); +						config_a = Integer.parseInt(tokens[2]);  					} else {  						cmd = AltosLib.AO_LOG_INVALID;  						data = line; diff --git a/altoslib/AltosEepromMegaIterable.java b/altoslib/AltosEepromMegaIterable.java index 1ab2fcc8..16809089 100644 --- a/altoslib/AltosEepromMegaIterable.java +++ b/altoslib/AltosEepromMegaIterable.java @@ -106,80 +106,47 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {  			eeprom.sensor_tick = record.tick;  			has_accel = true;  			break; -		case AltosLib.AO_LOG_PRESSURE: -			state.pres = record.b; -			state.flight_pres = state.pres; -			if (eeprom.n_pad_samples == 0) { -				eeprom.n_pad_samples++; -				state.ground_pres = state.pres; -			} -			eeprom.seen |= seen_sensor; -			break;  		case AltosLib.AO_LOG_TEMP_VOLT:  			state.v_batt = record.v_batt();  			state.v_pyro = record.v_pbatt(); -			for (int i = 0; i < AltosRecordMM.num_sense; i++) +			for (int i = 0; i < record.nsense(); i++)  				state.sense[i] = record.sense(i);  			eeprom.seen |= seen_temp_volt;  			break; -// -//		case AltosLib.AO_LOG_DEPLOY: -//			state.drogue = record.a; -//			state.main = record.b; -//			eeprom.seen |= seen_deploy; -//			has_ignite = true; -//			break; -  		case AltosLib.AO_LOG_STATE:  			state.state = record.state();  			break;  		case AltosLib.AO_LOG_GPS_TIME:  			eeprom.gps_tick = state.tick; -			AltosGPS old = state.gps;  			state.gps = new AltosGPS(); -			/* GPS date doesn't get repeated through the file */ -			if (old != null) { -				state.gps.year = old.year; -				state.gps.month = old.month; -				state.gps.day = old.day; -			} -			state.gps.hour = (record.a & 0xff); -			state.gps.minute = (record.a >> 8); -			state.gps.second = (record.b & 0xff); +			state.gps.lat = record.latitude() / 1e7; +			state.gps.lon = record.longitude() / 1e7; +			state.gps.alt = record.altitude(); +			state.gps.year = record.year() + 2000; +			state.gps.month = record.month(); +			state.gps.day = record.day(); + +			state.gps.hour = record.hour(); +			state.gps.minute = record.minute(); +			state.gps.second = record.second(); -			int flags = (record.b >> 8); +			int flags = record.flags();  			state.gps.connected = (flags & AltosLib.AO_GPS_RUNNING) != 0;  			state.gps.locked = (flags & AltosLib.AO_GPS_VALID) != 0;  			state.gps.nsat = (flags & AltosLib.AO_GPS_NUM_SAT_MASK) >>  				AltosLib.AO_GPS_NUM_SAT_SHIFT;  			state.new_gps = true;  			has_gps = true; -			break; -		case AltosLib.AO_LOG_GPS_LAT: -			int lat32 = record.a | (record.b << 16); -			state.gps.lat = (double) lat32 / 1e7; -			break; -		case AltosLib.AO_LOG_GPS_LON: -			int lon32 = record.a | (record.b << 16); -			state.gps.lon = (double) lon32 / 1e7; -			break; -		case AltosLib.AO_LOG_GPS_ALT: -			state.gps.alt = record.a; +			eeprom.seen |= seen_gps_time | seen_gps_lat | seen_gps_lon;  			break;  		case AltosLib.AO_LOG_GPS_SAT:  			if (state.tick == eeprom.gps_tick) { -				int svid = record.a; -				int c_n0 = record.b >> 8; -				state.gps.add_sat(svid, c_n0); +				int nsat = record.nsat(); +				for (int i = 0; i < nsat; i++) +					state.gps.add_sat(record.svid(i), record.c_n(i));  			}  			break; -		case AltosLib.AO_LOG_GPS_DATE: -			state.gps.year = (record.a & 0xff) + 2000; -			state.gps.month = record.a >> 8; -			state.gps.day = record.b & 0xff; -			break; -  		case AltosLib.AO_LOG_CONFIG_VERSION:  			break;  		case AltosLib.AO_LOG_MAIN_DEPLOY: @@ -192,8 +159,8 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {  			state.callsign = record.data;  			break;  		case AltosLib.AO_LOG_ACCEL_CAL: -			state.accel_plus_g = record.a; -			state.accel_minus_g = record.b; +			state.accel_plus_g = record.config_a; +			state.accel_minus_g = record.config_b;  			break;  		case AltosLib.AO_LOG_RADIO_CAL:  			break; @@ -202,33 +169,33 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {  		case AltosLib.AO_LOG_PRODUCT:  			break;  		case AltosLib.AO_LOG_SERIAL_NUMBER: -			state.serial = record.a; +			state.serial = record.config_a;  			break;  		case AltosLib.AO_LOG_SOFTWARE_VERSION:  			break;  		case AltosLib.AO_LOG_BARO_RESERVED: -			baro.reserved = record.a; +			baro.reserved = record.config_a;  			break;  		case AltosLib.AO_LOG_BARO_SENS: -			baro.sens =record.a; +			baro.sens =record.config_a;  			break;  		case AltosLib.AO_LOG_BARO_OFF: -			baro.off =record.a; +			baro.off =record.config_a;  			break;  		case AltosLib.AO_LOG_BARO_TCS: -			baro.tcs =record.a; +			baro.tcs =record.config_a;  			break;  		case AltosLib.AO_LOG_BARO_TCO: -			baro.tco =record.a; +			baro.tco =record.config_a;  			break;  		case AltosLib.AO_LOG_BARO_TREF: -			baro.tref =record.a; +			baro.tref =record.config_a;  			break;  		case AltosLib.AO_LOG_BARO_TEMPSENS: -			baro.tempsens =record.a; +			baro.tempsens =record.config_a;  			break;  		case AltosLib.AO_LOG_BARO_CRC: -			baro.crc =record.a; +			baro.crc =record.config_a;  			break;  		}  		state.seen |= eeprom.seen; @@ -287,25 +254,25 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {  				out.printf("# Config version: %s\n", record.data);  				break;  			case AltosLib.AO_LOG_MAIN_DEPLOY: -				out.printf("# Main deploy: %s\n", record.a); +				out.printf("# Main deploy: %s\n", record.config_a);  				break;  			case AltosLib.AO_LOG_APOGEE_DELAY: -				out.printf("# Apogee delay: %s\n", record.a); +				out.printf("# Apogee delay: %s\n", record.config_a);  				break;  			case AltosLib.AO_LOG_RADIO_CHANNEL: -				out.printf("# Radio channel: %s\n", record.a); +				out.printf("# Radio channel: %s\n", record.config_a);  				break;  			case AltosLib.AO_LOG_CALLSIGN:  				out.printf("# Callsign: %s\n", record.data);  				break;  			case AltosLib.AO_LOG_ACCEL_CAL: -				out.printf ("# Accel cal: %d %d\n", record.a, record.b); +				out.printf ("# Accel cal: %d %d\n", record.config_a, record.config_b);  				break;  			case AltosLib.AO_LOG_RADIO_CAL: -				out.printf ("# Radio cal: %d\n", record.a); +				out.printf ("# Radio cal: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_MAX_FLIGHT_LOG: -				out.printf ("# Max flight log: %d\n", record.a); +				out.printf ("# Max flight log: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_MANUFACTURER:  				out.printf ("# Manufacturer: %s\n", record.data); @@ -314,74 +281,40 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {  				out.printf ("# Product: %s\n", record.data);  				break;  			case AltosLib.AO_LOG_SERIAL_NUMBER: -				out.printf ("# Serial number: %d\n", record.a); +				out.printf ("# Serial number: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_SOFTWARE_VERSION:  				out.printf ("# Software version: %s\n", record.data);  				break;  			case AltosLib.AO_LOG_BARO_RESERVED: -				out.printf ("# Baro reserved: %d\n", record.a); +				out.printf ("# Baro reserved: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_BARO_SENS: -				out.printf ("# Baro sens: %d\n", record.a); +				out.printf ("# Baro sens: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_BARO_OFF: -				out.printf ("# Baro off: %d\n", record.a); +				out.printf ("# Baro off: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_BARO_TCS: -				out.printf ("# Baro tcs: %d\n", record.a); +				out.printf ("# Baro tcs: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_BARO_TCO: -				out.printf ("# Baro tco: %d\n", record.a); +				out.printf ("# Baro tco: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_BARO_TREF: -				out.printf ("# Baro tref: %d\n", record.a); +				out.printf ("# Baro tref: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_BARO_TEMPSENS: -				out.printf ("# Baro tempsens: %d\n", record.a); +				out.printf ("# Baro tempsens: %d\n", record.config_a);  				break;  			case AltosLib.AO_LOG_BARO_CRC: -				out.printf ("# Baro crc: %d\n", record.a); +				out.printf ("# Baro crc: %d\n", record.config_a);  				break;  			}  		}  	}  	/* -	 * Given an AO_LOG_GPS_TIME record with correct time, and one -	 * missing time, rewrite the missing time values with the good -	 * ones, assuming that the difference between them is 'diff' seconds -	 */ -	void update_time(AltosOrderedMegaRecord good, AltosOrderedMegaRecord bad) { - -		int diff = (bad.tick - good.tick + 50) / 100; - -		int hour = (good.a & 0xff); -		int minute = (good.a >> 8); -		int second = (good.b & 0xff); -		int flags = (good.b >> 8); -		int seconds = hour * 3600 + minute * 60 + second; - -		/* Make sure this looks like a good GPS value */ -		if ((flags & AltosLib.AO_GPS_NUM_SAT_MASK) >> AltosLib.AO_GPS_NUM_SAT_SHIFT < 4) -			flags = (flags & ~AltosLib.AO_GPS_NUM_SAT_MASK) | (4 << AltosLib.AO_GPS_NUM_SAT_SHIFT); -		flags |= AltosLib.AO_GPS_RUNNING; -		flags |= AltosLib.AO_GPS_VALID; - -		int new_seconds = seconds + diff; -		if (new_seconds < 0) -			new_seconds += 24 * 3600; -		int new_second = (new_seconds % 60); -		int new_minutes = (new_seconds / 60); -		int new_minute = (new_minutes % 60); -		int new_hours = (new_minutes / 60); -		int new_hour = (new_hours % 24); - -		bad.a = new_hour + (new_minute << 8); -		bad.b = new_second + (flags << 8); -	} - -	/*  	 * Read the whole file, dumping records into a RB tree so  	 * we can enumerate them in time order -- the eeprom data  	 * are sometimes out of order with GPS data getting timestamps @@ -416,53 +349,11 @@ public class AltosEepromMegaIterable extends AltosRecordIterable {  					continue;  				} -				/* Two firmware bugs caused the loss of some GPS data. -				 * The flight date would never be recorded, and often -				 * the flight time would get overwritten by another -				 * record. Detect the loss of the GPS date and fix up the -				 * missing time records -				 */ -				if (record.cmd == AltosLib.AO_LOG_GPS_DATE) { -					gps_date_record = record; -					continue; -				} - -				/* go back and fix up any missing time values */ -				if (record.cmd == AltosLib.AO_LOG_GPS_TIME) { -					last_gps_time = record; -					if (missing_time) { -						Iterator<AltosOrderedMegaRecord> iterator = records.iterator(); -						while (iterator.hasNext()) { -							AltosOrderedMegaRecord old = iterator.next(); -							if (old.cmd == AltosLib.AO_LOG_GPS_TIME && -							    old.a == -1 && old.b == -1) -							{ -								update_time(record, old); -							} -						} -						missing_time = false; -					} -				} - -				if (record.cmd == AltosLib.AO_LOG_GPS_LAT) { -					if (last_gps_time == null || last_gps_time.tick != record.tick) { -						AltosOrderedMegaRecord add_gps_time = new AltosOrderedMegaRecord(AltosLib.AO_LOG_GPS_TIME, -													 record.tick, -													 -1, -1, index-1); -						if (last_gps_time != null) -							update_time(last_gps_time, add_gps_time); -						else -							missing_time = true; - -						records.add(add_gps_time); -						record.index = index++; -					} -				}  				records.add(record);  				/* Bail after reading the 'landed' record; we're all done */  				if (record.cmd == AltosLib.AO_LOG_STATE && -				    record.a == AltosLib.ao_flight_landed) +				    record.state() == AltosLib.ao_flight_landed)  					break;  			}  		} catch (IOException io) { diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java index 2c4965ff..07d8930d 100644 --- a/altoslib/AltosIdleMonitor.java +++ b/altoslib/AltosIdleMonitor.java @@ -97,7 +97,7 @@ public class AltosIdleMonitor extends Thread {  			else if (has_sensor_mm(config_data))  				record = sensor_mm(config_data);  			else -				record = new AltosRecord(); +				record = new AltosRecordNone();  			if (has_gps(config_data))  				gps = new AltosGPSQuery(link, config_data); diff --git a/altoslib/AltosLib.java b/altoslib/AltosLib.java index 192c445e..07516aeb 100644 --- a/altoslib/AltosLib.java +++ b/altoslib/AltosLib.java @@ -199,7 +199,7 @@ public class AltosLib {  	public static String state_name_capital(int state) {  		if (state < 0 || state_to_string.length <= state) -			return "invalid"; +			return "Invalid";  		return state_to_string_capital[state];  	} diff --git a/altoslib/AltosOrderedMegaRecord.java b/altoslib/AltosOrderedMegaRecord.java index 05423dd9..3aaf7b5b 100644 --- a/altoslib/AltosOrderedMegaRecord.java +++ b/altoslib/AltosOrderedMegaRecord.java @@ -43,18 +43,6 @@ class AltosOrderedMegaRecord extends AltosEepromMega implements Comparable<Altos  		index = in_index;  	} -	public AltosOrderedMegaRecord(int in_cmd, int in_tick, int in_a, int in_b, int in_index) { -		super(in_cmd, in_tick); -		a = in_a; -		b = in_b; -		index = in_index; -	} - -	public String toString() { -		return String.format("%d.%d %04x %04x %04x", -				     cmd, index, tick, a, b); -	} -  	public int compareTo(AltosOrderedMegaRecord o) {  		int	tick_diff = tick - o.tick;  		if (tick_diff != 0) diff --git a/altoslib/AltosPyro.java b/altoslib/AltosPyro.java new file mode 100644 index 00000000..14051169 --- /dev/null +++ b/altoslib/AltosPyro.java @@ -0,0 +1,293 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.AltosLib; + +import java.util.*; +import java.text.*; +import java.util.concurrent.*; + +public class AltosPyro { +	public static final int pyro_none			= 0x00000000; + +	public static final int pyro_accel_less			= 0x00000001; +	public static final int pyro_accel_greater		= 0x00000002; +	public static final String pyro_accel_less_string	= "a<"; +	public static final String pyro_accel_greater_string	= "a>"; +	public static final String pyro_accel_less_name		= "Acceleration less than (m/s²)"; +	public static final String pyro_accel_greater_name	= "Acceleration greater than (m/s²)"; +	public static final double pyro_accel_scale		= 16.0; + +	public static final int pyro_speed_less			= 0x00000004; +	public static final int pyro_speed_greater		= 0x00000008; +	public static final String pyro_speed_less_string	= "s<"; +	public static final String pyro_speed_greater_string	= "s>"; +	public static final String pyro_speed_less_name		= "Speed less than (m/s)"; +	public static final String pyro_speed_greater_name	= "Speed greater than (m/s)"; +	public static final double pyro_speed_scale		= 16.0; + +	public static final int pyro_height_less		= 0x00000010; +	public static final int pyro_height_greater		= 0x00000020; +	public static final String pyro_height_less_string	= "h<"; +	public static final String pyro_height_greater_string	= "h>"; +	public static final String pyro_height_less_name	= "Height less than (m)"; +	public static final String pyro_height_greater_name	= "Height greater than (m)"; +	public static final double pyro_height_scale		= 1.0; + +	public static final int pyro_orient_less		= 0x00000040; +	public static final int pyro_orient_greater		= 0x00000080; +	public static final String pyro_orient_less_string	= "o<"; +	public static final String pyro_orient_greater_string	= "o>"; +	public static final String pyro_orient_less_name	= "Angle from vertical less than (degrees)"; +	public static final String pyro_orient_greater_name	= "Angle from vertical greater than (degrees)"; +	public static final double pyro_orient_scale		= 1.0; + +	public static final int pyro_time_less			= 0x00000100; +	public static final int pyro_time_greater		= 0x00000200; +	public static final String pyro_time_less_string	= "t<"; +	public static final String pyro_time_greater_string	= "t>"; +	public static final String pyro_time_less_name		= "Time since boost less than (s)"; +	public static final String pyro_time_greater_name	= "Time since boost greater than (s)"; +	public static final double pyro_time_scale		= 100.0; + +	public static final int pyro_ascending			= 0x00000400; +	public static final int pyro_descending			= 0x00000800; +	public static final String pyro_ascending_string	= "A"; +	public static final String pyro_descending_string	= "D"; +	public static final String pyro_ascending_name		= "Ascending"; +	public static final String pyro_descending_name		= "Descending"; + +	public static final int pyro_after_motor		= 0x00001000; +	public static final String pyro_after_motor_string	= "m"; +	public static final String pyro_after_motor_name	= "After motor number"; +	public static final double pyro_after_motor_scale	= 1.0; + +	public static final int pyro_delay			= 0x00002000; +	public static final String pyro_delay_string		= "d"; +	public static final String pyro_delay_name		= "Delay after other conditions (s)"; +	public static final double pyro_delay_scale		= 100.0; + +	public static final int pyro_state_less			= 0x00004000; +	public static final int pyro_state_greater_or_equal  	= 0x00008000; +	public static final String pyro_state_less_string	= "f<"; +	public static final String pyro_state_greater_or_equal_string	= "f>="; +	public static final String pyro_state_less_name		= "Flight state before"; +	public static final String pyro_state_greater_or_equal_name	= "Flight state after"; +	public static final double pyro_state_scale		= 1.0; + +	public static final int	pyro_all			= 0x0000ffff; + +	public static final int pyro_no_value			= (pyro_ascending | +								   pyro_descending); + +	public static final int pyro_state_value		= pyro_state_less | pyro_state_greater_or_equal; + +	private static HashMap<String,Integer> string_to_pyro = new HashMap<String,Integer>(); + +	private static HashMap<Integer,String> pyro_to_string = new HashMap<Integer,String>(); + +	private static HashMap<Integer,String> pyro_to_name = new HashMap<Integer,String>(); + +	private static HashMap<Integer,Double> pyro_to_scale = new HashMap<Integer,Double>(); +	 +	private static void insert_map(int flag, String string, String name, double scale) { +		string_to_pyro.put(string, flag); +		pyro_to_string.put(flag, string); +		pyro_to_name.put(flag, name); +		pyro_to_scale.put(flag, scale); +	} +	 +	public static int string_to_pyro(String name) { +		if (string_to_pyro.containsKey(name)) +			return string_to_pyro.get(name); +		return pyro_none; +	} + +	public static String pyro_to_string(int flag) { +		if (pyro_to_string.containsKey(flag)) +			return pyro_to_string.get(flag); +		return null; +	} + +	public static String pyro_to_name(int flag) { +		if (pyro_to_name.containsKey(flag)) +			return pyro_to_name.get(flag); +		return null; +	} + +	public static double pyro_to_scale(int flag) { +		if (pyro_to_scale.containsKey(flag)) +			return pyro_to_scale.get(flag); +		return 1.0; +	} + +	private static void initialize_maps() { +		insert_map(pyro_accel_less, pyro_accel_less_string, pyro_accel_less_name, pyro_accel_scale); +		insert_map(pyro_accel_greater, pyro_accel_greater_string, pyro_accel_greater_name, pyro_accel_scale); + +		insert_map(pyro_speed_less, pyro_speed_less_string, pyro_speed_less_name, pyro_speed_scale); +		insert_map(pyro_speed_greater, pyro_speed_greater_string, pyro_speed_greater_name, pyro_speed_scale); + +		insert_map(pyro_height_less, pyro_height_less_string, pyro_height_less_name, pyro_height_scale); +		insert_map(pyro_height_greater, pyro_height_greater_string, pyro_height_greater_name, pyro_height_scale); + +		insert_map(pyro_orient_less, pyro_orient_less_string, pyro_orient_less_name, pyro_orient_scale); +		insert_map(pyro_orient_greater, pyro_orient_greater_string, pyro_orient_greater_name, pyro_orient_scale); + +		insert_map(pyro_time_less, pyro_time_less_string, pyro_time_less_name, pyro_time_scale); +		insert_map(pyro_time_greater, pyro_time_greater_string, pyro_time_greater_name, pyro_time_scale); + +		insert_map(pyro_ascending, pyro_ascending_string, pyro_ascending_name, 1.0); +		insert_map(pyro_descending, pyro_descending_string, pyro_descending_name, 1.0); + +		insert_map(pyro_after_motor, pyro_after_motor_string, pyro_after_motor_name, 1.0); +		insert_map(pyro_delay, pyro_delay_string, pyro_delay_name, pyro_delay_scale); +		 +		insert_map(pyro_state_less, pyro_state_less_string, pyro_state_less_name, 1.0); +		insert_map(pyro_state_greater_or_equal, pyro_state_greater_or_equal_string, pyro_state_greater_or_equal_name, 1.0); +	} + +	{ +		initialize_maps(); +	} + +	public int	channel; +	public int	flags; +	public int	accel_less, accel_greater; +	public int	speed_less, speed_greater; +	public int	height_less, height_greater; +	public int	orient_less, orient_greater; +	public int	time_less, time_greater; +	public int	delay; +	public int	state_less, state_greater_or_equal; +	public int	motor; + +	public AltosPyro(int in_channel) { +		channel = in_channel; +		flags = 0; +	} + +	private boolean set_ivalue(int flag, int value) { +		switch (flag) { +		case pyro_accel_less:			accel_less = value; break; +		case pyro_accel_greater:		accel_greater = value; break; +		case pyro_speed_less:			speed_less = value; break; +		case pyro_speed_greater:		speed_greater = value; break; +		case pyro_height_less:			height_less = value; break; +		case pyro_height_greater:		height_greater = value; break; +		case pyro_orient_less:			orient_less = value; break; +		case pyro_orient_greater:		orient_greater = value; break; +		case pyro_time_less:			time_less = value; break; +		case pyro_time_greater:			time_greater = value; break; +		case pyro_after_motor:			motor = value; break; +		case pyro_delay:			delay = value; break; +		case pyro_state_less:			state_less = value; break; +		case pyro_state_greater_or_equal:	state_greater_or_equal = value; break; +		default: +			return false; +		} +		return true; +	} + +	public boolean set_value(int flag, double dvalue) { +		return set_ivalue(flag, (int) (dvalue * pyro_to_scale(flag))); +	} + +	private int get_ivalue (int flag) { +		int	value; + +		switch (flag) { +		case pyro_accel_less:			value = accel_less; break; +		case pyro_accel_greater:		value = accel_greater; break; +		case pyro_speed_less:			value = speed_less; break; +		case pyro_speed_greater:		value = speed_greater; break; +		case pyro_height_less:			value = height_less; break; +		case pyro_height_greater:		value = height_greater; break; +		case pyro_orient_less:			value = orient_less; break; +		case pyro_orient_greater:		value = orient_greater; break; +		case pyro_time_less:			value = time_less; break; +		case pyro_time_greater:			value = time_greater; break; +		case pyro_after_motor:			value = motor; break; +		case pyro_delay:			value = delay; break; +		case pyro_state_less:			value = state_less; break; +		case pyro_state_greater_or_equal:	value = state_greater_or_equal; break; +		default:				value = 0; break; +		} +		return value; +	} + +	public double get_value(int flag) { +		return get_ivalue(flag) / pyro_to_scale(flag); +	} + +	public AltosPyro(int in_channel, String line) throws ParseException { +		String[] tokens = line.split("\\s+"); + +		channel = in_channel; +		flags = 0; + +		int i = 0; +		if (tokens[i].equals("Pyro")) +			i += 2; + +		for (; i < tokens.length; i++) { + +			if (tokens[i].equals("<disabled>")) +				break; + +			int	flag = string_to_pyro(tokens[i]); +			if (flag == pyro_none) +				throw new ParseException(String.format("Invalid pyro token \"%s\"", +								       tokens[i]), i); +			flags |= flag; + +			if ((flag & pyro_no_value) == 0) { +				int	value = 0; +				++i; +				try { +					value = AltosLib.fromdec(tokens[i]); +				} catch (NumberFormatException n) { +					throw new ParseException(String.format("Invalid pyro value \"%s\"", +									       tokens[i]), i); +				} +				if (!set_ivalue(flag, value)) +					throw new ParseException(String.format("Internal parser error \"%s\" \"%s\"", +									       tokens[i-1], tokens[i]), i-1); +			} +		} +	} + +	public String toString() { +		String	ret = String.format("%d", channel); + +		for (int flag = 1; flag <= flags; flag <<= 1) { +			if ((flags & flag) != 0) { +				String	add; +				if ((flag & pyro_no_value) == 0) { +					add = String.format(" %s %d", +							    pyro_to_string.get(flag), +							    get_ivalue(flag)); +				} else { +					add = String.format(" %s", +							    pyro_to_string.get(flag)); +				} +				ret = ret.concat(add); +			} +		} +		return ret; +	} +} diff --git a/altoslib/AltosRecord.java b/altoslib/AltosRecord.java index 8bab1d0c..09169515 100644 --- a/altoslib/AltosRecord.java +++ b/altoslib/AltosRecord.java @@ -17,7 +17,7 @@  package org.altusmetrum.AltosLib; -public class AltosRecord implements Comparable <AltosRecord>, Cloneable { +public abstract class AltosRecord implements Comparable <AltosRecord>, Cloneable {  	public static final int	seen_flight = 1;  	public static final int	seen_sensor = 2; @@ -43,11 +43,6 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {  	public int	state;  	public int	tick; -	/* Current flight dynamic state */ -	public double	acceleration;	/* m/s² */ -	public double	speed;		/* m/s */ -	public double	height;		/* m */ -  	public AltosGPS	gps;  	public boolean	new_gps; @@ -63,6 +58,11 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {  	public AltosRecordCompanion companion; +	/* Telemetry sources have these values recorded from the flight computer */ +	public double	kalman_height; +	public double	kalman_speed; +	public double	kalman_acceleration; +  	/*  	 * Abstract methods that convert record data  	 * to standard units: @@ -75,76 +75,48 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {  	 *	temperature:	°C  	 */ -	public double raw_pressure() { return MISSING; } - -	public double filtered_pressure() { return MISSING; } - -	public double ground_pressure() { return MISSING; } - -	public double battery_voltage() { return MISSING; } +	abstract public double pressure(); +	abstract public double ground_pressure(); +	abstract public double acceleration(); -	public double main_voltage() { return MISSING; } +	public double altitude() { +		double	p = pressure(); -	public double drogue_voltage() { return MISSING; } - -	public double temperature() { return MISSING; } -	 -	public double acceleration() { return MISSING; } - -	public double accel_speed() { return MISSING; } - -	public AltosIMU imu() { return null; } - -	public AltosMag mag() { return null; } - -	/* -	 * Convert various pressure values to altitude -	 */ - -	public double raw_altitude() { -		double p = raw_pressure();  		if (p == MISSING)  			return MISSING;  		return AltosConvert.pressure_to_altitude(p);  	}  	public double ground_altitude() { -		double p = ground_pressure(); +		double	p = ground_pressure(); +  		if (p == MISSING)  			return MISSING;  		return AltosConvert.pressure_to_altitude(p);  	} -	public double filtered_altitude() { -		double	ga = ground_altitude(); -		if (height != MISSING && ga != MISSING) -			return height + ga; +	public double height() { +		double	g = ground_altitude(); +		double	a = altitude(); -		double	p = filtered_pressure(); -		if (p == MISSING) -			return raw_altitude(); -		return AltosConvert.pressure_to_altitude(p); +		if (g == MISSING) +			return MISSING; +		if (a == MISSING) +			return MISSING; +		return a - g;  	} -	public double filtered_height() { -		if (height != MISSING) -			return height; +	public double battery_voltage() { return MISSING; } -		double f = filtered_altitude(); -		double g = ground_altitude(); -		if (f == MISSING || g == MISSING) -			return MISSING; -		return f - g; -	} +	public double main_voltage() { return MISSING; } -	public double raw_height() { -		double r = raw_altitude(); -		double g = ground_altitude(); +	public double drogue_voltage() { return MISSING; } -		if (r == MISSING || g == MISSING) -			return height; -		return r - g; -	} +	public double temperature() { return MISSING; } +	 +	public AltosIMU imu() { return null; } + +	public AltosMag mag() { return null; }  	public String state() {  		return AltosLib.state_name(state); @@ -164,12 +136,12 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {  		status = old.status;  		state = old.state;  		tick = old.tick; -		acceleration = old.acceleration; -		speed = old.speed; -		height = old.height;  		gps = new AltosGPS(old.gps);  		new_gps = old.new_gps;  		companion = old.companion; +		kalman_acceleration = old.kalman_acceleration; +		kalman_speed = old.kalman_speed; +		kalman_height = old.kalman_height;  	}  	public AltosRecord clone() { @@ -192,11 +164,12 @@ public class AltosRecord implements Comparable <AltosRecord>, Cloneable {  		status = 0;  		state = AltosLib.ao_flight_startup;  		tick = 0; -		acceleration = MISSING; -		speed = MISSING; -		height = MISSING;  		gps = new AltosGPS();  		new_gps = false;  		companion = null; + +		kalman_acceleration = MISSING; +		kalman_speed = MISSING; +		kalman_height = MISSING;  	}  } diff --git a/altoslib/AltosRecordMM.java b/altoslib/AltosRecordMM.java index 5f952f7a..9f529234 100644 --- a/altoslib/AltosRecordMM.java +++ b/altoslib/AltosRecordMM.java @@ -19,6 +19,7 @@ package org.altusmetrum.AltosLib;  public class AltosRecordMM extends AltosRecord { +	/* Sensor values */  	public int	accel;  	public int	pres;  	public int	temp; @@ -45,16 +46,12 @@ public class AltosRecordMM extends AltosRecord {  		return raw / 4095.0;  	} -	public double raw_pressure() { +	public double pressure() {  		if (pres != MISSING)  			return pres;  		return MISSING;  	} -	public double filtered_pressure() { -		return raw_pressure(); -	} -  	public double ground_pressure() {  		if (ground_pres != MISSING)  			return ground_pres; @@ -98,9 +95,6 @@ public class AltosRecordMM extends AltosRecord {  	}  	public double acceleration() { -		if (acceleration != MISSING) -			return acceleration; -  		if (ground_accel == MISSING || accel == MISSING)  			return MISSING; @@ -110,10 +104,6 @@ public class AltosRecordMM extends AltosRecord {  		return (ground_accel - accel) / accel_counts_per_mss();  	} -	public double accel_speed() { -		return speed; -	} -  	public void copy (AltosRecordMM old) {  		super.copy(old); diff --git a/altoslib/AltosRecordNone.java b/altoslib/AltosRecordNone.java new file mode 100644 index 00000000..ca0a5fe3 --- /dev/null +++ b/altoslib/AltosRecordNone.java @@ -0,0 +1,34 @@ +/* + * Copyright © 2012 Keith Packard <keithp@keithp.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +package org.altusmetrum.AltosLib; + +public class AltosRecordNone extends AltosRecord { + +	public double pressure() { return MISSING; } +	public double ground_pressure() { return MISSING; } +	public double temperature() { return MISSING; } +	public double acceleration() { return MISSING; } + +	public AltosRecordNone(AltosRecord old) { +		super.copy(old); +	} + +	public AltosRecordNone() { +		super(); +	} +} diff --git a/altoslib/AltosRecordTM.java b/altoslib/AltosRecordTM.java index 37accef6..9530be31 100644 --- a/altoslib/AltosRecordTM.java +++ b/altoslib/AltosRecordTM.java @@ -18,6 +18,8 @@  package org.altusmetrum.AltosLib;  public class AltosRecordTM extends AltosRecord { + +	/* Sensor values */  	public int	accel;  	public int	pres;  	public int	temp; @@ -57,18 +59,12 @@ public class AltosRecordTM extends AltosRecord {  		return ((count / 16.0) / 2047.0 + 0.095) / 0.009 * 1000.0;  	} -	public double raw_pressure() { +	public double pressure() {  		if (pres == MISSING)  			return MISSING;  		return barometer_to_pressure(pres);  	} -	public double filtered_pressure() { -		if (flight_pres == MISSING) -			return MISSING; -		return barometer_to_pressure(flight_pres); -	} -  	public double ground_pressure() {  		if (ground_pres == MISSING)  			return MISSING; @@ -121,22 +117,11 @@ public class AltosRecordTM extends AltosRecord {  	}  	public double acceleration() { -		if (acceleration != MISSING) -			return acceleration; -  		if (ground_accel == MISSING || accel == MISSING)  			return MISSING;  		return (ground_accel - accel) / accel_counts_per_mss();  	} -	public double accel_speed() { -		if (speed != MISSING) -			return speed; -		if (flight_vel == MISSING) -			return MISSING; -		return flight_vel / (accel_counts_per_mss() * 100.0); -	} -  	public void copy(AltosRecordTM old) {  		super.copy(old); diff --git a/altoslib/AltosState.java b/altoslib/AltosState.java index 2e4d8870..f28dd1c6 100644 --- a/altoslib/AltosState.java +++ b/altoslib/AltosState.java @@ -40,17 +40,17 @@ public class AltosState {  	public double	ground_altitude;  	public double	altitude;  	public double	height; -	public double	speed;  	public double	acceleration;  	public double	battery;  	public double	temperature;  	public double	main_sense;  	public double	drogue_sense; +	public double	accel_speed;  	public double	baro_speed;  	public double	max_height;  	public double	max_acceleration; -	public double	max_speed; +	public double	max_accel_speed;  	public double	max_baro_speed;  	public AltosGPS	gps; @@ -76,20 +76,39 @@ public class AltosState {  	public int	speak_tick;  	public double	speak_altitude; -	public void init (AltosRecord cur, AltosState prev_state) { -		//int		i; -		//AltosRecord prev; +	public double speed() { +		if (ascent) +			return accel_speed; +		else +			return baro_speed; +	} + +	public double max_speed() { +		if (max_accel_speed != 0) +			return max_accel_speed; +		return max_baro_speed; +	} +	public void init (AltosRecord cur, AltosState prev_state) {  		data = cur;  		ground_altitude = data.ground_altitude(); -		altitude = data.raw_altitude(); -		height = data.filtered_height(); + +		altitude = data.altitude(); + +		if (data.kalman_height != AltosRecord.MISSING) +			height = data.kalman_height; +		else { +			if (prev_state != null) +				height = (prev_state.height * 15 + altitude - ground_altitude) / 16.0; +		}  		report_time = System.currentTimeMillis(); -		acceleration = data.acceleration(); -		speed = data.accel_speed(); +		if (data.kalman_acceleration != AltosRecord.MISSING) +			acceleration = data.kalman_acceleration; +		else +			acceleration = data.acceleration();  		temperature = data.temperature();  		drogue_sense = data.drogue_voltage();  		main_sense = data.main_voltage(); @@ -108,7 +127,7 @@ public class AltosState {  			pad_alt = prev_state.pad_alt;  			max_height = prev_state.max_height;  			max_acceleration = prev_state.max_acceleration; -			max_speed = prev_state.max_speed; +			max_accel_speed = prev_state.max_accel_speed;  			max_baro_speed = prev_state.max_baro_speed;  			imu = prev_state.imu;  			mag = prev_state.mag; @@ -119,23 +138,39 @@ public class AltosState {  			time_change = (tick - prev_state.tick) / 100.0; -			/* compute barometric speed */ +			if (data.kalman_speed != AltosRecord.MISSING) { +				baro_speed = accel_speed = data.kalman_speed; +			} else { +				/* compute barometric speed */ -			double height_change = height - prev_state.height; -			if (data.speed != AltosRecord.MISSING) -				baro_speed = data.speed; -			else { +				double height_change = height - prev_state.height;  				if (time_change > 0)  					baro_speed = (prev_state.baro_speed * 3 + (height_change / time_change)) / 4.0;  				else  					baro_speed = prev_state.baro_speed; + +				if (acceleration == AltosRecord.MISSING) { +					/* Fill in mising acceleration value */ +					accel_speed = baro_speed; +					if (time_change > 0) +						acceleration = (accel_speed - prev_state.accel_speed) / time_change; +					else +						acceleration = prev_state.acceleration; +				} else { +					/* compute accelerometer speed */ +					accel_speed = prev_state.accel_speed + acceleration * time_change; +				}  			} +  		} else {  			npad = 0;  			ngps = 0;  			gps = null;  			baro_speed = 0; +			accel_speed = 0;  			time_change = 0; +			if (acceleration == AltosRecord.MISSING) +				acceleration = 0;  		}  		time = tick / 100.0; @@ -180,8 +215,8 @@ public class AltosState {  		/* Only look at accelerometer data under boost */  		if (boost && acceleration > max_acceleration && acceleration != AltosRecord.MISSING)  			max_acceleration = acceleration; -		if (boost && speed > max_speed && speed != AltosRecord.MISSING) -			max_speed = speed; +		if (boost && accel_speed > max_accel_speed && accel_speed != AltosRecord.MISSING) +			max_accel_speed = accel_speed;  		if (boost && baro_speed > max_baro_speed && baro_speed != AltosRecord.MISSING)  			max_baro_speed = baro_speed; diff --git a/altoslib/AltosTelemetryRecordLegacy.java b/altoslib/AltosTelemetryRecordLegacy.java index 21176069..43189794 100644 --- a/altoslib/AltosTelemetryRecordLegacy.java +++ b/altoslib/AltosTelemetryRecordLegacy.java @@ -257,9 +257,9 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {  		record.accel_minus_g = map.get_int(AO_TELEM_CAL_ACCEL_MINUS, AltosRecord.MISSING);  		/* flight computer values */ -		record.acceleration = map.get_double(AO_TELEM_KALMAN_ACCEL, AltosRecord.MISSING, 1/16.0); -		record.speed = map.get_double(AO_TELEM_KALMAN_SPEED, AltosRecord.MISSING, 1/16.0); -		record.height = map.get_int(AO_TELEM_KALMAN_HEIGHT, AltosRecord.MISSING); +		record.kalman_acceleration = map.get_double(AO_TELEM_KALMAN_ACCEL, AltosRecord.MISSING, 1/16.0); +		record.kalman_speed = map.get_double(AO_TELEM_KALMAN_SPEED, AltosRecord.MISSING, 1/16.0); +		record.kalman_height = map.get_int(AO_TELEM_KALMAN_HEIGHT, AltosRecord.MISSING);  		record.flight_accel = map.get_int(AO_TELEM_ADHOC_ACCEL, AltosRecord.MISSING);  		record.flight_vel = map.get_int(AO_TELEM_ADHOC_SPEED, AltosRecord.MISSING); @@ -334,9 +334,9 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {  		/* Old TeleDongle code with kalman-reporting TeleMetrum code */  		if ((record.flight_vel & 0xffff0000) == 0x80000000) { -			record.speed = ((short) record.flight_vel) / 16.0; -			record.acceleration = record.flight_accel / 16.0; -			record.height = record.flight_pres; +			record.kalman_speed = ((short) record.flight_vel) / 16.0; +			record.kalman_acceleration = record.flight_accel / 16.0; +			record.kalman_height = record.flight_pres;  			record.flight_vel = AltosRecord.MISSING;  			record.flight_pres = AltosRecord.MISSING;  			record.flight_accel = AltosRecord.MISSING; @@ -455,9 +455,9 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {  		record.accel_minus_g = int16(19);  		if (uint16(11) == 0x8000) { -			record.acceleration = int16(5); -			record.speed = int16(9); -			record.height = int16(13); +			record.kalman_acceleration = int16(5); +			record.kalman_speed = int16(9); +			record.kalman_height = int16(13);  			record.flight_accel = AltosRecord.MISSING;  			record.flight_vel = AltosRecord.MISSING;  			record.flight_pres = AltosRecord.MISSING; @@ -465,9 +465,9 @@ public class AltosTelemetryRecordLegacy extends AltosTelemetryRecord {  			record.flight_accel = int16(5);  			record.flight_vel = uint32(9);  			record.flight_pres = int16(13); -			record.acceleration = AltosRecord.MISSING; -			record.speed = AltosRecord.MISSING; -			record.height = AltosRecord.MISSING; +			record.kalman_acceleration = AltosRecord.MISSING; +			record.kalman_speed = AltosRecord.MISSING; +			record.kalman_height = AltosRecord.MISSING;  		}  		record.gps = null; diff --git a/altoslib/AltosTelemetryRecordMegaData.java b/altoslib/AltosTelemetryRecordMegaData.java index 8f55d238..16a7b80c 100644 --- a/altoslib/AltosTelemetryRecordMegaData.java +++ b/altoslib/AltosTelemetryRecordMegaData.java @@ -83,9 +83,9 @@ public class AltosTelemetryRecordMegaData extends AltosTelemetryRecordRaw {  		next.accel_plus_g = accel_plus_g;  		next.accel_minus_g = accel_minus_g; -		next.acceleration = acceleration / 16.0; -		next.speed = speed / 16.0; -		next.height = height; +		next.kalman_acceleration = acceleration / 16.0; +		next.kalman_speed = speed / 16.0; +		next.kalman_height = height;  		next.seen |= AltosRecord.seen_flight | AltosRecord.seen_temp_volt; diff --git a/altoslib/AltosTelemetryRecordRaw.java b/altoslib/AltosTelemetryRecordRaw.java index fbb373d5..c21da6fc 100644 --- a/altoslib/AltosTelemetryRecordRaw.java +++ b/altoslib/AltosTelemetryRecordRaw.java @@ -65,7 +65,7 @@ public class AltosTelemetryRecordRaw extends AltosTelemetryRecord {  		if (previous != null)  			next = previous.clone();  		else -			next = new AltosRecord(); +			next = new AltosRecordNone();  		next.serial = serial;  		next.tick = tick;  		return next; diff --git a/altoslib/AltosTelemetryRecordSensor.java b/altoslib/AltosTelemetryRecordSensor.java index 319a91b3..f1fc156c 100644 --- a/altoslib/AltosTelemetryRecordSensor.java +++ b/altoslib/AltosTelemetryRecordSensor.java @@ -86,9 +86,9 @@ public class AltosTelemetryRecordSensor extends AltosTelemetryRecordRaw {  			next.main = AltosRecord.MISSING;  		} -		next.acceleration = acceleration / 16.0; -		next.speed = speed / 16.0; -		next.height = height; +		next.kalman_acceleration = acceleration / 16.0; +		next.kalman_speed = speed / 16.0; +		next.kalman_height = height;  		next.ground_pres = ground_pres;  		if (type == packet_type_TM_sensor) { diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am index b56d8af1..2579a650 100644 --- a/altoslib/Makefile.am +++ b/altoslib/Makefile.am @@ -46,6 +46,7 @@ AltosLib_JAVA = \  	$(SRC)/AltosRecordCompanion.java \  	$(SRC)/AltosRecordIterable.java \  	$(SRC)/AltosRecord.java \ +	$(SRC)/AltosRecordNone.java \  	$(SRC)/AltosRecordTM.java \  	$(SRC)/AltosRecordMM.java \  	$(SRC)/AltosReplayReader.java \ @@ -74,7 +75,8 @@ AltosLib_JAVA = \  	$(SRC)/AltosDistance.java \  	$(SRC)/AltosHeight.java \  	$(SRC)/AltosSpeed.java \ -	$(SRC)/AltosAccel.java +	$(SRC)/AltosAccel.java \ +	$(SRC)/AltosPyro.java  JAR=AltosLib.jar | 
