--- /dev/null
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+#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
+