make watch dog timeout enter mri mode
authorJim Morris <morris@wolfman.com>
Mon, 9 Nov 2015 21:03:57 +0000 (13:03 -0800)
committerJim Morris <morris@wolfman.com>
Mon, 9 Nov 2015 21:03:57 +0000 (13:03 -0800)
set a led pattern to indicate what happened

src/libs/Watchdog.cpp
src/main.cpp

index 1bee264..c031fb1 100644 (file)
@@ -1,9 +1,13 @@
 #include "Watchdog.h"
+#include "Kernel.h"
 
 #include <lpc17xx_wdt.h>
 
 #include <mri.h>
 
+#include "gpio.h"
+extern GPIO leds[];
+
 // TODO : comment this
 // Basically, when stuff stop answering, reset, or enter MRI mode, or something
 
@@ -31,9 +35,19 @@ void Watchdog::on_idle(void*)
 }
 
 
+// when watchdog triggers, set a led pattern and enter MRI which turns everything off into a safe state
+// TODO handle when MRI is disabled
 extern "C" void WDT_IRQHandler(void)
 {
-    WDT_ClrTimeOutFlag();
+    if(THEKERNEL->is_using_leds()) {
+        // set led pattern to show we are in watchdog timeout
+        leds[0]= 0;
+        leds[1]= 1;
+        leds[2]= 0;
+        leds[3]= 1;
+    }
+
+    WDT_ClrTimeOutFlag(); // bootloader uses this flag to enter DFU mode
     WDT_Feed();
     __debugbreak();
 }
index 41e7ecf..39ee957 100644 (file)
@@ -208,10 +208,10 @@ void init() {
         kernel->streams->printf("WARNING Watchdog is disabled when DFU is enabled\n");
 
     }else{
-        // 5 second watchdog timeout (or config as seconds)
-        float t= kernel->config->value( watchdog_timeout_checksum )->by_default(5.0F)->as_number();
+        // 10 second watchdog timeout (or config as seconds)
+        float t= kernel->config->value( watchdog_timeout_checksum )->by_default(10.0F)->as_number();
         if(t > 0) {
-            kernel->add_module( new Watchdog(t*1000000, WDT_RESET));
+            kernel->add_module( new Watchdog(t*1000000, WDT_MRI)); // WDT_RESET));
             kernel->streams->printf("Watchdog enabled for %f seconds\n", t);
         }else{
             kernel->streams->printf("WARNING Watchdog is disabled\n");