#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; 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]) { // been already pressed // TODO long button press /* uint16_t duration = jiffies - button_start[i]; if (duration > 10 && duration < 40) { gpio_set(GPIO_LED2, 1); } */ } else { // begin of button press button_pressed[i] = 1; button_start[i] = jiffies; // log_byte(0xC0); // log_word(jiffies); } } else { // is not pressed if (button_pressed[i]) { // just depressed uint16_t duration = jiffies - button_start[i]; log_byte(0xC1); log_word(duration); log_flush(); // led_set_number_pattern(N_PWMLEDS, 1 + (duration >> 3)); button_pressed[i] = 0; } } break; // FIXME - delete this when btn1 is ready } } #if 0 ISR(INT0_vect) { unsigned char tmpval = PINB & _BV(PB6); gpio_set(GPIO_LED2, tmpval); log_byte(0xbb); log_flush(); } #endif