#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();
+ susp_buttons();
+
wdt_disable();
}
-
void power_down()
{
- // 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();
+ hw_suspend();
- // G'morning
- cli();
+ do {
+ // G'night
+ set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+ sleep_enable();
+ sleep_bod_disable();
+ sei();
+ sleep_cpu();
- sleep_disable();
+ // G'morning
+ cli();
+ sleep_disable();
- // Disable PCINT14
- GIMSK &= ~_BV(PCIE1);
- PCMSK1 &= ~_BV(PCINT14);
+ // allow wakeup by long button-press only
+ } while (!buttons_wait_for_release());
+ // ok, so I will wake up
hw_setup();
}
-
-ISR(PCINT_vect)
-{
- GIMSK &= ~_BV(PCIE1);
- PCMSK1 &= ~_BV(PCINT14);
-}
-
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();