#include <util/delay.h>
#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();
set_sleep_mode(SLEEP_MODE_IDLE);
}
-int main(void)
+static void hw_suspend()
{
- log_init();
- wdt_enable(WDTO_1S);
+ susp_pwm();
+ susp_adc();
+ susp_tmr();
+ susp_gpio();
+ susp_buttons();
+
+ wdt_disable();
+}
+
+void power_down()
+{
+ hw_suspend();
+
+ do {
+ // G'night
+ set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+ sleep_enable();
+ sleep_bod_disable();
+ sei();
+ sleep_cpu();
- _delay_ms(100);
+ // G'morning
+ cli();
+ sleep_disable();
+ // allow wakeup by long button-press only
+ } while (!buttons_wait_for_release());
+
+ // ok, so I will wake up
hw_setup();
+}
+
+int main(void)
+{
+ init_log();
+
+ power_usi_disable(); // Once for lifetime
+ ACSRA |= _BV(ACD); // disable analog comparator
log_set_state(3);
+ hw_setup();
+ power_down();
+
sei();
#if 1
while (1) {