1b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel/* Copyright (c) 2017, The Linux Foundation. All rights reserved. 2b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * 3b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * Redistribution and use in source and binary forms, with or without 4b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * modification, are permitted provided that the following conditions are 5b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * met: 6b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * * Redistributions of source code must retain the above copyright 7b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * notice, this list of conditions and the following disclaimer. 8b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * * Redistributions in binary form must reproduce the above 9b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * copyright notice, this list of conditions and the following 10b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * disclaimer in the documentation and/or other materials provided 11b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * with the distribution. 12b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * * Neither the name of The Linux Foundation, nor the names of its 13b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * contributors may be used to endorse or promote products derived 14b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * from this software without specific prior written permission. 15b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * 16b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel * 28b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel */ 29b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 30b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#define LOG_NDDEBUG 0 31b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#define LOG_TAG "LocSvc_GnssAPIClient" 32b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 33b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include <log_util.h> 34b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include <loc_cfg.h> 35b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 36b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include "LocationUtil.h" 37b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel#include "GnssAPIClient.h" 38b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 39b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelnamespace android { 40b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelnamespace hardware { 41b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelnamespace gnss { 42b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelnamespace V1_0 { 43b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelnamespace implementation { 44b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 45b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelstatic void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvStatus& out); 46b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 47b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry StrudelGnssAPIClient::GnssAPIClient(const sp<IGnssCallback>& gpsCb, 48b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel const sp<IGnssNiCallback>& niCb) : 49b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LocationAPIClientBase(), 50b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface(nullptr), 51b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssNiCbIface(nullptr), 52b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationCapabilitiesMask(0) 53b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 54b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%p %p)", __FUNCTION__, &gpsCb, &niCb); 55b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 56b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel // set default LocationOptions. 57b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel memset(&mLocationOptions, 0, sizeof(LocationOptions)); 58b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.size = sizeof(LocationOptions); 59b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.minInterval = 1000; 60b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.minDistance = 0; 61b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE; 62b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 63b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel gnssUpdateCallbacks(gpsCb, niCb); 64b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 65b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 66b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry StrudelGnssAPIClient::~GnssAPIClient() 67b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 68b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: ()", __FUNCTION__); 69b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 70b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 71b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel// for GpsInterface 72b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::gnssUpdateCallbacks(const sp<IGnssCallback>& gpsCb, 73b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel const sp<IGnssNiCallback>& niCb) 74b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 75b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%p %p)", __FUNCTION__, &gpsCb, &niCb); 76b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 77b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface = gpsCb; 78b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssNiCbIface = niCb; 79b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 80b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LocationCallbacks locationCallbacks; 81b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.size = sizeof(LocationCallbacks); 82b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 83b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.trackingCb = nullptr; 84b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssCbIface != nullptr) { 85b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.trackingCb = [this](Location location) { 86b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel onTrackingCb(location); 87b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel }; 88b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 89b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 90b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.batchingCb = nullptr; 91b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.geofenceBreachCb = nullptr; 92b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.geofenceStatusCb = nullptr; 93b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.gnssLocationInfoCb = nullptr; 94b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 95b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.gnssNiCb = nullptr; 96b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssNiCbIface != nullptr) { 97b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.gnssNiCb = [this](uint32_t id, GnssNiNotification gnssNiNotification) { 98b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel onGnssNiCb(id, gnssNiNotification); 99b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel }; 100b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 101b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 102b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.gnssSvCb = nullptr; 103b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssCbIface != nullptr) { 104b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.gnssSvCb = [this](GnssSvNotification gnssSvNotification) { 105b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel onGnssSvCb(gnssSvNotification); 106b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel }; 107b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 108b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 109b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.gnssNmeaCb = nullptr; 110b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssCbIface != nullptr) { 111b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.gnssNmeaCb = [this](GnssNmeaNotification gnssNmeaNotification) { 112b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel onGnssNmeaCb(gnssNmeaNotification); 113b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel }; 114b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 115b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 116b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locationCallbacks.gnssMeasurementsCb = nullptr; 117b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 118b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locAPISetCallbacks(locationCallbacks); 119b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 120b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 121b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelbool GnssAPIClient::gnssStart() 122b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 123b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: ()", __FUNCTION__); 124b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel bool retVal = true; 125b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locAPIStartTracking(mLocationOptions); 126b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel return retVal; 127b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 128b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 129b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelbool GnssAPIClient::gnssStop() 130b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 131b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: ()", __FUNCTION__); 132b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel bool retVal = true; 133b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locAPIStopTracking(); 134b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel return retVal; 135b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 136b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 137b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::gnssDeleteAidingData(IGnss::GnssAidingData aidingDataFlags) 138b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 139b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%02hx)", __FUNCTION__, aidingDataFlags); 140b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel GnssAidingData data; 141b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel memset(&data, 0, sizeof (GnssAidingData)); 142b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.sv.svTypeMask = GNSS_AIDING_DATA_SV_TYPE_GPS | 143b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel GNSS_AIDING_DATA_SV_TYPE_GLONASS | 144b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel GNSS_AIDING_DATA_SV_TYPE_QZSS | 145b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel GNSS_AIDING_DATA_SV_TYPE_BEIDOU | 146b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel GNSS_AIDING_DATA_SV_TYPE_GALILEO; 147b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 148b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags == IGnss::GnssAidingData::DELETE_ALL) 149b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.deleteAll = true; 150b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else { 151b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_EPHEMERIS) 152b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.sv.svMask |= GNSS_AIDING_DATA_SV_EPHEMERIS; 153b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_ALMANAC) 154b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.sv.svMask |= GNSS_AIDING_DATA_SV_ALMANAC; 155b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_POSITION) 156b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.common.mask |= GNSS_AIDING_DATA_COMMON_POSITION; 157b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_TIME) 158b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.common.mask |= GNSS_AIDING_DATA_COMMON_TIME; 159b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_IONO) 160b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.sv.svMask |= GNSS_AIDING_DATA_SV_IONOSPHERE; 161b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_UTC) 162b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.common.mask |= GNSS_AIDING_DATA_COMMON_UTC; 163b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_HEALTH) 164b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.sv.svMask |= GNSS_AIDING_DATA_SV_HEALTH; 165b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SVDIR) 166b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.sv.svMask |= GNSS_AIDING_DATA_SV_DIRECTION; 167b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SVSTEER) 168b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.sv.svMask |= GNSS_AIDING_DATA_SV_STEER; 169b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_SADATA) 170b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.sv.svMask |= GNSS_AIDING_DATA_SV_SA_DATA; 171b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_RTI) 172b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.common.mask |= GNSS_AIDING_DATA_COMMON_RTI; 173b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (aidingDataFlags & IGnss::GnssAidingData::DELETE_CELLDB_INFO) 174b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data.common.mask |= GNSS_AIDING_DATA_COMMON_CELLDB; 175b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 176b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locAPIGnssDeleteAidingData(data); 177b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 178b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 179b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelbool GnssAPIClient::gnssSetPositionMode(IGnss::GnssPositionMode mode, 180b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnss::GnssPositionRecurrence recurrence, uint32_t minIntervalMs, 181b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel uint32_t preferredAccuracyMeters, uint32_t preferredTimeMs) 182b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 183b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%d %d %d %d %d)", __FUNCTION__, 184b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel (int)mode, recurrence, minIntervalMs, preferredAccuracyMeters, preferredTimeMs); 185b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel bool retVal = true; 186b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel memset(&mLocationOptions, 0, sizeof(LocationOptions)); 187b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.size = sizeof(LocationOptions); 188b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.minInterval = minIntervalMs; 189b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.minDistance = preferredAccuracyMeters; 190b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mode == IGnss::GnssPositionMode::STANDALONE) 191b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.mode = GNSS_SUPL_MODE_STANDALONE; 192b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (mode == IGnss::GnssPositionMode::MS_BASED) 193b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.mode = GNSS_SUPL_MODE_MSB; 194b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (mode == IGnss::GnssPositionMode::MS_ASSISTED) 195b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationOptions.mode = GNSS_SUPL_MODE_MSA; 196b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel return retVal; 197b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 198b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 199b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel// for GpsNiInterface 200b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::gnssNiRespond(int32_t notifId, 201b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssUserResponseType userResponse) 202b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 203b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%d %d)", __FUNCTION__, notifId, static_cast<int>(userResponse)); 204b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel GnssNiResponse data = GNSS_NI_RESPONSE_IGNORE; 205b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (userResponse == IGnssNiCallback::GnssUserResponseType::RESPONSE_ACCEPT) 206b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data = GNSS_NI_RESPONSE_ACCEPT; 207b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (userResponse == IGnssNiCallback::GnssUserResponseType::RESPONSE_DENY) 208b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data = GNSS_NI_RESPONSE_DENY; 209b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (userResponse == IGnssNiCallback::GnssUserResponseType::RESPONSE_NORESP) 210b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data = GNSS_NI_RESPONSE_NO_RESPONSE; 211b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locAPIGnssNiResponse(notifId, data); 212b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 213b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 214b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel// for GnssConfigurationInterface 215b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::gnssConfigurationUpdate(const GnssConfig& gnssConfig) 216b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 217b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%02x)", __FUNCTION__, gnssConfig.flags); 218b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel locAPIGnssUpdateConfig(gnssConfig); 219b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 220b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 221b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel// callbacks 222b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::onCapabilitiesCb(LocationCapabilitiesMask capabilitiesMask) 223b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 224b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%02x)", __FUNCTION__, capabilitiesMask); 225b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mLocationCapabilitiesMask = capabilitiesMask; 226b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssCbIface != nullptr) { 227b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel uint32_t data = 0; 228b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if ((capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_TRACKING_BIT) || 229b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel (capabilitiesMask & LOCATION_CAPABILITIES_TIME_BASED_BATCHING_BIT) || 230b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel (capabilitiesMask & LOCATION_CAPABILITIES_DISTANCE_BASED_TRACKING_BIT) || 231b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel (capabilitiesMask & LOCATION_CAPABILITIES_DISTANCE_BASED_BATCHING_BIT)) 232b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data |= IGnssCallback::Capabilities::SCHEDULING; 233b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (capabilitiesMask & LOCATION_CAPABILITIES_GEOFENCE_BIT) 234b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data |= IGnssCallback::Capabilities::GEOFENCING; 235b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT) 236b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data |= IGnssCallback::Capabilities::MEASUREMENTS; 237b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MSB_BIT) 238b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data |= IGnssCallback::Capabilities::MSB; 239b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MSA_BIT) 240b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel data |= IGnssCallback::Capabilities::MSA; 241b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssSetCapabilitesCb(data); 242b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 243b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssCbIface != nullptr) { 244b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssCallback::GnssSystemInfo gnssInfo; 245b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel gnssInfo.yearOfHw = 2015; 246b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (capabilitiesMask & LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT) { 247b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel gnssInfo.yearOfHw = 2017; 248b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 249b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGV("%s:%d] set_system_info_cb (%d)", __FUNCTION__, __LINE__, gnssInfo.yearOfHw); 250b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssSetSystemInfoCb(gnssInfo); 251b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 252b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 253b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 254b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::onTrackingCb(Location location) 255b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 256b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (flags: %02x)", __FUNCTION__, location.flags); 257b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssCbIface != nullptr) { 258b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel GnssLocation gnssLocation; 259b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel convertGnssLocation(location, gnssLocation); 260b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssLocationCb(gnssLocation); 261b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 262b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 263b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 264b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::onGnssNiCb(uint32_t id, GnssNiNotification gnssNiNotification) 265b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 266b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (id: %d)", __FUNCTION__, id); 267b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 268b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssNiCbIface == nullptr) { 269b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGE("%s]: mGnssNiCbIface is nullptr", __FUNCTION__); 270b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel return; 271b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 272b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 273b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiNotification notificationGnss; 274b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 275b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notificationId = id; 276b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 277b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (gnssNiNotification.type == GNSS_NI_TYPE_VOICE) 278b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.niType = IGnssNiCallback::GnssNiType::VOICE; 279b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.type == GNSS_NI_TYPE_SUPL) 280b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.niType = IGnssNiCallback::GnssNiType::UMTS_SUPL; 281b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.type == GNSS_NI_TYPE_CONTROL_PLANE) 282b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.niType = IGnssNiCallback::GnssNiType::UMTS_CTRL_PLANE; 283b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel // GNSS_NI_TYPE_EMERGENCY_SUPL not supported 284b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 285b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (gnssNiNotification.options == GNSS_NI_OPTIONS_NOTIFICATION) 286b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notifyFlags = 287b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel static_cast<uint32_t>(IGnssNiCallback::GnssNiNotifyFlags::NEED_NOTIFY); 288b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.options == GNSS_NI_OPTIONS_VERIFICATION) 289b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notifyFlags = 290b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel static_cast<uint32_t>(IGnssNiCallback::GnssNiNotifyFlags::NEED_VERIFY); 291b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.options == GNSS_NI_OPTIONS_PRIVACY_OVERRIDE) 292b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notifyFlags = 293b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel static_cast<uint32_t>(IGnssNiCallback::GnssNiNotifyFlags::PRIVACY_OVERRIDE); 294b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 295b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.timeoutSec = gnssNiNotification.timeout; 296b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 297b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_ACCEPT) 298b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_ACCEPT; 299b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_DENY) 300b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_DENY; 301b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_NO_RESPONSE || 302b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel gnssNiNotification.timeoutResponse == GNSS_NI_RESPONSE_IGNORE) 303b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.defaultResponse = IGnssNiCallback::GnssUserResponseType::RESPONSE_NORESP; 304b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 305b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.requestorId = gnssNiNotification.requestor; 306b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 307b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notificationMessage = gnssNiNotification.message; 308b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 309b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_NONE) 310b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.requestorIdEncoding = 311b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiEncodingType::ENC_NONE; 312b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_GSM_DEFAULT) 313b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.requestorIdEncoding = 314b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_GSM_DEFAULT; 315b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_UTF8) 316b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.requestorIdEncoding = 317b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UTF8; 318b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.requestorEncoding == GNSS_NI_ENCODING_TYPE_UCS2) 319b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.requestorIdEncoding = 320b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UCS2; 321b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 322b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_NONE) 323b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notificationIdEncoding = 324b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiEncodingType::ENC_NONE; 325b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_GSM_DEFAULT) 326b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notificationIdEncoding = 327b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_GSM_DEFAULT; 328b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_UTF8) 329b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notificationIdEncoding = 330b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UTF8; 331b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel else if (gnssNiNotification.messageEncoding == GNSS_NI_ENCODING_TYPE_UCS2) 332b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel notificationGnss.notificationIdEncoding = 333b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssNiCallback::GnssNiEncodingType::ENC_SUPL_UCS2; 334b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 335b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssNiCbIface->niNotifyCb(notificationGnss); 336b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 337b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 338b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::onGnssSvCb(GnssSvNotification gnssSvNotification) 339b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 340b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (count: %zu)", __FUNCTION__, gnssSvNotification.count); 341b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssCbIface != nullptr) { 342b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssCallback::GnssSvStatus svStatus; 343b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel convertGnssSvStatus(gnssSvNotification, svStatus); 344b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssSvStatusCb(svStatus); 345b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 346b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 347b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 348b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification) 349b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 350b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (mGnssCbIface != nullptr) { 351b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel android::hardware::hidl_string nmeaString; 352b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length); 353b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssNmeaCb(static_cast<GnssUtcTime>(gnssNmeaNotification.timestamp), 354b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel nmeaString); 355b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 356b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 357b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 358b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::onStartTrackingCb(LocationError error) 359b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 360b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%d)", __FUNCTION__, error); 361b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (error == LOCATION_ERROR_SUCCESS && mGnssCbIface != nullptr) { 362b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON); 363b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_BEGIN); 364b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 365b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 366b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 367b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelvoid GnssAPIClient::onStopTrackingCb(LocationError error) 368b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 369b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGD("%s]: (%d)", __FUNCTION__, error); 370b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (error == LOCATION_ERROR_SUCCESS && mGnssCbIface != nullptr) { 371b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::SESSION_END); 372b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel mGnssCbIface->gnssStatusCb(IGnssCallback::GnssStatusValue::ENGINE_ON); 373b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 374b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 375b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 376b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudelstatic void convertGnssSvStatus(GnssSvNotification& in, IGnssCallback::GnssSvStatus& out) 377b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel{ 378b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel memset(&out, 0, sizeof(IGnssCallback::GnssSvStatus)); 379b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel out.numSvs = in.count; 380b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (out.numSvs > static_cast<uint32_t>(GnssMax::SVS_COUNT)) { 381b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel LOC_LOGW("%s]: Too many satellites %zd. Clamps to %d.", 382b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel __FUNCTION__, out.numSvs, GnssMax::SVS_COUNT); 383b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel out.numSvs = static_cast<uint32_t>(GnssMax::SVS_COUNT); 384b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 385b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel for (size_t i = 0; i < out.numSvs; i++) { 386b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel IGnssCallback::GnssSvInfo& info = out.gnssSvList[i]; 387b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel info.svid = in.gnssSvs[i].svId; 388b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel convertGnssConstellationType(in.gnssSvs[i].type, info.constellation); 389b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel info.cN0Dbhz = in.gnssSvs[i].cN0Dbhz; 390b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel info.elevationDegrees = in.gnssSvs[i].elevation; 391b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel info.azimuthDegrees = in.gnssSvs[i].azimuth; 392b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel info.svFlag = static_cast<uint8_t>(IGnssCallback::GnssSvFlags::NONE); 393b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_EPHEMER_BIT) 394b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel info.svFlag |= IGnssCallback::GnssSvFlags::HAS_EPHEMERIS_DATA; 395b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_HAS_ALMANAC_BIT) 396b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel info.svFlag |= IGnssCallback::GnssSvFlags::HAS_ALMANAC_DATA; 397b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel if (in.gnssSvs[i].gnssSvOptionsMask & GNSS_SV_OPTIONS_USED_IN_FIX_BIT) 398b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel info.svFlag |= IGnssCallback::GnssSvFlags::USED_IN_FIX; 399b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel } 400b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} 401b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel 402b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} // namespace implementation 403b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} // namespace V1_0 404b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} // namespace gnss 405b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} // namespace hardware 406b4dcb0e3da7f3f737289d237b53b6b5e904b5284Thierry Strudel} // namespace android 407