From 71a62802b0f1282c4996379c285dddcd790cf4a4 Mon Sep 17 00:00:00 2001 From: Maurus Cuelenaere Date: Thu, 17 Dec 2009 14:41:15 +0100 Subject: [PATCH] Add 2nd backlight timeout --- apps/lang/english.lang | 31 ++++++++++++++++++++++ apps/menus/display_menu.c | 4 +++ apps/settings.c | 2 + apps/settings.h | 2 + apps/settings_list.c | 8 +++++ firmware/backlight-sw-fading.c | 21 +++++++++++--- firmware/backlight.c | 46 +++++++++++++++++++++++++------- firmware/export/backlight-sw-fading.h | 10 +++++-- firmware/export/backlight.h | 2 + 9 files changed, 108 insertions(+), 18 deletions(-) diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 4d73592..f5dffa4 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -13287,3 +13287,34 @@ *: "of" + + id: LANG_2ND_BACKLIGHT + desc: in settings_menu + user: core + + *: "Secondary Backlight Timeout" + + + *: "Secondary Backlight Timeout" + + + *: "Secondary Backlight Timeout" + + + + id: LANG_2ND_BRIGHTNESS + desc: in settings_menu + user: core + + *: none + backlight_brightness: "Secondary Brightness" + + + *: none + backlight_brightness: "Secondary Brightness" + + + *: none + backlight_brightness: "Secondary Brightness" + + diff --git a/apps/menus/display_menu.c b/apps/menus/display_menu.c index 5559ece..c9eefaf 100644 --- a/apps/menus/display_menu.c +++ b/apps/menus/display_menu.c @@ -84,6 +84,7 @@ static int flipdisplay_callback(int action,const struct menu_item_ex *this_item) /* LCD MENU */ #ifdef HAVE_BACKLIGHT MENUITEM_SETTING(backlight_timeout, &global_settings.backlight_timeout, NULL); +MENUITEM_SETTING(backlight_2nd_timeout, &global_settings.backlight_2nd_timeout, NULL); #if CONFIG_CHARGING MENUITEM_SETTING(backlight_timeout_plugged, &global_settings.backlight_timeout_plugged, NULL); @@ -107,6 +108,7 @@ MENUITEM_SETTING(lcd_sleep_after_backlight_off, #endif #ifdef HAVE_BACKLIGHT_BRIGHTNESS MENUITEM_SETTING(brightness_item, &global_settings.brightness, NULL); +MENUITEM_SETTING(brightness_2nd_item, &global_settings.brightness_2nd, NULL); #endif #endif /* HAVE_BACKLIGHT */ #ifdef HAVE_LCD_CONTRAST @@ -126,6 +128,7 @@ MAKE_MENU(lcd_settings,ID2P(LANG_LCD_MENU), NULL, Icon_Display_menu #ifdef HAVE_BACKLIGHT ,&backlight_timeout + ,&backlight_2nd_timeout # if CONFIG_CHARGING ,&backlight_timeout_plugged # endif @@ -143,6 +146,7 @@ MAKE_MENU(lcd_settings,ID2P(LANG_LCD_MENU), # endif # ifdef HAVE_BACKLIGHT_BRIGHTNESS ,&brightness_item + ,&brightness_2nd_item # endif #endif /* HAVE_BACKLIGHT */ #ifdef HAVE_LCD_CONTRAST diff --git a/apps/settings.c b/apps/settings.c index 9492448..e02c0db 100644 --- a/apps/settings.c +++ b/apps/settings.c @@ -833,9 +833,11 @@ void settings_apply(bool read_disk) #endif /* HAVE_REMOTE_LCD */ #ifdef HAVE_BACKLIGHT_BRIGHTNESS backlight_set_brightness(global_settings.brightness); + backlight_set_2nd_brightness(global_settings.brightness_2nd); #endif #ifdef HAVE_BACKLIGHT backlight_set_timeout(global_settings.backlight_timeout); + backlight_set_2nd_timeout(global_settings.backlight_2nd_timeout); #if CONFIG_CHARGING backlight_set_timeout_plugged(global_settings.backlight_timeout_plugged); #endif diff --git a/apps/settings.h b/apps/settings.h index ea7138c..7dc8e39 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -692,6 +692,7 @@ struct user_settings int backlight_timeout; /* backlight off timeout: 0-18 0=never, 1=always, then according to timeout_values[] */ + int backlight_2nd_timeout; /* backlight 2nd off timeout */ bool caption_backlight; /* turn on backlight at end and start of track */ bool bl_filter_first_keypress; /* filter first keypress when dark? */ #if CONFIG_CHARGING @@ -716,6 +717,7 @@ struct user_settings #endif #ifdef HAVE_BACKLIGHT_BRIGHTNESS int brightness; + int brightness_2nd; #endif #ifdef HAVE_REMOTE_LCD diff --git a/apps/settings_list.c b/apps/settings_list.c index a60ee3f..4ecdc95 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -585,6 +585,10 @@ const struct settings_list settings[] = { "backlight timeout", off_on, UNIT_SEC, backlight_formatter, backlight_getlang, backlight_set_timeout, 20, -1,0,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120), + TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_2nd_timeout, LANG_2ND_BACKLIGHT, 15, + "backlight 2nd timeout", off_on, UNIT_SEC, backlight_formatter, + backlight_getlang, backlight_set_2nd_timeout, 20, + -1,1,2,3,4,5,6,7,8,9,10,15,20,25,30,45,60,90,120), #if CONFIG_CHARGING TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, backlight_timeout_plugged, LANG_BACKLIGHT_ON_WHEN_CHARGING, 10, @@ -761,6 +765,10 @@ const struct settings_list settings[] = { DEFAULT_BRIGHTNESS_SETTING, "brightness",UNIT_INT, MIN_BRIGHTNESS_SETTING, MAX_BRIGHTNESS_SETTING, 1, NULL, NULL, backlight_set_brightness), + INT_SETTING(F_NO_WRAP, brightness_2nd, LANG_2ND_BRIGHTNESS, + DEFAULT_BRIGHTNESS_SETTING, "brightness_2nd",UNIT_INT, + MIN_BRIGHTNESS_SETTING, MAX_BRIGHTNESS_SETTING, 1, + NULL, NULL, backlight_set_2nd_brightness), #endif /* backlight fading */ #if defined(HAVE_BACKLIGHT_FADING_INT_SETTING) diff --git a/firmware/backlight-sw-fading.c b/firmware/backlight-sw-fading.c index b9c9587..e044729 100644 --- a/firmware/backlight-sw-fading.c +++ b/firmware/backlight-sw-fading.c @@ -35,6 +35,7 @@ /* can be MIN_BRIGHTNESS_SETTING-1 */ static int current_brightness = DEFAULT_BRIGHTNESS_SETTING; +static int brightness_2nd = MAX_BRIGHTNESS_SETTING / 2; void _backlight_fade_update_state(int brightness) { @@ -52,9 +53,10 @@ static bool _backlight_fade_up(void) } /* returns true if fade is finished */ -static bool _backlight_fade_down(void) +static bool _backlight_fade_down(bool fading_2nd) { - if (LIKELY(current_brightness > MIN_BRIGHTNESS_SETTING)) + int level = fading_2nd ? brightness_2nd : MIN_BRIGHTNESS_SETTING; + if (LIKELY(current_brightness > level)) { _backlight_set_brightness(--current_brightness); return false; @@ -63,7 +65,8 @@ static bool _backlight_fade_down(void) { /* decrement once more, since backlight is off */ current_brightness--; - _backlight_off(); + if(!fading_2nd) + _backlight_off(); return true; } } @@ -71,13 +74,13 @@ static bool _backlight_fade_down(void) bool _backlight_fade_step(int direction) { bool done; - switch(direction) + switch(direction & FADING_UPDOWN_MASK) { case FADING_UP: done = _backlight_fade_up(); break; case FADING_DOWN: - done = _backlight_fade_down(); + done = _backlight_fade_down(direction & FADING_2ND); break; default: done = true; @@ -85,3 +88,11 @@ bool _backlight_fade_step(int direction) } return(done); } + +void backlight_set_2nd_brightness(int val) +{ + if(val > backlight_brightness) + val = backlight_brightness; + + brightness_2nd = val; +} diff --git a/firmware/backlight.c b/firmware/backlight.c index 27bc8a4..d36f56e 100644 --- a/firmware/backlight.c +++ b/firmware/backlight.c @@ -104,6 +104,7 @@ int backlight_brightness = DEFAULT_BRIGHTNESS_SETTING; #endif static int backlight_timer SHAREDBSS_ATTR; static int backlight_timeout_normal = 5*HZ; +static int backlight_timeout_normal_2nd = (5*HZ)/2; #if CONFIG_CHARGING static int backlight_timeout_plugged = 5*HZ; #endif @@ -362,8 +363,9 @@ static void backlight_setup_fade_up(void) } } -static void backlight_setup_fade_down(void) +static void backlight_setup_fade_down(bool fade_2nd) { + (void)fade_2nd; /* FIXME */ if (bl_fade_out_step > 0) { backlight_dim(0); @@ -433,11 +435,13 @@ static void backlight_setup_fade_up(void) } } -static void backlight_setup_fade_down(void) +static void backlight_setup_fade_down(bool fade_2nd) { if (backlight_fading_type & FADING_DOWN) { backlight_fading_state = FADING_DOWN; + if(fade_2nd) + backlight_fading_state |= FADING_2ND; } else { @@ -456,12 +460,14 @@ static void backlight_setup_fade_down(void) } #endif /* CONFIG_BACKLIGHT_FADING */ -static inline void do_backlight_off(void) +static inline void do_backlight_off(bool fade_2nd) { - backlight_timer = 0; + if(!fade_2nd) + backlight_timer = -1; #if BACKLIGHT_FADE_IN_THREAD - backlight_setup_fade_down(); + backlight_setup_fade_down(fade_2nd); #else + (void) fade_2nd; _backlight_off(); /* targets that have fading need to start the countdown when done with * fading */ @@ -480,7 +486,7 @@ static void backlight_update_state(void) /* Backlight == OFF in the setting? */ if (UNLIKELY(timeout < 0)) { - do_backlight_off(); + do_backlight_off(false); #if (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_SETTING) \ || (CONFIG_BACKLIGHT_FADING == BACKLIGHT_FADING_SW_HW_REG) /* necessary step to issue fading down when the setting is selected */ @@ -609,7 +615,7 @@ void backlight_thread(void) break; case BACKLIGHT_OFF: - do_backlight_off(); + do_backlight_off(false); break; #ifdef HAVE_BACKLIGHT_BRIGHTNESS case BACKLIGHT_BRIGHTNESS_CHANGED: @@ -682,12 +688,17 @@ void backlight_thread(void) static void backlight_timeout_handler(void) { - if(backlight_timer > 0) + if(backlight_timer >= 0) { backlight_timer -= BACKLIGHT_THREAD_TIMEOUT; - if(backlight_timer <= 0) + if(backlight_timer == backlight_timeout_normal + - backlight_timeout_normal_2nd) { - do_backlight_off(); + do_backlight_off(true); + } + else if(backlight_timer <= 0) + { + do_backlight_off(false); } } #ifdef HAVE_LCD_SLEEP @@ -812,6 +823,21 @@ void backlight_set_timeout(int value) queue_post(&backlight_queue, BACKLIGHT_TMO_CHANGED, 0); } +void backlight_set_2nd_timeout(int value) +{ + if (value == -1) + value = INT_MAX; + else + { + value *= HZ; + if (value > backlight_timeout_normal) + value = backlight_timeout_normal; + } + + backlight_timeout_normal_2nd = value; + queue_post(&backlight_queue, BACKLIGHT_TMO_CHANGED, 0); +} + #if CONFIG_CHARGING void backlight_set_timeout_plugged(int value) { diff --git a/firmware/export/backlight-sw-fading.h b/firmware/export/backlight-sw-fading.h index 7a0deda..73f26d7 100644 --- a/firmware/export/backlight-sw-fading.h +++ b/firmware/export/backlight-sw-fading.h @@ -35,13 +35,17 @@ void _backlight_fade_update_state(int brightness); bool _backlight_fade_step(int direction); +void backlight_set_2nd_brightness(int val); /* enum used for both, fading state and fading type selected through the settings */ enum { - NOT_FADING = 0, - FADING_UP, - FADING_DOWN, + NOT_FADING = 0, + FADING_UP = 1, + FADING_DOWN = 2, + FADING_2ND = 4, }; +#define FADING_UPDOWN_MASK 0x3 + #endif /* BACKLIGHT_SW_FADING_H */ diff --git a/firmware/export/backlight.h b/firmware/export/backlight.h index c440db4..ba05ac8 100644 --- a/firmware/export/backlight.h +++ b/firmware/export/backlight.h @@ -22,6 +22,7 @@ #define BACKLIGHT_H #include "config.h" +#include "backlight-sw-fading.h" @@ -34,6 +35,7 @@ bool is_backlight_on(bool ignore_always_off); void backlight_on(void); void backlight_off(void); void backlight_set_timeout(int value); +void backlight_set_2nd_timeout(int val); #ifdef HAVE_BACKLIGHT void backlight_init(void); -- 1.6.5.5