#include #include #include #include #include #include #include "lights.h" void hw_setup() { wdt_enable(WDTO_1S); init_pwm(); init_adc(); init_tmr(); init_buttons(); pwmled_init(); gpio_init(); ambient_init(); pattern_init(); set_sleep_mode(SLEEP_MODE_IDLE); } void hw_suspend() { susp_pwm(); susp_adc(); susp_tmr(); susp_gpio(); 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); } // ok, so I will wake up log_byte(0xb1); log_word(wake_count); log_flush(); hw_setup(); } ISR(PCINT_vect) { GIMSK &= ~_BV(PCIE1); PCMSK1 &= ~_BV(PCINT14); } int main(void) { log_init(); power_usi_disable(); // Once for lifetime log_set_state(3); hw_setup(); hw_suspend(); power_down(); sei(); #if 1 while (1) { wdt_reset(); sleep_mode(); } #endif #if 0 DDRB |= _BV(PB2); while (1) { PORTB |= _BV( PB2 ); _delay_ms(200); PORTB &=~ _BV( PB2 ); _delay_ms(200); } #endif }