Pull in a bit more data for filtering the start of the boost
[fw/altos] / ao-tools / lib / cc-process.c
index 469ad2f2c9120bd6575fafe64973fadedfb1ed0b..c756b57028a5dd3a9a8f787867b4ec2eee53b354 100644 (file)
@@ -33,8 +33,6 @@ cook_timed(struct cc_timedata *td, struct cc_perioddata *pd,
        free (filtered);
        free (unfiltered->data);
        free (unfiltered);
-       free (td->data);
-       free (td);
 }
 
 static double
@@ -72,7 +70,7 @@ cc_flight_cook(struct cc_flightraw *raw)
         */
        for (i = 0; i < raw->state.num; i++) {
                if (!start_set && raw->state.data[i].value > ao_flight_pad) {
-                       flight_start = raw->state.data[i].time;
+                       flight_start = raw->state.data[i].time - 10;
                        start_set = 1;
                }
                if (!stop_set && raw->state.data[i].value > ao_flight_main) {
@@ -81,7 +79,7 @@ cc_flight_cook(struct cc_flightraw *raw)
                }
        }
 
-       if (!start_set)
+       if (!start_set || flight_start < raw->accel.data[0].time)
                flight_start = raw->accel.data[0].time;
        if (stop_set) {
                for (i = 0; i < raw->accel.num - 1; i++) {
@@ -93,32 +91,40 @@ cc_flight_cook(struct cc_flightraw *raw)
        } else {
                flight_stop = raw->accel.data[raw->accel.num-1].time;
        }
+       cooked->flight_start = flight_start;
+       cooked->flight_stop = flight_stop;
 
        /* Integrate the accelerometer data to get speed and position */
        accel = cc_timedata_convert(&raw->accel, cc_accelerometer_to_acceleration, raw->ground_accel);
-       accel_speed = cc_timedata_integrate(accel);
-       accel_pos = cc_timedata_integrate(accel_speed);
+       cooked->accel = *accel;
+       free(accel);
+       accel_speed = cc_timedata_integrate(&cooked->accel, flight_start - 10, flight_stop);
+       accel_pos = cc_timedata_integrate(accel_speed, flight_start - 10, flight_stop);
 
-#define ACCEL_OMEGA_PASS       (2 * M_PI * 5 / 100)
-#define ACCEL_OMEGA_STOP       (2 * M_PI * 8 / 100)
+#define ACCEL_OMEGA_PASS       (2 * M_PI * 20 / 100)
+#define ACCEL_OMEGA_STOP       (2 * M_PI * 30 / 100)
 #define BARO_OMEGA_PASS                (2 * M_PI * .5 / 100)
 #define BARO_OMEGA_STOP                (2 * M_PI * 1 / 100)
 #define FILTER_ERROR           (1e-8)
 
-       cook_timed(accel, &cooked->accel_accel,
+       cook_timed(&cooked->accel, &cooked->accel_accel,
                   flight_start, flight_stop,
                   ACCEL_OMEGA_PASS, ACCEL_OMEGA_STOP, FILTER_ERROR);
        cook_timed(accel_speed, &cooked->accel_speed,
                   flight_start, flight_stop,
                   ACCEL_OMEGA_PASS, ACCEL_OMEGA_STOP, FILTER_ERROR);
+       free(accel_speed->data); free(accel_speed);
        cook_timed(accel_pos, &cooked->accel_pos,
                   flight_start, flight_stop,
                   ACCEL_OMEGA_PASS, ACCEL_OMEGA_STOP, FILTER_ERROR);
+       free(accel_pos->data); free(accel_pos);
 
        /* Filter the pressure data */
        pres = cc_timedata_convert(&raw->pres, barometer_to_altitude,
                                   cc_barometer_to_altitude(raw->ground_pres));
-       cook_timed(pres, &cooked->pres_pos,
+       cooked->pres = *pres;
+       free(pres);
+       cook_timed(&cooked->pres, &cooked->pres_pos,
                   flight_start, flight_stop,
                   BARO_OMEGA_PASS, BARO_OMEGA_STOP, FILTER_ERROR);
        /* differentiate twice to get to acceleration */
@@ -154,5 +160,7 @@ cc_flightcooked_free(struct cc_flightcooked *cooked)
        if_free(cooked->gps_lon.data);
        if_free(cooked->gps_alt.data);
        if_free(cooked->state.data);
+       if_free(cooked->accel.data);
+       if_free(cooked->pres.data);
        free(cooked);
 }