diff options
author | Keith Packard <keithp@keithp.com> | 2013-01-12 09:45:31 -0800 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-01-12 09:45:31 -0800 |
commit | d374d6be7eb040457f4df6c38b5d057f26ee741c (patch) | |
tree | a6e1cbdd4386da6df87fe6bfa4552d706aea1387 | |
parent | 85baf657e7ea6debbed9effc6f8daff7ef09a5d8 (diff) |
micropeak: Record samples before boost detect
This saves a ring of 16 samples while waiting for boost, and then goes
back through those looking for the first sample higher than the ground
and writes the remaining ones to the log so that we get a more
complete log of the flight
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r-- | src/micropeak/ao_micropeak.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/micropeak/ao_micropeak.c b/src/micropeak/ao_micropeak.c index 82012800..f361aa26 100644 --- a/src/micropeak/ao_micropeak.c +++ b/src/micropeak/ao_micropeak.c @@ -60,6 +60,12 @@ ao_pips(void) ao_delay(AO_MS_TO_TICKS(200)); } +#define NUM_PA_HIST 16 + +#define SKIP_PA_HIST(i,j) (((i) + (j)) & (NUM_PA_HIST - 1)) + +static uint32_t pa_hist[NUM_PA_HIST]; + int main(void) { @@ -67,6 +73,7 @@ main(void) uint16_t time; uint32_t pa_interval_min, pa_interval_max; int32_t pa_diff; + uint8_t h, i; ao_led_init(LEDS_AVAILABLE); ao_timer_init(); @@ -91,6 +98,7 @@ main(void) ao_pa_get(); pa_avg = pa_ground = pa << FILTER_SHIFT; sample_count = 0; + h = 0; for (;;) { time += SAMPLE_SLEEP; if (sample_count == 0) @@ -99,6 +107,8 @@ main(void) ao_pa_get(); if (sample_count == 0) ao_led_off(AO_LED_REPORT); + pa_hist[h] = pa; + h = SKIP_PA_HIST(h,1); pa_avg = pa_avg - (pa_avg >> FILTER_SHIFT) + pa; pa_diff = pa_ground - pa_avg; @@ -119,6 +129,19 @@ main(void) pa_ground >>= FILTER_SHIFT; + /* Go back and find the first sample a decent interval above the ground */ + pa_min = pa_ground - LAND_DETECT; + for (i = SKIP_PA_HIST(h,2); i != h; i = SKIP_PA_HIST(i,2)) { + if (pa_hist[i] < pa_min) + break; + } + + /* Log the remaining samples so we get a complete history since leaving the ground */ + for (; i != h; i = SKIP_PA_HIST(i,2)) { + pa = pa_hist[i]; + ao_log_micro_data(); + } + /* Now sit around until the pressure is stable again and record the max */ sample_count = 0; |