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