ao-postflight: don't try to use missing gps sat data
[fw/altos] / ao-tools / ao-postflight / ao-postflight.c
index 7cedaa5b79ecb0cd36b42e5001ebfbc06de808b4..48752d073d9c6950d0e105098d8517cd40d95b24 100644 (file)
@@ -351,10 +351,21 @@ analyse_flight(struct cc_flightraw *f, FILE *summary_file, FILE *detail_file,
                                time, pres, accel);
                }
        }
-       if (gps_file) {
-               int     j = 0;
-               fprintf(gps_file, "%9s %12s %12s %12s\n",
-                       "time", "lat", "lon", "alt");
+       if (gps_file || kml_file) {
+               int     j = 0, baro_pos;
+               double  baro_offset;
+               double  baro = 0.0;
+
+               if (gps_file)
+                       fprintf(gps_file, "%9s %12s %12s %9s %8s %5s\n",
+                               "time", "lat", "lon", "alt", "baro", "nsat");
+               if (kml_file)
+                       fprintf(kml_file, "%s", kml_header);
+               if (f->gps.num)
+                       baro_offset = f->gps.data[0].alt;
+               else
+                       baro_offset = 0;
+               baro_pos = 0;
                for (i = 0; i < f->gps.num; i++) {
                        int     nsat = 0;
                        int     k;
@@ -364,52 +375,58 @@ analyse_flight(struct cc_flightraw *f, FILE *summary_file, FILE *detail_file,
                                        break;
                                j++;
                        }
-                       fprintf(gps_file, "%12.7f %12.7f %12.7f %12.7f",
-                               (f->gps.data[i].time - boost_start) / 100.0,
-                               f->gps.data[i].lat,
-                               f->gps.data[i].lon,
-                               f->gps.data[i].alt);
-                       nsat = 0;
-                       for (k = 0; k < f->gps.sats[j].nsat; k++) {
-                               fprintf (gps_file, " %12.7f", (double) f->gps.sats[j].sat[k].c_n);
-                               if (f->gps.sats[j].sat[k].svid != 0)
-                                       nsat++;
+                       if (cooked) {
+                               while (baro_pos < cooked->pres_pos.num) {
+                                       double  baro_time = cooked->accel_accel.start + baro_pos * cooked->accel_accel.step;
+                                       if (baro_time >= f->gps.data[i].time)
+                                               break;
+                                       baro_pos++;
+                               }
+                               if (baro_pos < cooked->pres_pos.num)
+                                       baro = cooked->pres_pos.data[baro_pos];
                        }
-                       fprintf(gps_file, " %d\n", nsat);
-               }
-       }
-       if (kml_file) {
-               int     j = 0;
-
-               fprintf(kml_file, "%s", kml_header);
-               for (i = 0; i < f->gps.num; i++) {
-                       int     nsat = 0;
-                       int     k;
-                       while (j < f->gps.numsats - 1) {
-                               if (f->gps.sats[j].sat[0].time <= f->gps.data[i].time &&
-                                   f->gps.data[i].time < f->gps.sats[j+1].sat[0].time)
-                                       break;
-                               j++;
+                       if (gps_file)
+                               fprintf(gps_file, "%12.7f %12.7f %12.7f %7.1f %7.1f",
+                                       (f->gps.data[i].time - boost_start) / 100.0,
+                                       f->gps.data[i].lat,
+                                       f->gps.data[i].lon,
+                                       f->gps.data[i].alt,
+                                       baro + baro_offset);
+                       if (kml_file) {
+                               fprintf(kml_file, "%12.7f, %12.7f, %12.7f <!-- alt %12.7f time %12.7f sats %d -->",
+                                       f->gps.data[i].lon,
+                                       f->gps.data[i].lat,
+                                       baro + baro_offset,
+                                       f->gps.data[i].alt,
+                                       (f->gps.data[i].time - boost_start) / 100.0,
+                                       nsat);
+                               if (i < f->gps.num - 1)
+                                       fprintf(kml_file, ",\n");
+                               else
+                                       fprintf(kml_file, "\n");
                        }
+
                        nsat = 0;
-                       if (j < f->gps.numsats) {
-                               for (k = 0; k < f->gps.sats[j].nsat; k++)
+                       if (f->gps.sats) {
+                               for (k = 0; k < f->gps.sats[j].nsat; k++) {
                                        if (f->gps.sats[j].sat[k].svid != 0)
                                                nsat++;
+                               }
+                               if (gps_file) {
+                                       fprintf(gps_file, " %4d", nsat);
+                                       for (k = 0; k < f->gps.sats[j].nsat; k++) {
+                                               if (f->gps.sats[j].sat[k].svid != 0) {
+                                                       fprintf (gps_file, " %3d(%4.1f)",
+                                                                f->gps.sats[j].sat[k].svid,
+                                                                (double) f->gps.sats[j].sat[k].c_n);
+                                               }
+                                       }
+                                       fprintf(gps_file, "\n");
+                               }
                        }
-
-                       fprintf(kml_file, "%12.7f, %12.7f, %12.7f <!-- time %12.7f sats %d -->",
-                               f->gps.data[i].lon,
-                               f->gps.data[i].lat,
-                               f->gps.data[i].alt,
-                               (f->gps.data[i].time - boost_start) / 100.0,
-                               nsat);
-                       if (i < f->gps.num - 1)
-                               fprintf(kml_file, ",\n");
-                       else
-                               fprintf(kml_file, "\n");
                }
-               fprintf(kml_file, "%s", kml_footer);
+               if (kml_file)
+                       fprintf(kml_file, "%s", kml_footer);
        }
        if (cooked && plot_name) {
                struct cc_perioddata    *speed;
@@ -451,12 +468,14 @@ static const struct option options[] = {
        { .name = "raw", .has_arg = 2, .val = 'r' },
        { .name = "gps", .has_arg = 2, .val = 'g' },
        { .name = "kml", .has_arg = 2, .val = 'k' },
+       { .name = "all", .has_arg = 0, .val = 'a' },
        { 0, 0, 0, 0},
 };
 
 static void usage(char *program)
 {
        fprintf(stderr, "usage: %s\n"
+               "\t[--all] [-a]\n"
                "\t[--summary=<summary-file>] [-s <summary-file>]\n"
                "\t[--detail=<detail-file] [-d <detail-file>]\n"
                "\t[--raw=<raw-file> -r <raw-file]\n"
@@ -534,8 +553,9 @@ main (int argc, char **argv)
        int                     has_raw = 0;
        int                     has_gps = 0;
        int                     has_kml = 0;
+       char                    *this_plot_name = NULL;;
 
-       while ((c = getopt_long(argc, argv, "s:d:p:r:g:k:", options, NULL)) != -1) {
+       while ((c = getopt_long(argc, argv, "s:d:p:r:g:k:a", options, NULL)) != -1) {
                switch (c) {
                case 's':
                        summary_name = optarg;
@@ -561,6 +581,9 @@ main (int argc, char **argv)
                        kml_name = optarg;
                        has_kml = 1;
                        break;
+               case 'a':
+                       has_summary = has_detail = has_plot = has_raw = has_gps = has_kml = 1;
+                       break;
                default:
                        usage(argv[0]);
                        break;
@@ -579,6 +602,12 @@ main (int argc, char **argv)
                        summary_file = open_output(summary_name, argv[i], ".summary");
                if (has_detail && !detail_file)
                        detail_file = open_output(detail_name, argv[i], ".detail");
+               if (has_plot) {
+                       if (plot_name)
+                               this_plot_name = plot_name;
+                       else
+                               this_plot_name = replace_extension(argv[i], ".plot");
+               }
                if (has_raw && !raw_file)
                        raw_file = open_output(raw_name, argv[i], ".raw");
                if (has_gps && !gps_file)
@@ -598,7 +627,7 @@ main (int argc, char **argv)
                }
                if (!raw->serial)
                        raw->serial = serial;
-               analyse_flight(raw, summary_file, detail_file, raw_file, plot_name, gps_file, kml_file);
+               analyse_flight(raw, summary_file, detail_file, raw_file, this_plot_name, gps_file, kml_file);
                cc_flightraw_free(raw);
                if (has_summary && !summary_name) {
                        fclose(summary_file); summary_file = NULL;
@@ -606,7 +635,10 @@ main (int argc, char **argv)
                if (has_detail && !detail_name) {
                        fclose(detail_file); detail_file = NULL;
                }
-               if (has_summary && !raw_name) {
+               if (this_plot_name && this_plot_name != plot_name) {
+                       free (this_plot_name); this_plot_name = NULL;
+               }
+               if (has_raw && !raw_name) {
                        fclose(raw_file); raw_file = NULL;
                }
                if (has_gps && !gps_name) {