X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fkernel%2Fao_report.c;h=5314fc8fb82fa7a698dd3743939ef23fe54dbeda;hb=1fb200d18cc385230b3af574816ec354682cc5c9;hp=1a0e9e166f959a576378c7eb82ced20e159e4319;hpb=0d367fc24bfd0377db6f3b00a888a18245616767;p=fw%2Faltos diff --git a/src/kernel/ao_report.c b/src/kernel/ao_report.c index 1a0e9e16..5314fc8f 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 @@ -157,12 +211,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));