X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Fmain.c;h=0fbdb1e9f804421fca1a07fe69f33d72bd0890a2;hb=a366ae18debc6e73c4946aa6290ed37c49bb1fc0;hp=b3bd6dc27a00ce0f9bf6522304ebeaab3ee4b0b0;hpb=0d98bdd496538991b106bc64c45df8e89f23ea32;p=bike-lights.git diff --git a/firmware/main.c b/firmware/main.c index b3bd6dc..0fbdb1e 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -9,8 +9,6 @@ static void hw_setup() { - wdt_enable(WDTO_1S); - init_battery(); init_pwm(); init_adc(); @@ -18,9 +16,10 @@ static void hw_setup() init_buttons(); init_pwmled(); - gpio_init(); - ambient_init(); - pattern_init(); + init_gpio(); + init_ambient(); + init_pattern(); + init_control(); set_sleep_mode(SLEEP_MODE_IDLE); } @@ -31,16 +30,18 @@ static void hw_suspend() susp_adc(); susp_tmr(); 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(); @@ -61,7 +62,18 @@ void power_down() int main(void) { - log_init(); + 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 @@ -69,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