1 /*
2 * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "calculation_manager.h"
17
18 #include <algorithm>
19 #include <cmath>
20 #include <iostream>
21 #include <sstream>
22 #include <string>
23
24 #include "display_log.h"
25
26 namespace OHOS {
27 namespace DisplayPowerMgr {
28
29 namespace {
30 constexpr float DEFAULT_NO_OFFSET_LUX = -1.0f;
31 constexpr float DEFAULT_OFFSET_BRIGHTNESS = 0.0f;
32 constexpr float DEFAULT_OFFSET_DELTA = 0.0f;
33 constexpr float SMALL_VALUE = 1e-6f;
34 constexpr float DEFAULT_OFFSET_RATIO = 1.0f;
35 constexpr float MIN_OFFSET_RATIO = 0.0f;
36 constexpr float DEFAULT_MIN_DELTA = 1.0f;
37 constexpr float MIN_DEFAULT_BRIGHTNESS = 4.0f;
38 constexpr float MAX_DEFAULT_BRIGHTNESS = 255.0f;
39
40 constexpr float AMBIENT_VALID_MAX_LUX = 40000;
41 constexpr float AMBIENT_VALID_MIN_LUX = 0.0f;
42 constexpr float DEFAULT_BRIGHTNESS = 100.0f;
43 }
44
InitParameters()45 void BrightnessCalculationManager::InitParameters()
46 {
47 mBrightnessCalculationCurve.InitParameters();
48 }
49
GetInterpolatedValue(float lux)50 float BrightnessCalculationManager::GetInterpolatedValue(float lux)
51 {
52 float valueInterp = GetInterpolatedBrightenssLevel(mPosBrightness, lux) / MAX_DEFAULT_BRIGHTNESS;
53 DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetInterpolatedValue lux=%{public}f, valueInterp=%{public}f, "\
54 " mPosBrightness=%{public}f", lux, valueInterp, mPosBrightness);
55 return valueInterp;
56 }
57
GetInterpolatedBrightenssLevel(float positionBrightness,float lux)58 float BrightnessCalculationManager::GetInterpolatedBrightenssLevel(float positionBrightness, float lux)
59 {
60 float posBrightness = positionBrightness;
61 UpdateCurveAmbientLux(lux);
62 UpdateDefaultBrightness(lux);
63
64 if (mLastLuxDefaultBrightness <= DEFAULT_OFFSET_BRIGHTNESS && mPosBrightness != DEFAULT_OFFSET_BRIGHTNESS) {
65 posBrightness = DEFAULT_OFFSET_BRIGHTNESS;
66 ResetDefaultBrightnessOffset();
67 }
68
69 float offsetBrightness = mDefaultBrightnessFromLux;
70 if (IsDefaultBrightnessMode(posBrightness)) {
71 offsetBrightness = mDefaultBrightnessFromLux;
72 } else {
73 offsetBrightness = GetOffsetLevel(mStartLuxDefaultBrightness,
74 mDefaultBrightnessFromLux, posBrightness, mDelta);
75 }
76
77 mLastLuxDefaultBrightness = mDefaultBrightnessFromLux;
78 mOffsetBrightnessLast = offsetBrightness;
79 DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetLevel lux=%{public}f, offsetBrightness=%{public}f, default=%{public}f",
80 lux, offsetBrightness, mDefaultBrightnessFromLux);
81 return offsetBrightness;
82 }
83
UpdateDefaultBrightness(float lux)84 void BrightnessCalculationManager::UpdateDefaultBrightness(float lux)
85 {
86 float defaultBrightness = GetCurrentBrightness(lux);
87 mDefaultBrightnessFromLux = defaultBrightness;
88 }
89
GetCurrentBrightness(float lux)90 float BrightnessCalculationManager::GetCurrentBrightness(float lux)
91 {
92 return mBrightnessCalculationCurve.GetCurrentBrightness(lux);
93 }
94
UpdateParaFromReboot()95 void BrightnessCalculationManager::UpdateParaFromReboot()
96 {
97 mLastLuxDefaultBrightness = mDefaultBrightnessFromLux;
98 mStartLuxDefaultBrightness = mDefaultBrightnessFromLux;
99 mOffsetBrightnessLast = mDefaultBrightnessFromLux;
100 mIsReboot = false;
101 }
102
IsDefaultBrightnessMode(float positionBrightness)103 bool BrightnessCalculationManager::IsDefaultBrightnessMode(float positionBrightness)
104 {
105 if (positionBrightness == DEFAULT_OFFSET_DELTA) {
106 return true;
107 }
108 return false;
109 }
110
GetOffsetLevel(float brightnessStartOrig,float brightnessEndOrig,float brightnessStartNew,float delta)111 float BrightnessCalculationManager::GetOffsetLevel(float brightnessStartOrig, float brightnessEndOrig,
112 float brightnessStartNew, float delta)
113 {
114 float brightenRatio = 1.0f;
115 float darkenRatio = 1.0f;
116 float deltaStart = delta;
117 if (brightnessStartOrig < brightnessEndOrig) {
118 if (deltaStart > DEFAULT_OFFSET_DELTA) {
119 darkenRatio = GetDefaultBrightenOffsetBrightenRaio(brightnessStartOrig, brightnessEndOrig,
120 brightnessStartNew, deltaStart);
121 }
122 if (deltaStart < DEFAULT_OFFSET_DELTA) {
123 brightenRatio = GetDefaultDarkenOffsetBrightenRatio(brightnessStartOrig, brightnessEndOrig,
124 brightnessStartNew, deltaStart);
125 }
126 }
127 if (brightnessStartOrig > brightnessEndOrig) {
128 if (deltaStart < DEFAULT_OFFSET_DELTA) {
129 darkenRatio = GetDefaultDarkenOffsetDarkenRatio(brightnessStartOrig, brightnessEndOrig,
130 brightnessStartNew, deltaStart);
131 }
132 if (deltaStart > DEFAULT_OFFSET_DELTA) {
133 brightenRatio = GetDefaultBrightenOffsetDarkenRatio(brightnessStartOrig, brightnessEndOrig,
134 brightnessStartNew);
135 }
136 }
137 float tempDeltaNew = deltaStart * brightenRatio * darkenRatio;
138
139 float brightnessAndDelta = brightnessEndOrig + tempDeltaNew;
140 float offsetBrightnessTemp = (brightnessAndDelta > MIN_DEFAULT_BRIGHTNESS
141 ? brightnessAndDelta : MIN_DEFAULT_BRIGHTNESS);
142 float offsetBrightness = (offsetBrightnessTemp < MAX_DEFAULT_BRIGHTNESS
143 ? offsetBrightnessTemp : MAX_DEFAULT_BRIGHTNESS);
144 DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetOffsetLevel tempDeltaNew=%{public}f, deltaStart=%{public}f, "\
145 " brightenRatio=%{public}f, darkenRatio=%{public}f", tempDeltaNew, deltaStart, brightenRatio, darkenRatio);
146 return offsetBrightness;
147 }
148
GetDefaultBrightenOffsetBrightenRaio(float brightnessStartOrig,float brightnessEndOrig,float brightnessStartNew,float deltaStart)149 float BrightnessCalculationManager::GetDefaultBrightenOffsetBrightenRaio(float brightnessStartOrig,
150 float brightnessEndOrig, float brightnessStartNew, float deltaStart)
151 {
152 float brightenRatio;
153 if (std::abs(MAX_DEFAULT_BRIGHTNESS - brightnessStartOrig) < SMALL_VALUE) {
154 brightenRatio = DEFAULT_OFFSET_RATIO;
155 } else {
156 brightenRatio = (MAX_DEFAULT_BRIGHTNESS - brightnessEndOrig)
157 / (MAX_DEFAULT_BRIGHTNESS - brightnessStartOrig);
158 }
159
160 float offsetBrightnessTmp = ((1 - offsetBrightenAlphaRight)
161 * std::max(brightnessEndOrig, brightnessStartNew))
162 + (offsetBrightenAlphaRight * ((deltaStart * brightenRatio) + brightnessEndOrig));
163 if (std::abs(deltaStart) < SMALL_VALUE) {
164 brightenRatio = DEFAULT_OFFSET_RATIO;
165 } else {
166 brightenRatio = (offsetBrightnessTmp - brightnessEndOrig) / deltaStart;
167 }
168 if (brightenRatio < MIN_OFFSET_RATIO) {
169 brightenRatio = MIN_OFFSET_RATIO;
170 }
171 return brightenRatio;
172 }
173
174
GetAmbientOffsetLux()175 float BrightnessCalculationManager::GetAmbientOffsetLux()
176 {
177 float lux = static_cast<int>(mOffsetLux);
178 return lux;
179 }
180
GetBrightenOffsetNoValidBrightenLux(float lux)181 float BrightnessCalculationManager::GetBrightenOffsetNoValidBrightenLux(float lux)
182 {
183 float noValidBrightenLuxTh = AMBIENT_VALID_MAX_LUX;
184 return noValidBrightenLuxTh;
185 }
186
GetDefaultDarkenOffsetBrightenRatio(float brightnessStartOrig,float brightnessEndOrig,float brightnessStartNew,float deltaStart)187 float BrightnessCalculationManager::GetDefaultDarkenOffsetBrightenRatio(float brightnessStartOrig,
188 float brightnessEndOrig, float brightnessStartNew, float deltaStart)
189 {
190 float brightenRatio;
191 if (std::abs(MAX_DEFAULT_BRIGHTNESS - brightnessStartOrig) < SMALL_VALUE) {
192 brightenRatio = DEFAULT_OFFSET_RATIO;
193 } else {
194 brightenRatio = (MAX_DEFAULT_BRIGHTNESS - brightnessEndOrig)
195 / (MAX_DEFAULT_BRIGHTNESS - brightnessStartOrig);
196 }
197
198 if (brightenRatio < MIN_OFFSET_RATIO) {
199 brightenRatio = MIN_OFFSET_RATIO;
200 }
201 return brightenRatio;
202 }
203
GetDefaultDarkenOffsetDarkenRatio(float brightnessStartOrig,float brightnessEndOrig,float brightnessStartNew,float deltaStart)204 float BrightnessCalculationManager::GetDefaultDarkenOffsetDarkenRatio(float brightnessStartOrig,
205 float brightnessEndOrig, float brightnessStartNew, float deltaStart)
206 {
207 float darkenRatio;
208 if (std::abs(brightnessStartOrig - MIN_DEFAULT_BRIGHTNESS) < SMALL_VALUE) {
209 darkenRatio = DEFAULT_OFFSET_RATIO;
210 } else {
211 darkenRatio = (brightnessEndOrig - MIN_DEFAULT_BRIGHTNESS)
212 / (brightnessStartOrig - MIN_DEFAULT_BRIGHTNESS);
213 }
214 float offsetBrightnessTmp = ((1 - offsetDarkenAlphaLeft) * std::min(brightnessEndOrig,
215 brightnessStartNew)) + (offsetDarkenAlphaLeft * ((deltaStart * darkenRatio) + brightnessEndOrig));
216 if (std::abs(deltaStart) < SMALL_VALUE) {
217 darkenRatio = DEFAULT_OFFSET_RATIO;
218 } else {
219 darkenRatio = (offsetBrightnessTmp - brightnessEndOrig) / deltaStart;
220 }
221 if (darkenRatio < MIN_OFFSET_RATIO) {
222 darkenRatio = MIN_OFFSET_RATIO;
223 }
224 return darkenRatio;
225 }
226
GetDefaultBrightenOffsetDarkenRatio(float brightnessStartOrig,float brightnessEndOrig,float brightnessStartNew)227 float BrightnessCalculationManager::GetDefaultBrightenOffsetDarkenRatio(float brightnessStartOrig,
228 float brightnessEndOrig, float brightnessStartNew)
229 {
230 float darkenRatio;
231 if (std::abs(brightnessStartOrig) < SMALL_VALUE) {
232 darkenRatio = DEFAULT_OFFSET_RATIO;
233 } else {
234 float darkenRatioTmp = static_cast<float>(pow(brightnessEndOrig / brightnessStartOrig,
235 offsetBrightenRatioLeft));
236 darkenRatio = (offsetBrightenAlphaLeft * brightnessEndOrig / brightnessStartOrig)
237 + ((1 - offsetBrightenAlphaLeft) * darkenRatioTmp);
238 }
239 return darkenRatio;
240 }
241
UpdateBrightnessOffset(float posBrightness,float lux)242 void BrightnessCalculationManager::UpdateBrightnessOffset(float posBrightness, float lux)
243 {
244 if (lux < AMBIENT_VALID_MIN_LUX || lux > AMBIENT_VALID_MAX_LUX) {
245 return;
246 }
247 if (std::abs(posBrightness) < SMALL_VALUE) {
248 ResetDefaultBrightnessOffset();
249 return;
250 }
251 mOffsetLux = lux;
252 mStartLuxDefaultBrightness = GetCurrentBrightness(lux);
253 mPosBrightness = posBrightness;
254 mDelta = mPosBrightness - mStartLuxDefaultBrightness;
255 DISPLAY_HILOGI(FEAT_BRIGHTNESS, "UpdateBrightnessOffset lux=%{public}f, mDelta=%{public}f, "\
256 "mPosBrightness=%{public}f", lux, mDelta, mPosBrightness);
257 }
258
ResetDefaultBrightnessOffset()259 void BrightnessCalculationManager::ResetDefaultBrightnessOffset()
260 {
261 mOffsetLux = DEFAULT_NO_OFFSET_LUX;
262 mDelta = DEFAULT_OFFSET_DELTA;
263
264 mOffsetBrightnessLast = DEFAULT_OFFSET_BRIGHTNESS;
265 mLastLuxDefaultBrightness = DEFAULT_OFFSET_BRIGHTNESS;
266 mStartLuxDefaultBrightness = DEFAULT_OFFSET_BRIGHTNESS;
267 mPosBrightness = DEFAULT_OFFSET_BRIGHTNESS;
268 DISPLAY_HILOGI(FEAT_BRIGHTNESS, "ResetDefaultBrightnessOffset");
269 }
270
UpdateCurveAmbientLux(float lux)271 void BrightnessCalculationManager::UpdateCurveAmbientLux(float lux)
272 {
273 if (mCurveLux != lux) {
274 mBrightnessCalculationCurve.UpdateCurveAmbientLux(lux);
275 mCurveLux = lux;
276 }
277 }
278
SetGameModeEnable(bool isGameCurveEnable)279 void BrightnessCalculationManager::SetGameModeEnable(bool isGameCurveEnable)
280 {
281 mIsGameCurveEnable = isGameCurveEnable;
282 }
283
SetCameraModeEnable(bool isCameraCurveEnable)284 void BrightnessCalculationManager::SetCameraModeEnable(bool isCameraCurveEnable)
285 {
286 mIsCameraCurveEnable = isCameraCurveEnable;
287 }
288
UpdateCurrentUserId(int userId)289 void BrightnessCalculationManager::UpdateCurrentUserId(int userId)
290 {
291 mCurrentUserId = userId;
292 mBrightnessCalculationCurve.UpdateCurrentUserId(userId);
293 }
294
ResetOffsetFromHumanFactor(bool isOffsetResetEnable,int minOffsetBrightness,int maxOffsetBrightness)295 void BrightnessCalculationManager::ResetOffsetFromHumanFactor(bool isOffsetResetEnable, int minOffsetBrightness,
296 int maxOffsetBrightness)
297 {
298 if (isOffsetResetEnable && std::abs(mPosBrightness) > SMALL_VALUE) {
299 if (mPosBrightness < minOffsetBrightness) {
300 mPosBrightness = minOffsetBrightness;
301 mOffsetBrightnessLast = minOffsetBrightness;
302 mDelta = mPosBrightness - mStartLuxDefaultBrightness;
303 }
304 if (mPosBrightness > maxOffsetBrightness) {
305 mPosBrightness = maxOffsetBrightness;
306 mOffsetBrightnessLast = maxOffsetBrightness;
307 mDelta = mPosBrightness - mStartLuxDefaultBrightness;
308 }
309 }
310 }
311
GetDisplayIdWithDisplayMode(int displayMode)312 int BrightnessCalculationManager::GetDisplayIdWithDisplayMode(int displayMode)
313 {
314 return mBrightnessCalculationCurve.GetDisplayIdWithDisplayMode(displayMode);
315 }
316
GetSensorIdWithDisplayMode(int displayMode)317 int BrightnessCalculationManager::GetSensorIdWithDisplayMode(int displayMode)
318 {
319 return mBrightnessCalculationCurve.GetSensorIdWithDisplayMode(displayMode);
320 }
321
GetDisplayIdWithFoldstatus(int foldStatus)322 int BrightnessCalculationManager::GetDisplayIdWithFoldstatus(int foldStatus)
323 {
324 return mBrightnessCalculationCurve.GetDisplayIdWithFoldstatus(foldStatus);
325 }
326
GetSensorIdWithFoldstatus(int foldStatus)327 int BrightnessCalculationManager::GetSensorIdWithFoldstatus(int foldStatus)
328 {
329 return mBrightnessCalculationCurve.GetSensorIdWithFoldstatus(foldStatus);
330 }
331 } // namespace DisplayPowerMgr
332 } // namespace OHOS