Index: firmware/backlight.c =================================================================== --- firmware/backlight.c (revision 20781) +++ firmware/backlight.c (working copy) @@ -144,6 +144,7 @@ #ifdef HAS_BUTTON_HOLD static int backlight_on_button_hold = 0; #endif +static void backlight_timeouts_handler(void); #ifdef HAVE_BUTTON_LIGHT static int buttonlight_timer; @@ -578,7 +579,7 @@ queue_wait_w_tmo(&backlight_queue, &ev, FADE_DELAY); else #endif - queue_wait(&backlight_queue, &ev); + queue_wait_w_tmo(&backlight_queue, &ev, HZ); switch(ev.id) { /* These events must always be processed */ #ifdef _BACKLIGHT_FADE_BOOST @@ -690,54 +691,65 @@ remote_backlight_update_state(); #endif break; + case SYS_TIMEOUT: + backlight_timeouts_handler(); #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \ || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG) - case SYS_TIMEOUT: if ((_backlight_fade_step(backlight_fading_state))) backlight_fading_state = NOT_FADING; /* finished fading */ +#endif /* CONFIG_BACKLIGHT_FADING */ break; -#endif /* CONFIG_BACKLIGHT_FADING */ } } /* end while */ } -static void backlight_tick(void) +static void backlight_timeouts_handler(void) { + static long last_tick = 0; + unsigned long delta = (unsigned long)(current_tick - last_tick); if(backlight_timer) { - if(--backlight_timer == 0) + backlight_timer -= delta; + if(backlight_timer <= 0) { - backlight_off(); + backlight_timer = 0; + _backlight_off(); } } #ifdef HAVE_LCD_SLEEP else if(lcd_sleep_timer) { - if(--lcd_sleep_timer == 0) + lcd_sleep_timer -= delta; + if(lcd_sleep_timer <= 0) { - /* Queue on bl thread or freeze! */ - queue_post(&backlight_queue, LCD_SLEEP, 0); + lcd_sleep_timer = 0; + lcd_sleep(); } } #endif /* HAVE_LCD_SLEEP */ #ifdef HAVE_REMOTE_LCD if(remote_backlight_timer) { - if(--remote_backlight_timer == 0) + remote_backlight_timer -= delta; + if(remote_backlight_timer <= 0) { - remote_backlight_off(); + remote_backlight_timer = 0; + _remote_backlight_off(); } } #endif /* HAVE_REMOVE_LCD */ #ifdef HAVE_BUTTON_LIGHT if (buttonlight_timer) { - if (--buttonlight_timer == 0) + buttonlight_timer -= delta; + if (buttonlight_timer <= 0) { - buttonlight_off(); + buttonlight_timer = 0; + _buttonlight_off(); } } #endif /* HAVE_BUTTON_LIGHT */ + last_tick = current_tick; } void backlight_init(void) @@ -764,7 +776,6 @@ sizeof(backlight_stack), 0, backlight_thread_name IF_PRIO(, PRIORITY_USER_INTERFACE) IF_COP(, CPU)); - tick_add_task(backlight_tick); } #ifdef BACKLIGHT_DRIVER_CLOSE