Guarantee to restore brightness to default on LCDON 47/240647/2
authorYoungjae Cho <y0.cho@samsung.com>
Thu, 6 Aug 2020 02:12:06 +0000 (11:12 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Tue, 11 Aug 2020 02:43:56 +0000 (02:43 +0000)
AutoBrightnessChanged with level 0 on LCDON will check brightness. If
the current brightnes is different to default brightness, restore the
brightness to the default brightness. This is especially important for
turning on LCD from AOD clock as the deferred brightness effect is
applied at this point.

Change-Id: Ia82a058c5d462d7739d51d161e2740586d990247
Signed-off-by: Youngjae Cho <y0.cho@samsung.com>
plugins/wearable/display/auto-brightness-sensorhub.c
plugins/wearable/display/display-handler.c

index c096090..2d10285 100644 (file)
@@ -38,7 +38,7 @@
 
 static struct display_plugin *disp_plgn;
 static int auto_brightness_state = SETTING_BRIGHTNESS_AUTOMATIC_OFF;
-static bool lbm, hbm, hold, lowdim;
+static bool lbm, hbm, hold_brt, lowdim;
 
 static void change_brightness_transit(int start, int end)
 {
@@ -48,6 +48,9 @@ static void change_brightness_transit(int start, int end)
 
 static void set_brightness_level(int level)
 {
+       int default_brightness;
+       int current_brightness;
+
        if (get_pm_cur_state() != S_NORMAL)
                return;
 /*
@@ -83,16 +86,19 @@ static void set_brightness_level(int level)
                auto_brightness_control(BR_HBM_ON, BR_IMPLICIT);
                break;
        case SPECIFIC_MODE_OFF:
-               /*
-                * Disable LBM or HBM.
-                * If the flag hold is set when disabling LBM, brightness remains
-                * held brightness. (FYI. HBM and Hold cannot be both enabled, so
-                * no need to consider hold flag when disabling HBM)
-                * Otherwise, brightness changes to default or dim brightness
-                * depending on flag lowdim.
-                */
+               default_brightness = backlight_ops.get_default_brt();
+               backlight_ops.get_brightness(&current_brightness);
+
+               /* Disable HBM, LBM */
                auto_brightness_control(BR_HBM_OFF, BR_IMPLICIT);
                auto_brightness_control(BR_LBM_OFF, BR_IMPLICIT);
+
+               /* For AOD -> LCDON, brightness effect is deferred to this point */
+               if (current_brightness != default_brightness && !hold_brt && !lowdim) {
+                       change_brightness_transit(current_brightness, default_brightness);
+                       auto_brightness_control(BR_SET_BRIGHTNESS, default_brightness);
+               }
+
                break;
        default:
                /*
@@ -148,10 +154,10 @@ static void change_flag(bool *flag, bool value)
        // previous
        int plbm = lbm;
        int phbm = hbm;
-       int phold = hold;
+       int phold = hold_brt;
        int pld = lowdim;
 
-       if (flag != &lbm && flag != &hbm && flag != &hold && flag != &lowdim) {
+       if (flag != &lbm && flag != &hbm && flag != &hold_brt && flag != &lowdim) {
                _E("Invalid flag setting.");
                return;
        }
@@ -164,7 +170,7 @@ static void change_flag(bool *flag, bool value)
 
        _D("Change flag LBM/HBM/Hold/LowDim: %d%d%d%d -> %d%d%d%d",
                plbm, phbm, phold, pld,
-               lbm, hbm, hold, lowdim);
+               lbm, hbm, hold_brt, lowdim);
 }
 
 int auto_brightness_control(enum brightness_request_e request, int set_brightness)
@@ -179,28 +185,28 @@ int auto_brightness_control(enum brightness_request_e request, int set_brightnes
        if (request == BR_LBM_ON) {
                if (!get_lbm_setting())
                        return 0;
-               if (!lbm && !hbm && !hold && !lowdim) {
+               if (!lbm && !hbm && !hold_brt && !lowdim) {
                        change_brightness_transit(default_brightness, lbm_down_brt(default_brightness));
                        lbm_set_state(true);
                        backlight_ops.set_brightness(default_brightness);
                        change_flag(&lbm, 1);
-               } else if (!lbm && !hbm && !hold && lowdim) {
+               } else if (!lbm && !hbm && !hold_brt && lowdim) {
                        change_brightness_transit(current_brightness, lbm_down_brt(current_brightness));
                        lbm_set_state(true);
                        backlight_ops.set_brightness(current_brightness);
                        change_flag(&lbm, 1);
-               } else if (!lbm && !hbm && hold) {
+               } else if (!lbm && !hbm && hold_brt) {
                        change_flag(&lbm, 1);
                }
        } else if (request == BR_HBM_ON) {
-               if (!lbm && !hbm && !hold) {
+               if (!lbm && !hbm && !hold_brt) {
                        if (!lowdim)
                                change_brightness_transit(default_brightness, PM_MAX_BRIGHTNESS);
                        else
                                change_brightness_transit(current_brightness, PM_MAX_BRIGHTNESS);
                        hbm_set_state(true);
                        change_flag(&hbm, 1);
-               } else if (!lbm && !hbm && hold) {
+               } else if (!lbm && !hbm && hold_brt) {
                        _E("Someone holds brightness, HBM is ignored.");
                        return -EBUSY;
                }
@@ -209,21 +215,21 @@ int auto_brightness_control(enum brightness_request_e request, int set_brightnes
                        _E("HBM state. Hold brightness is ignored.");
                        return -EBUSY;
                }
-               if (lbm && !hold) {
+               if (lbm && !hold_brt) {
                        lbm_set_state(false);
                        change_brightness_transit(lbm_down_brt(current_brightness), set_brightness);
                } else {
                        backlight_ops.set_brightness(set_brightness);
                }
-               change_flag(&hold, 1);
+               change_flag(&hold_brt, 1);
        } else if (request == BR_LOWDIM_ON) {
                if (!lowdim) {
-                       if (!hbm && !hold && (get_pm_cur_state() == S_NORMAL))
+                       if (!hbm && !hold_brt && (get_pm_cur_state() == S_NORMAL))
                                backlight_ops.dim();
                        change_flag(&lowdim, 1);
                }
        } else if (request == BR_LBM_OFF) {
-               if (lbm && !hold) {
+               if (lbm && !hold_brt) {
                        lbm_set_state(false);
                        change_flag(&lbm, 0);
 
@@ -237,7 +243,7 @@ int auto_brightness_control(enum brightness_request_e request, int set_brightnes
                        } else {
                                backlight_ops.dim();
                        }
-               } else if (lbm && hold) {
+               } else if (lbm && hold_brt) {
                        change_flag(&lbm, 0);
                }
        } else if (request == BR_HBM_OFF) {
@@ -250,8 +256,8 @@ int auto_brightness_control(enum brightness_request_e request, int set_brightnes
                        change_flag(&hbm, 0);
                }
        } else if (request == BR_RELEASE_BRIGHTNESS) {
-               if (!lbm && hold) {
-                       change_flag(&hold, 0);
+               if (!lbm && hold_brt) {
+                       change_flag(&hold_brt, 0);
 
                        /* called by DEVICE_NOTIFIER_LCD_OFF_COMPLETE, no need to change brightness */
                        if (get_pm_cur_state() != S_NORMAL)
@@ -261,8 +267,8 @@ int auto_brightness_control(enum brightness_request_e request, int set_brightnes
                                backlight_ops.set_brightness(default_brightness);
                        else
                                backlight_ops.dim();
-               } else if (lbm && hold) {
-                       change_flag(&hold, 0);
+               } else if (lbm && hold_brt) {
+                       change_flag(&hold_brt, 0);
                        if (!lowdim) {
                                change_brightness_transit(current_brightness, lbm_down_brt(default_brightness));
                                lbm_set_state(true);
@@ -275,15 +281,15 @@ int auto_brightness_control(enum brightness_request_e request, int set_brightnes
                }
        } else if (request == BR_LOWDIM_OFF) {
                if (lowdim) {
-                       if (!hbm && !hold && (get_pm_cur_state() == S_NORMAL))
+                       if (!hbm && !hold_brt && (get_pm_cur_state() == S_NORMAL))
                                backlight_ops.update();
                        change_flag(&lowdim, 0);
                }
        } else if (request == BR_SET_BRIGHTNESS) {
-               if (lbm && hold)
+               if (lbm && hold_brt)
                        lbm_set_state(true);
                change_flag(&lowdim, 0);
-               change_flag(&hold, 0);
+               change_flag(&hold_brt, 0);
                backlight_ops.set_default_brt(set_brightness);
                if (!hbm) {
                        ret = backlight_ops.set_brightness(set_brightness);
@@ -322,7 +328,7 @@ static int display_off_complete_changed(void *data)
 int auto_brightness_restore(void)
 {
        /* maintain hold brightness */
-       if (hold)
+       if (hold_brt)
                return 0;
 
        /* update to the default brightness */
index 1c5dd09..ddb25cd 100644 (file)
@@ -53,6 +53,11 @@ static gboolean lcdon_from_aod_cb(gpointer data)
        int level = (int) data;
 
        autobrt_timer = 0;
+
+       /* If it is still not turned on, do not apply auto brightness */
+       if (backlight_ops.get_lcd_power() != DPMS_ON)
+               return G_SOURCE_REMOVE;
+
        backlight_ops.transit_state(DPMS_ON);
        display_info.set_brightness_level(level);