X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fkernel%2Fao_microflight.c;h=bf994b8f80b647f1f56825053e1e0edb1e77e288;hb=243da063ef0dae656f940eb81ada55867924406f;hp=f680e4005c98a5cf9be432ed61509f79d1239863;hpb=24167015705ae831692b95735968b04a876f935e;p=fw%2Faltos diff --git a/src/kernel/ao_microflight.c b/src/kernel/ao_microflight.c index f680e400..bf994b8f 100644 --- a/src/kernel/ao_microflight.c +++ b/src/kernel/ao_microflight.c @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -23,6 +24,7 @@ uint32_t pa; uint32_t pa_ground; +uint32_t pa_ground_next; uint32_t pa_min; static void @@ -43,10 +45,12 @@ void ao_microflight(void) { int16_t sample_count; - uint16_t time; + int16_t log_count; + AO_TICK_TYPE time; uint32_t pa_interval_min, pa_interval_max; int32_t pa_diff; - uint8_t h, i; + uint8_t h; + uint8_t i; uint8_t accel_lock = 0; uint32_t pa_sum = 0; @@ -55,33 +59,43 @@ ao_microflight(void) time = ao_time(); ao_pa_get(); ao_microkalman_init(); - pa_ground = pa; + pa_ground_next = pa_ground = pa; sample_count = 0; h = 0; for (;;) { time += SAMPLE_SLEEP; +#if BOOST_DETECT if ((sample_count & 0x1f) == 0) ao_led_on(AO_LED_REPORT); +#endif ao_delay_until(time); ao_microsample(); +#if BOOST_DETECT if ((sample_count & 0x1f) == 0) ao_led_off(AO_LED_REPORT); +#endif pa_hist[h] = pa; h = SKIP_PA_HIST(h,1); - pa_diff = pa_ground - ao_pa; + pa_diff = (int32_t) (pa_ground - ao_pa); +#if BOOST_DETECT /* Check for a significant pressure change */ if (pa_diff > BOOST_DETECT) break; +#endif if (sample_count < GROUND_AVG * 2) { if (sample_count < GROUND_AVG) pa_sum += pa; ++sample_count; } else { - pa_ground = pa_sum >> GROUND_AVG_SHIFT; + pa_ground = pa_ground_next; + pa_ground_next = pa_sum >> GROUND_AVG_SHIFT; pa_sum = 0; sample_count = 0; +#if !BOOST_DETECT + break; +#endif } } @@ -93,7 +107,10 @@ ao_microflight(void) } /* Log the remaining samples so we get a complete history since leaving the ground */ - for (; i != h; i = SKIP_PA_HIST(i,2)) { +#if LOG_INTERVAL < NUM_PA_HIST + for (; i != h; i = SKIP_PA_HIST(i,2)) +#endif + { pa = pa_hist[i]; ao_log_micro_data(); } @@ -101,6 +118,7 @@ ao_microflight(void) /* Now sit around until the pressure is stable again and record the max */ sample_count = 0; + log_count = 0; pa_min = ao_pa; pa_interval_min = ao_pa; pa_interval_max = ao_pa; @@ -112,8 +130,11 @@ ao_microflight(void) ao_microsample(); if ((sample_count & 3) == 0) ao_led_off(AO_LED_REPORT); - if (sample_count & 1) + if (log_count == LOG_INTERVAL - 1) { ao_log_micro_data(); + log_count = 0; + } else + log_count++; /* If accelerating upwards, don't look for min pressure */ if (ao_pa_accel < ACCEL_LOCK_PA) @@ -124,7 +145,7 @@ ao_microflight(void) pa_min = ao_pa; if (sample_count == (GROUND_AVG - 1)) { - pa_diff = pa_interval_max - pa_interval_min; + pa_diff = (int32_t) (pa_interval_max - pa_interval_min); /* Check to see if the pressure is now stable */ if (pa_diff < LAND_DETECT)