#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()
{
- 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();