+ if (cooked && detail_file) {
+ double max_height = 0;
+ int i;
+ double *times;
+
+ fprintf(detail_file, "%9s %9s %9s %9s\n",
+ "time", "height", "speed", "accel");
+ for (i = 0; i < cooked->pres_pos.num; i++) {
+ double time = (cooked->accel_accel.start + i * cooked->accel_accel.step - boost_start) / 100.0;
+ double accel = cooked->accel_accel.data[i];
+ double pos = cooked->pres_pos.data[i];
+ double speed;
+ if (cooked->pres_pos.start + cooked->pres_pos.step * i < apogee)
+ speed = cooked->accel_speed.data[i];
+ else
+ speed = cooked->pres_speed.data[i];
+ fprintf(detail_file, "%9.2f %9.2f %9.2f %9.2f\n",
+ time, pos, speed, accel);
+ }
+ }
+ if (cooked && plot_name) {
+ struct cc_perioddata *speed;
+ plsdev("svgcairo");
+ plsfnam(plot_name);
+#define PLOT_DPI 96
+ plspage(PLOT_DPI, PLOT_DPI, 8 * PLOT_DPI, 8 * PLOT_DPI, 0, 0);
+ plscolbg(0xff, 0xff, 0xff);
+ plscol0(1,0,0,0);
+ plstar(2, 3);
+ speed = merge_data(&cooked->accel_speed, &cooked->pres_speed, apogee);
+
+ plot_perioddata(&cooked->pres_pos, "meters", "Height", -1e10, 1e10);
+ plot_perioddata(&cooked->pres_pos, "meters", "Height", boost_start, apogee);
+ plot_perioddata(speed, "meters/second", "Speed", -1e10, 1e10);
+ plot_perioddata(speed, "meters/second", "Speed", boost_start, apogee);
+ plot_perioddata(&cooked->accel_accel, "meters/second²", "Acceleration", -1e10, 1e10);
+ plot_perioddata(&cooked->accel_accel, "meters/second²", "Acceleration", boost_start, apogee);
+ free(speed->data);
+ free(speed);
+ plend();
+ }
+ if (cooked)
+ cc_flightcooked_free(cooked);
+}
+
+static const struct option options[] = {
+ { .name = "summary", .has_arg = 1, .val = 's' },
+ { .name = "detail", .has_arg = 1, .val = 'd' },
+ { .name = "plot", .has_arg = 1, .val = 'p' },
+ { 0, 0, 0, 0},
+};
+
+static void usage(char *program)
+{
+ fprintf(stderr, "usage: %s [--summary=<summary-file>] [-s <summary-file>] [--detail=<detail-file] [-d <detail-file>] [--plot=<plot-file> -p <plot-file>] {flight-log} ...\n", program);
+ exit(1);