]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tos/lib/safe/SafeFailureHandlerP.nc
Merge TinyOS 2.1.1 into master.
[tinyos-2.x.git] / tos / lib / safe / SafeFailureHandlerP.nc
diff --git a/tos/lib/safe/SafeFailureHandlerP.nc b/tos/lib/safe/SafeFailureHandlerP.nc
new file mode 100644 (file)
index 0000000..c8fb772
--- /dev/null
@@ -0,0 +1,143 @@
+
+#include "Timer.h"
+
+module SafeFailureHandlerP {
+  uses {
+    interface Leds;
+    interface BusyWait<TMicro, uint16_t>;
+  }
+}
+implementation {
+
+  #ifndef asmlinkage
+    #define asmlinkage
+  #endif
+
+  #ifndef noreturn
+    #define noreturn __attribute__((noreturn))
+  #endif
+
+  void delay (int len) 
+  {
+    volatile int x;
+    for (x=0; x<len; x++) { 
+      call BusyWait.wait(2000);
+    }
+  }
+
+  void v_short_delay (void) { delay (10); }
+
+  void short_delay (void) { delay (80); }
+
+  void long_delay (void) { delay (800); }
+
+  void flicker (void)
+  {
+    int i;
+    for (i=0; i<20; i++) {
+       delay (20);
+       call Leds.led0Off();
+       call Leds.led1Off();
+       call Leds.led2Off();
+       delay (20);
+       call Leds.led0On();
+       call Leds.led1On();
+       call Leds.led2On();
+    }
+    call Leds.led0Off();
+    call Leds.led1Off();
+    call Leds.led2Off();
+  }
+
+  void roll (void)
+  {
+    int i;
+    for (i=0; i<10; i++) {
+       delay (30);
+       call Leds.led0On();
+       call Leds.led2Off();
+       delay (30);
+       call Leds.led1On();
+       call Leds.led0Off();
+       delay (30);
+       call Leds.led2On();
+       call Leds.led1Off();
+    }
+    call Leds.led2Off();
+  }
+           
+  void separator (void)
+  {
+    call Leds.led0Off();
+    call Leds.led1Off();
+    call Leds.led2Off();
+    short_delay ();
+    call Leds.led0On();
+    call Leds.led1On();
+    call Leds.led2On();
+    v_short_delay ();
+    call Leds.led0Off();
+    call Leds.led1Off();
+    call Leds.led2Off();
+    short_delay ();
+  }
+
+  void display_b4 (int c) 
+  {
+    switch (c) {
+    case 3:
+      call Leds.led2On();
+    case 2:
+      call Leds.led1On();
+    case 1:
+      call Leds.led0On();
+    case 0:
+      long_delay ();
+      break;
+    default:
+      flicker ();
+    }
+    separator ();
+  }
+
+  void display_int (const unsigned int x)
+  {
+    int i = 14;
+    do {
+      display_b4 (0x3 & (x >> i));
+      i -= 2;
+    } while (i >= 0);
+  }
+
+  void display_int_flid (const unsigned int x)
+  {
+    roll ();
+    display_int (x);
+    roll ();
+  }
+
+  asmlinkage noreturn 
+  void deputy_fail_noreturn_fast (int flid) @C() @spontaneous()
+  {
+    atomic {
+#if defined(__AVR_ARCH__)
+      asm volatile ("break");
+#endif
+      while(1) {
+        display_int_flid(flid);
+      }
+    }
+  }
+
+  asmlinkage 
+  void deputy_fail_mayreturn(int flid) @C() @spontaneous()
+  {
+    deputy_fail_noreturn_fast(flid);
+  }
+
+  asmlinkage noreturn 
+  void deputy_fail_noreturn(int flid) @C() @spontaneous()
+  {
+    deputy_fail_noreturn_fast(flid);
+  }
+}