X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fmicropeak%2Fao_micropeak.c;h=8201280000e9d8c2cfd0491976501529a92b318f;hp=1d11300e887040d8d834d124ccabf15f7df56d7b;hb=f7a56152808c7838c1886884bb77de2705ab076c;hpb=e9ea0ad4024532fd6f87bb6708bf76b0c7aa1c5b diff --git a/src/micropeak/ao_micropeak.c b/src/micropeak/ao_micropeak.c index 1d11300e..82012800 100644 --- a/src/micropeak/ao_micropeak.c +++ b/src/micropeak/ao_micropeak.c @@ -16,22 +16,23 @@ */ #include +#include #include #include +#include static struct ao_ms5607_sample sample; static struct ao_ms5607_value value; -static uint32_t pa; -static uint32_t pa_sum; -static uint32_t pa_avg; -static int32_t pa_diff; -static uint32_t pa_ground; -static uint32_t pa_min; -static uint32_t pa_interval_min, pa_interval_max; -static alt_t ground_alt, max_alt; +uint32_t pa; +uint32_t pa_avg; +uint32_t pa_ground; +uint32_t pa_min; +alt_t ground_alt, max_alt; alt_t ao_max_height; +static uint32_t pa_sum; + static void ao_pa_get(void) { @@ -40,19 +41,6 @@ ao_pa_get(void) pa = value.pres; } -#define FILTER_SHIFT 3 -#define SAMPLE_SLEEP AO_MS_TO_TICKS(96) - -/* 16 sample, or about two seconds worth */ -#define GROUND_AVG_SHIFT 4 -#define GROUND_AVG (1 << GROUND_AVG_SHIFT) - -/* Pressure change (in Pa) to detect boost */ -#define BOOST_DETECT 48 /* 4m at sea level, 4.8m at 2000m */ - -/* Pressure change (in Pa) to detect landing */ -#define LAND_DETECT 12 /* 1m at sea level, 1.2m at 2000m */ - static void ao_compute_height(void) { @@ -61,66 +49,43 @@ ao_compute_height(void) ao_max_height = max_alt - ground_alt; } -#if !HAS_EEPROM -void -ao_save_flight(void) -{ - ao_eeprom_write(0, &pa_ground, sizeof (pa_ground)); - ao_eeprom_write(sizeof (pa_ground), &pa_min, sizeof (pa_min)); -} - -void -ao_restore_flight(void) +static void +ao_pips(void) { - ao_eeprom_read(0, &pa_ground, sizeof (pa_ground)); - ao_eeprom_read(sizeof (pa_ground), &pa_min, sizeof (pa_min)); + uint8_t i; + for (i = 0; i < 10; i++) { + ao_led_toggle(AO_LED_REPORT); + ao_delay(AO_MS_TO_TICKS(80)); + } + ao_delay(AO_MS_TO_TICKS(200)); } -#endif int main(void) { int16_t sample_count; uint16_t time; -#if HAS_EEPROM - uint8_t dump_eeprom = 0; -#endif + uint32_t pa_interval_min, pa_interval_max; + int32_t pa_diff; + ao_led_init(LEDS_AVAILABLE); ao_timer_init(); -#if HAS_EEPROM - - /* Set MOSI and CLK as inputs with pull-ups */ - DDRB &= ~(1 << 0) | (1 << 2); - PORTB |= (1 << 0) | (1 << 2); - - /* Check to see if either MOSI or CLK are pulled low by the - * user shorting them to ground. If so, dump the eeprom out - * via the LED. Wait for the shorting wire to go away before - * continuing. - */ - while ((PINB & ((1 << 0) | (1 << 2))) != ((1 << 0) | (1 << 2))) - dump_eeprom = 1; - PORTB &= ~(1 << 0) | (1 << 2); - - ao_i2c_init(); -#endif - ao_restore_flight(); - ao_compute_height(); - ao_report_altitude(); - + /* Init external hardware */ ao_spi_init(); ao_ms5607_init(); ao_ms5607_setup(); -#if HAS_EEPROM - ao_storage_init(); - - /* Check to see if there's a flight recorded in memory */ - if (dump_eeprom && ao_log_micro_scan()) - ao_log_micro_dump(); -#endif + /* Give the person a second to get their finger out of the way */ + ao_delay(AO_MS_TO_TICKS(1000)); + ao_log_micro_restore(); + ao_compute_height(); + ao_report_altitude(); + ao_pips(); + ao_log_micro_dump(); + + ao_delay(BOOST_DELAY); /* Wait for motion, averaging values to get ground pressure */ time = ao_time(); ao_pa_get(); @@ -129,15 +94,13 @@ main(void) for (;;) { time += SAMPLE_SLEEP; if (sample_count == 0) - ao_led_on(AO_LED_BLUE); + ao_led_on(AO_LED_REPORT); ao_delay_until(time); ao_pa_get(); if (sample_count == 0) - ao_led_off(AO_LED_BLUE); + ao_led_off(AO_LED_REPORT); pa_avg = pa_avg - (pa_avg >> FILTER_SHIFT) + pa; pa_diff = pa_ground - pa_avg; - if (pa_diff < 0) - pa_diff = -pa_diff; /* Check for a significant pressure change */ if (pa_diff > (BOOST_DETECT << FILTER_SHIFT)) @@ -156,10 +119,6 @@ main(void) pa_ground >>= FILTER_SHIFT; -#if HAS_EEPROM - ao_log_micro_data(AO_LOG_MICRO_GROUND | pa_ground); -#endif - /* Now sit around until the pressure is stable again and record the max */ sample_count = 0; @@ -170,13 +129,12 @@ main(void) time += SAMPLE_SLEEP; ao_delay_until(time); if ((sample_count & 3) == 0) - ao_led_on(AO_LED_BLUE); + ao_led_on(AO_LED_REPORT); ao_pa_get(); if ((sample_count & 3) == 0) - ao_led_off(AO_LED_BLUE); -#if HAS_EEPROM - ao_log_micro_data(AO_LOG_MICRO_DATA | pa); -#endif + ao_led_off(AO_LED_REPORT); + if (sample_count & 1) + ao_log_micro_data(); pa_avg = pa_avg - (pa_avg >> FILTER_SHIFT) + pa; if (pa_avg < pa_min) pa_min = pa_avg; @@ -199,10 +157,7 @@ main(void) } } pa_min >>= FILTER_SHIFT; -#if HAS_EEPROM - ao_log_micro_data(AO_LOG_MICRO_DONE | pa_min); -#endif - ao_save_flight(); + ao_log_micro_save(); ao_compute_height(); ao_report_altitude(); for (;;) {