]> www.fi.muni.cz Git - bike-lights.git/blobdiff - buttons.c
preliminary long keypress to power-down
[bike-lights.git] / buttons.c
index b58ca2adade9d384e17659da9202df9508fdf438..d5a18bec515ba2d7f3f17d645b923ffebe2e823b 100644 (file)
--- a/buttons.c
+++ b/buttons.c
@@ -1,26 +1,48 @@
 #include <avr/io.h>
 #include <avr/interrupt.h>
+#include <avr/sleep.h>
 
 #include "lights.h"
 
 static uint16_t button_start[N_BUTTONS];
 static unsigned char button_pressed[N_BUTTONS];
 
+static unsigned char sleep_after_release;
+
 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);
 
+       sleep_after_release = 0;
        // log_byte(PORTB);
 }
 
-extern unsigned char led1_counter;
-
 static void inline long_press(unsigned char n)
 {
-       led_set_status(2);
+       sleep_after_release = 1;
+       gpio_set(1, 1);
+}
+
+static void do_sleep()
+{
+       // led_set_status(2);
+       // MCUCR |= _BV(ISC00); // any edge generates IRQ
+       log_byte(0xb0);
+       log_flush();
+       set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+       PORTA = 0;
+       PORTB = 0;
+       DDRA = 0;
+       DDRB = 0;
+       GIMSK |= _BV(INT0); // enable INT0
+       sleep_enable();
+       sei();
+       sleep_cpu();
+       sleep_disable();
+       cli();
+       GIMSK &= ~_BV(INT0); // disable INT0
+       hw_setup();
 }
 
 static void inline short_press(unsigned char n)
@@ -66,19 +88,17 @@ void timer_check_buttons()
                                button_pressed[i] = 0;
                                if (duration > 6 && duration < 30)
                                        short_press(i);
+                               if (sleep_after_release)
+                                       do_sleep();
                        }
                }
        }
 }
 
-#if 0
 ISR(INT0_vect)
 {
-       unsigned char tmpval = PINB & _BV(PB6);
-
-       gpio_set(GPIO_LED2, tmpval);
+       hw_setup();
        log_byte(0xbb);
        log_flush();
 }
-#endif