#include #include #include "lights.h" static uint16_t button_start[N_BUTTONS]; static unsigned char button_pressed[N_BUTTONS]; void init_buttons() { // MCUCR |= _BV(ISC00); // any edge generates IRQ // GIMSK |= _BV(INT0); // enable INT0 DDRB &= ~(_BV(PB6) | _BV(PB0)); PORTB |= _BV(PB6) | _BV(PB0); // log_byte(PORTB); } extern unsigned char led1_counter; static void inline long_press(unsigned char n) { led_set_status(2); } static void inline short_press(unsigned char n) { led_set_status(1); } void timer_check_buttons() { unsigned char pinb = PINB; unsigned char i; unsigned char port_states[N_BUTTONS] = { pinb & _BV(PB6), pinb & _BV(PB0), }; for (i = 0; i < N_BUTTONS; i++) { if (!port_states[i]) { // is pressed 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 (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); } } } } #if 0 ISR(INT0_vect) { unsigned char tmpval = PINB & _BV(PB6); gpio_set(GPIO_LED2, tmpval); log_byte(0xbb); log_flush(); } #endif