summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBart Massey <bart@cs.pdx.edu>2016-03-05 17:38:19 -0800
committerKeith Packard <keithp@keithp.com>2016-03-07 13:54:47 -0800
commitd1af180c2d2a2caf1e13f00d83f2b86ba26de27f (patch)
tree766e27ba7ca5c85251aae14aa03a0b3194eb64fd /src
parent20d9286402b7da74fef9b7c98e79d13671f6c82b (diff)
altos: Fixed timing of panic display LED to be readable
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.
Diffstat (limited to 'src')
-rw-r--r--src/kernel/ao_panic.c11
-rw-r--r--src/stmf0/ao_arch.h1
2 files changed, 9 insertions, 3 deletions
diff --git a/src/kernel/ao_panic.c b/src/kernel/ao_panic.c
index c29cd8fe..e280f98c 100644
--- a/src/kernel/ao_panic.c
+++ b/src/kernel/ao_panic.c
@@ -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
diff --git a/src/stmf0/ao_arch.h b/src/stmf0/ao_arch.h
index 45df0982..26a34c85 100644
--- a/src/stmf0/ao_arch.h
+++ b/src/stmf0/ao_arch.h
@@ -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