1 /*
2  * Copyright (c) 2024 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 #ifndef HGM_ENERGY_CONSUMPTION_POLICY_H
17 #define HGM_ENERGY_CONSUMPTION_POLICY_H
18 
19 #include <mutex>
20 #include <string>
21 #include <unordered_map>
22 
23 #include "animation/rs_frame_rate_range.h"
24 
25 namespace OHOS::Rosen {
26 class HgmEnergyConsumptionPolicy {
27 public:
28     static HgmEnergyConsumptionPolicy& Instance();
29     void SetEnergyConsumptionConfig(std::unordered_map<std::string, std::string> animationPowerConfig);
30     void SetUiEnergyConsumptionConfig(std::unordered_map<std::string, std::string> uiPowerConfig);
31     void SetAnimationEnergyConsumptionAssuranceMode(bool isEnergyConsumptionAssuranceMode);
32     void SetUiEnergyConsumptionAssuranceMode(bool isEnergyConsumptionAssuranceMode);
33     void StatisticAnimationTime(uint64_t timestamp);
34     void StartNewAnimation();
35     void GetAnimationIdleFps(FrameRateRange& rsRange);
36     void GetUiIdleFps(FrameRateRange& rsRange);
37 
38 private:
39     std::recursive_mutex mutex_;
40     // <rateType, <isEnable, idleFps>>
41     std::unordered_map<int32_t, std::pair<bool, int>> uiEnergyAssuranceMap_;
42     bool isAnimationEnergyAssuranceEnable_ = false;
43     bool isAnimationEnergyConsumptionAssuranceMode_ = false;
44     bool isUiEnergyConsumptionAssuranceMode_ = false;
45     uint64_t firstAnimationTimestamp_ = 0;
46     uint64_t lastAnimationTimestamp_ = 0;
47     // Unit: ms
48     int animationIdleDuration_ = 2000;
49     int animationIdleFps_ = 60;
50 
51     HgmEnergyConsumptionPolicy();
52     ~HgmEnergyConsumptionPolicy() = default;
53     HgmEnergyConsumptionPolicy(const HgmEnergyConsumptionPolicy&) = delete;
54     HgmEnergyConsumptionPolicy(const HgmEnergyConsumptionPolicy&&) = delete;
55     HgmEnergyConsumptionPolicy& operator=(const HgmEnergyConsumptionPolicy&) = delete;
56     HgmEnergyConsumptionPolicy& operator=(const HgmEnergyConsumptionPolicy&&) = delete;
57     void ConverStrToInt(int& targetNum, std::string sourceStr, int defaultValue);
58     void SetEnergyConsumptionRateRange(FrameRateRange& rsRange, int idleFps);
59 };
60 } // namespace OHOS::Rosen
61 
62 #endif