X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fkernel%2Fao_report.c;h=73f87cdd16c05762bdd15933a0a6185c58b4fe64;hp=1a0e9e166f959a576378c7eb82ced20e159e4319;hb=6023ff81f1bbd240169b9548209133d3b02d475f;hpb=0d367fc24bfd0377db6f3b00a888a18245616767 diff --git a/src/kernel/ao_report.c b/src/kernel/ao_report.c index 1a0e9e16..73f87cdd 100644 --- a/src/kernel/ao_report.c +++ b/src/kernel/ao_report.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 @@ -44,14 +45,75 @@ static const uint8_t flight_reports[] = { #define mid(time) ao_beep_for(AO_BEEP_MID, time) #define high(time) ao_beep_for(AO_BEEP_HIGH, time) #else -#define low(time) ao_led_for(AO_LED_GREEN, time) -#define mid(time) ao_led_for(AO_LED_RED, time) -#define high(time) ao_led_for(AO_LED_GREEN|AO_LED_RED, time) +#ifndef AO_LED_LOW +#define AO_LED_LOW AO_LED_GREEN +#endif +#ifndef AO_LED_MID +#define AO_LED_MID AO_LED_RED +#endif + +#define low(time) ao_led_for(AO_LED_LOW, time) +#define mid(time) ao_led_for(AO_LED_MID, time) +#define high(time) ao_led_for(AO_LED_MID|AO_LED_LOW, time) #endif #define pause(time) ao_delay(time) 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 +124,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 @@ -121,7 +183,7 @@ ao_report_battery(void) ao_data_get(&packet); if (packet.adc.v_batt != 0) break; - ao_sleep(DATA_TO_XDATA(&ao_sample_data)); + ao_sleep(&ao_sample_data); } ao_report_number(ao_battery_decivolt(packet.adc.v_batt)); } @@ -157,12 +219,23 @@ ao_report_continuity(void) __reentrant pause(AO_MS_TO_TICKS(100)); } } else { - c = 10; + c = 5; while (c--) { high(AO_MS_TO_TICKS(20)); low(AO_MS_TO_TICKS(20)); } } +#if AO_PYRO_NUM + pause(AO_MS_TO_TICKS(250)); + for(c = 0; c < AO_PYRO_NUM; c++) { + enum ao_igniter_status status = ao_pyro_status(c); + if (status == ao_igniter_ready) + mid(AO_MS_TO_TICKS(25)); + else + low(AO_MS_TO_TICKS(25)); + pause(AO_MS_TO_TICKS(200)); + } +#endif #if HAS_LOG if (ao_log_full()) { pause(AO_MS_TO_TICKS(100)); @@ -181,15 +254,15 @@ ao_report_continuity(void) __reentrant void ao_report(void) { - ao_report_state = ao_flight_state; for(;;) { + ao_report_state = ao_flight_state; #if HAS_BATTERY_REPORT - if (ao_flight_state == ao_flight_startup) + if (ao_report_state == ao_flight_startup) ao_report_battery(); else #endif ao_report_beep(); - if (ao_flight_state == ao_flight_landed) { + if (ao_report_state == ao_flight_landed) { ao_report_altitude(); #if HAS_FLIGHT ao_delay(AO_SEC_TO_TICKS(5)); @@ -197,7 +270,7 @@ ao_report(void) #endif } #if HAS_IGNITE_REPORT - if (ao_flight_state == ao_flight_idle) + if (ao_report_state == ao_flight_idle) ao_report_continuity(); while (ao_flight_state == ao_flight_pad) { uint8_t c; @@ -207,10 +280,8 @@ ao_report(void) pause(AO_MS_TO_TICKS(100)); } #endif - while (ao_report_state == ao_flight_state) - ao_sleep(DATA_TO_XDATA(&ao_flight_state)); - ao_report_state = ao_flight_state; + ao_sleep(&ao_flight_state); } }