]> www.fi.muni.cz Git - bike-lights.git/blobdiff - firmware/main.c
Watchdog-based timing
[bike-lights.git] / firmware / main.c
index 25ea829511781e3e365c282a9bc0ae0e4357b8c3..0e3395779e9c7a2c84afd71d912ef4b64868bb9f 100644 (file)
 #include <avr/sleep.h>
 #include <avr/interrupt.h>
 #include <avr/power.h>
-#include <avr/wdt.h>
 
 #include "lights.h"
 
-void hw_setup()
+static void hw_setup()
 {
-       wdt_enable(WDTO_1S);
        init_battery();
        init_pwm();
        init_adc();
        init_tmr();
        init_buttons();
 
-       pwmled_init();
-       gpio_init();
-       ambient_init();
-       pattern_init();
+       init_pwmled();
+       init_gpio();
+       init_ambient();
+       init_pattern();
+       init_control();
 
        set_sleep_mode(SLEEP_MODE_IDLE);
 }
 
-void hw_suspend()
+static void hw_suspend()
 {
        susp_pwm();
        susp_adc();
        susp_tmr();
        susp_gpio();
-       wdt_disable();
+       susp_ambient();
+       susp_buttons();
 }
 
-
 void power_down()
 {
-       uint16_t wake_count = 0;
-       unsigned char btn;
-
-sleep_again:
-       // enable PCINT14, so that user can wake up later
-        GIMSK |= _BV(PCIE1);
-        PCMSK1 |= _BV(PCINT14);
-
-       // G'night
-        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
-        sleep_enable();
-        sleep_bod_disable();
-        sei();
-        sleep_cpu();
-
-       // G'morning
-       cli();
-
-        sleep_disable();
-
-       // Disable PCINT14
-       GIMSK &= ~_BV(PCIE1);
-       PCMSK1 &= ~_BV(PCINT14);
-
-        // allow wakeup by long button-press only
-        for (btn = 0; btn < 5; btn++) {
-                if ((PINB & _BV(PB6)) != 0) {
-                        wake_count++;
-                        goto sleep_again;;
-                }
-                _delay_ms(100);
-        }
+       hw_suspend();
 
-       // ok, so I will wake up
-       log_byte(0xb1);
-       log_word(wake_count);
-       log_flush();
+       do {
+               // G'night
+               set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+               sleep_enable();
+               sleep_bod_disable();
+               sei();
+               sleep_cpu();
 
-       hw_setup();
-}
+               // G'morning
+               cli();
+               sleep_disable();
 
+               // allow wakeup by long button-press only
+       } while (!buttons_wait_for_release());
 
-ISR(PCINT_vect)
-{
-       GIMSK &= ~_BV(PCIE1);
-       PCMSK1 &= ~_BV(PCINT14);
+       // ok, so I will wake up
+       hw_setup();
 }
 
 int main(void)
 {
-       log_init();
+       init_log();
+
        power_usi_disable(); // Once for lifetime
+       ACSRA |= _BV(ACD);   // disable analog comparator
 
        log_set_state(3);
 
        hw_setup();
-       hw_suspend();
        power_down();
 
        sei();
 #if 1
        while (1) {
-               wdt_reset();
                sleep_mode();
        }
 #endif