• 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_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