1 /*
2 * Copyright (C) 2022 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 #ifdef FEATURE_GNSS_SUPPORT
17 #include "gnss_ability.h"
18
19 #include <file_ex.h>
20 #include <thread>
21
22 #include "event_runner.h"
23 #include "idevmgr_hdi.h"
24 #include "ipc_skeleton.h"
25 #include "iproxy_broker.h"
26 #include "iservice_registry.h"
27 #include "system_ability_definition.h"
28
29 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
30 #include "agnss_event_callback.h"
31 #endif
32 #include "common_hisysevent.h"
33 #include "common_utils.h"
34 #include "gnss_event_callback.h"
35 #include "i_cached_locations_callback.h"
36 #include "location_config_manager.h"
37 #include "location_dumper.h"
38 #include "location_log.h"
39 #include "location_sa_load_manager.h"
40 #include "locationhub_ipc_interface_code.h"
41 #include "location_log_event_ids.h"
42
43 namespace OHOS {
44 namespace Location {
45 namespace {
46 constexpr uint32_t WAIT_MS = 200;
47 const uint32_t EVENT_REPORT_LOCATION = 0x0100;
48 const uint32_t RECONNECT_HDI = 0x0103;
49 const uint32_t INIT_HDI = 0x0104;
50 const uint32_t EVENT_INTERVAL_UNITE = 1000;
51 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
52 const uint32_t SET_SUBSCRIBER_SET_ID = 0x0101;
53 const uint32_t SET_AGNSS_REF_INFO = 0x0102;
54 constexpr const char *AGNSS_SERVICE_NAME = "agnss_interface_service";
55 #endif
56 constexpr const char *GNSS_SERVICE_NAME = "gnss_interface_service";
57 const std::string UNLOAD_GNSS_TASK = "gnss_sa_unload";
58 const uint32_t RETRY_INTERVAL_OF_UNLOAD_SA = 4 * 60 * EVENT_INTERVAL_UNITE;
59 }
60
61 const bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(
62 DelayedSingleton<GnssAbility>::GetInstance().get());
63
GnssAbility()64 GnssAbility::GnssAbility() : SystemAbility(LOCATION_GNSS_SA_ID, true)
65 {
66 gnssInterface_ = nullptr;
67 gnssCallback_ = nullptr;
68 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
69 agnssCallback_ = nullptr;
70 agnssInterface_ = nullptr;
71 #endif
72 gnssWorkingStatus_ = GNSS_STATUS_NONE;
73 SetAbility(GNSS_ABILITY);
74 gnssHandler_ = std::make_shared<GnssHandler>(AppExecFwk::EventRunner::Create(true));
75 if (gnssHandler_ != nullptr) {
76 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(INIT_HDI, 0);
77 gnssHandler_->SendEvent(event);
78 }
79 LBSLOGI(GNSS, "ability constructed.");
80 }
81
~GnssAbility()82 GnssAbility::~GnssAbility()
83 {
84 }
85
CheckIfHdiConnected()86 bool GnssAbility::CheckIfHdiConnected()
87 {
88 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
89 return gnssInterface_ != nullptr && agnssInterface_ != nullptr;
90 #else
91 return gnssInterface_ != nullptr;
92 #endif
93 }
94
OnStart()95 void GnssAbility::OnStart()
96 {
97 if (state_ == ServiceRunningState::STATE_RUNNING) {
98 LBSLOGI(GNSS, "ability has already started.");
99 return;
100 }
101 if (!Init()) {
102 LBSLOGE(GNSS, "failed to init ability");
103 OnStop();
104 return;
105 }
106 state_ = ServiceRunningState::STATE_RUNNING;
107 LBSLOGI(GNSS, "OnStart start ability success.");
108 }
109
OnStop()110 void GnssAbility::OnStop()
111 {
112 state_ = ServiceRunningState::STATE_NOT_START;
113 registerToAbility_ = false;
114 LBSLOGI(GNSS, "OnStop ability stopped.");
115 }
116
Init()117 bool GnssAbility::Init()
118 {
119 if (!registerToAbility_) {
120 bool ret = Publish(AsObject());
121 if (!ret) {
122 LBSLOGE(GNSS, "Init Publish failed!");
123 return false;
124 }
125 registerToAbility_ = true;
126 }
127 return true;
128 }
129
SendLocationRequest(WorkRecord & workrecord)130 LocationErrCode GnssAbility::SendLocationRequest(WorkRecord &workrecord)
131 {
132 LocationRequest(workrecord);
133 return ERRCODE_SUCCESS;
134 }
135
SetEnable(bool state)136 LocationErrCode GnssAbility::SetEnable(bool state)
137 {
138 if (!CheckIfHdiConnected()) {
139 LBSLOGE(GNSS, "no need start or stop gnss");
140 return ERRCODE_SUCCESS;
141 }
142 if (state) {
143 EnableGnss();
144 StartGnss();
145 } else {
146 StopGnss();
147 DisableGnss();
148 }
149 return ERRCODE_SUCCESS;
150 }
151
UnloadGnssSystemAbility()152 void GnssAbility::UnloadGnssSystemAbility()
153 {
154 if (gnssHandler_ == nullptr) {
155 LBSLOGE(GNSS, "%{public}s gnssHandler is nullptr", __func__);
156 return;
157 }
158 gnssHandler_->RemoveTask(UNLOAD_GNSS_TASK);
159 if (CheckIfGnssConnecting()) {
160 return;
161 }
162 auto task = [this]() {
163 auto instance = DelayedSingleton<LocationSaLoadManager>::GetInstance();
164 if (instance == nullptr) {
165 LBSLOGE(GNSS, "%{public}s instance is nullptr", __func__);
166 return;
167 }
168 if (CheckIfHdiConnected()) {
169 RemoveHdi();
170 }
171 instance->UnloadLocationSa(LOCATION_GNSS_SA_ID);
172 };
173 if (gnssHandler_ != nullptr) {
174 gnssHandler_->PostTask(task, UNLOAD_GNSS_TASK, RETRY_INTERVAL_OF_UNLOAD_SA);
175 }
176 }
177
CheckIfGnssConnecting()178 bool GnssAbility::CheckIfGnssConnecting()
179 {
180 std::unique_lock<std::mutex> gnssLock(gnssMutex_);
181 std::unique_lock<std::mutex> nmeaLock(nmeaMutex_);
182 return IsMockEnabled() || !gnssStatusCallback_.empty()
183 || !nmeaCallback_.empty() || GetRequestNum() != 0 || IsMockProcessing();
184 }
185
RefrashRequirements()186 LocationErrCode GnssAbility::RefrashRequirements()
187 {
188 HandleRefrashRequirements();
189 return ERRCODE_SUCCESS;
190 }
191
RegisterGnssStatusCallback(const sptr<IRemoteObject> & callback,pid_t uid)192 LocationErrCode GnssAbility::RegisterGnssStatusCallback(const sptr<IRemoteObject>& callback, pid_t uid)
193 {
194 if (callback == nullptr) {
195 LBSLOGE(GNSS, "register an invalid gnssStatus callback");
196 return ERRCODE_INVALID_PARAM;
197 }
198 sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) GnssStatusCallbackDeathRecipient());
199 callback->AddDeathRecipient(death);
200 sptr<IGnssStatusCallback> gnssStatusCallback = iface_cast<IGnssStatusCallback>(callback);
201 if (gnssStatusCallback == nullptr) {
202 LBSLOGE(GNSS, "cast switch callback fail!");
203 return ERRCODE_INVALID_PARAM;
204 }
205 std::unique_lock<std::mutex> lock(gnssMutex_);
206 gnssStatusCallback_.push_back(gnssStatusCallback);
207 LBSLOGD(GNSS, "after uid:%{public}d register, gnssStatusCallback size:%{public}s",
208 uid, std::to_string(gnssStatusCallback_.size()).c_str());
209 return ERRCODE_SUCCESS;
210 }
211
UnregisterGnssStatusCallback(const sptr<IRemoteObject> & callback)212 LocationErrCode GnssAbility::UnregisterGnssStatusCallback(const sptr<IRemoteObject>& callback)
213 {
214 if (callback == nullptr) {
215 LBSLOGE(GNSS, "unregister an invalid gnssStatus callback");
216 return ERRCODE_INVALID_PARAM;
217 }
218 sptr<IGnssStatusCallback> gnssStatusCallback = iface_cast<IGnssStatusCallback>(callback);
219 if (gnssStatusCallback == nullptr) {
220 LBSLOGE(GNSS, "cast gnssStatus callback fail!");
221 return ERRCODE_INVALID_PARAM;
222 }
223
224 std::unique_lock<std::mutex> lock(gnssMutex_);
225 size_t i = 0;
226 for (; i < gnssStatusCallback_.size(); i++) {
227 sptr<IRemoteObject> remoteObject = gnssStatusCallback_[i]->AsObject();
228 if (remoteObject == callback) {
229 break;
230 }
231 }
232 if (i >= gnssStatusCallback_.size()) {
233 LBSLOGD(GNSS, "gnssStatus callback is not in vector");
234 return ERRCODE_SUCCESS;
235 }
236 if (gnssStatusCallback_.size() > 0) {
237 gnssStatusCallback_.erase(gnssStatusCallback_.begin() + i);
238 }
239 LBSLOGD(GNSS, "after unregister, gnssStatus callback size:%{public}s",
240 std::to_string(gnssStatusCallback_.size()).c_str());
241 return ERRCODE_SUCCESS;
242 }
243
RegisterNmeaMessageCallback(const sptr<IRemoteObject> & callback,pid_t uid)244 LocationErrCode GnssAbility::RegisterNmeaMessageCallback(const sptr<IRemoteObject>& callback, pid_t uid)
245 {
246 if (callback == nullptr) {
247 LBSLOGE(GNSS, "register an invalid nmea callback");
248 return ERRCODE_INVALID_PARAM;
249 }
250 sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) NmeaCallbackDeathRecipient());
251 callback->AddDeathRecipient(death);
252 sptr<INmeaMessageCallback> nmeaCallback = iface_cast<INmeaMessageCallback>(callback);
253 if (nmeaCallback == nullptr) {
254 LBSLOGE(GNSS, "cast nmea callback fail!");
255 return ERRCODE_INVALID_PARAM;
256 }
257 std::unique_lock<std::mutex> lock(nmeaMutex_);
258 nmeaCallback_.push_back(nmeaCallback);
259 LBSLOGD(GNSS, "after uid:%{public}d register, nmeaCallback size:%{public}s",
260 uid, std::to_string(nmeaCallback_.size()).c_str());
261 return ERRCODE_SUCCESS;
262 }
263
UnregisterNmeaMessageCallback(const sptr<IRemoteObject> & callback)264 LocationErrCode GnssAbility::UnregisterNmeaMessageCallback(const sptr<IRemoteObject>& callback)
265 {
266 if (callback == nullptr) {
267 LBSLOGE(GNSS, "unregister an invalid nmea callback");
268 return ERRCODE_INVALID_PARAM;
269 }
270 sptr<INmeaMessageCallback> nmeaCallback = iface_cast<INmeaMessageCallback>(callback);
271 if (nmeaCallback == nullptr) {
272 LBSLOGE(GNSS, "cast nmea callback fail!");
273 return ERRCODE_INVALID_PARAM;
274 }
275
276 std::unique_lock<std::mutex> lock(nmeaMutex_);
277 size_t i = 0;
278 for (; i < nmeaCallback_.size(); i++) {
279 sptr<IRemoteObject> remoteObject = nmeaCallback_[i]->AsObject();
280 if (remoteObject == callback) {
281 break;
282 }
283 }
284 if (i >= nmeaCallback_.size()) {
285 LBSLOGD(GNSS, "nmea callback is not in vector");
286 return ERRCODE_SUCCESS;
287 }
288 if (nmeaCallback_.size() > 0) {
289 nmeaCallback_.erase(nmeaCallback_.begin() + i);
290 }
291 LBSLOGD(GNSS, "after unregister, nmea callback size:%{public}s",
292 std::to_string(nmeaCallback_.size()).c_str());
293 return ERRCODE_SUCCESS;
294 }
295
RegisterCachedCallback(const std::unique_ptr<CachedGnssLocationsRequest> & request,const sptr<IRemoteObject> & callback)296 LocationErrCode GnssAbility::RegisterCachedCallback(const std::unique_ptr<CachedGnssLocationsRequest>& request,
297 const sptr<IRemoteObject>& callback)
298 {
299 if (callback == nullptr) {
300 LBSLOGE(GNSS, "register an invalid cached location callback");
301 return ERRCODE_INVALID_PARAM;
302 }
303 sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) CachedLocationCallbackDeathRecipient());
304 callback->AddDeathRecipient(death);
305 sptr<ICachedLocationsCallback> cachedCallback = iface_cast<ICachedLocationsCallback>(callback);
306 if (cachedCallback == nullptr) {
307 LBSLOGE(GNSS, "cast cached location callback fail!");
308 return ERRCODE_INVALID_PARAM;
309 }
310 LBSLOGD(GNSS, "request:%{public}d %{public}d",
311 request->reportingPeriodSec, request->wakeUpCacheQueueFull ? 1 : 0);
312 return ERRCODE_NOT_SUPPORTED;
313 }
314
UnregisterCachedCallback(const sptr<IRemoteObject> & callback)315 LocationErrCode GnssAbility::UnregisterCachedCallback(const sptr<IRemoteObject>& callback)
316 {
317 if (callback == nullptr) {
318 LBSLOGE(GNSS, "register an invalid cached location callback");
319 return ERRCODE_INVALID_PARAM;
320 }
321
322 sptr<ICachedLocationsCallback> cachedCallback = iface_cast<ICachedLocationsCallback>(callback);
323 if (cachedCallback == nullptr) {
324 LBSLOGE(GNSS, "cast cached location callback fail!");
325 return ERRCODE_INVALID_PARAM;
326 }
327 return ERRCODE_NOT_SUPPORTED;
328 }
329
RequestRecord(WorkRecord & workRecord,bool isAdded)330 void GnssAbility::RequestRecord(WorkRecord &workRecord, bool isAdded)
331 {
332 LBSLOGD(GNSS, "enter RequestRecord");
333 if (isAdded) {
334 if (!CheckIfHdiConnected()) {
335 ConnectHdi();
336 EnableGnss();
337 }
338 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
339 SetAgnssCallback();
340 SetAgnssServer();
341 #endif
342 StartGnss();
343 } else {
344 // GNSS will stop only if all requests have stopped
345 if (CheckIfHdiConnected() && GetRequestNum() == 0) {
346 StopGnss();
347 }
348 }
349 std::string state = isAdded ? "start" : "stop";
350 WriteGnssStateEvent(state, workRecord.GetPid(0), workRecord.GetUid(0));
351 }
352
ReConnectHdi()353 void GnssAbility::ReConnectHdi()
354 {
355 if (gnssHandler_ != nullptr) {
356 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(RECONNECT_HDI, 0);
357 gnssHandler_->SendEvent(event);
358 }
359 }
360
ReConnectHdiImpl()361 void GnssAbility::ReConnectHdiImpl()
362 {
363 LBSLOGD(GNSS, "%{public}s called", __func__);
364 ConnectHdi();
365 EnableGnss();
366 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
367 SetAgnssCallback();
368 SetAgnssServer();
369 #endif
370 if (gnssWorkingStatus_ == GNSS_STATUS_SESSION_BEGIN) {
371 StartGnss();
372 }
373 }
374
GetCachedGnssLocationsSize(int & size)375 LocationErrCode GnssAbility::GetCachedGnssLocationsSize(int& size)
376 {
377 size = -1;
378 return ERRCODE_NOT_SUPPORTED;
379 }
380
FlushCachedGnssLocations()381 LocationErrCode GnssAbility::FlushCachedGnssLocations()
382 {
383 LBSLOGE(GNSS, "%{public}s not support", __func__);
384 return ERRCODE_NOT_SUPPORTED;
385 }
386
GetCommandFlags(std::unique_ptr<LocationCommand> & commands,GnssAuxiliaryData & flags)387 bool GnssAbility::GetCommandFlags(std::unique_ptr<LocationCommand>& commands, GnssAuxiliaryData& flags)
388 {
389 std::string cmd = commands->command;
390 if (cmd == "delete_auxiliary_data_ephemeris") {
391 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_EPHEMERIS;
392 } else if (cmd == "delete_auxiliary_data_almanac") {
393 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_ALMANAC;
394 } else if (cmd == "delete_auxiliary_data_position") {
395 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_POSITION;
396 } else if (cmd == "delete_auxiliary_data_time") {
397 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_TIME;
398 } else if (cmd == "delete_auxiliary_data_iono") {
399 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_IONO;
400 } else if (cmd == "delete_auxiliary_data_utc") {
401 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_UTC;
402 } else if (cmd == "delete_auxiliary_data_health") {
403 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_HEALTH;
404 } else if (cmd == "delete_auxiliary_data_svdir") {
405 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_SVDIR;
406 } else if (cmd == "delete_auxiliary_data_svsteer") {
407 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_SVSTEER;
408 } else if (cmd == "delete_auxiliary_data_sadata") {
409 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_SADATA;
410 } else if (cmd == "delete_auxiliary_data_rti") {
411 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_RTI;
412 } else if (cmd == "delete_auxiliary_data_celldb_info") {
413 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_CELLDB_INFO;
414 } else if (cmd == "delete_auxiliary_data_all") {
415 flags = GnssAuxiliaryData::GNSS_AUXILIARY_DATA_ALL;
416 } else {
417 LBSLOGE(GNSS, "unknow command %{public}s", cmd.c_str());
418 return false;
419 }
420 return true;
421 }
422
SendCommand(std::unique_ptr<LocationCommand> & commands)423 LocationErrCode GnssAbility::SendCommand(std::unique_ptr<LocationCommand>& commands)
424 {
425 if (gnssInterface_ == nullptr) {
426 LBSLOGE(GNSS, "gnssInterface_ is nullptr");
427 return ERRCODE_SERVICE_UNAVAILABLE;
428 }
429 GnssAuxiliaryData flags;
430 bool result = GetCommandFlags(commands, flags);
431 LBSLOGE(GNSS, "GetCommandFlags,flags = %{public}d", flags);
432 if (result) {
433 gnssInterface_->DeleteAuxiliaryData(flags);
434 }
435 return ERRCODE_SUCCESS;
436 }
437
SetPositionMode()438 LocationErrCode GnssAbility::SetPositionMode()
439 {
440 if (gnssInterface_ == nullptr) {
441 LBSLOGE(GNSS, "gnssInterface_ is nullptr");
442 return ERRCODE_SERVICE_UNAVAILABLE;
443 }
444 GnssConfigPara para;
445 int suplMode = LocationConfigManager::GetInstance().GetSuplMode();
446 if (suplMode == MODE_STANDALONE) {
447 para.gnssBasic.gnssMode = GnssWorkingMode::GNSS_WORKING_MODE_STANDALONE;
448 } else if (suplMode == MODE_MS_BASED) {
449 para.gnssBasic.gnssMode = GnssWorkingMode::GNSS_WORKING_MODE_MS_BASED;
450 } else if (suplMode == MODE_MS_ASSISTED) {
451 para.gnssBasic.gnssMode = GnssWorkingMode::GNSS_WORKING_MODE_MS_ASSISTED;
452 } else {
453 LBSLOGE(GNSS, "unknow mode");
454 return ERRCODE_SUCCESS;
455 }
456 int ret = gnssInterface_->SetGnssConfigPara(para);
457 if (ret != ERRCODE_SUCCESS) {
458 LBSLOGE(GNSS, "SetGnssConfigPara failed , ret =%{public}d", ret);
459 }
460 return ERRCODE_SUCCESS;
461 }
462
AddFence(std::unique_ptr<GeofenceRequest> & request)463 LocationErrCode GnssAbility::AddFence(std::unique_ptr<GeofenceRequest>& request)
464 {
465 return ERRCODE_NOT_SUPPORTED;
466 }
467
RemoveFence(std::unique_ptr<GeofenceRequest> & request)468 LocationErrCode GnssAbility::RemoveFence(std::unique_ptr<GeofenceRequest>& request)
469 {
470 return ERRCODE_NOT_SUPPORTED;
471 }
472
ReportGnssSessionStatus(int status)473 void GnssAbility::ReportGnssSessionStatus(int status)
474 {
475 }
476
ReportNmea(int64_t timestamp,const std::string & nmea)477 void GnssAbility::ReportNmea(int64_t timestamp, const std::string &nmea)
478 {
479 std::unique_lock<std::mutex> lock(nmeaMutex_);
480 for (auto nmeaCallback : nmeaCallback_) {
481 nmeaCallback->OnMessageChange(timestamp, nmea);
482 }
483 }
484
ReportSv(const std::unique_ptr<SatelliteStatus> & sv)485 void GnssAbility::ReportSv(const std::unique_ptr<SatelliteStatus> &sv)
486 {
487 std::unique_lock<std::mutex> lock(gnssMutex_);
488 for (auto gnssStatusCallback : gnssStatusCallback_) {
489 gnssStatusCallback->OnStatusChange(sv);
490 }
491 }
492
EnableGnss()493 bool GnssAbility::EnableGnss()
494 {
495 if (CommonUtils::QuerySwitchState() == DISABLED) {
496 LBSLOGE(GNSS, "QuerySwitchState is DISABLED");
497 return false;
498 }
499 if (gnssInterface_ == nullptr || gnssCallback_ == nullptr) {
500 LBSLOGE(GNSS, "gnssInterface_ or gnssCallback_ is nullptr");
501 return false;
502 }
503 if (IsGnssEnabled()) {
504 LBSLOGE(GNSS, "gnss has been enabled");
505 return false;
506 }
507 int32_t ret = gnssInterface_->EnableGnss(gnssCallback_);
508 LBSLOGD(GNSS, "Successfully enable_gnss!, %{public}d", ret);
509 if (ret == 0) {
510 gnssWorkingStatus_ = GNSS_STATUS_ENGINE_ON;
511 } else {
512 gnssWorkingStatus_ = GNSS_STATUS_NONE;
513 WriteLocationInnerEvent(HDI_EVENT, {"errCode", std::to_string(ret),
514 "hdiName", "EnableGnss", "hdiType", "gnss"});
515 }
516 return true;
517 }
518
DisableGnss()519 void GnssAbility::DisableGnss()
520 {
521 if (gnssInterface_ == nullptr) {
522 LBSLOGE(GNSS, "gnssInterface_ is nullptr");
523 return;
524 }
525 if (!IsGnssEnabled()) {
526 LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
527 return;
528 }
529 int ret = gnssInterface_->DisableGnss();
530 if (ret == 0) {
531 gnssWorkingStatus_ = GNSS_STATUS_ENGINE_OFF;
532 } else {
533 WriteLocationInnerEvent(HDI_EVENT, {"errCode", std::to_string(ret),
534 "hdiName", "DisableGnss", "hdiType", "gnss"});
535 }
536 }
537
IsGnssEnabled()538 bool GnssAbility::IsGnssEnabled()
539 {
540 return (gnssWorkingStatus_ != GNSS_STATUS_ENGINE_OFF &&
541 gnssWorkingStatus_ != GNSS_STATUS_NONE);
542 }
543
StartGnss()544 void GnssAbility::StartGnss()
545 {
546 if (CommonUtils::QuerySwitchState() == DISABLED) {
547 LBSLOGE(GNSS, "QuerySwitchState is DISABLED");
548 return;
549 }
550 if (gnssInterface_ == nullptr) {
551 LBSLOGE(GNSS, "gnssInterface_ is nullptr");
552 return;
553 }
554 if (!IsGnssEnabled()) {
555 LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
556 return;
557 }
558 if (gnssWorkingStatus_ == GNSS_STATUS_SESSION_BEGIN) {
559 LBSLOGD(GNSS, "GNSS navigation started");
560 return;
561 }
562 if (GetRequestNum() == 0) {
563 return;
564 }
565 SetPositionMode();
566 int ret = gnssInterface_->StartGnss(GNSS_START_TYPE_NORMAL);
567 if (ret == 0) {
568 gnssWorkingStatus_ = GNSS_STATUS_SESSION_BEGIN;
569 WriteLocationInnerEvent(START_GNSS, {});
570 } else {
571 WriteLocationInnerEvent(HDI_EVENT, {"errCode", std::to_string(ret), "hdiName", "StartGnss", "hdiType", "gnss"});
572 }
573 }
574
StopGnss()575 void GnssAbility::StopGnss()
576 {
577 if (gnssInterface_ == nullptr) {
578 LBSLOGE(GNSS, "gnssInterface_ is nullptr");
579 return;
580 }
581 if (!IsGnssEnabled()) {
582 LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
583 return;
584 }
585
586 int ret = gnssInterface_->StopGnss(GNSS_START_TYPE_NORMAL);
587 if (ret == 0) {
588 gnssWorkingStatus_ = GNSS_STATUS_SESSION_END;
589 WriteLocationInnerEvent(STOP_GNSS, {});
590 } else {
591 WriteLocationInnerEvent(HDI_EVENT, {"errCode", std::to_string(ret), "hdiName", "StopGnss", "hdiType", "gnss"});
592 }
593 }
594
ConnectHdi()595 bool GnssAbility::ConnectHdi()
596 {
597 auto devmgr = HDI::DeviceManager::V1_0::IDeviceManager::Get();
598 if (devmgr == nullptr) {
599 LBSLOGE(GNSS, "fail to get devmgr.");
600 return false;
601 }
602 if (devmgr->LoadDevice(GNSS_SERVICE_NAME) != 0) {
603 LBSLOGE(GNSS, "Load gnss service failed!");
604 return false;
605 }
606 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
607 if (devmgr->LoadDevice(AGNSS_SERVICE_NAME) != 0) {
608 LBSLOGE(GNSS, "Load agnss service failed!");
609 return false;
610 }
611 #endif
612 std::unique_lock<std::mutex> lock(hdiMutex_, std::defer_lock);
613 lock.lock();
614 gnssInterface_ = IGnssInterface::Get();
615 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
616 agnssInterface_ = IAGnssInterface::Get();
617 if (gnssInterface_ != nullptr && agnssInterface_ != nullptr) {
618 agnssCallback_ = new (std::nothrow) AGnssEventCallback();
619 #else
620 if (gnssInterface_ != nullptr) {
621 #endif
622 LBSLOGD(GNSS, "connect v1_0 hdi success.");
623 gnssCallback_ = new (std::nothrow) GnssEventCallback();
624 RegisterLocationHdiDeathRecipient();
625 lock.unlock();
626 return true;
627 }
628 lock.unlock();
629 LBSLOGE(GNSS, "connect v1_0 hdi failed.");
630 return false;
631 }
632
633 bool GnssAbility::RemoveHdi()
634 {
635 auto devmgr = HDI::DeviceManager::V1_0::IDeviceManager::Get();
636 if (devmgr == nullptr) {
637 LBSLOGE(GNSS, "fail to get devmgr.");
638 return false;
639 }
640 if (devmgr->UnloadDevice(GNSS_SERVICE_NAME) != 0) {
641 LBSLOGE(GNSS, "Load gnss service failed!");
642 return false;
643 }
644 gnssCallback_ = nullptr;
645 gnssInterface_ = nullptr;
646 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
647 if (devmgr->UnloadDevice(AGNSS_SERVICE_NAME) != 0) {
648 LBSLOGE(GNSS, "Load agnss service failed!");
649 return false;
650 }
651 agnssCallback_ = nullptr;
652 agnssInterface_ = nullptr;
653 #endif
654 return true;
655 }
656
657 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
658 void GnssAbility::SetAgnssServer()
659 {
660 if (agnssInterface_ == nullptr) {
661 LBSLOGE(GNSS, "agnssInterface_ is nullptr");
662 return;
663 }
664 if (!IsGnssEnabled()) {
665 LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
666 return;
667 }
668 std::string addrName;
669 bool result = LocationConfigManager::GetInstance().GetAgnssServerAddr(addrName);
670 if (!result || addrName.empty()) {
671 LBSLOGE(GNSS, "get agnss server address failed!");
672 return;
673 }
674 int port = LocationConfigManager::GetInstance().GetAgnssServerPort();
675 AGnssServerInfo info;
676 info.type = AGNSS_TYPE_SUPL;
677 info.server = addrName;
678 info.port = port;
679 agnssInterface_->SetAgnssServer(info);
680 }
681
682 void GnssAbility::SetAgnssCallback()
683 {
684 LBSLOGD(GNSS, "enter SetAgnssCallback");
685 if (agnssInterface_ == nullptr || agnssCallback_ == nullptr) {
686 LBSLOGE(GNSS, "agnssInterface_ or agnssCallback_ is nullptr");
687 return;
688 }
689 if (!IsGnssEnabled()) {
690 LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
691 return;
692 }
693 agnssInterface_->SetAgnssCallback(agnssCallback_);
694 }
695
696 void GnssAbility::SetSetId(const SubscriberSetId& id)
697 {
698 std::unique_ptr<SubscriberSetId> subscribeSetId = std::make_unique<SubscriberSetId>();
699 subscribeSetId->type = id.type;
700 subscribeSetId->id = id.id;
701 if (gnssHandler_ != nullptr) {
702 AppExecFwk::InnerEvent::Pointer event =
703 AppExecFwk::InnerEvent::Get(SET_SUBSCRIBER_SET_ID, subscribeSetId);
704 gnssHandler_->SendEvent(event);
705 }
706 }
707
708 void GnssAbility::SetSetIdImpl(const SubscriberSetId& id)
709 {
710 if (agnssInterface_ == nullptr) {
711 LBSLOGE(GNSS, "agnssInterface_ is nullptr");
712 return;
713 }
714 if (!IsGnssEnabled()) {
715 LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
716 return;
717 }
718 agnssInterface_->SetSubscriberSetId(id);
719 }
720
721 void GnssAbility::SetRefInfo(const AGnssRefInfo& refInfo)
722 {
723 std::unique_ptr<AgnssRefInfoMessage> agnssRefInfoMessage = std::make_unique<AgnssRefInfoMessage>();
724 if (gnssHandler_ != nullptr) {
725 agnssRefInfoMessage->SetAgnssRefInfo(refInfo);
726 AppExecFwk::InnerEvent::Pointer event =
727 AppExecFwk::InnerEvent::Get(SET_AGNSS_REF_INFO, agnssRefInfoMessage);
728 gnssHandler_->SendEvent(event);
729 }
730 }
731
732 void GnssAbility::SetRefInfoImpl(const AGnssRefInfo &refInfo)
733 {
734 if (agnssInterface_ == nullptr) {
735 LBSLOGE(GNSS, "agnssInterface_ is nullptr");
736 return;
737 }
738 if (!IsGnssEnabled()) {
739 LBSLOGE(GNSS, "%{public}s gnss has been disabled", __func__);
740 return;
741 }
742 agnssInterface_->SetAgnssRefInfo(refInfo);
743 }
744
745 AGnssRefInfo AgnssRefInfoMessage::GetAgnssRefInfo()
746 {
747 return agnssRefInfo_;
748 }
749
750 void AgnssRefInfoMessage::SetAgnssRefInfo(const AGnssRefInfo &refInfo)
751 {
752 agnssRefInfo_ = refInfo;
753 }
754 #endif
755
756 void GnssAbility::SaDumpInfo(std::string& result)
757 {
758 result += "Gnss Location enable status: true";
759 result += "\n";
760 }
761
762 int32_t GnssAbility::Dump(int32_t fd, const std::vector<std::u16string>& args)
763 {
764 std::vector<std::string> vecArgs;
765 std::transform(args.begin(), args.end(), std::back_inserter(vecArgs), [](const std::u16string &arg) {
766 return Str16ToStr8(arg);
767 });
768
769 LocationDumper dumper;
770 std::string result;
771 dumper.GnssDump(SaDumpInfo, vecArgs, result);
772 if (!SaveStringToFd(fd, result)) {
773 LBSLOGE(GNSS, "Gnss save string to fd failed!");
774 return ERR_OK;
775 }
776 return ERR_OK;
777 }
778
779 LocationErrCode GnssAbility::EnableMock()
780 {
781 if (!EnableLocationMock()) {
782 return ERRCODE_NOT_SUPPORTED;
783 }
784 return ERRCODE_SUCCESS;
785 }
786
787 LocationErrCode GnssAbility::DisableMock()
788 {
789 if (!DisableLocationMock()) {
790 return ERRCODE_NOT_SUPPORTED;
791 }
792 return ERRCODE_SUCCESS;
793 }
794
795 LocationErrCode GnssAbility::SetMocked(const int timeInterval,
796 const std::vector<std::shared_ptr<Location>> &location)
797 {
798 if (!SetMockedLocations(timeInterval, location)) {
799 return ERRCODE_NOT_SUPPORTED;
800 }
801 return ERRCODE_SUCCESS;
802 }
803
804 bool GnssAbility::IsMockEnabled()
805 {
806 return IsLocationMocked();
807 }
808
809 bool GnssAbility::IsMockProcessing()
810 {
811 auto loc = GetLocationMock();
812 return !loc.empty();
813 }
814
815 void GnssAbility::ProcessReportLocationMock()
816 {
817 std::vector<std::shared_ptr<Location>> mockLocationArray = GetLocationMock();
818 if (mockLocationIndex_ < mockLocationArray.size()) {
819 ReportMockedLocation(mockLocationArray[mockLocationIndex_++]);
820 if (gnssHandler_ != nullptr) {
821 gnssHandler_->SendHighPriorityEvent(EVENT_REPORT_LOCATION,
822 0, GetTimeIntervalMock() * EVENT_INTERVAL_UNITE);
823 }
824 } else {
825 ClearLocationMock();
826 mockLocationIndex_ = 0;
827 }
828 }
829
830 void GnssAbility::SendReportMockLocationEvent()
831 {
832 if (gnssHandler_ != nullptr) {
833 gnssHandler_->SendHighPriorityEvent(EVENT_REPORT_LOCATION, 0, 0);
834 }
835 }
836
837 int32_t GnssAbility::ReportMockedLocation(const std::shared_ptr<Location> location)
838 {
839 if ((IsLocationMocked() && !location->GetIsFromMock()) ||
840 (!IsLocationMocked() && location->GetIsFromMock())) {
841 LBSLOGE(GNSS, "location mock is enabled, do not report gnss location!");
842 return ERR_OK;
843 }
844 ReportLocationInfo(GNSS_ABILITY, location);
845 #ifdef FEATURE_PASSIVE_SUPPORT
846 ReportLocationInfo(PASSIVE_ABILITY, location);
847 #endif
848 return ERR_OK;
849 }
850
851 void GnssAbility::SendMessage(uint32_t code, MessageParcel &data, MessageParcel &reply)
852 {
853 if (gnssHandler_ == nullptr) {
854 reply.WriteInt32(ERRCODE_SERVICE_UNAVAILABLE);
855 return;
856 }
857 switch (code) {
858 case static_cast<uint32_t>(GnssInterfaceCode::SEND_LOCATION_REQUEST): {
859 std::unique_ptr<WorkRecord> workrecord = WorkRecord::Unmarshalling(data);
860 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::
861 Get(code, workrecord);
862 SendEvent(event, reply);
863 break;
864 }
865 case static_cast<uint32_t>(GnssInterfaceCode::SET_MOCKED_LOCATIONS): {
866 if (!IsMockEnabled()) {
867 reply.WriteInt32(ERRCODE_NOT_SUPPORTED);
868 break;
869 }
870 int timeInterval = data.ReadInt32();
871 int locationSize = data.ReadInt32();
872 timeInterval = timeInterval < 0 ? 1 : timeInterval;
873 locationSize = locationSize > INPUT_ARRAY_LEN_MAX ? INPUT_ARRAY_LEN_MAX :
874 locationSize;
875 std::shared_ptr<std::vector<std::shared_ptr<Location>>> vcLoc =
876 std::make_shared<std::vector<std::shared_ptr<Location>>>();
877 for (int i = 0; i < locationSize; i++) {
878 vcLoc->push_back(Location::UnmarshallingShared(data));
879 }
880 AppExecFwk::InnerEvent::Pointer event =
881 AppExecFwk::InnerEvent::Get(code, vcLoc, timeInterval);
882 SendEvent(event, reply);
883 break;
884 }
885 case static_cast<uint32_t>(GnssInterfaceCode::SEND_COMMANDS): {
886 std::unique_ptr<LocationCommand> locationCommand = std::make_unique<LocationCommand>();
887 locationCommand->scenario = data.ReadInt32();
888 locationCommand->command = Str16ToStr8(data.ReadString16());
889 AppExecFwk::InnerEvent::Pointer event = AppExecFwk::InnerEvent::Get(code, locationCommand);
890 SendEvent(event, reply);
891 break;
892 }
893 case static_cast<uint32_t>(GnssInterfaceCode::SET_ENABLE): {
894 AppExecFwk::InnerEvent::Pointer event =
895 AppExecFwk::InnerEvent::Get(code, static_cast<int>(data.ReadBool()));
896 SendEvent(event, reply);
897 break;
898 }
899 default:
900 break;
901 }
902 }
903
904 void GnssAbility::SendEvent(AppExecFwk::InnerEvent::Pointer& event, MessageParcel &reply)
905 {
906 if (gnssHandler_ == nullptr) {
907 reply.WriteInt32(ERRCODE_SERVICE_UNAVAILABLE);
908 return;
909 }
910 if (gnssHandler_->SendEvent(event)) {
911 reply.WriteInt32(ERRCODE_SUCCESS);
912 } else {
913 reply.WriteInt32(ERRCODE_SERVICE_UNAVAILABLE);
914 }
915 }
916
917 void GnssAbility::RegisterLocationHdiDeathRecipient()
918 {
919 if (gnssInterface_ == nullptr) {
920 LBSLOGE(GNSS, "%{public}s: gnssInterface_ is nullptr", __func__);
921 return;
922 }
923 sptr<IRemoteObject> obj = OHOS::HDI::hdi_objcast<IGnssInterface>(gnssInterface_);
924 if (obj == nullptr) {
925 LBSLOGE(GNSS, "%{public}s: hdi obj is nullptr", __func__);
926 return;
927 }
928 sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) LocationHdiDeathRecipient());
929 obj->AddDeathRecipient(death);
930 }
931
932 GnssHandler::GnssHandler(const std::shared_ptr<AppExecFwk::EventRunner>& runner) : EventHandler(runner)
933 {
934 InitGnssEventProcessMap();
935 }
936
937 void GnssHandler::InitGnssEventProcessMap()
938 {
939 if (gnssEventProcessMap_.size() != 0) {
940 return;
941 }
942 gnssEventProcessMap_[EVENT_REPORT_LOCATION] = &GnssHandler::HandleEventReportLocation;
943 gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SEND_LOCATION_REQUEST)] =
944 &GnssHandler::HandleSendLocationRequest;
945 gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SET_MOCKED_LOCATIONS)] =
946 &GnssHandler::HandleSetMockedLocations;
947 gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SEND_COMMANDS)] =
948 &GnssHandler::HandleSendCommands;
949 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
950 gnssEventProcessMap_[SET_SUBSCRIBER_SET_ID] = &GnssHandler::HandleSetSubscriberSetId;
951 gnssEventProcessMap_[SET_AGNSS_REF_INFO] = &GnssHandler::HandleSetAgnssRefInfo;
952 #endif
953 gnssEventProcessMap_[RECONNECT_HDI] = &GnssHandler::HandleReconnectHdi;
954 gnssEventProcessMap_[static_cast<uint32_t>(GnssInterfaceCode::SET_ENABLE)] = &GnssHandler::HandleSetEnable;
955 gnssEventProcessMap_[INIT_HDI] = &GnssHandler::HandleInitHdi;
956 }
957
958 GnssHandler::~GnssHandler() {}
959
960 void GnssHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer& event)
961 {
962 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
963 if (gnssAbility == nullptr) {
964 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
965 return;
966 }
967 uint32_t eventId = event->GetInnerEventId();
968 LBSLOGD(GNSS, "ProcessEvent event:%{public}d", eventId);
969 auto handleFunc = gnssEventProcessMap_.find(eventId);
970 if (handleFunc != gnssEventProcessMap_.end() && handleFunc->second != nullptr) {
971 auto memberFunc = handleFunc->second;
972 (this->*memberFunc)(event);
973 }
974 gnssAbility->UnloadGnssSystemAbility();
975 }
976
977 void GnssHandler::HandleEventReportLocation(const AppExecFwk::InnerEvent::Pointer& event)
978 {
979 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
980 if (gnssAbility == nullptr) {
981 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
982 return;
983 }
984 gnssAbility->ProcessReportLocationMock();
985 }
986
987 void GnssHandler::HandleSendLocationRequest(const AppExecFwk::InnerEvent::Pointer& event)
988 {
989 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
990 if (gnssAbility == nullptr) {
991 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
992 return;
993 }
994 std::unique_ptr<WorkRecord> workrecord = event->GetUniqueObject<WorkRecord>();
995 if (workrecord != nullptr) {
996 gnssAbility->LocationRequest(*workrecord);
997 }
998 }
999
1000 void GnssHandler::HandleSetMockedLocations(const AppExecFwk::InnerEvent::Pointer& event)
1001 {
1002 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
1003 if (gnssAbility == nullptr) {
1004 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
1005 return;
1006 }
1007 int timeInterval = event->GetParam();
1008 auto vcLoc = event->GetSharedObject<std::vector<std::shared_ptr<Location>>>();
1009 if (vcLoc != nullptr) {
1010 std::vector<std::shared_ptr<Location>> mockLocations;
1011 for (auto it = vcLoc->begin(); it != vcLoc->end(); ++it) {
1012 mockLocations.push_back(*it);
1013 }
1014 gnssAbility->SetMocked(timeInterval, mockLocations);
1015 }
1016 }
1017
1018 void GnssHandler::HandleSendCommands(const AppExecFwk::InnerEvent::Pointer& event)
1019 {
1020 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
1021 if (gnssAbility == nullptr) {
1022 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
1023 return;
1024 }
1025 std::unique_ptr<LocationCommand> locationCommand = event->GetUniqueObject<LocationCommand>();
1026 if (locationCommand != nullptr) {
1027 gnssAbility->SendCommand(locationCommand);
1028 }
1029 }
1030 #ifdef HDF_DRIVERS_INTERFACE_AGNSS_ENABLE
1031 void GnssHandler::HandleSetSubscriberSetId(const AppExecFwk::InnerEvent::Pointer& event)
1032 {
1033 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
1034 if (gnssAbility == nullptr) {
1035 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
1036 return;
1037 }
1038 std::unique_ptr<SubscriberSetId> subscriberSetId = event->GetUniqueObject<SubscriberSetId>();
1039 if (subscriberSetId != nullptr) {
1040 gnssAbility->SetSetIdImpl(*subscriberSetId);
1041 }
1042 }
1043
1044 void GnssHandler::HandleSetAgnssRefInfo(const AppExecFwk::InnerEvent::Pointer& event)
1045 {
1046 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
1047 if (gnssAbility == nullptr) {
1048 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
1049 return;
1050 }
1051 std::unique_ptr<AgnssRefInfoMessage> agnssRefInfoMessage = event->GetUniqueObject<AgnssRefInfoMessage>();
1052 if (agnssRefInfoMessage != nullptr) {
1053 AGnssRefInfo refInfo = agnssRefInfoMessage->GetAgnssRefInfo();
1054 gnssAbility->SetRefInfoImpl(refInfo);
1055 }
1056 }
1057 #endif
1058
1059 void GnssHandler::HandleReconnectHdi(const AppExecFwk::InnerEvent::Pointer& event)
1060 {
1061 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
1062 if (gnssAbility == nullptr) {
1063 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
1064 return;
1065 }
1066 gnssAbility->ReConnectHdiImpl();
1067 }
1068
1069 void GnssHandler::HandleSetEnable(const AppExecFwk::InnerEvent::Pointer& event)
1070 {
1071 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
1072 if (gnssAbility == nullptr) {
1073 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
1074 return;
1075 }
1076 int state = event->GetParam();
1077 gnssAbility->SetEnable(state != 0);
1078 }
1079
1080 void GnssHandler::HandleInitHdi(const AppExecFwk::InnerEvent::Pointer& event)
1081 {
1082 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
1083 if (gnssAbility == nullptr) {
1084 LBSLOGE(GNSS, "ProcessEvent: gnss ability is nullptr");
1085 return;
1086 }
1087 if (!gnssAbility->CheckIfHdiConnected()) {
1088 gnssAbility->ConnectHdi();
1089 gnssAbility->EnableGnss();
1090 }
1091 }
1092
1093 LocationHdiDeathRecipient::LocationHdiDeathRecipient()
1094 {
1095 }
1096
1097 LocationHdiDeathRecipient::~LocationHdiDeathRecipient()
1098 {
1099 }
1100
1101 void LocationHdiDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
1102 {
1103 auto gnssAbility = DelayedSingleton<GnssAbility>::GetInstance();
1104 if (gnssAbility != nullptr) {
1105 LBSLOGI(LOCATOR, "hdi reconnecting");
1106 // wait for device unloaded
1107 std::this_thread::sleep_for(std::chrono::milliseconds(WAIT_MS));
1108 gnssAbility->ReConnectHdi();
1109 LBSLOGI(LOCATOR, "hdi connected finish");
1110 }
1111 }
1112 } // namespace Location
1113 } // namespace OHOS
1114 #endif
1115