X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?p=bike-lights.git;a=blobdiff_plain;f=firmware%2Fbuttons.c;h=9a4c7e1172dfd52f1374969148f74945e3dc92bb;hp=84dd8da680a1019bfadd5f2992cb8e52f9068d86;hb=33c451a9ba18c59b405d735b2420bc7b549643a4;hpb=a06ea914a745c95ca286ea41337ff5bbf3d02cbd diff --git a/firmware/buttons.c b/firmware/buttons.c index 84dd8da..9a4c7e1 100644 --- a/firmware/buttons.c +++ b/firmware/buttons.c @@ -1,53 +1,59 @@ #include #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; +static unsigned char just_waked_up; void init_buttons() { + unsigned char i; + DDRB &= ~(_BV(PB4) | _BV(PB6)); PORTB |= _BV(PB4) | _BV(PB6); - sleep_after_release = 0; - // log_byte(PORTB); -} + for (i=0; i < N_BUTTONS; i++) { + button_start[i] = 0; + button_pressed[i] = 0; + } -static void inline long_press(unsigned char n) -{ - sleep_after_release = 1; - gpio_set(1, 1); + just_waked_up = 1; + + // log_byte(PORTB); } 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(); + + hw_suspend(); + gpio_before_poweroff(); // Set the status LED on again + + while((PINB & _BV(PB6)) == 0) + ; // wait for button release + + _delay_ms(100); + + susp_gpio(); // disable the status LED + + power_down(); +} + +static void inline long_press(unsigned char n) +{ + if (n == 0) + do_sleep(); } static void inline short_press(unsigned char n) { - led_set_status(1); + if (n == 0) + gpio_set(2,1); } void timer_check_buttons() @@ -58,15 +64,18 @@ void timer_check_buttons() pinb & _BV(PB6), pinb & _BV(PB4), }; + for (i = 0; i < N_BUTTONS; i++) { if (!port_states[i]) { // is pressed + if (i == 0 && just_waked_up) + continue; if (button_pressed[i] == 0) { // begin of button press button_pressed[i] = 1; button_start[i] = jiffies; #if 0 - // log_byte(0xC0); - // log_word(jiffies); + log_byte(0xC0); + log_word(jiffies); #endif } else if (button_pressed[i] == 1) { // been already pressed @@ -78,6 +87,8 @@ void timer_check_buttons() } } } else { // is not pressed + if (i == 0) + just_waked_up = 0; if (button_pressed[i]) { // just depressed uint16_t duration = jiffies - button_start[i]; #if 1 @@ -88,17 +99,8 @@ void timer_check_buttons() button_pressed[i] = 0; if (duration > 6 && duration < 30) short_press(i); - if (sleep_after_release) - do_sleep(); } } } } -ISR(INT0_vect) -{ - hw_setup(); - log_byte(0xbb); - log_flush(); -} -