diff options
Diffstat (limited to 'ao-tools/altosui/AltosCSV.java')
| -rw-r--r-- | ao-tools/altosui/AltosCSV.java | 138 | 
1 files changed, 128 insertions, 10 deletions
| diff --git a/ao-tools/altosui/AltosCSV.java b/ao-tools/altosui/AltosCSV.java index 24936758..db50e7a2 100644 --- a/ao-tools/altosui/AltosCSV.java +++ b/ao-tools/altosui/AltosCSV.java @@ -19,12 +19,20 @@ package altosui;  import java.lang.*;  import java.io.*; +import java.text.*; +import java.util.*; +  import altosui.AltosRecord; +import altosui.AltosReader;  public class AltosCSV { -	File		name; -	PrintStream	out; -	boolean		header_written; +	File			name; +	PrintStream		out; +	boolean			header_written; +	boolean			seen_boost; +	int			boost_tick; +	LinkedList<AltosRecord>	pad_records; +	AltosState		state;  	static final int ALTOS_CSV_VERSION = 1; @@ -36,6 +44,7 @@ public class AltosCSV {  	 *	flight number  	 *	callsign  	 *	time (seconds since boost) +	 *	rssi  	 *  	 * Flight status  	 *	state @@ -45,6 +54,7 @@ public class AltosCSV {  	 *	acceleration (m/s²)  	 *	pressure (mBar)  	 *	altitude (m) +	 *	height (m)  	 *	accelerometer speed (m/s)  	 *	barometer speed (m/s)  	 *	temp (°C) @@ -65,6 +75,8 @@ public class AltosCSV {  	 *	hour (0-23)  	 *	minute (0-59)  	 *	second (0-59) +	 *	from_pad_dist (m) +	 *	from_pad_dir (deg true)  	 *  	 * GPS Sat data  	 *	hdop @@ -72,12 +84,14 @@ public class AltosCSV {  	 */  	void write_general_header() { -		out.printf("version serial flight call time"); +		out.printf("version serial flight call time rssi");  	}  	void write_general(AltosRecord record) { -		out.printf("%s,%d,%d,%s,%d", -			   record.version, record.serial, record.flight, record.callsign, record.tick); +		out.printf("%s,%d,%d,%s,%8.2f,%4d", +			   record.version, record.serial, record.flight, record.callsign, +			   (double) record.time, +			   record.rssi);  	}  	void write_flight_header() { @@ -85,31 +99,135 @@ public class AltosCSV {  	}  	void write_flight(AltosRecord record) { -		out.printf("%d,%s", record.state, record.state()); +		out.printf("%d,%8s", record.state, record.state()); +	} + +	void write_basic_header() { +		out.printf("acceleration pressure altitude height accel_speed baro_speed temperature battery_voltage drogue_voltage main_voltage"); +	} + +	void write_basic(AltosRecord record) { +		out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f,%5.2f", +			   record.acceleration(), +			   record.pressure(), +			   record.altitude(), +			   record.height(), +			   record.accel_speed(), +			   state.baro_speed, +			   record.temperature(), +			   record.battery_voltage(), +			   record.drogue_voltage(), +			   record.main_voltage()); +	} + +	void write_gps_header() { +		out.printf("connected locked nsat latitude longitude altitude year month day hour minute second pad_dist pad_dir"); +	} + +	void write_gps(AltosRecord record) { +		AltosGPS	gps = record.gps; +		if (gps == null) +			gps = new AltosGPS(); + +		AltosGreatCircle from_pad = state.from_pad; +		if (from_pad == null) +			from_pad = new AltosGreatCircle(); + +		out.printf("%2d,%2d,%3d,%12.7f,%12.7f,%6d,%5d,%3d,%3d,%3d,%3d,%3d,%9.0f,%4.0f", +			   gps.connected?1:0, +			   gps.locked?1:0, +			   gps.nsat, +			   gps.lat, +			   gps.lon, +			   gps.alt, +			   gps.year, +			   gps.month, +			   gps.day, +			   gps.hour, +			   gps.minute, +			   gps.second, +			   from_pad.distance, +			   from_pad.bearing);  	}  	void write_header() {  		out.printf("# "); write_general_header();  		out.printf(" "); write_flight_header(); +		out.printf(" "); write_basic_header(); +		out.printf(" "); write_gps_header(); +		out.printf ("\n"); +	} + +	void write_one(AltosRecord record) { +		state = new AltosState(record, state); +		write_general(record); out.printf(","); +		write_flight(record); out.printf(","); +		write_basic(record); out.printf(","); +		write_gps(record);  		out.printf ("\n");  	} +	void flush_pad() { +		while (!pad_records.isEmpty()) { +			write_one (pad_records.remove()); +		} +	} +  	public void write(AltosRecord record) {  		if (!header_written) {  			write_header();  			header_written = true;  		} -		write_general(record); out.printf(","); -		write_flight(record); -		out.printf ("\n"); +		if (!seen_boost) { +			if (record.state >= Altos.ao_flight_boost) { +				seen_boost = true; +				boost_tick = record.tick; +				flush_pad(); +			} +		} +		if (seen_boost) +			write_one(record); +		else +			pad_records.add(record);  	}  	public PrintStream out() {  		return out;  	} +	public void close() { +		if (!pad_records.isEmpty()) { +			boost_tick = pad_records.element().tick; +			flush_pad(); +		} +		out.close(); +	} + +	public void write(AltosReader reader) { +		AltosRecord	record; + +		reader.write_comments(out()); +		try { +			for (;;) { +				record = reader.read(); +				if (record == null) +					break; +				write(record); +			} +		} catch (IOException ie) { +			System.out.printf("IOException\n"); +		} catch (ParseException pe) { +			System.out.printf("ParseException %s\n", pe.getMessage()); +		} +	} +  	public AltosCSV(File in_name) throws FileNotFoundException {  		name = in_name;  		out = new PrintStream(name); +		pad_records = new LinkedList<AltosRecord>(); +	} + +	public AltosCSV(String in_string) throws FileNotFoundException { +		this(new File(in_string));  	}  } | 
