• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "battery_service.h"
17 
18 #include <cstdio>
19 #include <ctime>
20 #include <functional>
21 #include <new>
22 
23 #include "ability_manager_client.h"
24 #include "errors.h"
25 #include "hdf_device_class.h"
26 #include "hdf_service_status.h"
27 #include "ipc_skeleton.h"
28 #include "iremote_object.h"
29 #include "permission.h"
30 #include "power_common.h"
31 #include "power_mgr_client.h"
32 #include "ffrt_utils.h"
33 #include "sysparam.h"
34 #include "system_ability_definition.h"
35 #include "xcollie/watchdog.h"
36 
37 #include "battery_callback.h"
38 #include "battery_config.h"
39 #include "battery_dump.h"
40 #include "battery_log.h"
41 #include "power_vibrator.h"
42 #include "v2_0/ibattery_callback.h"
43 
44 using namespace OHOS::HDI::Battery;
45 using namespace OHOS::AAFwk;
46 
47 namespace OHOS {
48 namespace PowerMgr {
49 namespace {
50 constexpr const char* BATTERY_SERVICE_NAME = "BatteryService";
51 constexpr const char* BATTERY_HDI_NAME = "battery_interface_service";
52 constexpr int32_t BATTERY_FULL_CAPACITY = 100;
53 constexpr uint32_t RETRY_TIME = 1000;
54 constexpr uint32_t SHUTDOWN_DELAY_TIME_MS = 60000;
55 const std::string BATTERY_VIBRATOR_CONFIG_FILE = "etc/battery/battery_vibrator.json";
56 const std::string VENDOR_BATTERY_VIBRATOR_CONFIG_FILE = "/vendor/etc/battery/battery_vibrator.json";
57 const std::string SYSTEM_BATTERY_VIBRATOR_CONFIG_FILE = "/system/etc/battery/battery_vibrator.json";
58 sptr<BatteryService> g_service = DelayedSpSingleton<BatteryService>::GetInstance();
59 FFRTQueue g_queue("battery_service");
60 FFRTHandle g_lowCapacityShutdownHandle = nullptr;
61 BatteryPluggedType g_lastPluggedType = BatteryPluggedType::PLUGGED_TYPE_NONE;
62 SysParam::BootCompletedCallback g_bootCompletedCallback;
63 }
64 std::atomic_bool BatteryService::isBootCompleted_ = false;
65 
66 const bool G_REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(
67     DelayedSpSingleton<BatteryService>::GetInstance().GetRefPtr());
68 
BatteryService()69 BatteryService::BatteryService()
70     : SystemAbility(POWER_MANAGER_BATT_SERVICE_ID, true)
71 {
72 }
73 
~BatteryService()74 BatteryService::~BatteryService() {}
75 
GetCurrentTime()76 static int64_t GetCurrentTime()
77 {
78     constexpr int32_t SEC_TO_MSEC = 1000;
79     constexpr int32_t NSEC_TO_MSEC = 1000000;
80     timespec tm {};
81     clock_gettime(CLOCK_MONOTONIC, &tm);
82 
83     return tm.tv_sec * SEC_TO_MSEC + (tm.tv_nsec / NSEC_TO_MSEC);
84 }
85 
OnStart()86 void BatteryService::OnStart()
87 {
88     if (ready_) {
89         BATTERY_HILOGD(COMP_SVC, "Service is ready, nothing to do");
90         return;
91     }
92     if (!(Init())) {
93         BATTERY_HILOGE(COMP_SVC, "Call init failed");
94         return;
95     }
96     RegisterHdiStatusListener();
97     if (!Publish(this)) {
98         BATTERY_HILOGE(COMP_SVC, "Register to system ability manager failed");
99         return;
100     }
101     AddSystemAbilityListener(MISCDEVICE_SERVICE_ABILITY_ID);
102     ready_ = true;
103 }
104 
Init()105 bool BatteryService::Init()
106 {
107     InitConfig();
108     if (!batteryNotify_) {
109         batteryNotify_ = std::make_unique<BatteryNotify>();
110     }
111     VibratorInit();
112     RegisterBootCompletedCallback();
113     return true;
114 }
115 
RegisterBootCompletedCallback()116 void BatteryService::RegisterBootCompletedCallback()
117 {
118     g_bootCompletedCallback = []() {
119         isBootCompleted_ = true;
120     };
121     SysParam::RegisterBootCompletedCallback(g_bootCompletedCallback);
122 }
123 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)124 void BatteryService::OnAddSystemAbility(int32_t systemAbilityId, const std::string& deviceId)
125 {
126     BATTERY_HILOGI(COMP_SVC, "systemAbilityId=%{public}d, deviceId=%{private}s", systemAbilityId, deviceId.c_str());
127     if (systemAbilityId == MISCDEVICE_SERVICE_ABILITY_ID) {
128         batteryLight_.InitLight();
129     }
130 }
131 
RegisterBatteryHdiCallback()132 bool BatteryService::RegisterBatteryHdiCallback()
133 {
134     std::lock_guard<std::shared_mutex> lock(mutex_);
135     if (iBatteryInterface_ == nullptr) {
136         iBatteryInterface_ = V2_0::IBatteryInterface::Get();
137         BATTERY_HILOGE(COMP_SVC, "failed to get battery hdi interface");
138         RETURN_IF_WITH_RET(iBatteryInterface_ == nullptr, false);
139     }
140     sptr<V2_0::IBatteryCallback> callback = new BatteryCallback();
141     ErrCode ret = iBatteryInterface_->Register(callback);
142     if (ret < 0) {
143         BATTERY_HILOGE(COMP_SVC, "register callback failed");
144         return false;
145     }
146 
147     BatteryCallback::BatteryEventCallback eventCb =
148         [this](const V2_0::BatteryInfo& event) -> int32_t { return this->HandleBatteryCallbackEvent(event); };
149     BatteryCallback::RegisterBatteryEvent(eventCb);
150     return true;
151 }
152 
InitConfig()153 void BatteryService::InitConfig()
154 {
155     auto& batteryConfig = BatteryConfig::GetInstance();
156     batteryConfig.ParseConfig();
157 
158     warnCapacity_ = batteryConfig.GetInt("soc.warning", warnCapacity_);
159     highTemperature_ = batteryConfig.GetInt("temperature.high", highTemperature_);
160     lowTemperature_ = batteryConfig.GetInt("temperature.low", lowTemperature_);
161     shutdownCapacityThreshold_ = batteryConfig.GetInt("soc.shutdown", shutdownCapacityThreshold_);
162     criticalCapacityThreshold_ = batteryConfig.GetInt("soc.critical", criticalCapacityThreshold_);
163     warningCapacityThreshold_ = batteryConfig.GetInt("soc.warning", warningCapacityThreshold_);
164     lowCapacityThreshold_ = batteryConfig.GetInt("soc.low", lowCapacityThreshold_);
165     normalCapacityThreshold_ = batteryConfig.GetInt("soc.normal", normalCapacityThreshold_);
166     highCapacityThreshold_ = batteryConfig.GetInt("soc.high", highCapacityThreshold_);
167     fullCapacityThreshold_ = batteryConfig.GetInt("soc.full", fullCapacityThreshold_);
168     BATTERY_HILOGI(COMP_SVC, "warnCapacity_=%{public}d, highTemperature_=%{public}d,\
169         lowTemperature_=%{public}d, shutdownCapacityThreshold_=%{public}d,\
170         criticalCapacityThreshold_=%{public}d, warningCapacityThreshold_=%{public}d, lowCapacityThreshold_=%{public}d,\
171         normalCapacityThreshold_=%{public}d, highCapacityThreshold_=%{public}d, fullCapacityThreshold_=%{public}d",
172         warnCapacity_, highTemperature_, lowTemperature_, shutdownCapacityThreshold_, criticalCapacityThreshold_,
173         warningCapacityThreshold_, lowCapacityThreshold_, normalCapacityThreshold_, highCapacityThreshold_,
174         fullCapacityThreshold_);
175 }
176 
HandleBatteryCallbackEvent(const V2_0::BatteryInfo & event)177 int32_t BatteryService::HandleBatteryCallbackEvent(const V2_0::BatteryInfo& event)
178 {
179     if (isMockUnplugged_ || isMockCapacity_ || isMockUevent_) {
180         return ERR_OK;
181     }
182 
183     ConvertingEvent(event);
184     RETURN_IF_WITH_RET(lastBatteryInfo_ == batteryInfo_, ERR_OK);
185     HandleBatteryInfo();
186     return ERR_OK;
187 }
188 
ConvertingEvent(const V2_0::BatteryInfo & event)189 void BatteryService::ConvertingEvent(const V2_0::BatteryInfo& event)
190 {
191     if (!isMockCapacity_) {
192         batteryInfo_.SetCapacity(event.capacity);
193     }
194     if (!isMockUnplugged_) {
195         batteryInfo_.SetPluggedType(BatteryPluggedType(event.pluggedType));
196         batteryInfo_.SetPluggedMaxCurrent(event.pluggedMaxCurrent);
197         batteryInfo_.SetPluggedMaxVoltage(event.pluggedMaxVoltage);
198         batteryInfo_.SetChargeState(BatteryChargeState(event.chargeState));
199     }
200     batteryInfo_.SetVoltage(event.voltage);
201     batteryInfo_.SetTemperature(event.temperature);
202     batteryInfo_.SetHealthState(BatteryHealthState(event.healthState));
203     batteryInfo_.SetChargeCounter(event.chargeCounter);
204     batteryInfo_.SetTotalEnergy(event.totalEnergy);
205     batteryInfo_.SetCurAverage(event.curAverage);
206     batteryInfo_.SetRemainEnergy(event.remainEnergy);
207     batteryInfo_.SetPresent(event.present);
208     batteryInfo_.SetTechnology(event.technology);
209     batteryInfo_.SetNowCurrent(event.curNow);
210     batteryInfo_.SetChargeType(GetChargeType());
211     if (!isMockUevent_) {
212         batteryInfo_.SetUevent(event.uevent);
213     }
214 }
215 
InitBatteryInfo()216 void BatteryService::InitBatteryInfo()
217 {
218     batteryInfo_.SetCapacity(GetCapacity());
219     batteryInfo_.SetPluggedType(GetPluggedType());
220     batteryInfo_.SetChargeState(GetChargingStatus());
221     batteryInfo_.SetVoltage(GetVoltage());
222     batteryInfo_.SetTemperature(GetBatteryTemperature());
223     batteryInfo_.SetHealthState(GetHealthStatus());
224     batteryInfo_.SetTotalEnergy(GetTotalEnergy());
225     batteryInfo_.SetCurAverage(GetCurrentAverage());
226     batteryInfo_.SetRemainEnergy(GetRemainEnergy());
227     batteryInfo_.SetPresent(GetPresent());
228     batteryInfo_.SetTechnology(GetTechnology());
229     batteryInfo_.SetNowCurrent(GetNowCurrent());
230     batteryInfo_.SetChargeType(GetChargeType());
231     HandleBatteryInfo();
232 }
233 
HandleBatteryInfo()234 void BatteryService::HandleBatteryInfo()
235 {
236     BATTERY_HILOGI(FEATURE_BATT_INFO, "capacity=%{public}d, voltage=%{public}d, temperature=%{public}d, "
237         "healthState=%{public}d, pluggedType=%{public}d, pluggedMaxCurrent=%{public}d, "
238         "pluggedMaxVoltage=%{public}d, chargeState=%{public}d, chargeCounter=%{public}d, present=%{public}d, "
239         "technology=%{public}s, currNow=%{public}d, totalEnergy=%{public}d, curAverage=%{public}d, "
240         "remainEnergy=%{public}d, chargeType=%{public}d, event=%{public}s", batteryInfo_.GetCapacity(),
241         batteryInfo_.GetVoltage(), batteryInfo_.GetTemperature(), batteryInfo_.GetHealthState(),
242         batteryInfo_.GetPluggedType(), batteryInfo_.GetPluggedMaxCurrent(), batteryInfo_.GetPluggedMaxVoltage(),
243         batteryInfo_.GetChargeState(), batteryInfo_.GetChargeCounter(), batteryInfo_.IsPresent(),
244         batteryInfo_.GetTechnology().c_str(), batteryInfo_.GetNowCurrent(), batteryInfo_.GetTotalEnergy(),
245         batteryInfo_.GetCurAverage(), batteryInfo_.GetRemainEnergy(), batteryInfo_.GetChargeType(),
246         batteryInfo_.GetUevent().c_str());
247 
248     batteryLight_.UpdateColor(batteryInfo_.GetChargeState(), batteryInfo_.GetCapacity());
249     WakeupDevice(batteryInfo_.GetPluggedType());
250     CalculateRemainingChargeTime(batteryInfo_.GetCapacity(), batteryInfo_.GetChargeState());
251 
252     batteryNotify_->PublishEvents(batteryInfo_);
253     HandleTemperature(batteryInfo_.GetTemperature());
254     HandleCapacity(batteryInfo_.GetCapacity(), batteryInfo_.GetChargeState());
255     lastBatteryInfo_ = batteryInfo_;
256 }
257 
RegisterHdiStatusListener()258 bool BatteryService::RegisterHdiStatusListener()
259 {
260     hdiServiceMgr_ = OHOS::HDI::ServiceManager::V1_0::IServiceManager::Get();
261     if (hdiServiceMgr_ == nullptr) {
262         BATTERY_HILOGW(COMP_SVC, "hdi service manager is nullptr, Try again after %{public}u second", RETRY_TIME);
263         FFRTTask retryTask = [this] {
264             return RegisterHdiStatusListener();
265         };
266         FFRTUtils::SubmitDelayTask(retryTask, RETRY_TIME, g_queue);
267         return false;
268     }
269 
270     hdiServStatListener_ = new HdiServiceStatusListener(HdiServiceStatusListener::StatusCallback(
271         [this](const OHOS::HDI::ServiceManager::V1_0::ServiceStatus &status) {
272             RETURN_IF(status.serviceName != BATTERY_HDI_NAME || status.deviceClass != DEVICE_CLASS_DEFAULT);
273 
274             std::lock_guard<std::shared_mutex> lock(mutex_);
275             if (status.status == SERVIE_STATUS_START) {
276                 FFRTTask task = [this] {
277                     (void)RegisterBatteryHdiCallback();
278 #ifdef BATTERY_MANAGER_SET_LOW_CAPACITY_THRESHOLD
279                     SetLowCapacityThreshold();
280 #endif
281                     InitBatteryInfo();
282                     return;
283                 };
284                 FFRTUtils::SubmitTask(task);
285                 BATTERY_HILOGD(COMP_SVC, "battery interface service start");
286             } else if (status.status == SERVIE_STATUS_STOP && iBatteryInterface_) {
287                 iBatteryInterface_->UnRegister();
288                 iBatteryInterface_ = nullptr;
289                 BATTERY_HILOGW(COMP_SVC, "battery interface service stop, unregister interface");
290             }
291         }
292     ));
293 
294     int32_t status = hdiServiceMgr_->RegisterServiceStatusListener(hdiServStatListener_, DEVICE_CLASS_DEFAULT);
295     if (status != ERR_OK) {
296         BATTERY_HILOGW(COMP_SVC, "Register hdi failed, Try again after %{public}u second", RETRY_TIME);
297         FFRTTask retryTask = [this] {
298             return RegisterHdiStatusListener();
299         };
300         FFRTUtils::SubmitDelayTask(retryTask, RETRY_TIME, g_queue);
301         return false;
302     }
303     return true;
304 }
305 
OnStop()306 void BatteryService::OnStop()
307 {
308     if (!ready_) {
309         return;
310     }
311     ready_ = false;
312     isBootCompleted_ = false;
313 
314     std::lock_guard<std::shared_mutex> lock(mutex_);
315     if (iBatteryInterface_ != nullptr) {
316         iBatteryInterface_->UnRegister();
317         iBatteryInterface_ = nullptr;
318     }
319     if (hdiServiceMgr_ != nullptr) {
320         hdiServiceMgr_->UnregisterServiceStatusListener(hdiServStatListener_);
321         hdiServiceMgr_ = nullptr;
322     }
323 }
324 
IsLastPlugged()325 bool BatteryService::IsLastPlugged()
326 {
327     if (g_lastPluggedType != BatteryPluggedType::PLUGGED_TYPE_NONE &&
328         g_lastPluggedType != BatteryPluggedType::PLUGGED_TYPE_BUTT) {
329         return true;
330     }
331     return false;
332 }
333 
IsNowPlugged(BatteryPluggedType pluggedType)334 bool BatteryService::IsNowPlugged(BatteryPluggedType pluggedType)
335 {
336     if (pluggedType != BatteryPluggedType::PLUGGED_TYPE_NONE &&
337         pluggedType != BatteryPluggedType::PLUGGED_TYPE_BUTT) {
338         return true;
339     }
340     return false;
341 }
342 
IsPlugged(BatteryPluggedType pluggedType)343 bool BatteryService::IsPlugged(BatteryPluggedType pluggedType)
344 {
345     if (!IsLastPlugged() && IsNowPlugged(pluggedType)) {
346         return true;
347     }
348     return false;
349 }
350 
IsUnplugged(BatteryPluggedType pluggedType)351 bool BatteryService::IsUnplugged(BatteryPluggedType pluggedType)
352 {
353     if (IsLastPlugged() && !IsNowPlugged(pluggedType)) {
354         return true;
355     }
356     return false;
357 }
358 
IsCharging(BatteryChargeState chargeState)359 bool BatteryService::IsCharging(BatteryChargeState chargeState)
360 {
361     return chargeState == BatteryChargeState::CHARGE_STATE_ENABLE;
362 }
363 
IsInExtremePowerSaveMode()364 bool BatteryService::IsInExtremePowerSaveMode()
365 {
366     PowerMode mode = PowerMgrClient::GetInstance().GetDeviceMode();
367     return mode == PowerMode::EXTREME_POWER_SAVE_MODE;
368 }
369 
WakeupDevice(BatteryPluggedType pluggedType)370 void BatteryService::WakeupDevice(BatteryPluggedType pluggedType)
371 {
372     if (IsPlugged(pluggedType) || IsUnplugged(pluggedType)) {
373         PowerMgrClient::GetInstance().WakeupDevice();
374     }
375     g_lastPluggedType = pluggedType;
376 }
377 
HandleTemperature(int32_t temperature)378 void BatteryService::HandleTemperature(int32_t temperature)
379 {
380     if (((temperature <= lowTemperature_) || (temperature >= highTemperature_)) &&
381         (highTemperature_ != lowTemperature_)) {
382         PowerMgrClient::GetInstance().ShutDownDevice("TemperatureOutOfRange");
383     }
384 }
385 
HandleCapacity(int32_t capacity,BatteryChargeState chargeState)386 void BatteryService::HandleCapacity(int32_t capacity, BatteryChargeState chargeState)
387 {
388     if ((capacity <= shutdownCapacityThreshold_) &&
389         (g_lowCapacityShutdownHandle == nullptr) &&
390         (!IsCharging(chargeState))) {
391         BATTERY_HILOGI(COMP_SVC, "HandleCapacity begin to submit task");
392         FFRTTask task = [&] {
393             if (!IsInExtremePowerSaveMode()) {
394                 BATTERY_HILOGI(COMP_SVC, "HandleCapacity begin to shutdown");
395                 PowerMgrClient::GetInstance().ShutDownDevice("LowCapacity");
396             }
397         };
398         g_lowCapacityShutdownHandle = FFRTUtils::SubmitDelayTask(task, SHUTDOWN_DELAY_TIME_MS, g_queue);
399     }
400 
401     if (IsCharging(chargeState) && g_lowCapacityShutdownHandle != nullptr) {
402         BATTERY_HILOGI(COMP_SVC, "HandleCapacity cancel shutdown task");
403         FFRTUtils::CancelTask(g_lowCapacityShutdownHandle, g_queue);
404         g_lowCapacityShutdownHandle = nullptr;
405     }
406 }
407 
GetCapacity()408 int32_t BatteryService::GetCapacity()
409 {
410     if (isMockCapacity_) {
411         BATTERY_HILOGD(FEATURE_BATT_INFO, "Return mock battery capacity");
412         return batteryInfo_.GetCapacity();
413     }
414     std::shared_lock<std::shared_mutex> lock(mutex_);
415     int32_t capacity = BATTERY_FULL_CAPACITY;
416     if (iBatteryInterface_ == nullptr) {
417         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
418         return capacity;
419     }
420     iBatteryInterface_->GetCapacity(capacity);
421     return capacity;
422 }
423 
ChangePath(const std::string path)424 bool BatteryService::ChangePath(const std::string path)
425 {
426     BATTERY_HILOGD(FEATURE_BATT_INFO, "Enter");
427     std::shared_lock<std::shared_mutex> lock(mutex_);
428     if (iBatteryInterface_ == nullptr) {
429         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
430         return false;
431     }
432     iBatteryInterface_->ChangePath(path);
433     return true;
434 }
435 
436 #ifdef BATTERY_MANAGER_SET_LOW_CAPACITY_THRESHOLD
SetLowCapacityThreshold()437 void BatteryService::SetLowCapacityThreshold()
438 {
439     const std::string thers = "low_battery_thers";
440     if (iBatteryInterface_ == nullptr) {
441             BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
442         return;
443     }
444     BATTERY_HILOGI(FEATURE_BATT_INFO, "set low capacity thres: shutdownCapacityThreshold_ = %{public}d",
445         shutdownCapacityThreshold_);
446     iBatteryInterface_->SetBatteryConfig(thers, std::to_string(shutdownCapacityThreshold_));
447 }
448 #endif
449 
SetBatteryConfig(const std::string & sceneName,const std::string & value)450 BatteryError BatteryService::SetBatteryConfig(const std::string& sceneName, const std::string& value)
451 {
452     if (!Permission::IsSystem() || !Permission::IsNativePermissionGranted("ohos.permission.POWER_OPTIMIZATION")) {
453         BATTERY_HILOGI(FEATURE_BATT_INFO, "SetBatteryConfig failed, System permission intercept");
454         return BatteryError::ERR_SYSTEM_API_DENIED;
455     }
456 
457     BATTERY_HILOGD(FEATURE_BATT_INFO, "Enter SetBatteryConfig");
458     std::shared_lock<std::shared_mutex> lock(mutex_);
459     if (iBatteryInterface_ == nullptr) {
460         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
461         return BatteryError::ERR_FAILURE;
462     }
463     return iBatteryInterface_->SetBatteryConfig(sceneName, value) == ERR_OK ?
464         BatteryError::ERR_OK : BatteryError::ERR_FAILURE;
465 }
466 
GetBatteryConfig(const std::string & sceneName,std::string & result)467 BatteryError BatteryService::GetBatteryConfig(const std::string& sceneName, std::string& result)
468 {
469     if (!Permission::IsSystem()) {
470         BATTERY_HILOGI(FEATURE_BATT_INFO, "GetBatteryConfig failed, System permission intercept");
471         return BatteryError::ERR_SYSTEM_API_DENIED;
472     }
473 
474     BATTERY_HILOGD(FEATURE_BATT_INFO, "Enter GetBatteryConfig");
475     std::shared_lock<std::shared_mutex> lock(mutex_);
476     if (iBatteryInterface_ == nullptr) {
477         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
478         return BatteryError::ERR_FAILURE;
479     }
480 
481     int32_t ret = iBatteryInterface_->GetBatteryConfig(sceneName, result);
482     if (ret != ERR_OK) {
483         BATTERY_HILOGE(FEATURE_BATT_INFO, "get charge config failed, key:%{public}s", sceneName.c_str());
484         return BatteryError::ERR_FAILURE;
485     }
486 
487     return BatteryError::ERR_OK;
488 }
489 
IsBatteryConfigSupported(const std::string & sceneName,bool & result)490 BatteryError BatteryService::IsBatteryConfigSupported(const std::string& sceneName, bool& result)
491 {
492     if (!Permission::IsSystem()) {
493         BATTERY_HILOGI(FEATURE_BATT_INFO, "IsBatteryConfigSupported failed, System permission intercept");
494         return BatteryError::ERR_SYSTEM_API_DENIED;
495     }
496 
497     BATTERY_HILOGD(FEATURE_BATT_INFO, "Enter IsBatteryConfigSupported");
498     std::shared_lock<std::shared_mutex> lock(mutex_);
499     if (iBatteryInterface_ == nullptr) {
500         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
501         return BatteryError::ERR_FAILURE;
502     }
503 
504     int32_t ret = iBatteryInterface_->IsBatteryConfigSupported(sceneName, result);
505     if (ret != ERR_OK) {
506         BATTERY_HILOGE(FEATURE_BATT_INFO, "get support charge config failed, key:%{public}s", sceneName.c_str());
507         return BatteryError::ERR_FAILURE;
508     }
509     return BatteryError::ERR_OK;
510 }
511 
GetChargingStatus()512 BatteryChargeState BatteryService::GetChargingStatus()
513 {
514     if (isMockUnplugged_) {
515         BATTERY_HILOGD(FEATURE_BATT_INFO, "Return mock charge status");
516         return batteryInfo_.GetChargeState();
517     }
518     std::shared_lock<std::shared_mutex> lock(mutex_);
519     V2_0::BatteryChargeState chargeState = V2_0::BatteryChargeState(0);
520     if (iBatteryInterface_ == nullptr) {
521         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
522         return BatteryChargeState(chargeState);
523     }
524     iBatteryInterface_->GetChargeState(chargeState);
525     return BatteryChargeState(chargeState);
526 }
527 
GetHealthStatus()528 BatteryHealthState BatteryService::GetHealthStatus()
529 {
530     BATTERY_HILOGD(FEATURE_BATT_INFO, "Enter");
531     std::shared_lock<std::shared_mutex> lock(mutex_);
532     V2_0::BatteryHealthState healthState = V2_0::BatteryHealthState(0);
533     if (iBatteryInterface_ == nullptr) {
534         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
535         return BatteryHealthState(healthState);
536     }
537 
538     iBatteryInterface_->GetHealthState(healthState);
539     return BatteryHealthState(healthState);
540 }
541 
GetPluggedType()542 BatteryPluggedType BatteryService::GetPluggedType()
543 {
544     if (isMockUnplugged_) {
545         BATTERY_HILOGD(FEATURE_BATT_INFO, "Return mock plugged type");
546         return batteryInfo_.GetPluggedType();
547     }
548     std::shared_lock<std::shared_mutex> lock(mutex_);
549     V2_0::BatteryPluggedType pluggedType = V2_0::BatteryPluggedType(0);
550     if (iBatteryInterface_ == nullptr) {
551         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
552         return BatteryPluggedType(pluggedType);
553     }
554     iBatteryInterface_->GetPluggedType(pluggedType);
555     return BatteryPluggedType(pluggedType);
556 }
557 
GetVoltage()558 int32_t BatteryService::GetVoltage()
559 {
560     std::shared_lock<std::shared_mutex> lock(mutex_);
561     if (iBatteryInterface_ == nullptr) {
562         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
563         return ERR_NO_INIT;
564     }
565     int32_t voltage = INVALID_BATT_INT_VALUE;
566     iBatteryInterface_->GetVoltage(voltage);
567     return voltage;
568 }
569 
GetPresent()570 bool BatteryService::GetPresent()
571 {
572     std::shared_lock<std::shared_mutex> lock(mutex_);
573     bool present = false;
574     if (iBatteryInterface_ == nullptr) {
575         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
576         return present;
577     }
578 
579     iBatteryInterface_->GetPresent(present);
580     return present;
581 }
582 
GetTechnology()583 std::string BatteryService::GetTechnology()
584 {
585     std::shared_lock<std::shared_mutex> lock(mutex_);
586     if (iBatteryInterface_ == nullptr) {
587         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
588         return "";
589     }
590 
591     std::string technology;
592     iBatteryInterface_->GetTechnology(technology);
593     return technology;
594 }
595 
GetBatteryTemperature()596 int32_t BatteryService::GetBatteryTemperature()
597 {
598     std::shared_lock<std::shared_mutex> lock(mutex_);
599     if (iBatteryInterface_ == nullptr) {
600         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
601         return batteryInfo_.GetTemperature();
602     }
603     int32_t temperature = INVALID_BATT_INT_VALUE;
604     iBatteryInterface_->GetTemperature(temperature);
605     return temperature;
606 }
607 
GetTotalEnergy()608 int32_t BatteryService::GetTotalEnergy()
609 {
610     int32_t totalEnergy = INVALID_BATT_INT_VALUE;
611     if (!Permission::IsSystem()) {
612         BATTERY_HILOGD(FEATURE_BATT_INFO, "GetTotalEnergy totalEnergy: %{public}d", totalEnergy);
613         return totalEnergy;
614     }
615     std::shared_lock<std::shared_mutex> lock(mutex_);
616     if (iBatteryInterface_ == nullptr) {
617         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
618         return batteryInfo_.GetTotalEnergy();
619     }
620     iBatteryInterface_->GetTotalEnergy(totalEnergy);
621     return totalEnergy;
622 }
623 
GetCurrentAverage()624 int32_t BatteryService::GetCurrentAverage()
625 {
626     std::shared_lock<std::shared_mutex> lock(mutex_);
627     if (iBatteryInterface_ == nullptr) {
628         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
629         return batteryInfo_.GetCurAverage();
630     }
631     int32_t curAverage = INVALID_BATT_INT_VALUE;
632     iBatteryInterface_->GetCurrentAverage(curAverage);
633     return curAverage;
634 }
635 
GetNowCurrent()636 int32_t BatteryService::GetNowCurrent()
637 {
638     int32_t nowCurr = INVALID_BATT_INT_VALUE;
639     std::shared_lock<std::shared_mutex> lock(mutex_);
640     if (iBatteryInterface_ == nullptr) {
641         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
642         return batteryInfo_.GetNowCurrent();
643     }
644     iBatteryInterface_->GetCurrentNow(nowCurr);
645     return nowCurr;
646 }
647 
GetRemainEnergy()648 int32_t BatteryService::GetRemainEnergy()
649 {
650     int32_t remainEnergy = INVALID_BATT_INT_VALUE;
651     if (!Permission::IsSystem()) {
652         BATTERY_HILOGD(FEATURE_BATT_INFO, "GetRemainEnergy remainEnergy: %{public}d", remainEnergy);
653         return remainEnergy;
654     }
655     std::shared_lock<std::shared_mutex> lock(mutex_);
656     if (iBatteryInterface_ == nullptr) {
657         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
658         return batteryInfo_.GetRemainEnergy();
659     }
660     iBatteryInterface_->GetRemainEnergy(remainEnergy);
661     return remainEnergy;
662 }
663 
GetChargeType()664 ChargeType BatteryService::GetChargeType()
665 {
666     std::shared_lock<std::shared_mutex> lock(mutex_);
667     V2_0::ChargeType chargeType = V2_0::ChargeType::CHARGE_TYPE_NONE;
668     if (iBatteryInterface_ == nullptr) {
669         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
670         return ChargeType(chargeType);
671     }
672 
673     iBatteryInterface_->GetChargeType(chargeType);
674     return ChargeType(chargeType);
675 }
676 
CalculateRemainingChargeTime(int32_t capacity,BatteryChargeState chargeState)677 void BatteryService::CalculateRemainingChargeTime(int32_t capacity, BatteryChargeState chargeState)
678 {
679     if (capacity > BATTERY_FULL_CAPACITY) {
680         BATTERY_HILOGE(FEATURE_BATT_INFO, "capacity error");
681         return;
682     }
683 
684     if (chargeState != BatteryChargeState::CHARGE_STATE_ENABLE) {
685         remainTime_ = 0;
686         chargeFlag_ = false;
687         return;
688     }
689 
690     if (!chargeFlag_) {
691         lastCapacity_ = capacity;
692         lastTime_ = GetCurrentTime();
693         chargeFlag_ = true;
694     }
695 
696     if (capacity < lastCapacity_) {
697         lastCapacity_ = capacity;
698     }
699 
700     if (((capacity - lastCapacity_) >= 1) && (lastCapacity_ >= 0) && chargeFlag_) {
701         int64_t onceTime = (GetCurrentTime() - lastTime_) / (capacity - lastCapacity_);
702         remainTime_ = (BATTERY_FULL_CAPACITY - capacity) * onceTime;
703         lastCapacity_ = capacity;
704         lastTime_ = GetCurrentTime();
705     }
706 }
707 
GetRemainingChargeTime()708 int64_t BatteryService::GetRemainingChargeTime()
709 {
710     if (!Permission::IsSystem()) {
711         BATTERY_HILOGW(FEATURE_BATT_INFO, "system permission denied.");
712         return INVALID_REMAINING_CHARGE_TIME_VALUE;
713     }
714     return remainTime_;
715 }
716 
IsCapacityLevelDefined(int32_t capacityThreshold)717 bool IsCapacityLevelDefined(int32_t capacityThreshold)
718 {
719     return capacityThreshold != INVALID_BATT_INT_VALUE;
720 }
721 
GetCapacityLevel()722 BatteryCapacityLevel BatteryService::GetCapacityLevel()
723 {
724     BatteryCapacityLevel batteryCapacityLevel = BatteryCapacityLevel::LEVEL_NONE;
725     int32_t capacity = GetCapacity();
726     if (IsCapacityLevelDefined(shutdownCapacityThreshold_) && capacity > 0 && capacity <= shutdownCapacityThreshold_) {
727         batteryCapacityLevel = BatteryCapacityLevel::LEVEL_SHUTDOWN;
728     } else if (IsCapacityLevelDefined(criticalCapacityThreshold_) && capacity > shutdownCapacityThreshold_ &&
729         capacity <= criticalCapacityThreshold_) {
730         batteryCapacityLevel = BatteryCapacityLevel::LEVEL_CRITICAL;
731     } else if (IsCapacityLevelDefined(warningCapacityThreshold_) && capacity > criticalCapacityThreshold_ &&
732         capacity <= warningCapacityThreshold_) {
733         batteryCapacityLevel = BatteryCapacityLevel::LEVEL_WARNING;
734     } else if (IsCapacityLevelDefined(lowCapacityThreshold_) && capacity > warningCapacityThreshold_ &&
735         capacity <= lowCapacityThreshold_) {
736         batteryCapacityLevel = BatteryCapacityLevel::LEVEL_LOW;
737     } else if (IsCapacityLevelDefined(normalCapacityThreshold_) && capacity > lowCapacityThreshold_ &&
738         capacity <= normalCapacityThreshold_) {
739         batteryCapacityLevel = BatteryCapacityLevel::LEVEL_NORMAL;
740     } else if (IsCapacityLevelDefined(highCapacityThreshold_) && capacity > normalCapacityThreshold_ &&
741         capacity <= highCapacityThreshold_) {
742         batteryCapacityLevel = BatteryCapacityLevel::LEVEL_HIGH;
743     } else if (IsCapacityLevelDefined(fullCapacityThreshold_) && capacity > highCapacityThreshold_ &&
744         capacity <= fullCapacityThreshold_) {
745         batteryCapacityLevel = BatteryCapacityLevel::LEVEL_FULL;
746     }
747     return batteryCapacityLevel;
748 }
749 
Dump(int32_t fd,const std::vector<std::u16string> & args)750 int32_t BatteryService::Dump(int32_t fd, const std::vector<std::u16string> &args)
751 {
752     if (!isBootCompleted_) {
753         return ERR_NO_INIT;
754     }
755     if (!Permission::IsSystem()) {
756         return ERR_PERMISSION_DENIED;
757     }
758     BatteryDump& batteryDump = BatteryDump::GetInstance();
759     if ((args.empty()) || (args[0].compare(u"-h") == 0)) {
760         batteryDump.DumpBatteryHelp(fd);
761         return ERR_OK;
762     }
763     bool getBatteryInfo = batteryDump.GetBatteryInfo(fd, g_service, args);
764     bool unplugged = batteryDump.MockUnplugged(fd, g_service, args);
765     bool mockedCapacity = batteryDump.MockCapacity(fd, g_service, args);
766     bool mockedUevent = batteryDump.MockUevent(fd, g_service, args);
767     bool reset = batteryDump.Reset(fd, g_service, args);
768     bool total = getBatteryInfo + unplugged + mockedCapacity + mockedUevent + reset;
769     if (!total) {
770         dprintf(fd, "cmd param is invalid\n");
771         batteryDump.DumpBatteryHelp(fd);
772         return ERR_NO_INIT;
773     }
774 
775     return ERR_OK;
776 }
777 
MockUnplugged()778 void BatteryService::MockUnplugged()
779 {
780     std::shared_lock<std::shared_mutex> lock(mutex_);
781     if (!iBatteryInterface_) {
782         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
783         return;
784     }
785     isMockUnplugged_ = true;
786     V2_0::BatteryInfo event;
787     iBatteryInterface_->GetBatteryInfo(event);
788     ConvertingEvent(event);
789     batteryInfo_.SetPluggedType(BatteryPluggedType::PLUGGED_TYPE_NONE);
790     batteryInfo_.SetPluggedMaxCurrent(0);
791     batteryInfo_.SetPluggedMaxVoltage(0);
792     batteryInfo_.SetChargeState(BatteryChargeState::CHARGE_STATE_NONE);
793     HandleBatteryInfo();
794 }
795 
IsMockUnplugged()796 bool BatteryService::IsMockUnplugged()
797 {
798     return isMockUnplugged_;
799 }
800 
MockCapacity(int32_t capacity)801 void BatteryService::MockCapacity(int32_t capacity)
802 {
803     std::shared_lock<std::shared_mutex> lock(mutex_);
804     if (!iBatteryInterface_) {
805         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
806         return;
807     }
808     isMockCapacity_ = true;
809     V2_0::BatteryInfo event;
810     iBatteryInterface_->GetBatteryInfo(event);
811     ConvertingEvent(event);
812     batteryInfo_.SetCapacity(capacity);
813     HandleBatteryInfo();
814 }
815 
IsMockCapacity()816 bool BatteryService::IsMockCapacity()
817 {
818     return isMockCapacity_;
819 }
820 
MockUevent(const std::string & uevent)821 void BatteryService::MockUevent(const std::string& uevent)
822 {
823     std::shared_lock<std::shared_mutex> lock(mutex_);
824     if (!iBatteryInterface_) {
825         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
826         return;
827     }
828     isMockUevent_ = true;
829     V2_0::BatteryInfo event;
830     iBatteryInterface_->GetBatteryInfo(event);
831     ConvertingEvent(event);
832     batteryInfo_.SetUevent(uevent);
833     HandleBatteryInfo();
834 }
835 
Reset()836 void BatteryService::Reset()
837 {
838     std::shared_lock<std::shared_mutex> lock(mutex_);
839     if (!iBatteryInterface_) {
840         BATTERY_HILOGE(FEATURE_BATT_INFO, "iBatteryInterface_ is nullptr");
841         return;
842     }
843     isMockUnplugged_ = false;
844     isMockCapacity_ = false;
845     isMockUevent_ = false;
846     V2_0::BatteryInfo event;
847     iBatteryInterface_->GetBatteryInfo(event);
848     ConvertingEvent(event);
849     HandleBatteryInfo();
850 }
851 
VibratorInit()852 void BatteryService::VibratorInit()
853 {
854     std::shared_ptr<PowerVibrator> vibrator = PowerVibrator::GetInstance();
855     vibrator->LoadConfig(BATTERY_VIBRATOR_CONFIG_FILE,
856         VENDOR_BATTERY_VIBRATOR_CONFIG_FILE, SYSTEM_BATTERY_VIBRATOR_CONFIG_FILE);
857 }
858 } // namespace PowerMgr
859 } // namespace OHOS
860