1094332d3Sopenharmony_ci/*
2094332d3Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3094332d3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4094332d3Sopenharmony_ci * you may not use this file except in compliance with the License.
5094332d3Sopenharmony_ci * You may obtain a copy of the License at
6094332d3Sopenharmony_ci *
7094332d3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8094332d3Sopenharmony_ci *
9094332d3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10094332d3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11094332d3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12094332d3Sopenharmony_ci * See the License for the specific language governing permissions and
13094332d3Sopenharmony_ci * limitations under the License.
14094332d3Sopenharmony_ci */
15094332d3Sopenharmony_ci
16094332d3Sopenharmony_ci#include "gnss_interface_impl.h"
17094332d3Sopenharmony_ci
18094332d3Sopenharmony_ci#include <hdf_base.h>
19094332d3Sopenharmony_ci#include <hdf_log.h>
20094332d3Sopenharmony_ci#include <iproxy_broker.h>
21094332d3Sopenharmony_ci#include <mutex>
22094332d3Sopenharmony_ci#include <unordered_map>
23094332d3Sopenharmony_ci
24094332d3Sopenharmony_ci#include "idevmgr_hdi.h"
25094332d3Sopenharmony_ci
26094332d3Sopenharmony_ci#include "location_vendor_interface.h"
27094332d3Sopenharmony_ci#include "location_vendor_lib.h"
28094332d3Sopenharmony_ci#include "string_utils.h"
29094332d3Sopenharmony_ci
30094332d3Sopenharmony_cinamespace OHOS {
31094332d3Sopenharmony_cinamespace HDI {
32094332d3Sopenharmony_cinamespace Location {
33094332d3Sopenharmony_cinamespace Gnss {
34094332d3Sopenharmony_cinamespace V2_0 {
35094332d3Sopenharmony_cinamespace {
36094332d3Sopenharmony_ciusing LocationCallBackMap = std::unordered_map<IRemoteObject*, sptr<IGnssCallback>>;
37094332d3Sopenharmony_ci#ifndef EMULATOR_ENABLED
38094332d3Sopenharmony_ciusing GnssMeasurementCallbackMap = std::unordered_map<IRemoteObject*, sptr<IGnssMeasurementCallback>>;
39094332d3Sopenharmony_ci#endif
40094332d3Sopenharmony_ciusing GnssDeathRecipientMap = std::unordered_map<IRemoteObject*, sptr<IRemoteObject::DeathRecipient>>;
41094332d3Sopenharmony_ciusing OHOS::HDI::DeviceManager::V1_0::IDeviceManager;
42094332d3Sopenharmony_ciLocationCallBackMap g_locationCallBackMap;
43094332d3Sopenharmony_ci#ifndef EMULATOR_ENABLED
44094332d3Sopenharmony_ciGnssMeasurementCallbackMap g_gnssMeasurementCallbackMap;
45094332d3Sopenharmony_ci#endif
46094332d3Sopenharmony_ciGnssDeathRecipientMap g_gnssCallBackDeathRecipientMap;
47094332d3Sopenharmony_ciGnssConfigParameter g_configPara;
48094332d3Sopenharmony_cistd::mutex g_mutex;
49094332d3Sopenharmony_cistd::mutex g_deathMutex;
50094332d3Sopenharmony_ci} // namespace
51094332d3Sopenharmony_ci
52094332d3Sopenharmony_ciextern "C" IGnssInterface* GnssInterfaceImplGetInstance(void)
53094332d3Sopenharmony_ci{
54094332d3Sopenharmony_ci    return new (std::nothrow) GnssInterfaceImpl();
55094332d3Sopenharmony_ci}
56094332d3Sopenharmony_ci
57094332d3Sopenharmony_cistatic void NiNotifyCallback(OHOS::HDI::Location::GnssNiNotificationRequest *notification)
58094332d3Sopenharmony_ci{
59094332d3Sopenharmony_ci    if (notification == nullptr) {
60094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:niNotificationRequest is nullptr.", __func__);
61094332d3Sopenharmony_ci        return;
62094332d3Sopenharmony_ci    }
63094332d3Sopenharmony_ci    HDF_LOGI("%{public}s:NiNotifyCb.", __func__);
64094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
65094332d3Sopenharmony_ci    GnssNiNotificationRequest niNotification;
66094332d3Sopenharmony_ci    niNotification.gnssNiNotificationId = notification->gnssNiNotificationId;
67094332d3Sopenharmony_ci    niNotification.gnssNiRequestCategory = GnssNiRequestCategory(notification->gnssNiRequestCategory);
68094332d3Sopenharmony_ci    niNotification.notificationCategory = notification->notificationCategory;
69094332d3Sopenharmony_ci    niNotification.requestTimeout = notification->requestTimeout;
70094332d3Sopenharmony_ci    niNotification.defaultResponseCmd = notification->defaultResponseCmd;
71094332d3Sopenharmony_ci    niNotification.supplicantInfo = notification->supplicantInfo;
72094332d3Sopenharmony_ci    niNotification.notificationText = notification->notificationText;
73094332d3Sopenharmony_ci    niNotification.supplicantInfoEncoding = GnssNiRequestEncodingFormat(notification->supplicantInfoEncoding);
74094332d3Sopenharmony_ci    niNotification.notificationTextEncoding = GnssNiRequestEncodingFormat(notification->notificationTextEncoding);
75094332d3Sopenharmony_ci
76094332d3Sopenharmony_ci    HDF_LOGI("reportNiNotification: notificationId %{public}u, niType %{public}d, notifyType %{public}d, timeout "
77094332d3Sopenharmony_ci        "%{public}d, defaultRespone %{private}d",
78094332d3Sopenharmony_ci        niNotification.gnssNiNotificationId,
79094332d3Sopenharmony_ci        niNotification.gnssNiRequestCategory,
80094332d3Sopenharmony_ci        niNotification.notificationCategory,
81094332d3Sopenharmony_ci        niNotification.requestTimeout,
82094332d3Sopenharmony_ci        niNotification.defaultResponseCmd);
83094332d3Sopenharmony_ci
84094332d3Sopenharmony_ci    for (const auto& iter : g_locationCallBackMap) {
85094332d3Sopenharmony_ci        auto& callback = iter.second;
86094332d3Sopenharmony_ci        if (callback != nullptr) {
87094332d3Sopenharmony_ci            callback->ReportGnssNiNotification(niNotification);
88094332d3Sopenharmony_ci        }
89094332d3Sopenharmony_ci    }
90094332d3Sopenharmony_ci    HDF_LOGI("%{public}s:NiNotifyCallback.", __func__);
91094332d3Sopenharmony_ci}
92094332d3Sopenharmony_ci
93094332d3Sopenharmony_cistatic void LocationUpdate(GnssLocation* location)
94094332d3Sopenharmony_ci{
95094332d3Sopenharmony_ci    if (location == nullptr) {
96094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:location is nullptr.", __func__);
97094332d3Sopenharmony_ci        return;
98094332d3Sopenharmony_ci    }
99094332d3Sopenharmony_ci    HDF_LOGI("%{public}s:LocationUpdate.", __func__);
100094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
101094332d3Sopenharmony_ci    LocationInfo locationNew;
102094332d3Sopenharmony_ci    locationNew.fieldValidity = location->fieldValidity;
103094332d3Sopenharmony_ci    locationNew.latitude = location->latitude;
104094332d3Sopenharmony_ci    locationNew.longitude = location->longitude;
105094332d3Sopenharmony_ci    locationNew.altitude = location->altitude;
106094332d3Sopenharmony_ci    locationNew.horizontalAccuracy = location->horizontalAccuracy;
107094332d3Sopenharmony_ci    locationNew.speed = location->speed;
108094332d3Sopenharmony_ci    locationNew.bearing = location->bearing;
109094332d3Sopenharmony_ci    locationNew.verticalAccuracy = location->verticalAccuracy;
110094332d3Sopenharmony_ci    locationNew.speedAccuracy = location->speedAccuracy;
111094332d3Sopenharmony_ci    locationNew.bearingAccuracy = location->bearingAccuracy;
112094332d3Sopenharmony_ci    locationNew.timeForFix = location->timeForFix;
113094332d3Sopenharmony_ci    locationNew.timeSinceBoot = location->timeSinceBoot;
114094332d3Sopenharmony_ci    locationNew.timeUncertainty = location->timeUncertainty;
115094332d3Sopenharmony_ci    for (const auto& iter : g_locationCallBackMap) {
116094332d3Sopenharmony_ci        auto& callback = iter.second;
117094332d3Sopenharmony_ci        if (callback != nullptr) {
118094332d3Sopenharmony_ci            callback->ReportLocation(locationNew);
119094332d3Sopenharmony_ci        }
120094332d3Sopenharmony_ci    }
121094332d3Sopenharmony_ci}
122094332d3Sopenharmony_ci
123094332d3Sopenharmony_ci#ifndef EMULATOR_ENABLED
124094332d3Sopenharmony_cistatic void SetGnssClock(OHOS::HDI::Location::Gnss::V2_0::GnssMeasurementInfo* gnssMeasurementInfoNew,
125094332d3Sopenharmony_ci    OHOS::HDI::Location::GnssMeasurementInfo* gnssMeasurementInfo)
126094332d3Sopenharmony_ci{
127094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.fieldValidFlags = gnssMeasurementInfo->gnssClock.fieldValidFlags;
128094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.leapSecond = gnssMeasurementInfo->gnssClock.leapSecond;
129094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.receiverClockTime = gnssMeasurementInfo->gnssClock.receiverClockTime;
130094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.timeUncertainty = gnssMeasurementInfo->gnssClock.timeUncertainty;
131094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.rcvClockFullBias = gnssMeasurementInfo->gnssClock.rcvClockFullBias;
132094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.rcvClockSubBias = gnssMeasurementInfo->gnssClock.rcvClockSubBias;
133094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.biasUncertainty = gnssMeasurementInfo->gnssClock.biasUncertainty;
134094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.clockDrift = gnssMeasurementInfo->gnssClock.clockDrift;
135094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.clockDriftUncertainty = gnssMeasurementInfo->gnssClock.clockDriftUncertainty;
136094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.clockInterruptCnt = gnssMeasurementInfo->gnssClock.clockInterruptCnt;
137094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.clockJumpThreshold = gnssMeasurementInfo->gnssClock.clockJumpThreshold;
138094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.clockHWFreBiasIndicator = gnssMeasurementInfo->gnssClock.clockHWFreBiasIndicator;
139094332d3Sopenharmony_ci    gnssMeasurementInfoNew->gnssClock.clockHWFreDriftIndicator =
140094332d3Sopenharmony_ci        gnssMeasurementInfo->gnssClock.clockHWFreDriftIndicator;
141094332d3Sopenharmony_ci}
142094332d3Sopenharmony_ci
143094332d3Sopenharmony_cistatic void GnssMeasurementUpdate(OHOS::HDI::Location::GnssMeasurementInfo* gnssMeasurementInfo)
144094332d3Sopenharmony_ci{
145094332d3Sopenharmony_ci    if (gnssMeasurementInfo == nullptr) {
146094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:gnssMeasurementInfo is nullptr.", __func__);
147094332d3Sopenharmony_ci        return;
148094332d3Sopenharmony_ci    }
149094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
150094332d3Sopenharmony_ci    OHOS::HDI::Location::Gnss::V2_0::GnssMeasurementInfo gnssMeasurementInfoNew;
151094332d3Sopenharmony_ci    SetGnssClock(&gnssMeasurementInfoNew, gnssMeasurementInfo);
152094332d3Sopenharmony_ci    gnssMeasurementInfoNew.elapsedRealtime = static_cast<long>(gnssMeasurementInfo->elapsedRealtime);
153094332d3Sopenharmony_ci    gnssMeasurementInfoNew.uncertainty = static_cast<long>(gnssMeasurementInfo->uncertainty);
154094332d3Sopenharmony_ci    gnssMeasurementInfoNew.measurementCount = static_cast<int>(gnssMeasurementInfo->measurementCount);
155094332d3Sopenharmony_ci
156094332d3Sopenharmony_ci    std::vector<OHOS::HDI::Location::Gnss::V2_0::GnssMeasurement> gnssMeasurements;
157094332d3Sopenharmony_ci    for (OHOS::HDI::Location::GnssMeasurement infoItem : gnssMeasurementInfo->measurements) {
158094332d3Sopenharmony_ci        OHOS::HDI::Location::Gnss::V2_0::GnssMeasurement gnssMeasurement;
159094332d3Sopenharmony_ci        gnssMeasurement.fieldValidflags = infoItem.fieldValidflags;
160094332d3Sopenharmony_ci        gnssMeasurement.satelliteId = infoItem.satelliteId;
161094332d3Sopenharmony_ci        gnssMeasurement.constellationCategory = infoItem.constellationCategory;
162094332d3Sopenharmony_ci        gnssMeasurement.timeOffset = infoItem.timeOffset;
163094332d3Sopenharmony_ci        gnssMeasurement.syncState = infoItem.syncState;
164094332d3Sopenharmony_ci        gnssMeasurement.receivedSatelliteTime = infoItem.receivedSatelliteTime;
165094332d3Sopenharmony_ci        gnssMeasurement.receivedSatelliteTimeUncertainty = infoItem.receivedSatelliteTimeUncertainty;
166094332d3Sopenharmony_ci        gnssMeasurement.cn0 = infoItem.cn0;
167094332d3Sopenharmony_ci        gnssMeasurement.pseudorangeRate = infoItem.pseudorangeRate;
168094332d3Sopenharmony_ci        gnssMeasurement.pseudorangeRateUncertainty = infoItem.pseudorangeRateUncertainty;
169094332d3Sopenharmony_ci        gnssMeasurement.accumulatedDeltaRangeFlag = infoItem.accumulatedDeltaRangeFlag;
170094332d3Sopenharmony_ci        gnssMeasurement.accumulatedDeltaRange = infoItem.accumulatedDeltaRange;
171094332d3Sopenharmony_ci        gnssMeasurement.accumulatedDeltaRangeUncertainty = infoItem.accumulatedDeltaRangeUncertainty;
172094332d3Sopenharmony_ci        gnssMeasurement.carrierFrequency = infoItem.carrierFrequency;
173094332d3Sopenharmony_ci        gnssMeasurement.carrierCyclesCount = infoItem.carrierCyclesCount;
174094332d3Sopenharmony_ci        gnssMeasurement.carrierPhase = infoItem.carrierPhase;
175094332d3Sopenharmony_ci        gnssMeasurement.carrierPhaseUncertainty = infoItem.carrierPhaseUncertainty;
176094332d3Sopenharmony_ci        gnssMeasurement.multipathFlag = infoItem.multipathFlag;
177094332d3Sopenharmony_ci        gnssMeasurement.agcGain = infoItem.agcGain;
178094332d3Sopenharmony_ci        gnssMeasurement.codeCategory = infoItem.codeCategory;
179094332d3Sopenharmony_ci        gnssMeasurement.ionoCorrect = infoItem.ionoCorrect;
180094332d3Sopenharmony_ci        gnssMeasurement.tropCorrect = infoItem.tropCorrect;
181094332d3Sopenharmony_ci        gnssMeasurement.satelliteClockBias = infoItem.satelliteClockBias;
182094332d3Sopenharmony_ci        gnssMeasurement.satelliteClockDriftBias = infoItem.satelliteClockDriftBias;
183094332d3Sopenharmony_ci        gnssMeasurements.push_back(gnssMeasurement);
184094332d3Sopenharmony_ci    }
185094332d3Sopenharmony_ci    gnssMeasurementInfoNew.measurements = gnssMeasurements;
186094332d3Sopenharmony_ci    for (const auto& iter : g_gnssMeasurementCallbackMap) {
187094332d3Sopenharmony_ci        auto& callback = iter.second;
188094332d3Sopenharmony_ci        if (callback != nullptr) {
189094332d3Sopenharmony_ci            callback->ReportGnssMeasurementInfo(gnssMeasurementInfoNew);
190094332d3Sopenharmony_ci        }
191094332d3Sopenharmony_ci    }
192094332d3Sopenharmony_ci}
193094332d3Sopenharmony_ci#endif
194094332d3Sopenharmony_ci
195094332d3Sopenharmony_ci__attribute__((no_sanitize("cfi")))
196094332d3Sopenharmony_cistatic void GnssWorkingStatusUpdate(uint16_t* status)
197094332d3Sopenharmony_ci{
198094332d3Sopenharmony_ci    if (status == nullptr) {
199094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:param is nullptr.", __func__);
200094332d3Sopenharmony_ci        return;
201094332d3Sopenharmony_ci    }
202094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
203094332d3Sopenharmony_ci    GnssWorkingStatus gnssStatus = static_cast<GnssWorkingStatus>(*status);
204094332d3Sopenharmony_ci    for (const auto& iter : g_locationCallBackMap) {
205094332d3Sopenharmony_ci        auto& callback = iter.second;
206094332d3Sopenharmony_ci        if (callback != nullptr) {
207094332d3Sopenharmony_ci            callback->ReportGnssWorkingStatus(gnssStatus);
208094332d3Sopenharmony_ci        }
209094332d3Sopenharmony_ci    }
210094332d3Sopenharmony_ci}
211094332d3Sopenharmony_ci
212094332d3Sopenharmony_ci__attribute__((no_sanitize("cfi")))
213094332d3Sopenharmony_cistatic void SvStatusCallback(GnssSatelliteStatus* svInfo)
214094332d3Sopenharmony_ci{
215094332d3Sopenharmony_ci    if (svInfo == nullptr) {
216094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:sv_info is null.", __func__);
217094332d3Sopenharmony_ci        return;
218094332d3Sopenharmony_ci    }
219094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
220094332d3Sopenharmony_ci    SatelliteStatusInfo svStatus;
221094332d3Sopenharmony_ci    svStatus.satellitesNumber = svInfo->satellitesNum;
222094332d3Sopenharmony_ci    for (unsigned int i = 0; i < svInfo->satellitesNum; i++) {
223094332d3Sopenharmony_ci        svStatus.satelliteIds.push_back(svInfo->satellitesList[i].satelliteId);
224094332d3Sopenharmony_ci        svStatus.constellation.push_back(
225094332d3Sopenharmony_ci            static_cast<ConstellationCategory>(svInfo->satellitesList[i].constellationCategory));
226094332d3Sopenharmony_ci        svStatus.elevation.push_back(svInfo->satellitesList[i].elevation);
227094332d3Sopenharmony_ci        svStatus.azimuths.push_back(svInfo->satellitesList[i].azimuth);
228094332d3Sopenharmony_ci        svStatus.carrierFrequencies.push_back(svInfo->satellitesList[i].carrierFrequency);
229094332d3Sopenharmony_ci        svStatus.carrierToNoiseDensitys.push_back(svInfo->satellitesList[i].cn0);
230094332d3Sopenharmony_ci        svStatus.additionalInfo.push_back(svInfo->satellitesList[i].satelliteAdditionalInfo);
231094332d3Sopenharmony_ci    }
232094332d3Sopenharmony_ci    for (const auto& iter : g_locationCallBackMap) {
233094332d3Sopenharmony_ci        auto& callback = iter.second;
234094332d3Sopenharmony_ci        if (callback != nullptr) {
235094332d3Sopenharmony_ci            callback->ReportSatelliteStatusInfo(svStatus);
236094332d3Sopenharmony_ci        }
237094332d3Sopenharmony_ci    }
238094332d3Sopenharmony_ci}
239094332d3Sopenharmony_ci
240094332d3Sopenharmony_cistatic void NmeaCallback(int64_t timestamp, const char* nmea, int length)
241094332d3Sopenharmony_ci{
242094332d3Sopenharmony_ci    if (nmea == nullptr) {
243094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:nmea is nullptr.", __func__);
244094332d3Sopenharmony_ci        return;
245094332d3Sopenharmony_ci    }
246094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
247094332d3Sopenharmony_ci    for (const auto& iter : g_locationCallBackMap) {
248094332d3Sopenharmony_ci        auto& callback = iter.second;
249094332d3Sopenharmony_ci        if (callback != nullptr) {
250094332d3Sopenharmony_ci            callback->ReportNmea(timestamp, nmea, length);
251094332d3Sopenharmony_ci        }
252094332d3Sopenharmony_ci    }
253094332d3Sopenharmony_ci}
254094332d3Sopenharmony_ci
255094332d3Sopenharmony_cistatic void GetGnssBasicCallbackMethods(GnssBasicCallbackIfaces* device)
256094332d3Sopenharmony_ci{
257094332d3Sopenharmony_ci    if (device == nullptr) {
258094332d3Sopenharmony_ci        return;
259094332d3Sopenharmony_ci    }
260094332d3Sopenharmony_ci    device->size = sizeof(GnssCallbackStruct);
261094332d3Sopenharmony_ci    device->locationUpdate = LocationUpdate;
262094332d3Sopenharmony_ci    device->gnssWorkingStatusUpdate = GnssWorkingStatusUpdate;
263094332d3Sopenharmony_ci    device->satelliteStatusUpdate = SvStatusCallback;
264094332d3Sopenharmony_ci    device->nmeaUpdate = NmeaCallback;
265094332d3Sopenharmony_ci    device->capabilitiesUpdate = nullptr;
266094332d3Sopenharmony_ci    device->requestRefInfo = nullptr;
267094332d3Sopenharmony_ci    device->requestExtendedEphemeris = nullptr;
268094332d3Sopenharmony_ci}
269094332d3Sopenharmony_ci
270094332d3Sopenharmony_cistatic void GetGnssCacheCallbackMethods(GnssCacheCallbackIfaces* device)
271094332d3Sopenharmony_ci{
272094332d3Sopenharmony_ci    if (device == nullptr) {
273094332d3Sopenharmony_ci        return;
274094332d3Sopenharmony_ci    }
275094332d3Sopenharmony_ci    device->size = 0;
276094332d3Sopenharmony_ci    device->cachedLocationUpdate = nullptr;
277094332d3Sopenharmony_ci}
278094332d3Sopenharmony_ci
279094332d3Sopenharmony_cistatic void GetGnssCallbackMethods(GnssCallbackStruct* device)
280094332d3Sopenharmony_ci{
281094332d3Sopenharmony_ci    if (device == nullptr) {
282094332d3Sopenharmony_ci        return;
283094332d3Sopenharmony_ci    }
284094332d3Sopenharmony_ci    device->size = sizeof(GnssCallbackStruct);
285094332d3Sopenharmony_ci    static GnssBasicCallbackIfaces basicCallback;
286094332d3Sopenharmony_ci    GetGnssBasicCallbackMethods(&basicCallback);
287094332d3Sopenharmony_ci    device->gnssCallback = basicCallback;
288094332d3Sopenharmony_ci    static GnssCacheCallbackIfaces cacheCallback;
289094332d3Sopenharmony_ci    GetGnssCacheCallbackMethods(&cacheCallback);
290094332d3Sopenharmony_ci    device->gnssCacheCallback = cacheCallback;
291094332d3Sopenharmony_ci}
292094332d3Sopenharmony_ci
293094332d3Sopenharmony_ci#ifndef EMULATOR_ENABLED
294094332d3Sopenharmony_cistatic void GetGnssMeasurementCallbackMethods(GnssMeasurementCallbackIfaces* device)
295094332d3Sopenharmony_ci{
296094332d3Sopenharmony_ci    if (device == nullptr) {
297094332d3Sopenharmony_ci        return;
298094332d3Sopenharmony_ci    }
299094332d3Sopenharmony_ci    device->size = sizeof(GnssMeasurementCallbackIfaces);
300094332d3Sopenharmony_ci    device->gnssMeasurementUpdate = GnssMeasurementUpdate;
301094332d3Sopenharmony_ci}
302094332d3Sopenharmony_ci#endif
303094332d3Sopenharmony_ci
304094332d3Sopenharmony_ciGnssInterfaceImpl::GnssInterfaceImpl()
305094332d3Sopenharmony_ci{
306094332d3Sopenharmony_ci}
307094332d3Sopenharmony_ci
308094332d3Sopenharmony_ciGnssInterfaceImpl::~GnssInterfaceImpl()
309094332d3Sopenharmony_ci{
310094332d3Sopenharmony_ci    ResetGnssDeathRecipient();
311094332d3Sopenharmony_ci}
312094332d3Sopenharmony_ci
313094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::SetGnssConfigPara(const GnssConfigPara& para)
314094332d3Sopenharmony_ci{
315094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
316094332d3Sopenharmony_ci    auto gnssInterface = LocationVendorInterface::GetInstance()->GetGnssVendorInterface();
317094332d3Sopenharmony_ci    if (gnssInterface == nullptr) {
318094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetGnssVendorInterface return nullptr.", __func__);
319094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
320094332d3Sopenharmony_ci    }
321094332d3Sopenharmony_ci    g_configPara.startCategory = static_cast<uint32_t>(GnssStartCategory::GNSS_START_CATEGORY_NORMAL);
322094332d3Sopenharmony_ci    g_configPara.u.gnssBasicConfig.gnssMode = para.gnssBasic.gnssMode;
323094332d3Sopenharmony_ci    g_configPara.u.gnssBasicConfig.size = sizeof(GnssBasicConfigPara);
324094332d3Sopenharmony_ci    int ret = gnssInterface->setGnssConfigPara(&g_configPara);
325094332d3Sopenharmony_ci    HDF_LOGI("%{public}s, ret=%{public}d", __func__, ret);
326094332d3Sopenharmony_ci    return ret;
327094332d3Sopenharmony_ci}
328094332d3Sopenharmony_ci
329094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::EnableGnss(const sptr<IGnssCallback>& callbackObj)
330094332d3Sopenharmony_ci{
331094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
332094332d3Sopenharmony_ci    if (callbackObj == nullptr) {
333094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid callbackObj", __func__);
334094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
335094332d3Sopenharmony_ci    }
336094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
337094332d3Sopenharmony_ci    const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<IGnssCallback>(callbackObj);
338094332d3Sopenharmony_ci    if (remote == nullptr) {
339094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid remote", __func__);
340094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
341094332d3Sopenharmony_ci    }
342094332d3Sopenharmony_ci    static GnssCallbackStruct gnssCallback;
343094332d3Sopenharmony_ci    GetGnssCallbackMethods(&gnssCallback);
344094332d3Sopenharmony_ci    auto gnssInterface = LocationVendorInterface::GetInstance()->GetGnssVendorInterface();
345094332d3Sopenharmony_ci    if (gnssInterface == nullptr) {
346094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetGnssVendorInterface return nullptr.", __func__);
347094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
348094332d3Sopenharmony_ci    }
349094332d3Sopenharmony_ci    int ret = gnssInterface->enableGnss(&gnssCallback);
350094332d3Sopenharmony_ci    if (ret != HDF_SUCCESS) {
351094332d3Sopenharmony_ci        HDF_LOGE("enableGnss failed.");
352094332d3Sopenharmony_ci        return HDF_FAILURE;
353094332d3Sopenharmony_ci    }
354094332d3Sopenharmony_ci    static GnssNetInitiatedCallbacks niCallback;
355094332d3Sopenharmony_ci    niCallback.reportNiNotification = NiNotifyCallback;
356094332d3Sopenharmony_ci    int moduleType = static_cast<int>(GnssModuleIfaceCategory::GNSS_NET_INITIATED_MODULE_INTERFACE);
357094332d3Sopenharmony_ci    auto niInterface = static_cast<const GnssNetInitiatedInterface*>
358094332d3Sopenharmony_ci        (LocationVendorInterface::GetInstance()->GetModuleInterface(moduleType));
359094332d3Sopenharmony_ci    if (niInterface != nullptr) {
360094332d3Sopenharmony_ci        niInterface->setCallback(&niCallback);
361094332d3Sopenharmony_ci    } else {
362094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:can not get gnssNiInterface.", __func__);
363094332d3Sopenharmony_ci    }
364094332d3Sopenharmony_ci
365094332d3Sopenharmony_ci    if (g_locationCallBackMap.size() > 0) {
366094332d3Sopenharmony_ci        for (const auto& iter : g_locationCallBackMap) {
367094332d3Sopenharmony_ci            const auto& callback = iter.second;
368094332d3Sopenharmony_ci            if (callback != nullptr) {
369094332d3Sopenharmony_ci                RemoveGnssDeathRecipient(callback);
370094332d3Sopenharmony_ci            }
371094332d3Sopenharmony_ci        }
372094332d3Sopenharmony_ci        g_locationCallBackMap.clear();
373094332d3Sopenharmony_ci    }
374094332d3Sopenharmony_ci    AddGnssDeathRecipient(callbackObj);
375094332d3Sopenharmony_ci    g_locationCallBackMap[remote.GetRefPtr()] = callbackObj;
376094332d3Sopenharmony_ci    return ret;
377094332d3Sopenharmony_ci}
378094332d3Sopenharmony_ci
379094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::DisableGnss()
380094332d3Sopenharmony_ci{
381094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
382094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
383094332d3Sopenharmony_ci    auto gnssInterface = LocationVendorInterface::GetInstance()->GetGnssVendorInterface();
384094332d3Sopenharmony_ci    if (gnssInterface == nullptr) {
385094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetGnssVendorInterface return nullptr.", __func__);
386094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
387094332d3Sopenharmony_ci    }
388094332d3Sopenharmony_ci    int ret = gnssInterface->disableGnss();
389094332d3Sopenharmony_ci    g_locationCallBackMap.clear();
390094332d3Sopenharmony_ci    return ret;
391094332d3Sopenharmony_ci}
392094332d3Sopenharmony_ci
393094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::StartGnss(GnssStartType type)
394094332d3Sopenharmony_ci{
395094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
396094332d3Sopenharmony_ci    int startType = int(type);
397094332d3Sopenharmony_ci    auto gnssInterface = LocationVendorInterface::GetInstance()->GetGnssVendorInterface();
398094332d3Sopenharmony_ci    if (gnssInterface == nullptr) {
399094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetGnssVendorInterface return nullptr.", __func__);
400094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
401094332d3Sopenharmony_ci    }
402094332d3Sopenharmony_ci    int ret = gnssInterface->startGnss(startType);
403094332d3Sopenharmony_ci    return ret;
404094332d3Sopenharmony_ci}
405094332d3Sopenharmony_ci
406094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::StopGnss(GnssStartType type)
407094332d3Sopenharmony_ci{
408094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
409094332d3Sopenharmony_ci    int startType = static_cast<int>(type);
410094332d3Sopenharmony_ci    auto gnssInterface = LocationVendorInterface::GetInstance()->GetGnssVendorInterface();
411094332d3Sopenharmony_ci    if (gnssInterface == nullptr) {
412094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetGnssVendorInterface return nullptr.", __func__);
413094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
414094332d3Sopenharmony_ci    }
415094332d3Sopenharmony_ci    int ret = gnssInterface->stopGnss(startType);
416094332d3Sopenharmony_ci    return ret;
417094332d3Sopenharmony_ci}
418094332d3Sopenharmony_ci
419094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::SetGnssReferenceInfo(const GnssRefInfo& refInfo)
420094332d3Sopenharmony_ci{
421094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
422094332d3Sopenharmony_ci    auto gnssInterface = LocationVendorInterface::GetInstance()->GetGnssVendorInterface();
423094332d3Sopenharmony_ci    if (gnssInterface == nullptr) {
424094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetGnssVendorInterface return nullptr.", __func__);
425094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
426094332d3Sopenharmony_ci    }
427094332d3Sopenharmony_ci    GnssReferenceInfo referenceInfo;
428094332d3Sopenharmony_ci    referenceInfo.category = refInfo.type;
429094332d3Sopenharmony_ci    switch (refInfo.type) {
430094332d3Sopenharmony_ci        case GNSS_REF_INFO_TIME:
431094332d3Sopenharmony_ci            referenceInfo.u.time.size = sizeof(GnssRefTime);
432094332d3Sopenharmony_ci            referenceInfo.u.time.time = refInfo.time.time;
433094332d3Sopenharmony_ci            referenceInfo.u.time.elapsedRealtime = refInfo.time.elapsedRealtime;
434094332d3Sopenharmony_ci            referenceInfo.u.time.uncertaintyOfTime = refInfo.time.uncertaintyOfTime;
435094332d3Sopenharmony_ci            referenceInfo.size = sizeof(GnssReferenceInfo);
436094332d3Sopenharmony_ci            return gnssInterface->injectsGnssReferenceInfo(referenceInfo.category, &referenceInfo);
437094332d3Sopenharmony_ci        case GNSS_REF_INFO_LOCATION:
438094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.size = sizeof(GnssLocation);
439094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.fieldValidity = refInfo.gnssLocation.fieldValidity;
440094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.latitude = refInfo.gnssLocation.latitude;
441094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.longitude = refInfo.gnssLocation.longitude;
442094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.altitude = refInfo.gnssLocation.altitude;
443094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.speed = refInfo.gnssLocation.speed;
444094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.bearing = refInfo.gnssLocation.bearing;
445094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.horizontalAccuracy = refInfo.gnssLocation.horizontalAccuracy;
446094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.verticalAccuracy = refInfo.gnssLocation.verticalAccuracy;
447094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.speedAccuracy = refInfo.gnssLocation.speedAccuracy;
448094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.bearingAccuracy = refInfo.gnssLocation.bearingAccuracy;
449094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.timeForFix = refInfo.gnssLocation.timeForFix;
450094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.timeSinceBoot = refInfo.gnssLocation.timeSinceBoot;
451094332d3Sopenharmony_ci            referenceInfo.u.gnssLocation.timeUncertainty = refInfo.gnssLocation.timeUncertainty;
452094332d3Sopenharmony_ci            referenceInfo.size = sizeof(GnssReferenceInfo);
453094332d3Sopenharmony_ci            return gnssInterface->injectsGnssReferenceInfo(referenceInfo.category, &referenceInfo);
454094332d3Sopenharmony_ci        default:
455094332d3Sopenharmony_ci            HDF_LOGI("%{public}s: do not support now", __func__);
456094332d3Sopenharmony_ci            return HDF_ERR_INVALID_PARAM;
457094332d3Sopenharmony_ci    }
458094332d3Sopenharmony_ci}
459094332d3Sopenharmony_ci
460094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::DeleteAuxiliaryData(unsigned short data)
461094332d3Sopenharmony_ci{
462094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
463094332d3Sopenharmony_ci    uint16_t flags = data;
464094332d3Sopenharmony_ci    HDF_LOGI("%{public}s, flag=%{public}d", __func__, flags);
465094332d3Sopenharmony_ci    auto gnssInterface = LocationVendorInterface::GetInstance()->GetGnssVendorInterface();
466094332d3Sopenharmony_ci    if (gnssInterface == nullptr) {
467094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetGnssVendorInterface return nullptr.", __func__);
468094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
469094332d3Sopenharmony_ci    }
470094332d3Sopenharmony_ci    gnssInterface->removeAuxiliaryData(flags);
471094332d3Sopenharmony_ci    return HDF_SUCCESS;
472094332d3Sopenharmony_ci}
473094332d3Sopenharmony_ci
474094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::SetPredictGnssData(const std::string& data)
475094332d3Sopenharmony_ci{
476094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
477094332d3Sopenharmony_ci    return HDF_SUCCESS;
478094332d3Sopenharmony_ci}
479094332d3Sopenharmony_ci
480094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::GetCachedGnssLocationsSize(int32_t& size)
481094332d3Sopenharmony_ci{
482094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
483094332d3Sopenharmony_ci    return HDF_SUCCESS;
484094332d3Sopenharmony_ci}
485094332d3Sopenharmony_ci
486094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::GetCachedGnssLocations()
487094332d3Sopenharmony_ci{
488094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
489094332d3Sopenharmony_ci    return HDF_SUCCESS;
490094332d3Sopenharmony_ci}
491094332d3Sopenharmony_ci
492094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::AddGnssDeathRecipient(const sptr<IGnssCallback>& callbackObj)
493094332d3Sopenharmony_ci{
494094332d3Sopenharmony_ci    sptr<IRemoteObject::DeathRecipient> death(new (std::nothrow) GnssCallBackDeathRecipient(this));
495094332d3Sopenharmony_ci    const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<IGnssCallback>(callbackObj);
496094332d3Sopenharmony_ci    bool result = remote->AddDeathRecipient(death);
497094332d3Sopenharmony_ci    if (!result) {
498094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: GnssInterfaceImpl add deathRecipient fail", __func__);
499094332d3Sopenharmony_ci        return HDF_FAILURE;
500094332d3Sopenharmony_ci    }
501094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_deathMutex);
502094332d3Sopenharmony_ci    g_gnssCallBackDeathRecipientMap[remote.GetRefPtr()] = death;
503094332d3Sopenharmony_ci    return HDF_SUCCESS;
504094332d3Sopenharmony_ci}
505094332d3Sopenharmony_ci
506094332d3Sopenharmony_ci__attribute__((no_sanitize("cfi")))
507094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::RemoveGnssDeathRecipient(const sptr<IGnssCallback>& callbackObj)
508094332d3Sopenharmony_ci{
509094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_deathMutex);
510094332d3Sopenharmony_ci    const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<IGnssCallback>(callbackObj);
511094332d3Sopenharmony_ci    auto iter = g_gnssCallBackDeathRecipientMap.find(remote.GetRefPtr());
512094332d3Sopenharmony_ci    if (iter == g_gnssCallBackDeathRecipientMap.end()) {
513094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: GnssInterfaceImpl can not find deathRecipient", __func__);
514094332d3Sopenharmony_ci        return HDF_FAILURE;
515094332d3Sopenharmony_ci    }
516094332d3Sopenharmony_ci    auto recipient = iter->second;
517094332d3Sopenharmony_ci    bool result = remote->RemoveDeathRecipient(recipient);
518094332d3Sopenharmony_ci    g_gnssCallBackDeathRecipientMap.erase(iter);
519094332d3Sopenharmony_ci    if (!result) {
520094332d3Sopenharmony_ci        HDF_LOGE("%{public}s: GnssInterfaceImpl remove deathRecipient fail", __func__);
521094332d3Sopenharmony_ci        return HDF_FAILURE;
522094332d3Sopenharmony_ci    }
523094332d3Sopenharmony_ci    return HDF_SUCCESS;
524094332d3Sopenharmony_ci}
525094332d3Sopenharmony_ci
526094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::SendNiUserResponse(int32_t gnssNiNotificationId, GnssNiResponseCmd userResponse)
527094332d3Sopenharmony_ci{
528094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
529094332d3Sopenharmony_ci    int moduleType = static_cast<int>(GnssModuleIfaceCategory::GNSS_NET_INITIATED_MODULE_INTERFACE);
530094332d3Sopenharmony_ci    auto niInterface = static_cast<const GnssNetInitiatedInterface*>
531094332d3Sopenharmony_ci        (LocationVendorInterface::GetInstance()->GetModuleInterface(moduleType));
532094332d3Sopenharmony_ci    if (niInterface == nullptr) {
533094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:can not get gnssNiInterface.", __func__);
534094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
535094332d3Sopenharmony_ci    }
536094332d3Sopenharmony_ci    niInterface->sendUserResponse(gnssNiNotificationId, static_cast<int32_t>(userResponse));
537094332d3Sopenharmony_ci    return HDF_SUCCESS;
538094332d3Sopenharmony_ci}
539094332d3Sopenharmony_ci
540094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::SendNetworkInitiatedMsg(const std::string& msg, int length)
541094332d3Sopenharmony_ci{
542094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
543094332d3Sopenharmony_ci    if (msg.empty()) {
544094332d3Sopenharmony_ci        HDF_LOGE("%{public}s msg is empty", __func__);
545094332d3Sopenharmony_ci        return HDF_FAILURE;
546094332d3Sopenharmony_ci    }
547094332d3Sopenharmony_ci    int moduleType = static_cast<int>(GnssModuleIfaceCategory::GNSS_NET_INITIATED_MODULE_INTERFACE);
548094332d3Sopenharmony_ci    auto niInterface = static_cast<const GnssNetInitiatedInterface*>
549094332d3Sopenharmony_ci        (LocationVendorInterface::GetInstance()->GetModuleInterface(moduleType));
550094332d3Sopenharmony_ci    if (niInterface == nullptr) {
551094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:can not get gnssNiInterface.", __func__);
552094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
553094332d3Sopenharmony_ci    }
554094332d3Sopenharmony_ci    std::vector<uint8_t> data = StringUtils::HexToByteVector(msg);
555094332d3Sopenharmony_ci    HDF_LOGI("%{public}s. msg : %{public}s, length %{public}d, msg size %{public}d, data size %{public}d",
556094332d3Sopenharmony_ci        __func__, msg.c_str(), length, int(msg.size()), int(data.size()));
557094332d3Sopenharmony_ci
558094332d3Sopenharmony_ci    niInterface->sendNetworkInitiatedMsg(data.data(), data.size());
559094332d3Sopenharmony_ci    return HDF_SUCCESS;
560094332d3Sopenharmony_ci}
561094332d3Sopenharmony_ci
562094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::EnableGnssMeasurement(const sptr<IGnssMeasurementCallback>& callbackObj)
563094332d3Sopenharmony_ci{
564094332d3Sopenharmony_ci#ifndef EMULATOR_ENABLED
565094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
566094332d3Sopenharmony_ci    if (callbackObj == nullptr) {
567094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid callbackObj", __func__);
568094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
569094332d3Sopenharmony_ci    }
570094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
571094332d3Sopenharmony_ci    const sptr<IRemoteObject>& remote = OHOS::HDI::hdi_objcast<IGnssMeasurementCallback>(callbackObj);
572094332d3Sopenharmony_ci    if (remote == nullptr) {
573094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:invalid remote", __func__);
574094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
575094332d3Sopenharmony_ci    }
576094332d3Sopenharmony_ci
577094332d3Sopenharmony_ci    static GnssMeasurementCallbackIfaces gnssMeasurementCallback;
578094332d3Sopenharmony_ci    GetGnssMeasurementCallbackMethods(&gnssMeasurementCallback);
579094332d3Sopenharmony_ci    int moduleType = static_cast<int>(GnssModuleIfaceCategory::GNSS_MEASUREMENT_MODULE_INTERFACE);
580094332d3Sopenharmony_ci    auto gnssMeasurementInterface = static_cast<const GnssMeasurementInterface*>
581094332d3Sopenharmony_ci        (LocationVendorInterface::GetInstance()->GetModuleInterface(moduleType));
582094332d3Sopenharmony_ci    if (gnssMeasurementInterface == nullptr) {
583094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GetModuleInterface return nullptr.", __func__);
584094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
585094332d3Sopenharmony_ci    }
586094332d3Sopenharmony_ci    bool result = gnssMeasurementInterface->enable(&gnssMeasurementCallback);
587094332d3Sopenharmony_ci    if (!result) {
588094332d3Sopenharmony_ci        HDF_LOGE("enableGnssMeasurement failed.");
589094332d3Sopenharmony_ci        return HDF_FAILURE;
590094332d3Sopenharmony_ci    }
591094332d3Sopenharmony_ci    if (g_gnssMeasurementCallbackMap.size() > 0) {
592094332d3Sopenharmony_ci        g_gnssMeasurementCallbackMap.clear();
593094332d3Sopenharmony_ci    }
594094332d3Sopenharmony_ci    g_gnssMeasurementCallbackMap[remote.GetRefPtr()] = callbackObj;
595094332d3Sopenharmony_ci    return HDF_SUCCESS;
596094332d3Sopenharmony_ci#else
597094332d3Sopenharmony_ci    return HDF_SUCCESS;
598094332d3Sopenharmony_ci#endif
599094332d3Sopenharmony_ci}
600094332d3Sopenharmony_ci
601094332d3Sopenharmony_ciint32_t GnssInterfaceImpl::DisableGnssMeasurement()
602094332d3Sopenharmony_ci{
603094332d3Sopenharmony_ci#ifndef EMULATOR_ENABLED
604094332d3Sopenharmony_ci    HDF_LOGI("%{public}s.", __func__);
605094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
606094332d3Sopenharmony_ci    int moduleType = static_cast<int>(GnssModuleIfaceCategory::GNSS_MEASUREMENT_MODULE_INTERFACE);
607094332d3Sopenharmony_ci    auto gnssMeasurementInterface = static_cast<const GnssMeasurementInterface*>
608094332d3Sopenharmony_ci        (LocationVendorInterface::GetInstance()->GetModuleInterface(moduleType));
609094332d3Sopenharmony_ci    if (gnssMeasurementInterface == nullptr) {
610094332d3Sopenharmony_ci        HDF_LOGE("%{public}s:GnssMeasurementInterface return nullptr.", __func__);
611094332d3Sopenharmony_ci        return HDF_ERR_INVALID_PARAM;
612094332d3Sopenharmony_ci    }
613094332d3Sopenharmony_ci    gnssMeasurementInterface->disable();
614094332d3Sopenharmony_ci    g_gnssMeasurementCallbackMap.clear();
615094332d3Sopenharmony_ci#endif
616094332d3Sopenharmony_ci    return HDF_SUCCESS;
617094332d3Sopenharmony_ci}
618094332d3Sopenharmony_ci
619094332d3Sopenharmony_civoid GnssInterfaceImpl::ResetGnssDeathRecipient()
620094332d3Sopenharmony_ci{
621094332d3Sopenharmony_ci    std::unique_lock<std::mutex> lock(g_mutex);
622094332d3Sopenharmony_ci    for (const auto& iter : g_locationCallBackMap) {
623094332d3Sopenharmony_ci        const auto& callback = iter.second;
624094332d3Sopenharmony_ci        if (callback != nullptr) {
625094332d3Sopenharmony_ci            RemoveGnssDeathRecipient(callback);
626094332d3Sopenharmony_ci        }
627094332d3Sopenharmony_ci    }
628094332d3Sopenharmony_ci}
629094332d3Sopenharmony_ci
630094332d3Sopenharmony_civoid GnssInterfaceImpl::ResetGnss()
631094332d3Sopenharmony_ci{
632094332d3Sopenharmony_ci    HDF_LOGI("%{public}s called.", __func__);
633094332d3Sopenharmony_ci    ResetGnssDeathRecipient();
634094332d3Sopenharmony_ci    StopGnss(GNSS_START_TYPE_NORMAL);
635094332d3Sopenharmony_ci    DisableGnssMeasurement();
636094332d3Sopenharmony_ci}
637094332d3Sopenharmony_ci} // V2_0
638094332d3Sopenharmony_ci} // Gnss
639094332d3Sopenharmony_ci} // Location
640094332d3Sopenharmony_ci} // HDI
641094332d3Sopenharmony_ci} // OHOS
642