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