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_curve.h"
17
18 #include <algorithm>
19 #include <cmath>
20 #include <iostream>
21 #include <sstream>
22 #include <string>
23 #include <vector>
24
25 #include "brightness_base.h"
26 #include "config_parser.h"
27 #include "display_log.h"
28
29 using namespace std;
30
31 namespace OHOS {
32 namespace DisplayPowerMgr {
33
34 using std::string;
35 using std::vector;
36
InitParameters()37 void BrightnessCalculationCurve::InitParameters()
38 {
39 const ScreenConfig screenConfig = ConfigParse::Get().GetScreenConfig();
40 mScreenConfig = screenConfig;
41 int displayId = 0;
42 const std::unordered_map<int, Config>& brightnessConfig =
43 ConfigParse::Get().GetBrightnessConfig();
44 std::unordered_map<int, Config>::const_iterator itDisp = brightnessConfig.find(displayId);
45 if (itDisp == brightnessConfig.end()) {
46 DISPLAY_HILOGE(FEAT_BRIGHTNESS, "[%{public}d]Failed to find config", displayId);
47 return;
48 }
49 mCurveConfig = itDisp->second;
50 }
51
GetCurrentBrightness(float lux)52 float BrightnessCalculationCurve::GetCurrentBrightness(float lux)
53 {
54 std::vector<PointXy> curve = mCurveConfig.calculationConfig.defaultPoints;
55 if (curve.size() == 0) {
56 DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetCurrentBrightness default=%{public}f", mDefaultBrightness);
57 return mDefaultBrightness;
58 }
59 float brightness = GetBrightnessCurveLevel(curve, lux);
60 DISPLAY_HILOGI(FEAT_BRIGHTNESS, "GetCurrentBrightness brightness=%{public}f", brightness);
61 return brightness;
62 }
63
GetBrightnessCurveLevel(std::vector<PointXy> & linePointsList,float lux)64 float BrightnessCalculationCurve::GetBrightnessCurveLevel(std::vector<PointXy>& linePointsList, float lux)
65 {
66 float brightnessLevel = mDefaultBrightness;
67 for (auto point = linePointsList.begin(), prePoint = point; point != linePointsList.end(); point++) {
68 if (lux < point->x) {
69 if (point->x < prePoint->x || IsEqualF(point->x, prePoint->x)) {
70 brightnessLevel = mDefaultBrightness;
71 } else {
72 brightnessLevel = ((point->y - prePoint->y) / (point->x - prePoint->x) * (lux - prePoint->x))
73 + prePoint->y;
74 }
75 break;
76 } else {
77 prePoint = point;
78 brightnessLevel = prePoint->y;
79 }
80 }
81 return brightnessLevel;
82 }
83
UpdateCurveAmbientLux(float lux)84 void BrightnessCalculationCurve::UpdateCurveAmbientLux(float lux)
85 {
86 mCurveAmbientLux = lux;
87 }
88
UpdateCurrentUserId(int userId)89 void BrightnessCalculationCurve::UpdateCurrentUserId(int userId)
90 {
91 mCurrentUserId = userId;
92 }
93
GetDisplayIdWithDisplayMode(int displayMode)94 int BrightnessCalculationCurve::GetDisplayIdWithDisplayMode(int displayMode)
95 {
96 std::unordered_map<int, ScreenData> displayModeMap = mScreenConfig.brightnessConfig.displayModeMap;
97 if (displayModeMap.find(displayMode) != displayModeMap.end()) {
98 return displayModeMap[displayMode].displayId;
99 }
100 return DEFAULT_DISPLAY_ID;
101 }
102
GetSensorIdWithDisplayMode(int displayMode)103 int BrightnessCalculationCurve::GetSensorIdWithDisplayMode(int displayMode)
104 {
105 std::unordered_map<int, ScreenData> displayModeMap = mScreenConfig.brightnessConfig.displayModeMap;
106 if (displayModeMap.find(displayMode) != displayModeMap.end()) {
107 return displayModeMap[displayMode].sensorId;
108 }
109 return DEFAULT_SENSOR_ID;
110 }
111
GetDisplayIdWithFoldstatus(int foldStatus)112 int BrightnessCalculationCurve::GetDisplayIdWithFoldstatus(int foldStatus)
113 {
114 std::unordered_map<int, ScreenData> displayModeMap = mScreenConfig.brightnessConfig.foldStatusModeMap;
115 if (displayModeMap.find(foldStatus) != displayModeMap.end()) {
116 return displayModeMap[foldStatus].displayId;
117 }
118 return DEFAULT_DISPLAY_ID;
119 }
120
GetSensorIdWithFoldstatus(int foldStatus)121 int BrightnessCalculationCurve::GetSensorIdWithFoldstatus(int foldStatus)
122 {
123 std::unordered_map<int, ScreenData> displayModeMap = mScreenConfig.brightnessConfig.foldStatusModeMap;
124 if (displayModeMap.find(foldStatus) != displayModeMap.end()) {
125 return displayModeMap[foldStatus].sensorId;
126 }
127 return DEFAULT_SENSOR_ID;
128 }
129
130 } // namespace DisplayPowerMgr
131 } // namespace OHOS