]> www.fi.muni.cz Git - bike-lights.git/commitdiff
preliminary long keypress to power-down
authorJan "Yenya" Kasprzak <kas@fi.muni.cz>
Wed, 29 Aug 2012 23:58:19 +0000 (01:58 +0200)
committerJan "Yenya" Kasprzak <kas@fi.muni.cz>
Fri, 31 Aug 2012 21:08:11 +0000 (23:08 +0200)
buttons.c
lights.h
main.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
 
index d357b55d8906aa28c192f85b3457298fb1796ecf..56345fb9f7819354299f419804d19653f2bdbd5b 100644 (file)
--- a/lights.h
+++ b/lights.h
@@ -64,5 +64,8 @@ void led_set_status(unsigned char status);
 void init_buttons();
 void timer_check_buttons();
 
+/* init.c */
+void hw_setup();
+
 #endif /* !LIGHTS_H__ */
 
diff --git a/main.c b/main.c
index 57ffa14c097e2fcfd4af0df4241b795326450165..416a6519dd3313729f203092130bf851ca886472 100644 (file)
--- a/main.c
+++ b/main.c
@@ -5,12 +5,8 @@
 
 #include "lights.h"
 
-int main(void)
+void hw_setup()
 {
-       log_init();
-
-       _delay_ms(1500);
-
        init_pwm();
        init_adc();
        init_tmr();
@@ -21,9 +17,18 @@ int main(void)
        ambient_init();
        pattern_init();
 
-       log_set_state(3);
-
        set_sleep_mode(SLEEP_MODE_IDLE);
+}
+
+int main(void)
+{
+       log_init();
+
+       _delay_ms(1500);
+
+       hw_setup();
+
+       log_set_state(3);
 
        sei();
 #if 1