altoslib: Missed a couple of easy mini voltage API changes
[fw/altos] / src / core / ao_panic.c
index fdada201572c38e19e8adac2b6d9c7ad23414109..c29cd8feb279d605e06ffafa50ff3a53f7864dbd 100644 (file)
 #if !HAS_BEEP
 #define ao_beep(x)
 #endif
+#if !LEDS_AVAILABLE
+#define ao_led_on(x)
+#define ao_led_off(x)
+#endif
+
+#ifndef AO_LED_PANIC
+#define AO_LED_PANIC   AO_LED_RED
+#endif
 
 static void
 ao_panic_delay(uint8_t n)
@@ -33,7 +41,7 @@ ao_panic_delay(uint8_t n)
        while (n--)
                while (--j)
                        while (--i)
-                               _asm nop _endasm;
+                               ao_arch_nop();
 }
 
 void
@@ -41,24 +49,40 @@ ao_panic(uint8_t reason)
 {
        uint8_t n;
 
-       __critical for (;;) {
+#if LOW_LEVEL_DEBUG
+       ao_cur_task = NULL;
+       printf ("panic %d\n", reason);
+#endif
+       ao_arch_block_interrupts();
+       for (;;) {
                ao_panic_delay(20);
                for (n = 0; n < 5; n++) {
-                       ao_led_on(AO_LED_RED);
+                       ao_led_on(AO_LED_PANIC);
                        ao_beep(AO_BEEP_HIGH);
                        ao_panic_delay(1);
-                       ao_led_off(AO_LED_RED);
+                       ao_led_off(AO_LED_PANIC);
                        ao_beep(AO_BEEP_LOW);
                        ao_panic_delay(1);
                }
                ao_beep(AO_BEEP_OFF);
                ao_panic_delay(2);
+
+#ifdef SDCC
 #pragma disable_warning 126
-               for (n = 0; n < reason; n++) {
-                       ao_led_on(AO_LED_RED);
+#endif
+               if (reason & 0x40) {
+                       ao_led_on(AO_LED_PANIC);
+                       ao_beep(AO_BEEP_HIGH);
+                       ao_panic_delay(40);
+                       ao_led_off(AO_LED_PANIC);
+                       ao_beep(AO_BEEP_OFF);
+                       ao_panic_delay(10);
+               }
+               for (n = 0; n < (reason & 0x3f); n++) {
+                       ao_led_on(AO_LED_PANIC);
                        ao_beep(AO_BEEP_MID);
                        ao_panic_delay(10);
-                       ao_led_off(AO_LED_RED);
+                       ao_led_off(AO_LED_PANIC);
                        ao_beep(AO_BEEP_OFF);
                        ao_panic_delay(10);
                }