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_srv_client.h"
17
18 #include "new"
19 #include "refbase.h"
20 #include "errors.h"
21 #include "iremote_broker.h"
22 #include "iservice_registry.h"
23 #include "if_system_ability_manager.h"
24 #include "system_ability_definition.h"
25 #include "battery_info.h"
26 #include "battery_log.h"
27 #include "power_mgr_errors.h"
28 #include "power_common.h"
29
30 namespace OHOS {
31 namespace PowerMgr {
BatterySrvClient()32 BatterySrvClient::BatterySrvClient() {}
~BatterySrvClient()33 BatterySrvClient::~BatterySrvClient() {}
34
Connect()35 sptr<IBatterySrv> BatterySrvClient::Connect()
36 {
37 std::lock_guard<std::mutex> lock(mutex_);
38 if (proxy_ != nullptr) {
39 return proxy_;
40 }
41 sptr<ISystemAbilityManager> sysMgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
42 if (sysMgr == nullptr) {
43 BATTERY_HILOGE(COMP_FWK, "Failed to get Registry");
44 return nullptr;
45 }
46 sptr<IRemoteObject> remoteObject_ = sysMgr->CheckSystemAbility(POWER_MANAGER_BATT_SERVICE_ID);
47 if (remoteObject_ == nullptr) {
48 BATTERY_HILOGE(COMP_FWK, "GetSystemAbility failed");
49 return nullptr;
50 }
51 sptr<IRemoteObject::DeathRecipient> drt = new(std::nothrow) BatterySrvDeathRecipient(*this);
52 if (drt == nullptr) {
53 BATTERY_HILOGE(COMP_FWK, "Failed to create BatterySrvDeathRecipient");
54 return nullptr;
55 }
56 if ((remoteObject_->IsProxyObject()) && (!remoteObject_->AddDeathRecipient(drt))) {
57 BATTERY_HILOGE(COMP_FWK, "Add death recipient to BatterySrv failed");
58 return nullptr;
59 }
60
61 proxy_ = iface_cast<IBatterySrv>(remoteObject_);
62 deathRecipient_ = drt;
63 BATTERY_HILOGI(COMP_FWK, "Connecting PowerMgrService success, pid=%{public}d", getpid());
64 return proxy_;
65 }
66
ResetProxy(const wptr<IRemoteObject> & remote)67 void BatterySrvClient::ResetProxy(const wptr<IRemoteObject>& remote)
68 {
69 if (remote == nullptr) {
70 BATTERY_HILOGE(COMP_FWK, "OnRemoteDied failed, remote is nullptr");
71 return;
72 }
73
74 std::lock_guard<std::mutex> lock(mutex_);
75 RETURN_IF(proxy_ == nullptr);
76 auto serviceRemote = proxy_->AsObject();
77 if ((serviceRemote != nullptr) && (serviceRemote == remote.promote())) {
78 serviceRemote->RemoveDeathRecipient(deathRecipient_);
79 proxy_ = nullptr;
80 }
81 }
82
OnRemoteDied(const wptr<IRemoteObject> & remote)83 void BatterySrvClient::BatterySrvDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
84 {
85 BATTERY_HILOGW(COMP_FWK, "Recv death notice, BateryService Died");
86 client_.ResetProxy(remote);
87 }
88
GetCapacity()89 int32_t BatterySrvClient::GetCapacity()
90 {
91 auto proxy = Connect();
92 RETURN_IF_WITH_RET(proxy == nullptr, INVALID_BATT_INT_VALUE);
93 int32_t capacity = INVALID_BATT_INT_VALUE;
94 auto ret = proxy->GetCapacity(capacity);
95 if (ret != ERR_OK) {
96 BATTERY_HILOGE(COMP_FWK, "GetCapacity ret = %{public}d", ret);
97 return INVALID_BATT_INT_VALUE;
98 }
99 return capacity;
100 }
101
GetChargingStatus()102 BatteryChargeState BatterySrvClient::GetChargingStatus()
103 {
104 auto proxy = Connect();
105 RETURN_IF_WITH_RET(proxy == nullptr, BatteryChargeState::CHARGE_STATE_BUTT);
106 uint32_t chargeState = static_cast<uint32_t>(BatteryChargeState::CHARGE_STATE_BUTT);
107 auto ret = proxy->GetChargingStatus(chargeState);
108 if (ret != ERR_OK) {
109 BATTERY_HILOGE(COMP_FWK, "GetChargingStatus ret = %{public}d", ret);
110 return BatteryChargeState::CHARGE_STATE_BUTT;
111 }
112 return static_cast<BatteryChargeState>(chargeState);
113 }
114
GetHealthStatus()115 BatteryHealthState BatterySrvClient::GetHealthStatus()
116 {
117 auto proxy = Connect();
118 RETURN_IF_WITH_RET(proxy == nullptr, BatteryHealthState::HEALTH_STATE_BUTT);
119 uint32_t healthState = static_cast<uint32_t>(BatteryHealthState::HEALTH_STATE_BUTT);
120 auto ret = proxy->GetHealthStatus(healthState);
121 if (ret != ERR_OK) {
122 BATTERY_HILOGE(COMP_FWK, "GetHealthStatus ret = %{public}d", ret);
123 return BatteryHealthState::HEALTH_STATE_BUTT;
124 }
125 return static_cast<BatteryHealthState>(healthState);
126 }
127
GetPluggedType()128 BatteryPluggedType BatterySrvClient::GetPluggedType()
129 {
130 auto proxy = Connect();
131 RETURN_IF_WITH_RET(proxy == nullptr, BatteryPluggedType::PLUGGED_TYPE_BUTT);
132 uint32_t pluggedType = static_cast<uint32_t>(BatteryPluggedType::PLUGGED_TYPE_BUTT);
133 auto ret = proxy->GetPluggedType(pluggedType);
134 if (ret != ERR_OK) {
135 BATTERY_HILOGE(COMP_FWK, "GetPluggedType ret = %{public}d", ret);
136 return BatteryPluggedType::PLUGGED_TYPE_BUTT;
137 }
138 return static_cast<BatteryPluggedType>(pluggedType);
139 }
140
GetVoltage()141 int32_t BatterySrvClient::GetVoltage()
142 {
143 auto proxy = Connect();
144 RETURN_IF_WITH_RET(proxy == nullptr, INVALID_BATT_INT_VALUE);
145 int32_t voltage = INVALID_BATT_INT_VALUE;
146 auto ret = proxy->GetVoltage(voltage);
147 if (ret != ERR_OK) {
148 BATTERY_HILOGE(COMP_FWK, "GetVoltage ret = %{public}d", ret);
149 return INVALID_BATT_INT_VALUE;
150 }
151 return voltage;
152 }
153
GetPresent()154 bool BatterySrvClient::GetPresent()
155 {
156 auto proxy = Connect();
157 RETURN_IF_WITH_RET(proxy == nullptr, INVALID_BATT_BOOL_VALUE);
158 bool present = INVALID_BATT_BOOL_VALUE;
159 auto ret = proxy->GetPresent(present);
160 if (ret != ERR_OK) {
161 BATTERY_HILOGE(COMP_FWK, "GetPresent ret = %{public}d", ret);
162 return INVALID_BATT_BOOL_VALUE;
163 }
164 return present;
165 }
166
GetTechnology()167 std::string BatterySrvClient::GetTechnology()
168 {
169 auto proxy = Connect();
170 RETURN_IF_WITH_RET(proxy == nullptr, "");
171 std::string technology = INVALID_STRING_VALUE;
172 auto ret = proxy->GetTechnology(technology);
173 if (ret != ERR_OK) {
174 BATTERY_HILOGE(COMP_FWK, "GetTechnology ret = %{public}d", ret);
175 return INVALID_STRING_VALUE;
176 }
177 return technology;
178 }
179
GetBatteryTemperature()180 int32_t BatterySrvClient::GetBatteryTemperature()
181 {
182 auto proxy = Connect();
183 RETURN_IF_WITH_RET(proxy == nullptr, INVALID_BATT_TEMP_VALUE);
184 int32_t temperature = INVALID_BATT_TEMP_VALUE;
185 auto ret = proxy->GetBatteryTemperature(temperature);
186 if (ret != ERR_OK) {
187 BATTERY_HILOGE(COMP_FWK, "GetBatteryTemperature ret = %{public}d", ret);
188 return INVALID_BATT_TEMP_VALUE;
189 }
190 return temperature;
191 }
192
GetNowCurrent()193 int32_t BatterySrvClient::GetNowCurrent()
194 {
195 auto proxy = Connect();
196 RETURN_IF_WITH_RET(proxy == nullptr, INVALID_BATT_INT_VALUE);
197 int32_t nowCurr = INVALID_BATT_INT_VALUE;
198 auto ret = proxy->GetNowCurrent(nowCurr);
199 if (ret != ERR_OK) {
200 BATTERY_HILOGE(COMP_FWK, "GetNowCurrent ret = %{public}d", ret);
201 return INVALID_BATT_INT_VALUE;
202 }
203 return nowCurr;
204 }
205
GetRemainEnergy()206 int32_t BatterySrvClient::GetRemainEnergy()
207 {
208 auto proxy = Connect();
209 RETURN_IF_WITH_RET(proxy == nullptr, INVALID_BATT_INT_VALUE);
210 int32_t remainEnergy = INVALID_BATT_INT_VALUE;
211 auto ret = proxy->GetRemainEnergy(remainEnergy);
212 if (ret != ERR_OK) {
213 BATTERY_HILOGE(COMP_FWK, "GetRemainEnergy ret = %{public}d", ret);
214 return INVALID_BATT_INT_VALUE;
215 }
216 return remainEnergy;
217 }
218
GetTotalEnergy()219 int32_t BatterySrvClient::GetTotalEnergy()
220 {
221 auto proxy = Connect();
222 RETURN_IF_WITH_RET(proxy == nullptr, INVALID_BATT_INT_VALUE);
223 int32_t totalEnergy = INVALID_BATT_INT_VALUE;
224 auto ret = proxy->GetTotalEnergy(totalEnergy);
225 if (ret != ERR_OK) {
226 BATTERY_HILOGE(COMP_FWK, "GetTotalEnergy ret = %{public}d", ret);
227 return INVALID_BATT_INT_VALUE;
228 }
229 return totalEnergy;
230 }
231
GetCapacityLevel()232 BatteryCapacityLevel BatterySrvClient::GetCapacityLevel()
233 {
234 auto proxy = Connect();
235 RETURN_IF_WITH_RET(proxy == nullptr, BatteryCapacityLevel::LEVEL_NONE);
236 uint32_t batteryCapacityLevel = static_cast<uint32_t>(BatteryCapacityLevel::LEVEL_NONE);
237 auto ret = proxy->GetCapacityLevel(batteryCapacityLevel);
238 if (ret != ERR_OK) {
239 BATTERY_HILOGE(COMP_FWK, "GetCapacityLevel ret = %{public}d", ret);
240 return BatteryCapacityLevel::LEVEL_NONE;
241 }
242 return static_cast<BatteryCapacityLevel>(batteryCapacityLevel);
243 }
244
GetRemainingChargeTime()245 int64_t BatterySrvClient::GetRemainingChargeTime()
246 {
247 auto proxy = Connect();
248 RETURN_IF_WITH_RET(proxy == nullptr, INVALID_REMAINING_CHARGE_TIME_VALUE);
249 int64_t remainTime = INVALID_REMAINING_CHARGE_TIME_VALUE;
250 auto ret = proxy->GetRemainingChargeTime(remainTime);
251 if (ret != ERR_OK) {
252 BATTERY_HILOGE(COMP_FWK, "GetRemainingChargeTime ret = %{public}d", ret);
253 return INVALID_REMAINING_CHARGE_TIME_VALUE;
254 }
255 return remainTime;
256 }
257
SetBatteryConfig(const std::string & sceneName,const std::string & value)258 BatteryError BatterySrvClient::SetBatteryConfig(const std::string& sceneName, const std::string& value)
259 {
260 auto proxy = Connect();
261 RETURN_IF_WITH_RET(proxy == nullptr, BatteryError::ERR_CONNECTION_FAIL);
262 int32_t batteryErr = static_cast<int32_t>(BatteryError::ERR_CONNECTION_FAIL);
263 auto ret = proxy->SetBatteryConfig(sceneName, value, batteryErr);
264 if (ret != ERR_OK) {
265 BATTERY_HILOGE(COMP_FWK, "SetBatteryConfig ret = %{public}d", ret);
266 return BatteryError::ERR_CONNECTION_FAIL;
267 }
268 return static_cast<BatteryError>(batteryErr);
269 }
270
GetBatteryConfig(const std::string & sceneName,std::string & result)271 BatteryError BatterySrvClient::GetBatteryConfig(const std::string& sceneName, std::string& result)
272 {
273 auto proxy = Connect();
274 RETURN_IF_WITH_RET(proxy == nullptr, BatteryError::ERR_CONNECTION_FAIL);
275 int32_t batteryErr = static_cast<int32_t>(BatteryError::ERR_CONNECTION_FAIL);
276 auto ret = proxy->GetBatteryConfig(sceneName, result, batteryErr);
277 if (ret != ERR_OK) {
278 BATTERY_HILOGE(COMP_FWK, "GetBatteryConfig ret = %{public}d", ret);
279 return BatteryError::ERR_CONNECTION_FAIL;
280 }
281 return static_cast<BatteryError>(batteryErr);
282 }
283
IsBatteryConfigSupported(const std::string & sceneName,bool & result)284 BatteryError BatterySrvClient::IsBatteryConfigSupported(const std::string& sceneName, bool& result)
285 {
286 auto proxy = Connect();
287 RETURN_IF_WITH_RET(proxy == nullptr, BatteryError::ERR_CONNECTION_FAIL);
288 int32_t batteryErr = static_cast<int32_t>(BatteryError::ERR_CONNECTION_FAIL);
289 auto ret = proxy->IsBatteryConfigSupported(sceneName, result, batteryErr);
290 if (ret != ERR_OK) {
291 BATTERY_HILOGE(COMP_FWK, "IsBatteryConfigSupported ret = %{public}d", ret);
292 return BatteryError::ERR_CONNECTION_FAIL;
293 }
294 return static_cast<BatteryError>(batteryErr);
295 }
296 } // namespace PowerMgr
297 } // namespace OHOS
298