summaryrefslogtreecommitdiff
path: root/ao-tools/ao-postflight/ao-postflight.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-09-06 20:26:17 -0700
committerKeith Packard <keithp@keithp.com>2009-09-06 20:26:17 -0700
commit932f1539b38567e565fd484171c13539b1467308 (patch)
tree485485df3cef45614c861da39b987bedb0aec190 /ao-tools/ao-postflight/ao-postflight.c
parent9177f5f4e9d832558ddd9ab227c4511f6201e7e5 (diff)
Color plots, integrate only flight portion of data.
Telemetry files have piles of pad data which shouldn't be integrated into the velocity data as it tends to generate huge values from the noise of the sensor. Also make the data lines colored to keep them visually distinct from the rest of the plot image. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools/ao-postflight/ao-postflight.c')
-rw-r--r--ao-tools/ao-postflight/ao-postflight.c118
1 files changed, 102 insertions, 16 deletions
diff --git a/ao-tools/ao-postflight/ao-postflight.c b/ao-tools/ao-postflight/ao-postflight.c
index 4ca39c24..ded2f3c2 100644
--- a/ao-tools/ao-postflight/ao-postflight.c
+++ b/ao-tools/ao-postflight/ao-postflight.c
@@ -39,9 +39,19 @@ static const char *state_names[] = {
"invalid"
};
+static int plot_colors[3][3] = {
+ { 0, 0x90, 0 }, /* height */
+ { 0xa0, 0, 0 }, /* speed */
+ { 0, 0, 0xc0 }, /* accel */
+};
+
+#define PLOT_HEIGHT 0
+#define PLOT_SPEED 1
+#define PLOT_ACCEL 2
+
static void
plot_perioddata(struct cc_perioddata *d, char *axis_label, char *plot_label,
- double min_time, double max_time)
+ double min_time, double max_time, int plot_type)
{
double *times;
double ymin, ymax;
@@ -60,11 +70,58 @@ plot_perioddata(struct cc_perioddata *d, char *axis_label, char *plot_label,
ymax_i = cc_perioddata_max(d, min_time, max_time);
ymin = d->data[ymin_i];
ymax = d->data[ymax_i];
+ plscol0(1, 0, 0, 0);
+ plscol0(2, plot_colors[plot_type][0], plot_colors[plot_type][1], plot_colors[plot_type][2]);
+ plcol0(1);
plenv(times[0], times[stop-start],
ymin, ymax, 0, 2);
- plcol0(1);
pllab("Time", axis_label, plot_label);
+ plcol0(2);
plline(stop - start + 1, times, d->data + start);
+ free(times);
+}
+
+static void
+plot_timedata(struct cc_timedata *d, char *axis_label, char *plot_label,
+ double min_time, double max_time)
+{
+ double *times;
+ double *values;
+ double ymin, ymax;
+ int ymin_i, ymax_i;
+ int i;
+ int start = -1, stop = -1;
+ double start_time = 0, stop_time = 0;
+ int num;
+
+ for (i = 0; i < d->num; i++) {
+ if (start < 0 && d->data[i].time >= min_time) {
+ start_time = d->data[i].time;
+ start = i;
+ }
+ if (d->data[i].time <= max_time) {
+ stop_time = d->data[i].time;
+ stop = i;
+ }
+ }
+
+ times = calloc(stop - start + 1, sizeof (double));
+ values = calloc(stop - start + 1, sizeof (double));
+
+ ymin_i = cc_timedata_min(d, min_time, max_time);
+ ymax_i = cc_timedata_max(d, min_time, max_time);
+ ymin = d->data[ymin_i].value;
+ ymax = d->data[ymax_i].value;
+ plcol0(1);
+ pllab("Time", axis_label, plot_label);
+ for (i = start; i <= stop; i++) {
+ times[i-start] = (d->data[i].time - start_time)/100.0;
+ values[i-start] = d->data[i].value;
+ }
+ plenv(times[0], times[stop-start], ymin, ymax, 0, 2);
+ plline(stop - start + 1, times, values);
+ free(times);
+ free(values);
}
static struct cc_perioddata *
@@ -102,7 +159,7 @@ merge_data(struct cc_perioddata *first, struct cc_perioddata *last, double split
}
static void
-analyse_flight(struct cc_flightraw *f, FILE *summary_file, FILE *detail_file, char *plot_name)
+analyse_flight(struct cc_flightraw *f, FILE *summary_file, FILE *detail_file, FILE *raw_file, char *plot_name)
{
double height;
double accel;
@@ -241,6 +298,17 @@ analyse_flight(struct cc_flightraw *f, FILE *summary_file, FILE *detail_file, ch
time, pos, speed, accel);
}
}
+ if (raw_file) {
+ fprintf(raw_file, "%9s %9s %9s\n",
+ "time", "height", "accel");
+ for (i = 0; i < cooked->pres.num; i++) {
+ double time = cooked->pres.data[i].time;
+ double pres = cooked->pres.data[i].value;
+ double accel = cooked->accel.data[i].value;
+ fprintf(raw_file, "%9.2f %9.2f %9.2f %9.2f\n",
+ time, pres, accel);
+ }
+ }
if (cooked && plot_name) {
struct cc_perioddata *speed;
plsdev("svgcairo");
@@ -252,12 +320,12 @@ analyse_flight(struct cc_flightraw *f, FILE *summary_file, FILE *detail_file, ch
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);
+ plot_perioddata(&cooked->pres_pos, "meters", "Height", -1e10, 1e10, PLOT_HEIGHT);
+ plot_perioddata(&cooked->pres_pos, "meters", "Height to Apogee", boost_start, apogee, PLOT_HEIGHT);
+ plot_perioddata(speed, "meters/second", "Speed", -1e10, 1e10, PLOT_SPEED);
+ plot_perioddata(speed, "meters/second", "Speed to Apogee", boost_start, apogee, PLOT_SPEED);
+ plot_perioddata(&cooked->accel_accel, "meters/second²", "Acceleration", -1e10, 1e10, PLOT_ACCEL);
+ plot_perioddata(&cooked->accel_accel, "meters/second²", "Acceleration to Apogee", boost_start, apogee, PLOT_ACCEL);
free(speed->data);
free(speed);
plend();
@@ -270,12 +338,18 @@ 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' },
+ { .name = "raw", .has_arg = 1, .val = 'r' },
{ 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);
+ fprintf(stderr, "usage: %s\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"
+ "\t[--plot=<plot-file> -p <plot-file>]\n"
+ "\t{flight-log} ...\n", program);
exit(1);
}
@@ -283,18 +357,21 @@ int
main (int argc, char **argv)
{
FILE *file;
- FILE *summary_file;
- FILE *detail_file;
+ FILE *summary_file = NULL;
+ FILE *detail_file = NULL;
+ FILE *raw_file = NULL;
int i;
int ret = 0;
struct cc_flightraw *raw;
int c;
int serial;
char *s;
- char *summary_name = NULL, *detail_name = NULL;
+ char *summary_name = NULL;
+ char *detail_name = NULL;
+ char *raw_name = NULL;
char *plot_name = NULL;
- while ((c = getopt_long(argc, argv, "s:d:p:", options, NULL)) != -1) {
+ while ((c = getopt_long(argc, argv, "s:d:p:r:", options, NULL)) != -1) {
switch (c) {
case 's':
summary_name = optarg;
@@ -305,13 +382,15 @@ main (int argc, char **argv)
case 'p':
plot_name = optarg;
break;
+ case 'r':
+ raw_name = optarg;
+ break;
default:
usage(argv[0]);
break;
}
}
summary_file = stdout;
- detail_file = NULL;
if (summary_name) {
summary_file = fopen(summary_name, "w");
if (!summary_file) {
@@ -330,6 +409,13 @@ main (int argc, char **argv)
}
}
}
+ if (raw_name) {
+ raw_file = fopen (raw_name, "w");
+ if (!raw_file) {
+ perror(raw_name);
+ exit(1);
+ }
+ }
for (i = optind; i < argc; i++) {
file = fopen(argv[i], "r");
if (!file) {
@@ -350,7 +436,7 @@ main (int argc, char **argv)
}
if (!raw->serial)
raw->serial = serial;
- analyse_flight(raw, summary_file, detail_file, plot_name);
+ analyse_flight(raw, summary_file, detail_file, raw_file, plot_name);
cc_flightraw_free(raw);
}
return ret;