From 01e1d3b0da770db9cc4dc9a7fd649548e60ac0ec Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Thu, 30 Aug 2012 01:58:19 +0200 Subject: [PATCH] preliminary long keypress to power-down --- buttons.c | 40 ++++++++++++++++++++++++++++++---------- lights.h | 3 +++ main.c | 19 ++++++++++++------- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/buttons.c b/buttons.c index b58ca2a..d5a18be 100644 --- a/buttons.c +++ b/buttons.c @@ -1,26 +1,48 @@ #include #include +#include #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 diff --git a/lights.h b/lights.h index d357b55..56345fb 100644 --- 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 57ffa14..416a651 100644 --- 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 -- 2.39.3