X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fkernel%2Fao_report.c;h=977cea854ff1f014e0927a25530b34988e2682a8;hp=08967af8450f3f2701b82e3c3df146e801dfa5e1;hb=HEAD;hpb=c6e57291d91f1f6c4de5c54a5cfd3eef66d9f830 diff --git a/src/kernel/ao_report.c b/src/kernel/ao_report.c index 08967af8..3795eeb3 100644 --- a/src/kernel/ao_report.c +++ b/src/kernel/ao_report.c @@ -40,6 +40,8 @@ static const uint8_t flight_reports[] = { MORSE4(1,0,0,1), /* invalid 'X' */ }; +static enum ao_flight_state ao_report_state; + #if HAS_BEEP #define low(time) ao_beep_for(AO_BEEP_LOW, time) #define mid(time) ao_beep_for(AO_BEEP_MID, time) @@ -58,8 +60,6 @@ static const uint8_t flight_reports[] = { #endif #define pause(time) ao_delay(time) -static enum ao_flight_state ao_report_state; - /* * Farnsworth spacing * @@ -115,7 +115,7 @@ static enum ao_flight_state ao_report_state; */ static void -ao_report_beep(void) +ao_report_flight_state(void) { uint8_t r = flight_reports[ao_flight_state]; uint8_t l = r & 7; @@ -149,7 +149,7 @@ ao_report_digit(uint8_t digit) } static void -ao_report_number(int16_t n) +ao_report_number(int32_t n) { uint8_t digits[10]; uint8_t ndigits, i; @@ -158,7 +158,7 @@ ao_report_number(int16_t n) n = 0; ndigits = 0; do { - digits[ndigits++] = n % 10; + digits[ndigits++] = (uint8_t) (n % 10); n /= 10; } while (n); @@ -168,11 +168,20 @@ ao_report_number(int16_t n) while (i != 0); } +#ifdef HAS_BARO static void ao_report_altitude(void) { - ao_report_number(ao_max_height); + alt_t max_h = ao_max_height; + if (ao_config.report_feet) { + max_h = max_h * 39 / 12; + /* report a leading zero to distinguish */ + if (max_h) + ao_report_digit(0); + } + ao_report_number(max_h); } +#endif #if HAS_BATTERY_REPORT static void @@ -190,6 +199,7 @@ ao_report_battery(void) #endif #if HAS_IGNITE_REPORT +#if HAS_IGNITE static uint8_t ao_report_igniter_ready(enum ao_igniter igniter) { @@ -199,19 +209,16 @@ ao_report_igniter_ready(enum ao_igniter igniter) uint8_t ao_report_igniter(void) { - return (ao_report_igniter_ready(ao_igniter_drogue) | - (ao_report_igniter_ready(ao_igniter_main) << 1)); + return (uint8_t) (ao_report_igniter_ready(ao_igniter_drogue) | + (ao_report_igniter_ready(ao_igniter_main) << 1)); } +#endif static void ao_report_continuity(void) { - uint8_t c; - -#if !HAS_IGNITE - if (!ao_igniter_present) - return; -#endif + uint8_t c; +#if HAS_IGNITE c = ao_report_igniter(); if (c) { while (c--) { @@ -225,8 +232,11 @@ ao_report_continuity(void) low(AO_MS_TO_TICKS(20)); } } +#endif #if AO_PYRO_NUM +#if HAS_IGNITE pause(AO_MS_TO_TICKS(250)); +#endif for(c = 0; c < AO_PYRO_NUM; c++) { enum ao_igniter_status status = ao_pyro_status(c); if (status == ao_igniter_ready) @@ -251,7 +261,7 @@ ao_report_continuity(void) } #endif -void +static void ao_report(void) { for(;;) { @@ -261,9 +271,16 @@ ao_report(void) ao_report_battery(); else #endif - ao_report_beep(); + ao_report_flight_state(); +#if HAS_SENSOR_ERRORS + if (ao_report_state == ao_flight_invalid && ao_sensor_errors) + ao_report_number(ao_sensor_errors); +#endif + if (ao_report_state == ao_flight_landed) { +#if HAS_BARO ao_report_altitude(); +#endif #if HAS_FLIGHT ao_delay(AO_SEC_TO_TICKS(5)); continue; @@ -279,6 +296,15 @@ ao_report(void) while (c-- && ao_flight_state == ao_flight_pad) pause(AO_MS_TO_TICKS(100)); } +#endif +#if HAS_PAD_REPORT + while (ao_flight_state == ao_flight_pad) { + uint8_t c; + ao_report_flight_state(); + c = 50; + while (c-- && ao_flight_state == ao_flight_pad) + pause(AO_MS_TO_TICKS(100)); + } #endif while (ao_report_state == ao_flight_state) ao_sleep(&ao_flight_state);