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