#include #include #include #include #include "lights.h" static uint16_t button_start[N_BUTTONS]; static unsigned char button_pressed[N_BUTTONS]; static unsigned char just_waked_up; void init_buttons() { unsigned char i; DDRB &= ~(_BV(PB4) | _BV(PB6)); PORTB |= _BV(PB4) | _BV(PB6); for (i=0; i < N_BUTTONS; i++) { button_start[i] = 0; button_pressed[i] = 0; } just_waked_up = 1; // log_byte(PORTB); } static void do_sleep() { log_byte(0xb0); log_flush(); hw_suspend(); gpio_before_poweroff(); // Set the status LED on again while((PINB & _BV(PB6)) == 0) ; // wait for button release _delay_ms(100); susp_gpio(); // disable the status LED power_down(); } static void inline long_press(unsigned char n) { if (n == 0) do_sleep(); } static void inline short_press(unsigned char n) { if (n == 0) gpio_set(2,1); } void timer_check_buttons() { unsigned char pinb = PINB; unsigned char i; unsigned char port_states[N_BUTTONS] = { pinb & _BV(PB6), pinb & _BV(PB4), }; for (i = 0; i < N_BUTTONS; i++) { if (!port_states[i]) { // is pressed if (i == 0 && just_waked_up) continue; if (button_pressed[i] == 0) { // begin of button press button_pressed[i] = 1; button_start[i] = jiffies; #if 0 log_byte(0xC0); log_word(jiffies); #endif } else if (button_pressed[i] == 1) { // been already pressed uint16_t duration = jiffies - button_start[i]; if (duration > 80) { // long button press button_pressed[i] = 2; long_press(i); } } } else { // is not pressed if (i == 0) just_waked_up = 0; if (button_pressed[i]) { // just depressed uint16_t duration = jiffies - button_start[i]; #if 1 log_byte(0xC1); log_word(duration); log_flush(); #endif button_pressed[i] = 0; if (duration > 6 && duration < 30) short_press(i); } } } }