]> www.fi.muni.cz Git - bike-lights.git/blobdiff - buttons.c
preliminary button handling code
[bike-lights.git] / buttons.c
diff --git a/buttons.c b/buttons.c
new file mode 100644 (file)
index 0000000..83664c7
--- /dev/null
+++ b/buttons.c
@@ -0,0 +1,70 @@
+#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
+