X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=buttons.c;h=d5a18bec515ba2d7f3f17d645b923ffebe2e823b;hb=b6712df8f0931170e6ef6c8adef712d74738fe7e;hp=83664c70f9a3e085a7985c1eca041669c5f6a948;hpb=569867e93d1689d327a4fbf496e41d90cb0a4e1c;p=bike-lights.git diff --git a/buttons.c b/buttons.c index 83664c7..d5a18be 100644 --- a/buttons.c +++ b/buttons.c @@ -1,22 +1,54 @@ #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) +{ + 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) +{ + led_set_status(1); +} void timer_check_buttons() { @@ -28,43 +60,45 @@ void timer_check_buttons() }; for (i = 0; i < N_BUTTONS; i++) { if (!port_states[i]) { // is pressed - if (button_pressed[i]) { // been already pressed - // TODO long button press - /* - uint16_t duration = jiffies - button_start[i]; - if (duration > 10 && duration < 40) { - gpio_set(GPIO_LED2, 1); - } - */ - } else { // begin of button press + 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); +#endif + } else if (button_pressed[i] == 1) { + // been already pressed + uint16_t duration = jiffies - button_start[i]; + if (duration > 80) { + // long button press + button_pressed[i] = 2; + long_press(i); + } } } else { // is not pressed if (button_pressed[i]) { // just depressed uint16_t duration = jiffies - button_start[i]; +#if 1 log_byte(0xC1); log_word(duration); log_flush(); - // led_set_number_pattern(N_PWMLEDS, 1 + (duration >> 3)); +#endif button_pressed[i] = 0; + if (duration > 6 && duration < 30) + short_press(i); + if (sleep_after_release) + do_sleep(); } } - - break; // FIXME - delete this when btn1 is ready } } -#if 0 ISR(INT0_vect) { - unsigned char tmpval = PINB & _BV(PB6); - - gpio_set(GPIO_LED2, tmpval); + hw_setup(); log_byte(0xbb); log_flush(); } -#endif