• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 "base_state.h"
17 
18 #include "time_service_client.h"
19 
20 #include "standby_messsage.h"
21 #include "standby_service_log.h"
22 #include "standby_config_manager.h"
23 
24 #include "istate_manager_adapter.h"
25 #include "timed_task.h"
26 #include "time_provider.h"
27 #include "standby_service_impl.h"
28 #include "standby_config_manager.h"
29 
30 using namespace OHOS::MiscServices;
31 namespace OHOS {
32 namespace DevStandbyMgr {
33 std::shared_ptr<PowerMgr::RunningLock> BaseState::standbyRunningLock_ = nullptr;
34 bool BaseState::runningLockStatus_ = false;
35 
Init(const std::shared_ptr<BaseState> & statePtr)36 ErrCode BaseState::Init(const std::shared_ptr<BaseState>& statePtr)
37 {
38     auto callbackTask = [statePtr]() { statePtr->StartTransitNextState(statePtr); };
39     enterStandbyTimerId_ = TimedTask::CreateTimer(false, 0, true, false, callbackTask);
40     if (enterStandbyTimerId_ == 0) {
41         STANDBYSERVICE_LOGE("%{public}s state init failed", STATE_NAME_LIST[GetCurState()].c_str());
42         return ERR_STANDBY_STATE_INIT_FAILED;
43     }
44     return ERR_OK;
45 }
46 
UnInit()47 ErrCode BaseState::UnInit()
48 {
49     DestroyAllTimedTask();
50     enterStandbyTimerId_ = 0;
51     return ERR_OK;
52 }
53 
GetCurState()54 uint32_t BaseState::GetCurState()
55 {
56     return curState_;
57 }
58 
GetCurInnerPhase()59 uint32_t BaseState::GetCurInnerPhase()
60 {
61     return curPhase_;
62 }
63 
StartTransitNextState(const std::shared_ptr<BaseState> & statePtr)64 void BaseState::StartTransitNextState(const std::shared_ptr<BaseState>& statePtr)
65 {
66     handler_->PostTask([statePtr]() {
67         STANDBYSERVICE_LOGD("due to timeout, try to enter %{public}s state from %{public}s",
68             STATE_NAME_LIST[statePtr->nextState_].c_str(), STATE_NAME_LIST[statePtr->curState_].c_str());
69         BaseState::AcquireStandbyRunningLock();
70         auto stateManagerPtr = statePtr->stateManager_.lock();
71         if (!stateManagerPtr) {
72             STANDBYSERVICE_LOGW("state manager is nullptr, can not transit to next state");
73             BaseState::ReleaseStandbyRunningLock();
74             return;
75         }
76         if (stateManagerPtr->IsEvalution()) {
77             STANDBYSERVICE_LOGW("state is in evalution, stop evalution and enter next state");
78             stateManagerPtr->StopEvalution();
79         }
80         if (stateManagerPtr->TransitToState(statePtr->nextState_) != ERR_OK) {
81             STANDBYSERVICE_LOGW("can not transit to state %{public}d, block current state", statePtr->nextState_);
82             stateManagerPtr->BlockCurrentState();
83             BaseState::ReleaseStandbyRunningLock();
84         }
85         }, TRANSIT_NEXT_STATE_TIMED_TASK);
86 }
87 
TransitToPhase(uint32_t curPhase,uint32_t nextPhase)88 void BaseState::TransitToPhase(uint32_t curPhase, uint32_t nextPhase)
89 {
90     ConstraintEvalParam params{curState_, curPhase, curState_, nextPhase};
91     stateManager_.lock()->StartEvalCurrentState(params);
92 }
93 
TransitToPhaseInner(uint32_t prePhase,uint32_t curPhase)94 void BaseState::TransitToPhaseInner(uint32_t prePhase, uint32_t curPhase)
95 {
96     auto stateManagerPtr = stateManager_.lock();
97     if (!stateManagerPtr) {
98         STANDBYSERVICE_LOGW("state manager is nullptr, can not implement function to enter next phase");
99         return;
100     }
101     StandbyMessage message(StandbyMessageType::PHASE_TRANSIT);
102     message.want_ = AAFwk::Want{};
103     message.want_->SetParam(CURRENT_STATE, static_cast<int32_t>(curState_));
104     message.want_->SetParam(PREVIOUS_PHASE, static_cast<int32_t>(prePhase));
105     message.want_->SetParam(CURRENT_PHASE, static_cast<int32_t>(curPhase));
106     StandbyServiceImpl::GetInstance()->DispatchEvent(message);
107     STANDBYSERVICE_LOGI("phase transit succeed, phase form %{public}d to %{public}d",
108         static_cast<int32_t>(prePhase), static_cast<int32_t>(curPhase));
109 }
110 
IsInFinalPhase()111 bool BaseState::IsInFinalPhase()
112 {
113     return true;
114 }
115 
OnStateBlocked()116 void BaseState::OnStateBlocked()
117 {}
118 
SetTimedTask(const std::string & timedTaskName,uint64_t timedTaskId)119 void BaseState::SetTimedTask(const std::string& timedTaskName, uint64_t timedTaskId)
120 {
121     if (auto iter = timedTaskMap_.find(timedTaskName); iter == timedTaskMap_.end()) {
122         timedTaskMap_.emplace(timedTaskName, timedTaskId);
123     } else {
124         iter->second = timedTaskId;
125     }
126 }
127 
StartStateTransitionTimer(int64_t triggerTime)128 ErrCode BaseState::StartStateTransitionTimer(int64_t triggerTime)
129 {
130     if (enterStandbyTimerId_ == 0 || !MiscServices::TimeServiceClient::GetInstance()->
131         StartTimer(enterStandbyTimerId_, MiscServices::TimeServiceClient::GetInstance()->
132         GetWallTimeMs() + triggerTime)) {
133         STANDBYSERVICE_LOGE("%{public}s state set timed task failed", STATE_NAME_LIST[nextState_].c_str());
134         return ERR_STANDBY_TIMER_SERVICE_ERROR;
135     }
136 
137     STANDBYSERVICE_LOGD("StartStateTransitionTimer by id=" SPUBI64 ", triggerTime=" SPUBI64,
138         enterStandbyTimerId_, triggerTime);
139     SetTimedTask(TRANSIT_NEXT_STATE_TIMED_TASK, enterStandbyTimerId_);
140     return ERR_OK;
141 }
142 
StopTimedTask(const std::string & timedTaskName)143 ErrCode BaseState::StopTimedTask(const std::string& timedTaskName)
144 {
145     if (auto iter = timedTaskMap_.find(timedTaskName); iter == timedTaskMap_.end()) {
146         STANDBYSERVICE_LOGW("timedTask %{public}s not exist", timedTaskName.c_str());
147         return ERR_STANDBY_TIMERID_NOT_EXIST;
148     } else if (iter->second > 0) {
149         MiscServices::TimeServiceClient::GetInstance()->StopTimer(iter->second);
150     }
151 
152     return ERR_OK;
153 }
154 
DestroyAllTimedTask()155 void BaseState::DestroyAllTimedTask()
156 {
157     for (auto& [timeTaskName, timerId] : timedTaskMap_) {
158         handler_->RemoveTask(timeTaskName);
159         if (timerId > 0) {
160             TimeServiceClient::GetInstance()->StopTimer(timerId);
161             TimeServiceClient::GetInstance()->DestroyTimer(timerId);
162         }
163     }
164     timedTaskMap_.clear();
165 }
166 
InitRunningLock()167 void BaseState::InitRunningLock()
168 {
169     runningLockStatus_ = false;
170     standbyRunningLock_ = PowerMgr::PowerMgrClient::GetInstance().CreateRunningLock("StandbyRunningLock",
171         PowerMgr::RunningLockType::RUNNINGLOCK_BACKGROUND);
172 }
173 
AcquireStandbyRunningLock()174 void BaseState::AcquireStandbyRunningLock()
175 {
176     if (runningLockStatus_) {
177         return;
178     }
179     standbyRunningLock_->Lock();
180     runningLockStatus_ = true;
181     STANDBYSERVICE_LOGD("acquire standby running lock, status is %{public}d", runningLockStatus_);
182 }
183 
ReleaseStandbyRunningLock()184 void BaseState::ReleaseStandbyRunningLock()
185 {
186     if (!runningLockStatus_) {
187         return;
188     }
189     standbyRunningLock_->UnLock();
190     runningLockStatus_ = false;
191     STANDBYSERVICE_LOGD("release standby running lock, status is %{public}d", runningLockStatus_);
192 }
193 
ShellDump(const std::vector<std::string> & argsInStr,std::string & result)194 void BaseState::ShellDump(const std::vector<std::string>& argsInStr, std::string& result)
195 {
196     return;
197 }
198 
CalculateMaintTimeOut(const std::shared_ptr<IStateManagerAdapter> & stateManagerPtr,bool isFirstInterval)199 int64_t StateWithMaint::CalculateMaintTimeOut(const std::shared_ptr<IStateManagerAdapter>& stateManagerPtr,
200     bool isFirstInterval)
201 {
202     int64_t maintIntervalTimeOut {0};
203     if (maintInterval_.empty()) {
204         STANDBYSERVICE_LOGE("maintenance interval config error, can not enter maintence state");
205         return 0;
206     }
207     if (isFirstInterval) {
208         maintIntervalTimeOut = maintInterval_[maintIntervalIndex_];
209     } else {
210         maintIntervalIndex_ = std::min(maintIntervalIndex_ + 1, static_cast<int32_t>(maintInterval_.size() - 1));
211         maintIntervalTimeOut =  maintInterval_[maintIntervalIndex_];
212     }
213     int64_t timeDiff {0};
214     if (TimeProvider::GetCondition(maintIntervalTimeOut) == ConditionType::NIGHT_STANDBY &&
215         TimeProvider::TimeDiffToDayNightSwitch(timeDiff)) {
216         maintIntervalTimeOut *= TimeConstant::MSEC_PER_SEC;
217         maintIntervalTimeOut += timeDiff;
218         return maintIntervalTimeOut;
219     }
220     maintIntervalTimeOut *= TimeConstant::MSEC_PER_SEC;
221     return maintIntervalTimeOut;
222 }
223 }  // namespace DevStandbyMgr
224 }  // namespace OHOS