]> www.fi.muni.cz Git - bike-lights.git/blobdiff - firmware/buttons.c
buttons, wakeup rework
[bike-lights.git] / firmware / buttons.c
index 679d958cbec7e1585ae0e661a0140a740d0f3370..0742f927fb668a17d83d4ca3698e475f5f5a89f5 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "lights.h"
 
+#define WAKEUP_LIMIT   5       // times 100 ms
 static uint16_t button_start[N_BUTTONS];
 static unsigned char prev_pin;
 
@@ -113,8 +114,12 @@ static inline void long_press(unsigned char button)
 
 void init_buttons()
 {
-       DDRA &= ~(_BV(PA3) | _BV(PA4));
-       PORTA |=  _BV(PA3) | _BV(PA4);
+       DDRA &= ~(_BV(PA3) | _BV(PA4)); // set as input
+       PORTA |=  _BV(PA3) | _BV(PA4);  // enable internal pull-ups
+
+       GIMSK &= ~(_BV(PCIE0) | _BV(PCIE1)); // disable pin-change IRQs
+       PCMSK0 = 0; // disable pin-change IRQs on all pins of port A
+       PCMSK1 = 0; // disable pin-change IRQs on all pins of port B
 
        button_start[0] = 0;
        button_start[1] = 0;
@@ -122,6 +127,19 @@ void init_buttons()
        user_params_state = 0;
 }
 
+void susp_buttons()
+{
+       DDRA &= ~(_BV(PA3) | _BV(PA4)); // set as input
+       PORTA |=  _BV(PA3) | _BV(PA4);  // enable internal pull-ups
+
+       GIMSK &= ~_BV(PCIE1); // disable pin-change IRQ on port B
+       GIMSK |= _BV(PCIE0);
+
+       PCMSK0 = _BV(PCINT3) | _BV(PCINT4);
+               // disable pin-change IRQs on all pins except PA3,PA4
+       PCMSK1 = 0; // disable pin-change IRQs on all pins of port B
+}
+
 static void handle_button(unsigned char button, unsigned char cur,
        unsigned char prev)
 {
@@ -166,3 +184,28 @@ void timer_check_buttons()
        }
 }
 
+unsigned char buttons_wait_for_release()
+{
+       uint16_t wake_count = 0;
+       unsigned char pin;
+
+       do {
+               if (wake_count++ > WAKEUP_LIMIT)
+                       gpio_set(0, 1); // inform the user
+
+               _delay_ms(100);
+
+               pin = PINA & (_BV(PA3) | _BV(PA4));
+       } while (!(pin & _BV(PA3)) || !(pin & _BV(PA4)));
+
+       gpio_set(0, 0);
+
+       return wake_count > WAKEUP_LIMIT;
+
+}
+
+ISR(PCINT_vect)
+{
+       // empty - let it wake us from sleep, but do nothing else
+}
+