package altosui;
-import java.lang.*;
import java.io.*;
-import java.text.*;
import java.util.*;
+import org.altusmetrum.AltosLib.*;
public class AltosCSV implements AltosWriter {
File name;
LinkedList<AltosRecord> pad_records;
AltosState state;
- static final int ALTOS_CSV_VERSION = 2;
+ static final int ALTOS_CSV_VERSION = 5;
- /* Version 2 format:
+ /* Version 4 format:
*
* General info
* version number
* flight number
* callsign
* time (seconds since boost)
+ * clock (tick count / 100)
* rssi
* link quality
*
* drogue (V)
* main (V)
*
+ * Advanced sensors (if available)
+ * accel_x (m/s²)
+ * accel_y (m/s²)
+ * accel_z (m/s²)
+ * gyro_x (d/s)
+ * gyro_y (d/s)
+ * gyro_z (d/s)
+ * mag_x (g)
+ * mag_y (g)
+ * mag_z (g)
+ *
* GPS data (if available)
* connected (1/0)
* locked (1/0)
*
* GPS Sat data
* C/N0 data for all 32 valid SDIDs
+ *
+ * Companion data
+ * companion_id (1-255. 10 is TeleScience)
+ * time of last companion data (seconds since boost)
+ * update_period (0.1-2.55 minimum telemetry interval)
+ * channels (0-12)
+ * channel data for all 12 possible channels
*/
void write_general_header() {
- out.printf("version,serial,flight,call,time,rssi,lqi");
+ out.printf("version,serial,flight,call,time,clock,rssi,lqi");
}
void write_general(AltosRecord record) {
- out.printf("%s, %d, %d, %s, %8.2f, %4d, %3d",
+ out.printf("%s, %d, %d, %s, %8.2f, %8.2f, %4d, %3d",
ALTOS_CSV_VERSION, record.serial, record.flight, record.callsign,
- (double) record.time,
+ (double) record.time, (double) record.tick / 100.0,
record.rssi,
record.status & 0x7f);
}
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.raw_pressure(),
- record.raw_altitude(),
- record.raw_height(),
- record.accel_speed(),
+ record.pressure(),
+ record.altitude(),
+ record.height(),
+ state.accel_speed,
state.baro_speed,
record.temperature(),
record.battery_voltage(),
record.main_voltage());
}
+ void write_advanced_header() {
+ out.printf("accel_x,accel_y,accel_z,gyro_x,gyro_y,gyro_z");
+ }
+
+ void write_advanced(AltosRecord record) {
+ AltosIMU imu = record.imu();
+ AltosMag mag = record.mag();
+
+ if (imu == null)
+ imu = new AltosIMU();
+ if (mag == null)
+ mag = new AltosMag();
+ out.printf("%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d,%6d",
+ imu.accel_x, imu.accel_y, imu.accel_z,
+ imu.gyro_x, imu.gyro_y, imu.gyro_z,
+ mag.x, mag.y, mag.z);
+ }
+
void write_gps_header() {
out.printf("connected,locked,nsat,latitude,longitude,altitude,year,month,day,hour,minute,second,pad_dist,pad_range,pad_az,pad_el,hdop");
}
}
}
- void write_header(boolean gps) {
+ void write_companion_header() {
+ out.printf("companion_id,companion_time,companion_update,companion_channels");
+ for (int i = 0; i < 12; i++)
+ out.printf(",companion_%02d", i);
+ }
+
+ void write_companion(AltosRecord record) {
+ AltosRecordCompanion companion = record.companion;
+
+ int channels_written = 0;
+ if (companion == null) {
+ out.printf("0,0,0,0");
+ } else {
+ out.printf("%3d,%5.2f,%5.2f,%2d",
+ companion.board_id,
+ (companion.tick - boost_tick) / 100.0,
+ companion.update_period / 100.0,
+ companion.channels);
+ for (; channels_written < companion.channels; channels_written++)
+ out.printf(",%5d", companion.companion_data[channels_written]);
+ }
+ for (; channels_written < 12; channels_written++)
+ out.printf(",0");
+ }
+
+ void write_header(boolean advanced, boolean gps, boolean companion) {
out.printf("#"); write_general_header();
out.printf(","); write_flight_header();
out.printf(","); write_basic_header();
+ if (advanced)
+ out.printf(","); write_advanced_header();
if (gps) {
out.printf(","); write_gps_header();
out.printf(","); write_gps_sat_header();
}
+ if (companion) {
+ out.printf(","); write_companion_header();
+ }
out.printf ("\n");
}
state = new AltosState(record, state);
write_general(record); out.printf(",");
write_flight(record); out.printf(",");
- write_basic(record);
+ write_basic(record); out.printf(",");
+ if (record.imu() != null || record.mag() != null)
+ write_advanced(record);
if (record.gps != null) {
out.printf(",");
write_gps(record); out.printf(",");
write_gps_sat(record);
}
+ if (record.companion != null) {
+ out.printf(",");
+ write_companion(record);
+ }
out.printf ("\n");
}
}
public void write(AltosRecord record) {
+ if (record.state == Altos.ao_flight_startup)
+ return;
if (!header_written) {
- write_header(record.gps != null);
+ write_header(record.imu() != null || record.mag() != null,
+ record.gps != null, record.companion != null);
header_written = true;
}
if (!seen_boost) {