X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fkernel%2Fao_report.c;h=f22631547473d7de341bff5c91d85107ec8d133f;hp=1104cd82532ff8173334591ee06c534b968e1f42;hb=3b5c4d88671e6c511fbfb1ce6b046f558dd6c2bf;hpb=24167015705ae831692b95735968b04a876f935e diff --git a/src/kernel/ao_report.c b/src/kernel/ao_report.c index 1104cd82..f2263154 100644 --- a/src/kernel/ao_report.c +++ b/src/kernel/ao_report.c @@ -52,6 +52,60 @@ static const uint8_t flight_reports[] = { static __pdata enum ao_flight_state ao_report_state; +/* + * Farnsworth spacing + * + * From: http://www.arrl.org/files/file/Technology/x9004008.pdf + * + * c: character rate in wpm + * s: overall rate in wpm + * u: unit rate (dit speed) + * + * dit: u + * dah: 3u + * intra-character-time: u + * + * u = 1.2/c + * + * Because our clock runs at 10ms, we'll round up to 70ms for u, which + * is about 17wpm + * + * Farnsworth adds space between characters and + * words: + * 60 c - 37.2 s + * Ta = ------------- + * sc + * + * 3 Ta + * Tc = ---- + * 19 + * + * 7 Ta + * Tw = ---- + * 19 + * + * Ta = total delay to add to the characters (31 units) + * of a standard 50-unit "word", in seconds + * + * Tc = period between characters, in seconds + * + * Tw = period between words, in seconds + * + * We'll use Farnsworth spacing with c=18 and s=12: + * + * u = 1.2/18 = 0.0667 + * + * Ta = (60 * 17 - 37.2 * 12) / (17 * 12) = 2.812 + * + * Tc = 3 * Ta / 19 = .444 + * + * Tw = 1.036 + * + * Note that the values below are all reduced by 10ms; that's because + * the timer always adds a tick to make sure the task actually sleeps + * at least as long as the argument. + */ + static void ao_report_beep(void) __reentrant { @@ -62,13 +116,13 @@ ao_report_beep(void) __reentrant return; while (l--) { if (r & 8) - mid(AO_MS_TO_TICKS(600)); - else mid(AO_MS_TO_TICKS(200)); - pause(AO_MS_TO_TICKS(200)); + else + mid(AO_MS_TO_TICKS(60)); + pause(AO_MS_TO_TICKS(60)); r >>= 1; } - pause(AO_MS_TO_TICKS(400)); + pause(AO_MS_TO_TICKS(360)); } static void @@ -87,19 +141,18 @@ ao_report_digit(uint8_t digit) __reentrant } static void -ao_report_altitude(void) +ao_report_number(int16_t n) { - __pdata int16_t agl = ao_max_height; __xdata uint8_t digits[10]; __pdata uint8_t ndigits, i; - if (agl < 0) - agl = 0; + if (n < 0) + n = 0; ndigits = 0; do { - digits[ndigits++] = agl % 10; - agl /= 10; - } while (agl); + digits[ndigits++] = n % 10; + n /= 10; + } while (n); i = ndigits; do @@ -107,6 +160,27 @@ ao_report_altitude(void) while (i != 0); } +static void +ao_report_altitude(void) +{ + ao_report_number(ao_max_height); +} + +#if HAS_BATTERY_REPORT +static void +ao_report_battery(void) +{ + __xdata struct ao_data packet; + for (;;) { + ao_data_get(&packet); + if (packet.adc.v_batt != 0) + break; + ao_sleep(DATA_TO_XDATA(&ao_sample_data)); + } + ao_report_number(ao_battery_decivolt(packet.adc.v_batt)); +} +#endif + #if HAS_IGNITE_REPORT static uint8_t ao_report_igniter_ready(enum ao_igniter igniter) @@ -163,7 +237,12 @@ ao_report(void) { ao_report_state = ao_flight_state; for(;;) { - ao_report_beep(); +#if HAS_BATTERY_REPORT + if (ao_flight_state == ao_flight_startup) + ao_report_battery(); + else +#endif + ao_report_beep(); if (ao_flight_state == ao_flight_landed) { ao_report_altitude(); #if HAS_FLIGHT