altos: Add bit-bang i2c driver
[fw/altos] / altoslib / AltosCSV.java
index 38afdc640e4d85df23a144c497b257ab97477d89..16c57ec187104e5f8449f3ba030d496f734bd894 100644 (file)
@@ -16,7 +16,7 @@
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-package org.altusmetrum.altoslib_11;
+package org.altusmetrum.altoslib_14;
 
 import java.io.*;
 import java.util.*;
@@ -28,18 +28,26 @@ public class AltosCSV implements AltosWriter {
        boolean                 seen_boost;
        int                     boost_tick;
 
+       boolean                 has_call;
        boolean                 has_basic;
+       boolean                 has_accel;
+       boolean                 has_baro;
+       boolean                 has_pyro;
+       boolean                 has_radio;
        boolean                 has_battery;
        boolean                 has_flight_state;
-       boolean                 has_advanced;
+       boolean                 has_3d_accel;
+       boolean                 has_imu;
+       boolean                 has_igniter;
        boolean                 has_gps;
        boolean                 has_gps_sat;
        boolean                 has_companion;
+       boolean                 has_motor_pressure;
 
        AltosFlightSeries       series;
        int[]                   indices;
 
-       static final int ALTOS_CSV_VERSION = 5;
+       static final int ALTOS_CSV_VERSION = 6;
 
        /* Version 4 format:
         *
@@ -49,7 +57,8 @@ public class AltosCSV implements AltosWriter {
         *      flight number
         *      callsign
         *      time (seconds since boost)
-        *      clock (tick count / 100)
+        *
+        * Radio info (if available)
         *      rssi
         *      link quality
         *
@@ -81,6 +90,14 @@ public class AltosCSV implements AltosWriter {
         *      mag_x (g)
         *      mag_y (g)
         *      mag_z (g)
+        *      tilt (d)
+        *
+        * Extra igniter voltages (if available)
+        *      pyro (V)
+        *      igniter_a (V)
+        *      igniter_b (V)
+        *      igniter_c (V)
+        *      igniter_d (V)
         *
         * GPS data (if available)
         *      connected (1/0)
@@ -115,13 +132,30 @@ public class AltosCSV implements AltosWriter {
         */
 
        void write_general_header() {
-               out.printf("version,serial,flight,call,time,clock,rssi,lqi");
+               out.printf("version,serial,flight");
+               if (series.cal_data().callsign != null)
+                       out.printf(",call");
+               out.printf(",time");
        }
 
        double time() {
                return series.time(indices);
        }
 
+       void write_general() {
+               out.printf("%s, %d, %d",
+                          ALTOS_CSV_VERSION,
+                          series.cal_data().serial,
+                          series.cal_data().flight);
+               if (series.cal_data().callsign != null)
+                       out.printf(",%s", series.cal_data().callsign);
+               out.printf(", %8.2f", time());
+       }
+
+       void write_radio_header() {
+               out.printf("rssi,lqi");
+       }
+
        int rssi() {
                return (int) series.value(AltosFlightSeries.rssi_name, indices);
        }
@@ -130,12 +164,8 @@ public class AltosCSV implements AltosWriter {
                return (int) series.value(AltosFlightSeries.status_name, indices);
        }
 
-       void write_general() {
-               double time = time();
-               out.printf("%s, %d, %d, %s, %8.2f, %8.2f, %4d, %3d",
-                          ALTOS_CSV_VERSION, series.cal_data.serial,
-                          series.cal_data.flight, series.cal_data.callsign,
-                          time, time,
+       void write_radio() {
+               out.printf("%4d, %3d",
                           rssi(), status() & 0x7f);
        }
 
@@ -149,11 +179,19 @@ public class AltosCSV implements AltosWriter {
 
        void write_flight() {
                int state = state();
-               out.printf("%d,%8s", state, AltosLib.state_name(state));
+               out.printf("%2d,%8s", state, AltosLib.state_name(state));
        }
 
        void write_basic_header() {
-               out.printf("acceleration,pressure,altitude,height,accel_speed,baro_speed,temperature,drogue_voltage,main_voltage");
+               if (has_accel)
+                       out.printf("acceleration,");
+               if (has_baro)
+                       out.printf("pressure,altitude,");
+               out.printf("height,speed");
+               if (has_baro)
+                       out.printf(",temperature");
+               if (has_pyro)
+                       out.printf(",drogue_voltage,main_voltage");
        }
 
        double acceleration() { return series.value(AltosFlightSeries.accel_name, indices); }
@@ -166,16 +204,19 @@ public class AltosCSV implements AltosWriter {
        double main_voltage() { return series.value(AltosFlightSeries.main_voltage_name, indices); }
 
        void write_basic() {
-               out.printf("%8.2f,%10.2f,%8.2f,%8.2f,%8.2f,%8.2f,%5.1f,%5.2f,%5.2f",
-                          acceleration(),
-                          pressure(),
-                          altitude(),
-                          height(),
-                          speed(),
-                          speed(),
-                          temperature(),
-                          apogee_voltage(),
-                          main_voltage());
+               if (has_accel)
+                       out.printf("%8.2f,", acceleration());
+               if (has_baro)
+                       out.printf("%10.2f,%8.2f,",
+                                  pressure(), altitude());
+               out.printf("%8.2f,%8.2f",
+                          height(), speed());
+               if (has_baro)
+                       out.printf(",%5.1f", temperature());
+               if (has_pyro)
+                       out.printf(",%5.2f,%5.2f",
+                                  apogee_voltage(),
+                                  main_voltage());
        }
 
        void write_battery_header() {
@@ -188,14 +229,33 @@ public class AltosCSV implements AltosWriter {
                out.printf("%5.2f", battery_voltage());
        }
 
-       void write_advanced_header() {
-               out.printf("accel_x,accel_y,accel_z,gyro_x,gyro_y,gyro_z,mag_x,mag_y,mag_z");
+       void write_motor_pressure_header() {
+               out.printf("motor_pressure");
+       }
+
+       double motor_pressure() { return series.value(AltosFlightSeries.motor_pressure_name, indices); }
+
+       void write_motor_pressure() {
+               out.printf("%10.1f", motor_pressure());
+       }
+
+       void write_3d_accel_header() {
+               out.printf("accel_x,accel_y,accel_z");
        }
 
        double accel_along() { return series.value(AltosFlightSeries.accel_along_name, indices); }
        double accel_across() { return series.value(AltosFlightSeries.accel_across_name, indices); }
        double accel_through() { return series.value(AltosFlightSeries.accel_through_name, indices); }
 
+       void write_3d_accel() {
+               out.printf("%7.2f,%7.2f,%7.2f",
+                          accel_along(), accel_across(), accel_through());
+       }
+
+       void write_imu_header() {
+               out.printf("gyro_roll,gyro_pitch,gyro_yaw,mag_x,mag_y,mag_z,tilt");
+       }
+
        double gyro_roll() { return series.value(AltosFlightSeries.gyro_roll_name, indices); }
        double gyro_pitch() { return series.value(AltosFlightSeries.gyro_pitch_name, indices); }
        double gyro_yaw() { return series.value(AltosFlightSeries.gyro_yaw_name, indices); }
@@ -204,11 +264,29 @@ public class AltosCSV implements AltosWriter {
        double mag_across() { return series.value(AltosFlightSeries.mag_across_name, indices); }
        double mag_through() { return series.value(AltosFlightSeries.mag_through_name, indices); }
 
-       void write_advanced() {
-               out.printf("%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f",
-                          accel_along(), accel_across(), accel_through(),
+       double tilt() { return series.value(AltosFlightSeries.orient_name, indices); }
+
+       void write_imu() {
+               out.printf("%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f,%7.2f",
                           gyro_roll(), gyro_pitch(), gyro_yaw(),
-                          mag_along(), mag_across(), mag_through());
+                          mag_along(), mag_across(), mag_through(),
+                          tilt());
+       }
+
+       void write_igniter_header() {
+               out.printf("pyro");
+               for (int i = 0; i < series.igniter_voltage.length; i++)
+                       out.printf(",%s", AltosLib.igniter_short_name(i));
+       }
+
+       double pyro() { return series.value(AltosFlightSeries.pyro_voltage_name, indices); }
+
+       double igniter_value(int channel) { return series.value(series.igniter_voltage_name(channel), indices); }
+
+       void write_igniter() {
+               out.printf("%5.2f", pyro());
+               for (int i = 0; i < series.igniter_voltage.length; i++)
+                       out.printf(",%5.2f", igniter_value(i));
        }
 
        void write_gps_header() {
@@ -220,8 +298,8 @@ public class AltosCSV implements AltosWriter {
 
                AltosGreatCircle from_pad;
 
-               if (series.cal_data.gps_pad != null && gps != null)
-                       from_pad = new AltosGreatCircle(series.cal_data.gps_pad, gps);
+               if (series.cal_data().gps_pad != null && gps != null)
+                       from_pad = new AltosGreatCircle(series.cal_data().gps_pad, gps);
                else
                        from_pad = new AltosGreatCircle();
 
@@ -306,6 +384,10 @@ public class AltosCSV implements AltosWriter {
 
        void write_header() {
                out.printf("#"); write_general_header();
+               if (has_radio) {
+                       out.printf(",");
+                       write_radio_header();
+               }
                if (has_flight_state) {
                        out.printf(",");
                        write_flight_header();
@@ -318,9 +400,21 @@ public class AltosCSV implements AltosWriter {
                        out.printf(",");
                        write_battery_header();
                }
-               if (has_advanced) {
+               if (has_motor_pressure) {
+                       out.printf(",");
+                       write_motor_pressure_header();
+               }
+               if (has_3d_accel) {
                        out.printf(",");
-                       write_advanced_header();
+                       write_3d_accel_header();
+               }
+               if (has_imu) {
+                       out.printf(",");
+                       write_imu_header();
+               }
+               if (has_igniter) {
+                       out.printf(",");
+                       write_igniter_header();
                }
                if (has_gps) {
                        out.printf(",");
@@ -339,6 +433,10 @@ public class AltosCSV implements AltosWriter {
 
        void write_one() {
                write_general();
+               if (has_radio) {
+                       out.printf(",");
+                       write_radio();
+               }
                if (has_flight_state) {
                        out.printf(",");
                        write_flight();
@@ -351,9 +449,21 @@ public class AltosCSV implements AltosWriter {
                        out.printf(",");
                        write_battery();
                }
-               if (has_advanced) {
+               if (has_motor_pressure) {
+                       out.printf(",");
+                       write_motor_pressure();
+               }
+               if (has_3d_accel) {
+                       out.printf(",");
+                       write_3d_accel();
+               }
+               if (has_imu) {
                        out.printf(",");
-                       write_advanced();
+                       write_imu();
+               }
+               if (has_igniter) {
+                       out.printf(",");
+                       write_igniter();
                }
                if (has_gps) {
                        out.printf(",");
@@ -393,24 +503,47 @@ public class AltosCSV implements AltosWriter {
 
                this.series = series;
 
-               series.fill_in();
+               series.finish();
 
+               has_radio = false;
                has_flight_state = false;
                has_basic = false;
+               has_accel = false;
+               has_baro = false;
+               has_pyro = false;
                has_battery = false;
-               has_advanced = false;
+               has_motor_pressure = false;
+               has_3d_accel = false;
+               has_imu = false;
+               has_igniter = false;
                has_gps = false;
                has_gps_sat = false;
                has_companion = false;
 
+               if (series.has_series(AltosFlightSeries.rssi_name))
+                       has_radio = true;
                if (series.has_series(AltosFlightSeries.state_name))
                        has_flight_state = true;
-               if (series.has_series(AltosFlightSeries.accel_name) || series.has_series(AltosFlightSeries.pressure_name))
+               if (series.has_series(AltosFlightSeries.accel_name)) {
                        has_basic = true;
+                       has_accel = true;
+               }
+               if (series.has_series(AltosFlightSeries.pressure_name)) {
+                       has_basic = true;
+                       has_baro = true;
+               }
+               if (series.has_series(AltosFlightSeries.apogee_voltage_name))
+                       has_pyro = true;
                if (series.has_series(AltosFlightSeries.battery_voltage_name))
                        has_battery = true;
+               if (series.has_series(AltosFlightSeries.motor_pressure_name))
+                       has_motor_pressure = true;
                if (series.has_series(AltosFlightSeries.accel_across_name))
-                       has_advanced = true;
+                       has_3d_accel = true;
+               if (series.has_series(AltosFlightSeries.gyro_roll_name))
+                       has_imu = true;
+               if (series.has_series(AltosFlightSeries.pyro_voltage_name))
+                       has_igniter = true;
 
                if (series.gps_series != null)
                        has_gps = true;