X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=firmware%2Fbuttons.c;h=d0cbd51b10c5d2bff3ef35e85abc315d2f099907;hb=320b394fa14a973bcb68fcbd2af65a79462e30bc;hp=d5a18bec515ba2d7f3f17d645b923ffebe2e823b;hpb=f956c1fa7f47b0e8b8afe323c2eff1b6c2607c2a;p=bike-lights.git diff --git a/firmware/buttons.c b/firmware/buttons.c index d5a18be..d0cbd51 100644 --- a/firmware/buttons.c +++ b/firmware/buttons.c @@ -1,72 +1,81 @@ #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() { - DDRB &= ~(_BV(PB6) | _BV(PB0)); - PORTB |= _BV(PB6) | _BV(PB0); + unsigned char i; - sleep_after_release = 0; - // log_byte(PORTB); -} + DDRA &= ~(_BV(PA3) | _BV(PA4)); + PORTA |= _BV(PA3) | _BV(PA4); -static void inline long_press(unsigned char n) -{ - sleep_after_release = 1; - gpio_set(1, 1); + for (i=0; i < N_BUTTONS; i++) { + button_start[i] = 0; + button_pressed[i] = 0; + } + + just_waked_up = 1; + + // log_byte(PORTA); } 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((PINA & _BV(PA3)) == 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() { - unsigned char pinb = PINB; + unsigned char pin = PINA; unsigned char i; unsigned char port_states[N_BUTTONS] = { - pinb & _BV(PB6), - pinb & _BV(PB0), + pin & _BV(PA3), + pin & _BV(PA4), }; + 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(); -} -