+}
+
+static void status_led_init()
+{
+ DDRB |= _BV(PB2);
+ PORTB &= ~_BV(PB2);
+}
+
+static void status_led_on()
+{
+ PORTB |= _BV(PB2);
+}
+
+static void status_led_off()
+{
+ PORTB &= ~_BV(PB2);
+}
+
+static void buttons_init()
+{
+ DDRB &= ~(_BV(PB0) | _BV(PB1)); // set as input
+ PORTB |= _BV(PB0) | _BV(PB1); // internal pull-up
+
+ GIMSK &= ~_BV(PCIE); // disable pin-change IRQs
+ PCMSK = 0; // disable pin-change IRQs on all pins of port B
+}
+
+static void buttons_susp()
+{
+ buttons_init();
+
+ GIMSK |= _BV(PCIE);
+ PCMSK |= _BV(PCINT0) | _BV(PCINT1);
+}
+
+static unsigned char buttons_pressed()
+{
+ return (
+ (PINB & _BV(PB0) ? 0 : 1)
+ |
+ (PINB & _BV(PB1) ? 0 : 2)
+ );
+}
+
+#define WAKEUP_POLL 100 // msec
+#define WAKEUP_LIMIT 5 // times WAKEUP_POLL
+
+static unsigned char buttons_wait_for_release()
+{
+ uint16_t wake_count = 0;
+
+ do {
+ if (++wake_count > WAKEUP_LIMIT)
+ status_led_on(); // inform the user
+
+ _delay_ms(WAKEUP_POLL);
+ } while (buttons_pressed());
+
+ status_led_off();
+
+ return wake_count > WAKEUP_LIMIT;
+}
+
+ISR(PCINT0_vect)
+{
+ // empty - let it wake us from sleep, but do nothing else
+}
+
+static void wdt_init()
+{
+ WDTCR = _BV(WDIE) | _BV(WDP1); // interrupt mode, 64 ms
+}
+
+static void wdt_susp()
+{
+ wdt_disable();
+}
+
+static void hw_setup()
+{
+ power_all_disable();
+
+ timer_init();
+ adc_init();
+ status_led_init();
+ wdt_init();
+}
+
+static void hw_suspend()
+{
+ ADCSRA &= ~_BV(ADEN); // disable ADC
+ TCCR1 = 0; // disable T/C 1
+
+ status_led_init();
+ buttons_susp();
+ wdt_susp();
+
+ power_all_disable();
+}
+
+static volatile unsigned char wdt_timer_fired;
+
+ISR(WDT_vect) {
+ wdt_timer_fired = 1;
+}
+
+static void power_down()
+{
+ hw_suspend();
+
+ do {
+ // G'night
+ set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+ sleep_enable();
+ sleep_bod_disable();
+ sei();
+ sleep_cpu();
+
+ // G'morning
+ cli();
+ sleep_disable();
+
+ // allow wakeup by long button-press only
+ } while (!buttons_wait_for_release());
+
+ // OK, wake up now
+ hw_setup();
+}
+
+static void button_one_pressed()
+{
+ if (pwm > 1) {
+ pwm >>= 1;
+ OCR1B = pwm;
+ } else {
+ power_down();
+ }
+}
+
+static void button_two_pressed()
+{
+ if (pwm < 0x80) {
+ pwm <<= 1;
+ OCR1B = pwm;
+ }
+}
+
+static unsigned char button_state, button_state_time;
+
+static void timer_check_buttons()
+{
+ unsigned char newstate = buttons_pressed();
+
+ if (newstate == button_state) {
+ if (newstate && button_state_time < 4)
+ ++button_state_time;
+ return;
+ }
+
+ if (newstate) {
+ button_state = newstate;
+ button_state_time = 0;
+ return;
+ }
+
+ // just released
+ switch (button_state) {
+ case 1: button_one_pressed();
+ break;
+ case 2: button_two_pressed();
+ break;
+ default: // ignore when both are preseed
+ break;
+ }
+
+ button_state = newstate;
+}
+
+int main()
+{
+ log_init();
+
+ power_down();
+
+#if 0