altos: Fixed timing of panic display LED to be readable
authorBart Massey <bart@cs.pdx.edu>
Sun, 6 Mar 2016 01:38:19 +0000 (17:38 -0800)
committerKeith Packard <keithp@keithp.com>
Mon, 7 Mar 2016 21:54:47 +0000 (13:54 -0800)
When we don't have a beeper, there's no way to signal a 'warble' for
panic. So, elide that bit.

Second, panic can't use the scheduler and timer because those may not
be running (or may have failed), and so it uses a delay loop. Add a
configurable scale value to the panic loop so that the LED blinks can
be read. For stm32f0 devices, scale that by the sysclk value to
automatically make them of reasonable length.

src/kernel/ao_panic.c
src/stmf0/ao_arch.h

index c29cd8feb279d605e06ffafa50ff3a53f7864dbd..e280f98c57a77253d692e968ded0450cb56e3091 100644 (file)
@@ -38,10 +38,15 @@ ao_panic_delay(uint8_t n)
 {
        uint8_t i = 0, j = 0;
 
-       while (n--)
+       while (n--) {
+#ifdef AO_PANIC_DELAY_SCALE
+       uint8_t s = AO_PANIC_DELAY_SCALE;
+       while (s--)
+#endif
                while (--j)
                        while (--i)
                                ao_arch_nop();
+       }
 }
 
 void
@@ -56,16 +61,16 @@ ao_panic(uint8_t reason)
        ao_arch_block_interrupts();
        for (;;) {
                ao_panic_delay(20);
+#if HAS_BEEP
                for (n = 0; n < 5; n++) {
-                       ao_led_on(AO_LED_PANIC);
                        ao_beep(AO_BEEP_HIGH);
                        ao_panic_delay(1);
-                       ao_led_off(AO_LED_PANIC);
                        ao_beep(AO_BEEP_LOW);
                        ao_panic_delay(1);
                }
                ao_beep(AO_BEEP_OFF);
                ao_panic_delay(2);
+#endif
 
 #ifdef SDCC
 #pragma disable_warning 126
index 45df09820279ca52c9077f9c296bc18e0985be93..26a34c85f57c658056181caac2286d8e479e5818 100644 (file)
@@ -117,6 +117,7 @@ extern const uint32_t ao_radio_cal;
 #define AO_PCLK1       (AO_HCLK / AO_APB1_PRESCALER)
 #define AO_PCLK2       (AO_HCLK / AO_APB2_PRESCALER)
 #define AO_SYSTICK     (AO_HCLK)
+#define AO_PANIC_DELAY_SCALE  (AO_SYSCLK / 12000000)
 
 #if AO_APB1_PRESCALER == 1
 #define AO_TIM23467_CLK                AO_PCLK1