• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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