]> www.fi.muni.cz Git - bike-lights.git/blobdiff - firmware/main.c
Disable WDT as early as possible
[bike-lights.git] / firmware / main.c
index 393f47dff68b6a475625983726a7a47cae3dcf6b..0fbdb1e9f804421fca1a07fe69f33d72bd0890a2 100644 (file)
@@ -9,8 +9,6 @@
 
 static void hw_setup()
 {
-       wdt_enable(WDTO_1S);
-
        init_battery();
        init_pwm();
        init_adc();
@@ -34,15 +32,16 @@ static void hw_suspend()
        susp_gpio();
        susp_ambient();
        susp_buttons();
-
-       wdt_disable();
 }
 
-void power_down()
+void power_down(unsigned char err)
 {
        hw_suspend();
 
        do {
+               if (err)
+                       gpio_set(0, 1);
+
                // G'night
                set_sleep_mode(SLEEP_MODE_PWR_DOWN);
                sleep_enable();
@@ -63,7 +62,18 @@ void power_down()
 
 int main(void)
 {
-       init_log();
+       unsigned char mcusr_save;
+
+       // disable the WDT if running
+       wdt_reset();
+       mcusr_save = MCUSR;
+       MCUSR = 0;
+       wdt_disable();
+
+       if (mcusr_save & _BV(WDRF)) // was watchdog reset?
+               gpio_set(0, 1);
+
+       init_log(mcusr_save);
 
        power_usi_disable(); // Once for lifetime
        ACSRA |= _BV(ACD);   // disable analog comparator
@@ -71,13 +81,25 @@ int main(void)
        log_set_state(3);
 
        hw_setup();
-       power_down();
+       power_down(mcusr_save & _BV(WDRF));
 
        sei();
 #if 1
        while (1) {
-               wdt_reset();
-               sleep_mode();
+               cli();
+               if (TIMER1_IS_ON()) {
+                       set_sleep_mode(SLEEP_MODE_IDLE);
+               } else if (adc_is_on) {
+                       set_sleep_mode(SLEEP_MODE_ADC);
+               } else {
+                       set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+               }
+
+               sleep_enable();
+               // keep BOD active, no sleep_bod_disable();
+               sei();
+               sleep_cpu();
+               sleep_disable();
        }
 #endif