*
* 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.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altoslib_5;
+package org.altusmetrum.altoslib_11;
import java.io.*;
import java.util.*;
LinkedList<AltosState> pad_states;
AltosState state;
+ static boolean has_basic;
+ static boolean has_battery;
+ static boolean has_flight_state;
+ static boolean has_advanced;
+ static boolean has_gps;
+ static boolean has_gps_sat;
+ static boolean has_companion;
+
static final int ALTOS_CSV_VERSION = 5;
/* Version 4 format:
* accelerometer speed (m/s)
* barometer speed (m/s)
* temp (°C)
- * battery (V)
* drogue (V)
* main (V)
*
+ * Battery
+ * battery (V)
+ *
* Advanced sensors (if available)
* accel_x (m/s²)
* accel_y (m/s²)
* from_pad_azimuth (deg true)
* from_pad_range (m)
* from_pad_elevation (deg from horizon)
+ * pdop
* hdop
+ * vdop
*
* GPS Sat data
* C/N0 data for all 32 valid SDIDs
void write_general(AltosState state) {
out.printf("%s, %d, %d, %s, %8.2f, %8.2f, %4d, %3d",
ALTOS_CSV_VERSION, state.serial, state.flight, state.callsign,
- (double) state.time, (double) state.tick / 100.0,
+ (double) state.time_since_boost(), (double) state.tick / 100.0,
state.rssi,
state.status & 0x7f);
}
}
void write_flight(AltosState state) {
- out.printf("%d,%8s", state.state, state.state_name());
+ out.printf("%d,%8s", state.state(), state.state_name());
}
void write_basic_header() {
- out.printf("acceleration,pressure,altitude,height,accel_speed,baro_speed,temperature,battery_voltage,drogue_voltage,main_voltage");
+ out.printf("acceleration,pressure,altitude,height,accel_speed,baro_speed,temperature,drogue_voltage,main_voltage");
}
void write_basic(AltosState state) {
- out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f,%5.2f",
+ out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f",
state.acceleration(),
state.pressure(),
state.altitude(),
state.speed(),
state.speed(),
state.temperature,
- state.battery_voltage,
state.apogee_voltage,
state.main_voltage);
}
+ void write_battery_header() {
+ out.printf("battery_voltage");
+ }
+
+ void write_battery(AltosState state) {
+ out.printf("%5.2f", state.battery_voltage);
+ }
+
void write_advanced_header() {
- out.printf("accel_x,accel_y,accel_z,gyro_x,gyro_y,gyro_z");
+ out.printf("accel_x,accel_y,accel_z,gyro_x,gyro_y,gyro_z,mag_x,mag_y,mag_z");
}
void write_advanced(AltosState state) {
- AltosIMU imu = state.imu;
- AltosMag mag = state.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);
+ out.printf("%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f",
+ state.accel_along(), state.accel_across(), state.accel_through(),
+ state.gyro_roll(), state.gyro_pitch(), state.gyro_yaw(),
+ state.mag_along(), state.mag_across(), state.mag_through());
}
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");
+ out.printf("connected,locked,nsat,latitude,longitude,altitude,year,month,day,hour,minute,second,pad_dist,pad_range,pad_az,pad_el,pdop,hdop,vdop");
}
void write_gps(AltosState state) {
if (from_pad == null)
from_pad = new AltosGreatCircle();
- out.printf("%2d,%2d,%3d,%12.7f,%12.7f,%8.1f,%5d,%3d,%3d,%3d,%3d,%3d,%9.0f,%9.0f,%4.0f,%4.0f,%6.1f",
+ out.printf("%2d,%2d,%3d,%12.7f,%12.7f,%8.1f,%5d,%3d,%3d,%3d,%3d,%3d,%9.0f,%9.0f,%4.0f,%4.0f,%6.1f,%6.1f,%6.1f",
gps.connected?1:0,
gps.locked?1:0,
gps.nsat,
state.range,
from_pad.bearing,
state.elevation,
- gps.hdop);
+ gps.pdop,
+ gps.hdop,
+ gps.vdop);
}
void write_gps_sat_header() {
out.printf(",0");
}
- void write_header(boolean advanced, boolean gps, boolean companion) {
+ void write_header() {
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 (has_flight_state) {
+ out.printf(",");
+ write_flight_header();
}
- if (companion) {
- out.printf(","); write_companion_header();
+ if (has_basic) {
+ out.printf(",");
+ write_basic_header();
+ }
+ if (has_battery) {
+ out.printf(",");
+ write_battery_header();
+ }
+ if (has_advanced) {
+ out.printf(",");
+ write_advanced_header();
+ }
+ if (has_gps) {
+ out.printf(",");
+ write_gps_header();
+ }
+ if (has_gps_sat) {
+ out.printf(",");
+ write_gps_sat_header();
+ }
+ if (has_companion) {
+ out.printf(",");
+ write_companion_header();
}
out.printf ("\n");
}
void write_one(AltosState state) {
- write_general(state); out.printf(",");
- write_flight(state); out.printf(",");
- write_basic(state); out.printf(",");
- if (state.imu != null || state.mag != null)
+ write_general(state);
+ if (has_flight_state) {
+ out.printf(",");
+ write_flight(state);
+ }
+ if (has_basic) {
+ out.printf(",");
+ write_basic(state);
+ }
+ if (has_battery) {
+ out.printf(",");
+ write_battery(state);
+ }
+ if (has_advanced) {
+ out.printf(",");
write_advanced(state);
- if (state.gps != null) {
+ }
+ if (has_gps) {
+ out.printf(",");
+ write_gps(state);
+ }
+ if (has_gps_sat) {
out.printf(",");
- write_gps(state); out.printf(",");
write_gps_sat(state);
}
- if (state.companion != null) {
+ if (has_companion) {
out.printf(",");
write_companion(state);
}
out.printf ("\n");
}
- void flush_pad() {
+ private void flush_pad() {
while (!pad_states.isEmpty()) {
write_one (pad_states.remove());
}
}
- public void write(AltosState state) {
- if (state.state == AltosLib.ao_flight_startup)
+ private void write(AltosState state) {
+ if (state.state() == AltosLib.ao_flight_startup)
return;
if (!header_written) {
- write_header(state.imu != null || state.mag != null,
- state.gps != null, state.companion != null);
+ write_header();
header_written = true;
}
if (!seen_boost) {
- if (state.state >= AltosLib.ao_flight_boost) {
+ if (state.state() >= AltosLib.ao_flight_boost) {
seen_boost = true;
boost_tick = state.tick;
flush_pad();
pad_states.add(state);
}
- public PrintStream out() {
+ private PrintStream out() {
return out;
}
public void write(AltosStateIterable states) {
states.write_comments(out());
+
+ has_flight_state = false;
+ has_basic = false;
+ has_battery = false;
+ has_advanced = false;
+ has_gps = false;
+ has_gps_sat = false;
+ has_companion = false;
+ for (AltosState state : states) {
+ if (state.state() != AltosLib.ao_flight_stateless && state.state() != AltosLib.ao_flight_invalid && state.state() != AltosLib.ao_flight_startup)
+ has_flight_state = true;
+ if (state.acceleration() != AltosLib.MISSING || state.pressure() != AltosLib.MISSING)
+ has_basic = true;
+ if (state.battery_voltage != AltosLib.MISSING)
+ has_battery = true;
+ if (state.accel_across() != AltosLib.MISSING)
+ has_advanced = true;
+ if (state.gps != null) {
+ has_gps = true;
+ if (state.gps.cc_gps_sat != null)
+ has_gps_sat = true;
+ }
+ if (state.companion != null)
+ has_companion = true;
+ }
for (AltosState state : states)
write(state);
}