1 /* 2 * Copyright (c) 2021-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 #ifndef ITHERMAL_ACTION_H 17 #define ITHERMAL_ACTION_H 18 19 #include <map> 20 #include <string> 21 #include <vector> 22 23 #include "constants.h" 24 #include "thermal_common.h" 25 #include "thermal_timer.h" 26 27 namespace OHOS { 28 namespace PowerMgr { 29 30 struct PolicyDelayAction { 31 bool isCompleted; 32 int32_t intDelayValue; 33 uint32_t uintDelayValue; 34 float floatDelayValue; 35 uint32_t delayTime; 36 uint64_t delayTimerId; 37 }; 38 39 class IThermalAction { 40 public: 41 IThermalAction() = default; 42 virtual ~IThermalAction() = default; 43 44 virtual void InitParams(const std::string& params) = 0; 45 virtual void SetStrict(bool enable) = 0; 46 virtual void SetEnableEvent(bool enable) = 0; 47 virtual void AddActionValue(uint32_t actionId, std::string value) = 0; 48 virtual void ResetActionValue() = 0; 49 AddActionValue(std::string value)50 virtual void AddActionValue(std::string value) 51 { 52 AddActionValue(0, value); 53 } 54 AddActionDelayTime(uint32_t actionId,const PolicyDelayAction & delayTime)55 virtual void AddActionDelayTime(uint32_t actionId, const PolicyDelayAction& delayTime) 56 { 57 if (policyActionMap_.count(actionId) == 0) { 58 policyActionMap_.insert(std::make_pair(actionId, delayTime)); 59 } 60 actionIdList_.insert(actionId); 61 } 62 Execute()63 virtual void Execute() 64 { 65 auto thermalTimer = std::make_shared<ThermalTimer>(); 66 for (auto it = policyActionMap_.begin(); it != policyActionMap_.end();) { 67 if (actionIdList_.count(it->first) == 0) { 68 if (!it->second.isCompleted) { 69 thermalTimer->StopTimer(it->second.delayTimerId); 70 thermalTimer->DestroyTimer(it->second.delayTimerId); 71 } 72 it = policyActionMap_.erase(it); 73 } else { 74 ++it; 75 } 76 } 77 actionIdList_.clear(); 78 int64_t curMsecTimestam = MiscServices::TimeServiceClient::GetInstance()->GetWallTimeMs(); 79 80 for (auto &policyAction : policyActionMap_) { 81 if (policyAction.second.isCompleted || policyAction.second.delayTimerId > 0) { 82 continue; 83 } 84 auto timerInfo = std::make_shared<ThermalTimerInfo>(); 85 timerInfo->SetType(ThermalTimer::TIMER_TYPE_WAKEUP | ThermalTimer::TIMER_TYPE_EXACT); 86 auto callback = [this, &policyAction]() { 87 policyAction.second.isCompleted = true; 88 auto thermalTimer = std::make_shared<ThermalTimer>(); 89 thermalTimer->StopTimer(policyAction.second.delayTimerId); 90 thermalTimer->DestroyTimer(policyAction.second.delayTimerId); 91 }; 92 timerInfo->SetCallbackInfo(callback); 93 policyAction.second.delayTimerId = thermalTimer->CreateTimer(timerInfo); 94 THERMAL_HILOGI(COMP_SVC, "%{public}s startTimer, delayTime = %{public}d,", actionName_.c_str(), 95 policyAction.second.delayTime); 96 thermalTimer->StartTimer(policyAction.second.delayTimerId, 97 static_cast<uint64_t>(policyAction.second.delayTime + curMsecTimestam)); 98 } 99 ExecuteInner(); 100 } 101 102 virtual void ExecuteInner() = 0; 103 protected: 104 bool isStrict_ {true}; 105 bool enableEvent_ {false}; 106 std::string actionName_ = ""; 107 std::unordered_map<uint32_t, PolicyDelayAction> policyActionMap_; 108 std::unordered_set<uint32_t> actionIdList_; 109 }; 110 } // namespace PowerMgr 111 } // namespace OHOS 112 #endif // ITHERMAL_ACTION_H 113