1eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* Copyright (c) 2017, The Linux Foundation. All rights reserved. 2eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 3eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Redistribution and use in source and binary forms, with or without 4eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * modification, are permitted provided that the following conditions are 5eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * met: 6eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Redistributions of source code must retain the above copyright 7eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * notice, this list of conditions and the following disclaimer. 8eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Redistributions in binary form must reproduce the above 9eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * copyright notice, this list of conditions and the following 10eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * disclaimer in the documentation and/or other materials provided 11eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * with the distribution. 12eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * * Neither the name of The Linux Foundation, nor the names of its 13eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * contributors may be used to endorse or promote products derived 14eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * from this software without specific prior written permission. 15eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 16eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * 28eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh */ 29eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define LOG_TAG "LocSvc_GnssAdapter" 30eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 31eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <inttypes.h> 32eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <sys/stat.h> 33eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <errno.h> 34eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <ctype.h> 35eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <cutils/properties.h> 36eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <math.h> 37eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <arpa/inet.h> 38eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <netinet/in.h> 39eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <netdb.h> 40eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <GnssAdapter.h> 41eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <string> 42eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <loc_log.h> 43eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <loc_nmea.h> 44eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <Agps.h> 45eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <SystemStatus.h> 46eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 47eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <loc_nmea.h> 48eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <vector> 49eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <string> 50eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 51eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhusing namespace loc_core; 52eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 53eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::GnssAdapter() : 54eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocAdapterBase(0, 55eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocDualContext::getLocFgContext(NULL, 56eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NULL, 57eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocDualContext::mLocationHalName, 58eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh false)), 59eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlpProxy(new UlpProxyBase()), 60eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlpPositionMode(), 61eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnssSvIdUsedInPosition(), 62eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnssSvIdUsedInPosAvail(false), 63eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mControlCallbacks(), 64eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mPowerVoteId(0), 65eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mNmeaMask(0), 66eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mNiData(), 67eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager(), 68eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsCbInfo(), 698f362b95bd587923b1168244ea6a65d8938b0449Harikrishnan Hariharan mSystemStatus(SystemStatus::getInstance(mMsgTask)), 708f362b95bd587923b1168244ea6a65d8938b0449Harikrishnan Hariharan mXtraObserver(mSystemStatus->getOsObserver(), mMsgTask) 71eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 72eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: Constructor %p", __func__, this); 73eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlpPositionMode.mode = LOC_POSITION_MODE_INVALID; 74eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh readConfigCommand(); 75eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh setConfigCommand(); 76eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 77eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 78eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 79eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::setControlCallbacksCommand(LocationControlCallbacks& controlCallbacks) 80eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 81eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgSetControlCallbacks : public LocMsg { 82eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 83eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const LocationControlCallbacks mControlCallbacks; 84eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgSetControlCallbacks(GnssAdapter& adapter, 85eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationControlCallbacks& controlCallbacks) : 86eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 87eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 88eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mControlCallbacks(controlCallbacks) {} 89eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 90eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.setControlCallbacks(mControlCallbacks); 91eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 92eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 93eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 94eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgSetControlCallbacks(*this, controlCallbacks)); 95eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 96eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 97eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 98eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertOptions(LocPosMode& out, const LocationOptions& options) 99eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosMode locPosMode = {}; 101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (options.mode) { 102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SUPL_MODE_MSB: 103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.mode = LOC_POSITION_MODE_MS_BASED; 104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SUPL_MODE_MSA: 106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.mode = LOC_POSITION_MODE_MS_ASSISTED; 107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.mode = LOC_POSITION_MODE_STANDALONE; 110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 112eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.share_position = true; 113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.min_interval = options.minInterval; 114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertLocation(Location& out, const LocGpsLocation& locGpsLocation, 118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GpsLocationExtended& locationExtended, 119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const LocPosTechMask techMask) 120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh memset(&out, 0, sizeof(Location)); 122eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.size = sizeof(Location); 123eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_GPS_LOCATION_HAS_LAT_LONG & locGpsLocation.flags) { 124eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= LOCATION_HAS_LAT_LONG_BIT; 125eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.latitude = locGpsLocation.latitude; 126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.longitude = locGpsLocation.longitude; 127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_GPS_LOCATION_HAS_ALTITUDE & locGpsLocation.flags) { 129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= LOCATION_HAS_ALTITUDE_BIT; 130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.altitude = locGpsLocation.altitude; 131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_GPS_LOCATION_HAS_SPEED & locGpsLocation.flags) { 133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= LOCATION_HAS_SPEED_BIT; 134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.speed = locGpsLocation.speed; 135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 136eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_GPS_LOCATION_HAS_BEARING & locGpsLocation.flags) { 137eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= LOCATION_HAS_BEARING_BIT; 138eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.bearing = locGpsLocation.bearing; 139eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 140eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_GPS_LOCATION_HAS_ACCURACY & locGpsLocation.flags) { 141eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= LOCATION_HAS_ACCURACY_BIT; 142eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.accuracy = locGpsLocation.accuracy; 143eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 144eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_VERT_UNC & locationExtended.flags) { 145eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= LOCATION_HAS_VERTICAL_ACCURACY_BIT; 146eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.verticalAccuracy = locationExtended.vert_unc; 147eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 148eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_SPEED_UNC & locationExtended.flags) { 149eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= LOCATION_HAS_SPEED_ACCURACY_BIT; 150eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.speedAccuracy = locationExtended.speed_unc; 151eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 152eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_BEARING_UNC & locationExtended.flags) { 153eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= LOCATION_HAS_BEARING_ACCURACY_BIT; 154eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.bearingAccuracy = locationExtended.bearing_unc; 155eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 156eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.timestamp = locGpsLocation.timestamp; 157eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_POS_TECH_MASK_SATELLITE & techMask) { 158eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.techMask |= LOCATION_TECHNOLOGY_GNSS_BIT; 159eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 160eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_POS_TECH_MASK_CELLID & techMask) { 161eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.techMask |= LOCATION_TECHNOLOGY_CELL_BIT; 162eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 163eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_POS_TECH_MASK_WIFI & techMask) { 164eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.techMask |= LOCATION_TECHNOLOGY_WIFI_BIT; 165eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 166eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_POS_TECH_MASK_SENSORS & techMask) { 167eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.techMask |= LOCATION_TECHNOLOGY_SENSORS_BIT; 168eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 169eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 170eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 171eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 172eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertLocationInfo(GnssLocationInfoNotification& out, 173eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GpsLocationExtended& locationExtended) 174eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 175eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.size = sizeof(GnssLocationInfoNotification); 176eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_ALTITUDE_MEAN_SEA_LEVEL & locationExtended.flags) { 177eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= GNSS_LOCATION_INFO_ALTITUDE_MEAN_SEA_LEVEL_BIT; 178eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.altitudeMeanSeaLevel = locationExtended.altitudeMeanSeaLevel; 179eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 180eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_DOP & locationExtended.flags) { 181eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= GNSS_LOCATION_INFO_DOP_BIT; 182eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.pdop = locationExtended.pdop; 183eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.hdop = locationExtended.hdop; 184eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.vdop = locationExtended.vdop; 185eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 186eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_MAG_DEV & locationExtended.flags) { 187eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= GNSS_LOCATION_INFO_MAGNETIC_DEVIATION_BIT; 188eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.magneticDeviation = locationExtended.magneticDeviation; 189eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 190eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_HOR_RELIABILITY & locationExtended.flags) { 191eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= GNSS_LOCATION_INFO_HOR_RELIABILITY_BIT; 192eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (locationExtended.horizontal_reliability) { 193eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case LOC_RELIABILITY_VERY_LOW: 194eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.horReliability = LOCATION_RELIABILITY_VERY_LOW; 195eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 196eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case LOC_RELIABILITY_LOW: 197eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.horReliability = LOCATION_RELIABILITY_LOW; 198eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 199eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case LOC_RELIABILITY_MEDIUM: 200eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.horReliability = LOCATION_RELIABILITY_MEDIUM; 201eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 202eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case LOC_RELIABILITY_HIGH: 203eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.horReliability = LOCATION_RELIABILITY_HIGH; 204eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 205eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 206eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.horReliability = LOCATION_RELIABILITY_NOT_SET; 207eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 208eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 209eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 210eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_VERT_RELIABILITY & locationExtended.flags) { 211eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= GNSS_LOCATION_INFO_VER_RELIABILITY_BIT; 212eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (locationExtended.vertical_reliability) { 213eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case LOC_RELIABILITY_VERY_LOW: 214eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.verReliability = LOCATION_RELIABILITY_VERY_LOW; 215eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 216eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case LOC_RELIABILITY_LOW: 217eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.verReliability = LOCATION_RELIABILITY_LOW; 218eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 219eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case LOC_RELIABILITY_MEDIUM: 220eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.verReliability = LOCATION_RELIABILITY_MEDIUM; 221eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 222eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case LOC_RELIABILITY_HIGH: 223eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.verReliability = LOCATION_RELIABILITY_HIGH; 224eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 225eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 226eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.verReliability = LOCATION_RELIABILITY_NOT_SET; 227eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 228eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 229eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 230eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_MAJOR & locationExtended.flags) { 231eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_SEMI_MAJOR_BIT; 232eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.horUncEllipseSemiMajor = locationExtended.horUncEllipseSemiMajor; 233eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 234eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_MINOR & locationExtended.flags) { 235eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_SEMI_MINOR_BIT; 236eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.horUncEllipseSemiMinor = locationExtended.horUncEllipseSemiMinor; 237eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 238eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GPS_LOCATION_EXTENDED_HAS_HOR_ELIP_UNC_AZIMUTH & locationExtended.flags) { 239eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.flags |= GNSS_LOCATION_INFO_HOR_ACCURACY_ELIP_AZIMUTH_BIT; 240eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.horUncEllipseOrientAzimuth = locationExtended.horUncEllipseOrientAzimuth; 241eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 242eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 243eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 244eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhinline uint32_t 245eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertGpsLock(const GnssConfigGpsLock gpsLock) 246eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 247eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (gpsLock) { 248eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_GPS_LOCK_MO: 249eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 1; 250eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_GPS_LOCK_NI: 251eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 2; 252eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_GPS_LOCK_MO_AND_NI: 253eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 3; 254eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_GPS_LOCK_NONE: 255eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 256eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 0; 257eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 258eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 259eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 260eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhinline GnssConfigGpsLock 261eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertGpsLock(const uint32_t gpsLock) 262eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 263eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (gpsLock) { 264eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 1: 265eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_GPS_LOCK_MO; 266eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 2: 267eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_GPS_LOCK_NI; 268eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 3: 269eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_GPS_LOCK_MO_AND_NI; 270eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 0: 271eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 272eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_GPS_LOCK_NONE; 273eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 274eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 275eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 276eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhinline uint32_t 277eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertSuplVersion(const GnssConfigSuplVersion suplVersion) 278eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 279eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (suplVersion) { 280eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_SUPL_VERSION_2_0_0: 281eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 0x00020000; 282eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_SUPL_VERSION_2_0_2: 283eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 0x00020002; 284eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_SUPL_VERSION_1_0_0: 285eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 286eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 0x00010000; 287eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 288eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 289eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 290eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhinline GnssConfigSuplVersion 291eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertSuplVersion(const uint32_t suplVersion) 292eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 293eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (suplVersion) { 294eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 0x00020000: 295eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_SUPL_VERSION_2_0_0; 296eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 0x00020002: 297eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_SUPL_VERSION_2_0_2; 298eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 0x00010000: 299eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 300eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_SUPL_VERSION_1_0_0; 301eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 302eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 303eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 304eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhinline uint32_t 305eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertLppProfile(const GnssConfigLppProfile lppProfile) 306eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 307eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (lppProfile) { 308eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_LPP_PROFILE_USER_PLANE: 309eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 1; 310eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_LPP_PROFILE_CONTROL_PLANE: 311eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 2; 312eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_LPP_PROFILE_USER_PLANE_AND_CONTROL_PLANE: 313eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 3; 314eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_LPP_PROFILE_RRLP_ON_LTE: 315eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 316eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 0; 317eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 318eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 319eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 320eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhinline GnssConfigLppProfile 321eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertLppProfile(const uint32_t lppProfile) 322eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 323eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (lppProfile) { 324eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 1: 325eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_LPP_PROFILE_USER_PLANE; 326eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 2: 327eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_LPP_PROFILE_CONTROL_PLANE; 328eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 3: 329eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_LPP_PROFILE_USER_PLANE_AND_CONTROL_PLANE; 330eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case 0: 331eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 332eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return GNSS_CONFIG_LPP_PROFILE_RRLP_ON_LTE; 333eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 334eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 335eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 336eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 337eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertLppeCp(const GnssConfigLppeControlPlaneMask lppeControlPlaneMask) 338eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 339eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mask = 0; 340eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LPPE_CONTROL_PLANE_DBH_BIT & lppeControlPlaneMask) { 341eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<0); 342eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 343eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LPPE_CONTROL_PLANE_WLAN_AP_MEASUREMENTS_BIT & lppeControlPlaneMask) { 344eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<1); 345eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 346eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LPPE_CONTROL_PLANE_SRN_AP_MEASUREMENTS_BIT & lppeControlPlaneMask) { 347eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<2); 348eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 349eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LPPE_CONTROL_PLANE_SENSOR_BARO_MEASUREMENTS_BIT & lppeControlPlaneMask) { 350eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<3); 351eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 352eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mask; 353eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 354eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 355eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssConfigLppeControlPlaneMask 356eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertLppeCp(const uint32_t lppeControlPlaneMask) 357eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 358eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssConfigLppeControlPlaneMask mask = 0; 359eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((1<<0) & lppeControlPlaneMask) { 360eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= GNSS_CONFIG_LPPE_CONTROL_PLANE_DBH_BIT; 361eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 362eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((1<<1) & lppeControlPlaneMask) { 363eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= GNSS_CONFIG_LPPE_CONTROL_PLANE_WLAN_AP_MEASUREMENTS_BIT; 364eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 365eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((1<<2) & lppeControlPlaneMask) { 366eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= GNSS_CONFIG_LPPE_CONTROL_PLANE_SRN_AP_MEASUREMENTS_BIT; 367eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 368eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((1<<3) & lppeControlPlaneMask) { 369eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= GNSS_CONFIG_LPPE_CONTROL_PLANE_SENSOR_BARO_MEASUREMENTS_BIT; 370eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 371eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mask; 372eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 373eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 374eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 375eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 376eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertLppeUp(const GnssConfigLppeUserPlaneMask lppeUserPlaneMask) 377eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 378eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mask = 0; 379eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LPPE_USER_PLANE_DBH_BIT & lppeUserPlaneMask) { 380eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<0); 381eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 382eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LPPE_USER_PLANE_WLAN_AP_MEASUREMENTS_BIT & lppeUserPlaneMask) { 383eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<1); 384eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 385eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LPPE_USER_PLANE_SRN_AP_MEASUREMENTS_BIT & lppeUserPlaneMask) { 386eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<2); 387eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 388eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LPPE_USER_PLANE_SENSOR_BARO_MEASUREMENTS_BIT & lppeUserPlaneMask) { 389eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<3); 390eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 391eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mask; 392eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 393eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 394eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssConfigLppeUserPlaneMask 395eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertLppeUp(const uint32_t lppeUserPlaneMask) 396eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 397eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssConfigLppeUserPlaneMask mask = 0; 398eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((1<<0) & lppeUserPlaneMask) { 399eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= GNSS_CONFIG_LPPE_USER_PLANE_DBH_BIT; 400eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 401eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((1<<1) & lppeUserPlaneMask) { 402eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= GNSS_CONFIG_LPPE_USER_PLANE_WLAN_AP_MEASUREMENTS_BIT; 403eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 404eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((1<<2) & lppeUserPlaneMask) { 405eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= GNSS_CONFIG_LPPE_USER_PLANE_SRN_AP_MEASUREMENTS_BIT; 406eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 407eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((1<<3) & lppeUserPlaneMask) { 408eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= GNSS_CONFIG_LPPE_USER_PLANE_SENSOR_BARO_MEASUREMENTS_BIT; 409eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 410eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mask; 411eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 412eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 413eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 414eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertAGloProt(const GnssConfigAGlonassPositionProtocolMask aGloPositionProtocolMask) 415eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 416eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mask = 0; 417eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_RRC_CONTROL_PLANE_BIT & aGloPositionProtocolMask) { 418eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<0); 419eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 420eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_RRLP_USER_PLANE_BIT & aGloPositionProtocolMask) { 421eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<1); 422eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 423eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LLP_USER_PLANE_BIT & aGloPositionProtocolMask) { 424eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<2); 425eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 426eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_LLP_CONTROL_PLANE_BIT & aGloPositionProtocolMask) { 427eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<3); 428eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 429eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mask; 430eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 431eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 432eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 433eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertEP4ES(const GnssConfigEmergencyPdnForEmergencySupl emergencyPdnForEmergencySupl) 434eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 435eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (emergencyPdnForEmergencySupl) { 436eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_YES: 437eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 1; 438eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_EMERGENCY_PDN_FOR_EMERGENCY_SUPL_NO: 439eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 440eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 0; 441eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 442eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 443eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 444eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 445eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertSuplEs(const GnssConfigSuplEmergencyServices suplEmergencyServices) 446eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 447eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (suplEmergencyServices) { 448eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_YES: 449eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 1; 450eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_CONFIG_SUPL_EMERGENCY_SERVICES_NO: 451eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 452eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return 0; 453eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 454eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 455eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 456eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 457eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::convertSuplMode(const GnssConfigSuplModeMask suplModeMask) 458eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 459eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mask = 0; 460eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_SUPL_MODE_MSB_BIT & suplModeMask) { 461eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<0); 462eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 463eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_CONFIG_SUPL_MODE_MSA_BIT & suplModeMask) { 464eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= (1<<1); 465eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 466eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mask; 467eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 468eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 469eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool 470eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::resolveInAddress(const char* hostAddress, struct in_addr* inAddress) 471eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 472eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh bool ret = true; 473eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 474eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct hostent* hp; 475eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh hp = gethostbyname(hostAddress); 476eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (hp != NULL) { /* DNS OK */ 477eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh memcpy(inAddress, hp->h_addr_list[0], hp->h_length); 478eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 479eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Try IP representation */ 480eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (inet_aton(hostAddress, inAddress) == 0) { 481eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* IP not valid */ 482eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: DNS query on '%s' failed", __func__, hostAddress); 483eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ret = false; 484eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 485eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 486eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 487eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return ret; 488eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 489eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 490eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 491eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::readConfigCommand() 492eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 493eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 494eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 495eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgReadConfig : public LocMsg { 496eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter* mAdapter; 497eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& mContext; 498eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgReadConfig(GnssAdapter* adapter, 499eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& context) : 500eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 501eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 502eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext(context) {} 503eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 504eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // reads config into mContext->mGps_conf 505eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext.readConfig(); 506eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext.requestUlp((LocAdapterBase*)mAdapter, mContext.getCarrierCapabilities()); 507eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 508eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 509eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 510eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mContext != NULL) { 511eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgReadConfig(this, *mContext)); 512eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 513eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 514eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 515eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 516eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::setConfigCommand() 517eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 518eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 519eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 520eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgSetConfig : public LocMsg { 521eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 522eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 523eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgSetConfig(GnssAdapter& adapter, 524eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api) : 525eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 526eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 527eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api) {} 528eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 529eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { 530eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setSUPLVersion(mAdapter.convertSuplVersion(ContextBase::mGps_conf.SUPL_VER)); 531eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setLPPConfig(mAdapter.convertLppProfile(ContextBase::mGps_conf.LPP_PROFILE)); 532eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setAGLONASSProtocol(ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT); 533eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 534eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setSensorControlConfig(ContextBase::mSap_conf.SENSOR_USAGE, 535eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_PROVIDER); 536eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setLPPeProtocolCp( 537eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.convertLppeCp(ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY)); 538eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setLPPeProtocolUp( 539eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.convertLppeUp(ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY)); 540eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 541eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // set nmea mask type 542eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mask = 0; 543eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NMEA_PROVIDER_MP == ContextBase::mGps_conf.NMEA_PROVIDER) { 544eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_NMEA_ALL_GENERAL_SUPPORTED_MASK; 545eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 546eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mApi.isFeatureSupported(LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02)) { 547eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_NMEA_MASK_DEBUG_V02; 548eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 549eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mask != 0) { 550eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setNMEATypes(mask); 551eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 552eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.mNmeaMask= mask; 553eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 554eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setXtraVersionCheck(ContextBase::mGps_conf.XTRA_VERSION_CHECK); 555eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (ContextBase::mSap_conf.GYRO_BIAS_RANDOM_WALK_VALID || 556eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 557eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 558eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 559eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID ) { 560eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setSensorProperties( 561eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.GYRO_BIAS_RANDOM_WALK_VALID, 562eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.GYRO_BIAS_RANDOM_WALK, 563eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 564eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY, 565eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 566eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY, 567eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 568eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY, 569eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 570eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY); 571eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 572eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setSensorPerfControlConfig( 573eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_CONTROL_MODE, 574eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH, 575eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_ACCEL_BATCHES_PER_SEC, 576eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH, 577eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_GYRO_BATCHES_PER_SEC, 578eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH, 579eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH, 580eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH, 581eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH, 582eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mSap_conf.SENSOR_ALGORITHM_CONFIG_MASK); 583eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 584eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 585eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 586eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgSetConfig(*this, *mLocApi)); 587eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 588eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 589eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t* 590eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::gnssUpdateConfigCommand(GnssConfig config) 591eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 592eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // count the number of bits set 593eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssConfigFlagsMask flagsCopy = config.flags; 594eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh size_t count = 0; 595eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh while (flagsCopy > 0) { 596eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (flagsCopy & 1) { 597eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh count++; 598eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 599eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh flagsCopy >>= 1; 600eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 601eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh std::string idsString = "["; 602eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t* ids = NULL; 603eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (count > 0) { 604eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ids = new uint32_t[count]; 60587b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava if (ids == nullptr) { 60687b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava LOC_LOGE("%s] new allocation failed, fatal error.", __func__); 60787b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava return nullptr; 60887b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava } 609eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (size_t i=0; i < count; ++i) { 610eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ids[i] = generateSessionId(); 611eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh IF_LOC_LOGD { 612eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh idsString += std::to_string(ids[i]) + " "; 613eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 614eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 615eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 616eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh idsString += "]"; 617eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 618eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ids %s flags 0x%X", __func__, idsString.c_str(), config.flags); 619eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 620eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgGnssUpdateConfig : public LocMsg { 621eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 622eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 623eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssConfig mConfig; 624eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t* mIds; 625eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh size_t mCount; 626eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgGnssUpdateConfig(GnssAdapter& adapter, 627eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api, 628eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssConfig config, 629eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t* ids, 630eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh size_t count) : 631eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 632eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 633eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 634eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mConfig(config), 635eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mIds(ids), 636eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mCount(count) {} 637eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual ~MsgGnssUpdateConfig() 638eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh { 639eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh delete[] mIds; 640eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 641eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 642eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh //const size_t MAX_BITS_COUNT = 10; 643eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh //LocationError errs[MAX_BITS_COUNT] = {}; 644eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError* errs = new LocationError[mCount]; 645eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 646eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t index = 0; 647eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 64887b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava if (errs == nullptr) { 64987b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava LOC_LOGE("%s] new allocation failed, fatal error.", __func__); 65087b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava return; 65187b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava } 65287b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava 653eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_GPS_LOCK_VALID_BIT) { 654eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newGpsLock = mAdapter.convertGpsLock(mConfig.gpsLock); 655eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.GPS_LOCK = newGpsLock; 656eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (0 == mAdapter.getPowerVoteId()) { 657eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.setGpsLock(mConfig.gpsLock); 658eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 659eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 660eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 661eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 662eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 663eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_SUPL_VERSION_VALID_BIT) { 664eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newSuplVersion = mAdapter.convertSuplVersion(mConfig.suplVersion); 665eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (newSuplVersion != ContextBase::mGps_conf.SUPL_VER && 666eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { 667eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.SUPL_VER = newSuplVersion; 668eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.setSUPLVersion(mConfig.suplVersion); 669eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 670eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 671eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 672eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 673eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 674eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 675eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 676eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_SET_ASSISTANCE_DATA_VALID_BIT) { 677eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (GNSS_ASSISTANCE_TYPE_SUPL == mConfig.assistanceServer.type) { 678eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { 679eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh char serverUrl[MAX_URL_LEN] = {}; 680eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t length = 0; 681eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const char noHost[] = "NONE"; 682eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL == mConfig.assistanceServer.hostName || 683eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh strncasecmp(noHost, 684eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mConfig.assistanceServer.hostName, 685eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sizeof(noHost)) == 0) { 686eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 687eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh length = snprintf(serverUrl, sizeof(serverUrl), "%s:%u", 688eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mConfig.assistanceServer.hostName, 689eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mConfig.assistanceServer.port); 690eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 691eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 692eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (sizeof(serverUrl) > length) { 693eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.setServer(serverUrl, length); 694eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 695eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_INVALID_PARAMETER; 696eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 697eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 698eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 699eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 700eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else if (GNSS_ASSISTANCE_TYPE_C2K == mConfig.assistanceServer.type) { 701eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { 702eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct in_addr addr; 703eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!mAdapter.resolveInAddress(mConfig.assistanceServer.hostName, &addr)) { 704eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: hostName %s cannot be resolved", 705eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, mConfig.assistanceServer.hostName); 706eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_INVALID_PARAMETER; 707eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 708eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh unsigned int ip = htonl(addr.s_addr); 709eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.setServer(ip, mConfig.assistanceServer.port, 710eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_AGPS_CDMA_PDE_SERVER); 711eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 712eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 713eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 714eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 715eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 716eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: Not a valid gnss assistance type %u", 717eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, mConfig.assistanceServer.type); 718eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_INVALID_PARAMETER; 719eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 720eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 721eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 722eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 723eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 724eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_LPP_PROFILE_VALID_BIT) { 725eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newLppProfile = mAdapter.convertLppProfile(mConfig.lppProfile); 726eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (newLppProfile != ContextBase::mGps_conf.LPP_PROFILE && 727eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { 728eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.LPP_PROFILE = newLppProfile; 729eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.setLPPConfig(mConfig.lppProfile); 730eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 731eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 732eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 733eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 734eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 735eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 736eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 737eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_LPPE_CONTROL_PLANE_VALID_BIT) { 738eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newLppeControlPlaneMask = 739eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.convertLppeCp(mConfig.lppeControlPlaneMask); 740eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (newLppeControlPlaneMask != ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY) { 741eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.LPPE_CP_TECHNOLOGY = newLppeControlPlaneMask; 742eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.setLPPeProtocolCp(mConfig.lppeControlPlaneMask); 743eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 744eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 745eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 746eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 747eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 748eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 749eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 750eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_LPPE_USER_PLANE_VALID_BIT) { 751eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newLppeUserPlaneMask = 752eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.convertLppeUp(mConfig.lppeUserPlaneMask); 753eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (newLppeUserPlaneMask != ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY) { 754eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.LPPE_UP_TECHNOLOGY = newLppeUserPlaneMask; 755eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.setLPPeProtocolUp(mConfig.lppeUserPlaneMask); 756eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 757eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 758eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 759eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 760eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 761eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 762eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 763eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_AGLONASS_POSITION_PROTOCOL_VALID_BIT) { 764eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newAGloProtMask = 765eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.convertAGloProt(mConfig.aGlonassPositionProtocolMask); 766eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (newAGloProtMask != ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT && 767eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.AGPS_CONFIG_INJECT) { 768eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.A_GLONASS_POS_PROTOCOL_SELECT = newAGloProtMask; 769eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.setAGLONASSProtocol(mConfig.aGlonassPositionProtocolMask); 770eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 771eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 772eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 773eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 774eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 775eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 776eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 777eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_EM_PDN_FOR_EM_SUPL_VALID_BIT) { 778eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newEP4ES = mAdapter.convertEP4ES(mConfig.emergencyPdnForEmergencySupl); 779eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (newEP4ES != ContextBase::mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { 780eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL = newEP4ES; 781eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 782eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 783eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 784eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 785eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 786eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 787eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_SUPL_EM_SERVICES_BIT) { 788eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newSuplEs = mAdapter.convertSuplEs(mConfig.suplEmergencyServices); 789eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (newSuplEs != ContextBase::mGps_conf.SUPL_ES) { 790eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.SUPL_ES = newSuplEs; 791eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 792eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 793eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 794eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 795eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 796eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 797eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mConfig.flags & GNSS_CONFIG_FLAGS_SUPL_MODE_BIT) { 798eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t newSuplMode = mAdapter.convertSuplMode(mConfig.suplModeMask); 799eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (newSuplMode != ContextBase::mGps_conf.SUPL_MODE) { 800eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.SUPL_MODE = newSuplMode; 801eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.getUlpProxy()->setCapabilities( 802eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::getCarrierCapabilities()); 803eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.broadcastCapabilities(mAdapter.getCapabilities()); 804eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 805eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 806eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (index < mCount) { 807eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errs[index++] = err; 808eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 809eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 810eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 811eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportResponse(index, errs, mIds); 812eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh delete[] errs; 813eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 814eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 815eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 816eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL != ids) { 817eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgGnssUpdateConfig(*this, *mLocApi, config, ids, count)); 818eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 819eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: No GNSS config items to update", __func__); 820eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 821eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 822eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return ids; 823eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 824eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 825eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 826eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::gnssDeleteAidingDataCommand(GnssAidingData& data) 827eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 828eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId = generateSessionId(); 829eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: id %u", __func__, sessionId); 830eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 831eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgDeleteAidingData : public LocMsg { 832eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 833eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 834eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mSessionId; 835eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAidingData mData; 836eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgDeleteAidingData(GnssAdapter& adapter, 837eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api, 838eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId, 839eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAidingData& data) : 840eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 841eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 842eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 843eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mSessionId(sessionId), 844eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mData(data) {} 845eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 846eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 847eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mApi.deleteAidingData(mData); 848eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportResponse(err, mSessionId); 849eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SystemStatus* s = mAdapter.getSystemStatus(); 850eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((nullptr != s) && (mData.deleteAll)) { 851eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s->setDefaultReport(); 852eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 853eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 854eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 855eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 856eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgDeleteAidingData(*this, *mLocApi, sessionId, data)); 857eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return sessionId; 858eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 859eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 860eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 861eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::injectLocationCommand(double latitude, double longitude, float accuracy) 862eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 863eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: latitude %8.4f longitude %8.4f accuracy %8.4f", 864eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, latitude, longitude, accuracy); 865eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 866eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgInjectLocation : public LocMsg { 867eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 868eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& mContext; 869eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh double mLatitude; 870eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh double mLongitude; 871eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh float mAccuracy; 872eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgInjectLocation(LocApiBase& api, 873eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& context, 874eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh double latitude, 875eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh double longitude, 876eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh float accuracy) : 877eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 878eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 879eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext(context), 880eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLatitude(latitude), 881eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLongitude(longitude), 882eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAccuracy(accuracy) {} 883eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 884eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!mContext.hasCPIExtendedCapabilities()) { 885eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.injectPosition(mLatitude, mLongitude, mAccuracy); 886eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 887eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 888eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 889eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 890eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgInjectLocation(*mLocApi, *mContext, latitude, longitude, accuracy)); 891eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 892eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 893eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 894eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::injectTimeCommand(int64_t time, int64_t timeReference, int32_t uncertainty) 895eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 896eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: time %lld timeReference %lld uncertainty %d", 897eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, (long long)time, (long long)timeReference, uncertainty); 898eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 899eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgInjectTime : public LocMsg { 900eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 901eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& mContext; 902eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int64_t mTime; 903eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int64_t mTimeReference; 904eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int32_t mUncertainty; 905eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgInjectTime(LocApiBase& api, 906eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& context, 907eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int64_t time, 908eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int64_t timeReference, 909eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int32_t uncertainty) : 910eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 911eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 912eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext(context), 913eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mTime(time), 914eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mTimeReference(timeReference), 915eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUncertainty(uncertainty) {} 916eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 917eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setTime(mTime, mTimeReference, mUncertainty); 918eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 919eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 920eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 921eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgInjectTime(*mLocApi, *mContext, time, timeReference, uncertainty)); 922eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 923eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 924eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 925eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::setUlpProxyCommand(UlpProxyBase* ulp) 926eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 927eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 928eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 929eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgSetUlpProxy : public LocMsg { 930eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 931eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh UlpProxyBase* mUlp; 932eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgSetUlpProxy(GnssAdapter& adapter, 933eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh UlpProxyBase* ulp) : 934eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 935eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 936eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlp(ulp) {} 937eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 938eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.setUlpProxy(mUlp); 939eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mUlp) { 940eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlp->setCapabilities(ContextBase::getCarrierCapabilities()); 941eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 942eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 943eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 944eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 945eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgSetUlpProxy(*this, ulp)); 946eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 947eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 948eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 949eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::setUlpProxy(UlpProxyBase* ulp) 950eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 951eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (ulp == mUlpProxy) { 952eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh //This takes care of the case when double initalization happens 953eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh //and we get the same object back for UlpProxyBase . Do nothing 954eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 955eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 956eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 957eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("%s]: %p", __func__, ulp); 958eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL == ulp) { 959eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: ulp pointer is NULL", __func__); 960eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ulp = new UlpProxyBase(); 961eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 962eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 963eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_POSITION_MODE_INVALID != mUlpProxy->mPosMode.mode) { 964eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // need to send this mode and start msg to ULP 965eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ulp->sendFixMode(mUlpProxy->mPosMode); 966eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 967eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 968eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mUlpProxy->mFixSet) { 969eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ulp->sendStartFix(); 970eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 971eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 972eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh delete mUlpProxy; 973eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlpProxy = ulp; 974eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 975eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 976eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 977eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::addClientCommand(LocationAPI* client, const LocationCallbacks& callbacks) 978eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 979eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: client %p", __func__, client); 980eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 981eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgAddClient : public LocMsg { 982eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 983eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* mClient; 984eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const LocationCallbacks mCallbacks; 985eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgAddClient(GnssAdapter& adapter, 986eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* client, 987eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const LocationCallbacks& callbacks) : 988eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 989eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 990eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClient(client), 991eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mCallbacks(callbacks) {} 992eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 993eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.saveClient(mClient, mCallbacks); 994eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 995eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 996eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 997eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgAddClient(*this, client, callbacks)); 998eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 999eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1000eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1001eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::removeClientCommand(LocationAPI* client) 1002eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1003eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: client %p", __func__, client); 1004eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1005eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgRemoveClient : public LocMsg { 1006eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1007eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* mClient; 1008eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgRemoveClient(GnssAdapter& adapter, 1009eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* client) : 1010eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1011eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1012eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClient(client) {} 1013eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1014eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.stopClientSessions(mClient); 1015eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.eraseClient(mClient); 1016eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1017eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1018eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1019eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgRemoveClient(*this, client)); 1020eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1021eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1022eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1023eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::stopClientSessions(LocationAPI* client) 1024eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1025eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: client %p", __func__, client); 1026eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it = mTrackingSessions.begin(); it != mTrackingSessions.end();) { 1027eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (client == it->first.client) { 1028eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = stopTrackingMultiplex(it->first.client, it->first.id); 1029eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOCATION_ERROR_SUCCESS == err) { 1030eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it = mTrackingSessions.erase(it); 1031eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh continue; 1032eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1033eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1034eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ++it; // increment only when not erasing an iterator 1035eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1036eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1037eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1038eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1039eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1040eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::updateClientsEventMask() 1041eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1042eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_API_ADAPTER_EVENT_MASK_T mask = 0; 1043eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { 1044eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it->second.trackingCb != nullptr) { 1045eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_API_ADAPTER_BIT_PARSED_POSITION_REPORT; 1046eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1047eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it->second.gnssNiCb != nullptr) { 1048eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_API_ADAPTER_BIT_NI_NOTIFY_VERIFY_REQUEST; 1049eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1050eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it->second.gnssSvCb != nullptr) { 1051eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_API_ADAPTER_BIT_SATELLITE_REPORT; 1052eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1053eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((it->second.gnssNmeaCb != nullptr) && (mNmeaMask)) { 1054eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT; 1055eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1056eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it->second.gnssMeasurementsCb != nullptr) { 1057eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; 1058eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1059eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1060eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1061eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* 1062eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ** For Automotive use cases we need to enable MEASUREMENT and POLY 1063eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ** when QDR is enabled 1064eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh */ 1065eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if(1 == ContextBase::mGps_conf.EXTERNAL_DR_ENABLED) { 1066eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; 1067eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOC_API_ADAPTER_BIT_GNSS_SV_POLYNOMIAL_REPORT; 1068eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1069eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: Auto usecase, Enable MEAS/POLY - mask 0x%x", __func__, mask); 1070eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1071eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1072eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh updateEvtMask(mask, LOC_REGISTRATION_MASK_SET); 1073eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1074eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1075eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1076eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::handleEngineUpEvent() 1077eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1078eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgRestartSessions : public LocMsg { 1079eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1080eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgRestartSessions(GnssAdapter& adapter) : 1081eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1082eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter) {} 1083eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh virtual void proc() const { 1084eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.restartSessions(); 1085eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1086eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1087eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1088eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh setConfigCommand(); 1089eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgRestartSessions(*this)); 1090eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1091eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1092eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1093eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::restartSessions() 1094eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1095eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 1096eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1097eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mTrackingSessions.empty()) { 1098eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 1099eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // get the LocationOptions that has the smallest interval, which should be the active one 1102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions smallestIntervalOptions = {}; // size is zero until set for the first time 1103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it = mTrackingSessions.begin(); it != mTrackingSessions.end(); ++it) { 1104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (0 == smallestIntervalOptions.size || //size of zero means we havent set it yet 1105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.minInterval < smallestIntervalOptions.minInterval) { 1106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh smallestIntervalOptions = it->second; 1107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosMode locPosMode = {}; 1111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertOptions(locPosMode, smallestIntervalOptions); 1112eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocApi->startFix(locPosMode); 1113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::requestCapabilitiesCommand(LocationAPI* client) 1117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 1119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgRequestCapabilities : public LocMsg { 1121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1122eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* mClient; 1123eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgRequestCapabilities(GnssAdapter& adapter, 1124eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* client) : 1125eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClient(client) {} 1128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationCallbacks callbacks = mAdapter.getClientCallbacks(mClient); 1130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (callbacks.capabilitiesCb == nullptr) { 1131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: capabilitiesCb is NULL", __func__); 1132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 1133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationCapabilitiesMask mask = mAdapter.getCapabilities(); 1136eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh callbacks.capabilitiesCb(mask); 1137eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1138eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1139eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1140eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgRequestCapabilities(*this, client)); 1141eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1142eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1143eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhLocationCapabilitiesMask 1144eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::getCapabilities() 1145eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1146eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationCapabilitiesMask mask = 0; 1147eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t carrierCapabilities = ContextBase::getCarrierCapabilities(); 1148eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // time based tracking always supported 1149eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_TIME_BASED_TRACKING_BIT; 1150eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // geofence always supported 1151eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_GEOFENCE_BIT; 1152eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (carrierCapabilities & LOC_GPS_CAPABILITY_MSB) { 1153eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_GNSS_MSB_BIT; 1154eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1155eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_GPS_CAPABILITY_MSA & carrierCapabilities) { 1156eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_GNSS_MSA_BIT; 1157eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1158eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mLocApi == nullptr) 1159eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mask; 1160eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mLocApi->isMessageSupported(LOC_API_ADAPTER_MESSAGE_DISTANCE_BASE_LOCATION_BATCHING)) { 1161eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_TIME_BASED_BATCHING_BIT | 1162eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOCATION_CAPABILITIES_DISTANCE_BASED_BATCHING_BIT; 1163eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1164eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mLocApi->isMessageSupported(LOC_API_ADAPTER_MESSAGE_DISTANCE_BASE_TRACKING)) { 1165eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_DISTANCE_BASED_TRACKING_BIT; 1166eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1167eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mLocApi->isMessageSupported(LOC_API_ADAPTER_MESSAGE_OUTDOOR_TRIP_BATCHING)) { 1168eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_OUTDOOR_TRIP_BATCHING_BIT; 1169eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1170eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mLocApi->gnssConstellationConfig()) { 1171eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_GNSS_MEASUREMENTS_BIT; 1172eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1173eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mLocApi->isFeatureSupported(LOC_SUPPORTED_FEATURE_DEBUG_NMEA_V02)) { 1174eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mask |= LOCATION_CAPABILITIES_DEBUG_NMEA_BIT; 1175eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1176eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mask; 1177eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1178eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1179eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1180eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::broadcastCapabilities(LocationCapabilitiesMask mask) 1181eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1182eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it = mClientData.begin(); it != mClientData.end(); ++it) { 1183eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != it->second.capabilitiesCb) { 1184eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.capabilitiesCb(mask); 1185eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1186eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1187eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1188eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1189eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhLocationCallbacks 1190eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::getClientCallbacks(LocationAPI* client) 1191eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1192eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationCallbacks callbacks = {}; 1193eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mClientData.find(client); 1194eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it != mClientData.end()) { 1195eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh callbacks = it->second; 1196eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1197eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return callbacks; 1198eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1199eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1200eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1201eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::saveClient(LocationAPI* client, const LocationCallbacks& callbacks) 1202eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1203eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientData[client] = callbacks; 1204eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh updateClientsEventMask(); 1205eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1206eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1207eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1208eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::eraseClient(LocationAPI* client) 1209eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1210eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mClientData.find(client); 1211eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it != mClientData.end()) { 1212eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClientData.erase(it); 1213eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1214eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh updateClientsEventMask(); 1215eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1216eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1217eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool 1218eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::hasTrackingCallback(LocationAPI* client) 1219eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1220eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mClientData.find(client); 1221eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return (it != mClientData.end() && it->second.trackingCb); 1222eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1223eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1224eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool 1225eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::hasMeasurementsCallback(LocationAPI* client) 1226eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1227eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mClientData.find(client); 1228eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return (it != mClientData.end() && it->second.gnssMeasurementsCb); 1229eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1230eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1231eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool 1232eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::isTrackingSession(LocationAPI* client, uint32_t sessionId) 1233eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1234eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationSessionKey key(client, sessionId); 1235eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return (mTrackingSessions.find(key) != mTrackingSessions.end()); 1236eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1237eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1238eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1239eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::saveTrackingSession(LocationAPI* client, uint32_t sessionId, 1240eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const LocationOptions& options) 1241eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1242eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationSessionKey key(client, sessionId); 1243eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mTrackingSessions[key] = options; 1244eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1245eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1246eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1247eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::eraseTrackingSession(LocationAPI* client, uint32_t sessionId) 1248eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1249eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationSessionKey key(client, sessionId); 1250eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mTrackingSessions.find(key); 1251eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it != mTrackingSessions.end()) { 1252eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mTrackingSessions.erase(it); 1253eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1254eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1255eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1256eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1257eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1258eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportResponse(LocationAPI* client, LocationError err, uint32_t sessionId) 1259eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1260eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: client %p id %u err %u", __func__, client, sessionId, err); 1261eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1262eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mClientData.find(client); 1263eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it != mClientData.end() && 1264eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.responseCb != nullptr) { 1265eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.responseCb(err, sessionId); 1266eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1267eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGW("%s]: client %p id %u not found in data", __func__, client, sessionId); 1268eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1269eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1270eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1271eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1272eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportResponse(LocationError err, uint32_t sessionId) 1273eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1274eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: id %u err %u", __func__, sessionId, err); 1275eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1276eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mControlCallbacks.size > 0 && mControlCallbacks.responseCb != nullptr) { 1277eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mControlCallbacks.responseCb(err, sessionId); 1278eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1279eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGW("%s]: control client response callback not found", __func__); 1280eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1281eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1282eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1283eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1284eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportResponse(size_t count, LocationError* errs, uint32_t* ids) 1285eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1286eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh IF_LOC_LOGD { 1287eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh std::string idsString = "["; 1288eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh std::string errsString = "["; 1289eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL != ids && NULL != errs) { 1290eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (size_t i=0; i < count; ++i) { 1291eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh idsString += std::to_string(ids[i]) + " "; 1292eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errsString += std::to_string(errs[i]) + " "; 1293eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1294eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1295eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh idsString += "]"; 1296eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh errsString += "]"; 1297eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1298eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ids %s errs %s", 1299eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, idsString.c_str(), errsString.c_str()); 1300eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1301eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1302eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mControlCallbacks.size > 0 && mControlCallbacks.collectiveResponseCb != nullptr) { 1303eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mControlCallbacks.collectiveResponseCb(count, errs, ids); 1304eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1305eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGW("%s]: control client callback not found", __func__); 1306eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1307eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1308eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1309eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 1310eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::startTrackingCommand(LocationAPI* client, LocationOptions& options) 1311eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1312eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId = generateSessionId(); 1313eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: client %p id %u minInterval %u mode %u", 1314eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, client, sessionId, options.minInterval, options.mode); 1315eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1316eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgStartTracking : public LocMsg { 1317eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1318eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1319eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* mClient; 1320eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mSessionId; 1321eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions mOptions; 1322eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgStartTracking(GnssAdapter& adapter, 1323eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api, 1324eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* client, 1325eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId, 1326eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions options) : 1327eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1328eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1329eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 1330eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClient(client), 1331eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mSessionId(sessionId), 1332eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mOptions(options) {} 1333eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1334eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1335eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!mAdapter.hasTrackingCallback(mClient) && 1336eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh !mAdapter.hasMeasurementsCallback(mClient)) { 1337eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_CALLBACK_MISSING; 1338eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else if (0 == mOptions.size) { 1339eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_INVALID_PARAMETER; 1340eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1341eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // Api doesn't support multiple clients for time based tracking, so mutiplex 1342eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mAdapter.startTrackingMultiplex(mOptions); 1343eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOCATION_ERROR_SUCCESS == err) { 1344eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.saveTrackingSession(mClient, mSessionId, mOptions); 1345eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1346eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1347eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportResponse(mClient, err, mSessionId); 1348eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1349eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1350eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1351eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgStartTracking(*this, *mLocApi, client, sessionId, options)); 1352eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return sessionId; 1353eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1354eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1355eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1356eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhLocationError 1357eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::startTrackingMultiplex(const LocationOptions& options) 1358eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1359eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1360eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1361eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mTrackingSessions.empty()) { 1362eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = startTracking(options); 1363eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1364eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // get the LocationOptions that has the smallest interval, which should be the active one 1365eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions smallestIntervalOptions = {}; // size is zero until set for the first time 1366eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it = mTrackingSessions.begin(); it != mTrackingSessions.end(); ++it) { 1367eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (0 == smallestIntervalOptions.size || //size of zero means we havent set it yet 1368eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.minInterval < smallestIntervalOptions.minInterval) { 1369eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh smallestIntervalOptions = it->second; 1370eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1371eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1372eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // if new session's minInterval is smaller than any in other sessions 1373eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (options.minInterval < smallestIntervalOptions.minInterval) { 1374eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // restart time based tracking with new options 1375eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = startTracking(options); 1376eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1377eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1378eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1379eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return err; 1380eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1381eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1382eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhLocationError 1383eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::startTracking(const LocationOptions& options) 1384eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1385eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1386eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosMode locPosMode = {}; 1387eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertOptions(locPosMode, options); 1388eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!mUlpProxy->sendFixMode(locPosMode)) { 1389eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // do nothing 1390eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1391eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!mUlpProxy->sendStartFix()) { 1392eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh loc_api_adapter_err apiErr = mLocApi->startFix(locPosMode); 1393eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_API_ADAPTER_ERR_SUCCESS == apiErr) { 1394eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 1395eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1396eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_GENERAL_FAILURE; 1397eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1398eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1399eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1400eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return err; 1401eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1402eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1403eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1404eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::setPositionModeCommand(LocPosMode& locPosMode) 1405eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1406eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: min_interval %u mode %u", 1407eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, locPosMode.min_interval, locPosMode.mode); 1408eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1409eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgSetPositionMode : public LocMsg { 1410eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1411eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1412eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosMode mLocPosMode; 1413eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgSetPositionMode(GnssAdapter& adapter, 1414eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api, 1415eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosMode& locPosMode) : 1416eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1417eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1418eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 1419eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocPosMode(locPosMode) {} 1420eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1421eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // saves the mode in adapter to be used when startTrackingCommand is called from ULP 1422eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.setUlpPositionMode(mLocPosMode); 1423eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setPositionMode(mLocPosMode); 1424eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1425eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1426eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1427eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgSetPositionMode(*this, *mLocApi, locPosMode)); 1428eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1429eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1430eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1431eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::startTrackingCommand() 1432eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1433eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 1434eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1435eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgStartTracking : public LocMsg { 1436eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1437eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1438eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgStartTracking(GnssAdapter& adapter, 1439eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api) : 1440eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1441eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1442eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api) {} 1443eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1444eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // we get this call from ULP, so just call LocApi without multiplexing because 1445eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // ulp would be doing the multiplexing for us if it is present 1446eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosMode& ulpPositionMode = mAdapter.getUlpPositionMode(); 1447eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.startFix(ulpPositionMode); 1448eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1449eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1450eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1451eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgStartTracking(*this, *mLocApi)); 1452eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1453eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1454eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1455eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::updateTrackingOptionsCommand(LocationAPI* client, uint32_t id, 1456eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions& options) 1457eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1458eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: client %p id %u minInterval %u mode %u", 1459eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, client, id, options.minInterval, options.mode); 1460eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1461eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgUpdateTracking : public LocMsg { 1462eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1463eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1464eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* mClient; 1465eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mSessionId; 1466eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions mOptions; 1467eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgUpdateTracking(GnssAdapter& adapter, 1468eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api, 1469eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* client, 1470eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId, 1471eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions options) : 1472eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1473eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1474eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 1475eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClient(client), 1476eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mSessionId(sessionId), 1477eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mOptions(options) {} 1478eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1479eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mAdapter.isTrackingSession(mClient, mSessionId)) { 1480eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1481eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (0 == mOptions.size) { 1482eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_INVALID_PARAMETER; 1483eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1484eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // Api doesn't support multiple clients for time based tracking, so mutiplex 1485eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mAdapter.updateTrackingMultiplex(mClient, mSessionId, mOptions); 1486eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOCATION_ERROR_SUCCESS == err) { 1487eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.saveTrackingSession(mClient, mSessionId, mOptions); 1488eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1489eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1490eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportResponse(mClient, err, mSessionId); 1491eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1492eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // we do not reportResponse for the case where there is no existing tracking session 1493eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // for the client and id being used, since updateTrackingCommand can be sent to both 1494eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // GnssAdapter & FlpAdapter by LocationAPI and we want to avoid incorrect error response 1495eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1496eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1497eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1498eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgUpdateTracking(*this, *mLocApi, client, id, options)); 1499eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1500eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1501eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhLocationError 1502eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::updateTrackingMultiplex(LocationAPI* client, uint32_t id, 1503eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const LocationOptions& options) 1504eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1505eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1506eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1507eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (1 == mTrackingSessions.size()) { 1508eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = startTracking(options); 1509eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1510eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationSessionKey key(client, id); 1511eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1512eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // get the session we are updating 1513eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mTrackingSessions.find(key); 1514eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it != mTrackingSessions.end()) { 1515eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // find the smallest interval, other than the session we are updating 1516eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions smallestIntervalOptions = {}; // size is 0 until set for the first time 1517eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it2 = mTrackingSessions.begin(); it2 != mTrackingSessions.end(); ++it2) { 1518eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // if session is not the one we are updating and either smallest interval is not set 1519eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // or there is a new smallest interval, then set the new smallest interval 1520eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it2->first != key && (0 == smallestIntervalOptions.size || 1521eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it2->second.minInterval < smallestIntervalOptions.minInterval)) { 1522eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh smallestIntervalOptions = it2->second; 1523eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1524eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1525eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // if session we are updating has smaller interval then next smallest 1526eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (options.minInterval < smallestIntervalOptions.minInterval) { 1527eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // restart time based tracking with the newly updated interval 1528eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = startTracking(options); 1529eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // else if the session we are updating used to be the smallest 1530eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else if (it->second.minInterval < smallestIntervalOptions.minInterval) { 1531eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // restart time based tracking with the next smallest 1532eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = startTracking(smallestIntervalOptions); 1533eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1534eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1535eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1536eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1537eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return err; 1538eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1539eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1540eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1541eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::stopTrackingCommand(LocationAPI* client, uint32_t id) 1542eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1543eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: client %p id %u", __func__, client, id); 1544eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1545eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgStopTracking : public LocMsg { 1546eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1547eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1548eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* mClient; 1549eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mSessionId; 1550eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgStopTracking(GnssAdapter& adapter, 1551eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api, 1552eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* client, 1553eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId) : 1554eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1555eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1556eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 1557eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClient(client), 1558eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mSessionId(sessionId) {} 1559eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1560eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mAdapter.isTrackingSession(mClient, mSessionId)) { 1561eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1562eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // Api doesn't support multiple clients for time based tracking, so mutiplex 1563eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = mAdapter.stopTrackingMultiplex(mClient, mSessionId); 1564eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOCATION_ERROR_SUCCESS == err) { 1565eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.eraseTrackingSession(mClient, mSessionId); 1566eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1567eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportResponse(mClient, err, mSessionId); 1568eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1569eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // we do not reportResponse for the case where there is no existing tracking session 1570eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // for the client and id being used, since stopTrackingCommand can be sent to both 1571eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // GnssAdapter & FlpAdapter by LocationAPI and we want to avoid incorrect error response 1572eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1573eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1574eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1575eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1576eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgStopTracking(*this, *mLocApi, client, id)); 1577eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1578eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1579eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhLocationError 1580eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::stopTrackingMultiplex(LocationAPI* client, uint32_t id) 1581eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1582eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1583eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1584eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (1 == mTrackingSessions.size()) { 1585eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = stopTracking(); 1586eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1587eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationSessionKey key(client, id); 1588eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1589eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // get the session we are stopping 1590eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mTrackingSessions.find(key); 1591eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it != mTrackingSessions.end()) { 1592eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // find the next smallest interval, other than the session we are stopping 1593eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationOptions smallestIntervalOptions = {}; // size is 0 until set for the first time 1594eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it2 = mTrackingSessions.begin(); it2 != mTrackingSessions.end(); ++it2) { 1595eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // if session is not the one we are stopping and either smallest interval is not set 1596eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // or there is a new smallest interval, then set the new smallest interval 1597eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it2->first != key && (0 == smallestIntervalOptions.size || 1598eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it2->second.minInterval < smallestIntervalOptions.minInterval)) { 1599eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh smallestIntervalOptions = it2->second; 1600eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1601eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1602eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // if session we are stopping has smaller interval then next smallest 1603eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (it->second.minInterval < smallestIntervalOptions.minInterval) { 1604eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // restart time based tracking with next smallest interval 1605eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = startTracking(smallestIntervalOptions); 1606eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1607eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1608eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1609eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1610eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return err; 1611eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1612eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1613eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhLocationError 1614eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::stopTracking() 1615eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1616eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1617eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!mUlpProxy->sendStopFix()) { 1618eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh loc_api_adapter_err apiErr = mLocApi->stopFix(); 1619eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (LOC_API_ADAPTER_ERR_SUCCESS == apiErr) { 1620eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_SUCCESS; 1621eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1622eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_GENERAL_FAILURE; 1623eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1624eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1625eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1626eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return err; 1627eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1628eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1629eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1630eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::stopTrackingCommand() 1631eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1632eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 1633eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1634eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgStopTracking : public LocMsg { 1635eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1636eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1637eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgStopTracking(GnssAdapter& adapter, 1638eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api) : 1639eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1640eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1641eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api) {} 1642eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1643eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // clear the position mode 1644eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosMode mLocPosMode = {}; 1645eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocPosMode.mode = LOC_POSITION_MODE_INVALID; 1646eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.setUlpPositionMode(mLocPosMode); 1647eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // don't need to multiplex because ULP will do that for us if it is present 1648eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.stopFix(); 1649eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1650eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1651eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1652eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgStopTracking(*this, *mLocApi)); 1653eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1654eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1655eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1656eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::getZppCommand() 1657eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1658eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 1659eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1660eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgGetZpp : public LocMsg { 1661eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1662eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1663eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgGetZpp(GnssAdapter& adapter, 1664eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api) : 1665eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1666eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1667eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api) {} 1668eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1669eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh UlpLocation location = {}; 1670eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosTechMask techMask = LOC_POS_TECH_MASK_DEFAULT; 1671eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GpsLocationExtended locationExtended = {}; 1672eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh locationExtended.size = sizeof(locationExtended); 1673eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1674eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.getBestAvailableZppFix(location.gpsLocation, locationExtended, 1675eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh techMask); 1676eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh //Mark the location source as from ZPP 1677eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO; 1678eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh location.position_source = ULP_LOCATION_IS_FROM_ZPP; 1679eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1680eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.getUlpProxy()->reportPosition(location, 1681eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh locationExtended, 1682eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_SESS_SUCCESS, 1683eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh techMask); 1684eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1685eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1686eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1687eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgGetZpp(*this, *mLocApi)); 1688eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1689eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1690eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool 1691eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::hasNiNotifyCallback(LocationAPI* client) 1692eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1693eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh auto it = mClientData.find(client); 1694eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return (it != mClientData.end() && it->second.gnssNiCb); 1695eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1696eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1697eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1698eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::gnssNiResponseCommand(LocationAPI* client, 1699eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t id, 1700eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssNiResponse response) 1701eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1702eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: client %p id %u response %u", __func__, client, id, response); 1703eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1704eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgGnssNiResponse : public LocMsg { 1705eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1706eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* mClient; 1707eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mSessionId; 1708eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssNiResponse mResponse; 1709eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgGnssNiResponse(GnssAdapter& adapter, 1710eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationAPI* client, 1711eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId, 1712eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssNiResponse response) : 1713eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1714eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1715eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mClient(client), 1716eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mSessionId(sessionId), 1717eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mResponse(response) {} 1718eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1719eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NiData& niData = mAdapter.getNiData(); 1720eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1721eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!mAdapter.hasNiNotifyCallback(mClient)) { 1722eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_ID_UNKNOWN; 1723eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1724eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NiSession* pSession = NULL; 1725eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mSessionId == niData.sessionEs.reqID && 1726eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NULL != niData.sessionEs.rawRequest) { 1727eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession = &niData.sessionEs; 1728eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // ignore any SUPL NI non-Es session if a SUPL NI ES is accepted 1729eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mResponse == GNSS_NI_RESPONSE_ACCEPT && 1730eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NULL != niData.session.rawRequest) { 1731eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pthread_mutex_lock(&niData.session.tLock); 1732eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh niData.session.resp = GNSS_NI_RESPONSE_IGNORE; 1733eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh niData.session.respRecvd = true; 1734eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pthread_cond_signal(&niData.session.tCond); 1735eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pthread_mutex_unlock(&niData.session.tLock); 1736eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1737eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else if (mSessionId == niData.session.reqID && 1738eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NULL != niData.session.rawRequest) { 1739eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession = &niData.session; 1740eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1741eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1742eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (pSession) { 1743eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("%s]: gnssNiResponseCommand: send user mResponse %u for id %u", 1744eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, mResponse, mSessionId); 1745eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pthread_mutex_lock(&pSession->tLock); 1746eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->resp = mResponse; 1747eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->respRecvd = true; 1748eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pthread_cond_signal(&pSession->tCond); 1749eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pthread_mutex_unlock(&pSession->tLock); 1750eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1751eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_ID_UNKNOWN; 1752eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: gnssNiResponseCommand: id %u not an active session", 1753eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, mSessionId); 1754eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1755eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1756eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportResponse(mClient, err, mSessionId); 1757eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1758eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1759eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1760eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgGnssNiResponse(*this, client, id, response)); 1761eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1762eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1763eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1764eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1765eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::gnssNiResponseCommand(GnssNiResponse response, void* rawRequest) 1766eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1767eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: response %u", __func__, response); 1768eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1769eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgGnssNiResponse : public LocMsg { 1770eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1771eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GnssNiResponse mResponse; 1772eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const void* mPayload; 1773eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgGnssNiResponse(LocApiBase& api, 1774eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GnssNiResponse response, 1775eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const void* rawRequest) : 1776eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1777eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 1778eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mResponse(response), 1779eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mPayload(rawRequest) {} 1780eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual ~MsgGnssNiResponse() { 1781eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // this is a bit weird since mPayload is not 1782eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // allocated by this class. But there is no better way. 1783eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // mPayload actually won't be NULL here. 1784eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh free((void*)mPayload); 1785eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1786eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1787eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.informNiResponse(mResponse, mPayload); 1788eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1789eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1790eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1791eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgGnssNiResponse(*mLocApi, response, rawRequest)); 1792eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1793eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1794eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1795eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhuint32_t 1796eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::enableCommand(LocationTechnologyType techType) 1797eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1798eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId = generateSessionId(); 1799eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: id %u techType %u", __func__, sessionId, techType); 1800eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1801eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgEnableGnss : public LocMsg { 1802eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1803eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1804eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& mContext; 1805eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mSessionId; 1806eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationTechnologyType mTechType; 1807eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgEnableGnss(GnssAdapter& adapter, 1808eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api, 1809eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& context, 1810eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId, 1811eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationTechnologyType techType) : 1812eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1813eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1814eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 1815eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext(context), 1816eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mSessionId(sessionId), 1817eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mTechType(techType) {} 1818eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1819eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1820eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t powerVoteId = mAdapter.getPowerVoteId(); 1821eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mTechType != LOCATION_TECHNOLOGY_TYPE_GNSS) { 1822eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_INVALID_PARAMETER; 1823eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else if (powerVoteId > 0) { 1824eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_ALREADY_STARTED; 1825eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1826eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext.modemPowerVote(true); 1827eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.setPowerVoteId(mSessionId); 1828eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setGpsLock(GNSS_CONFIG_GPS_LOCK_NONE); 1829eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.mXtraObserver.updateLockStatus( 1830eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.convertGpsLock(GNSS_CONFIG_GPS_LOCK_NONE)); 1831eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1832eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportResponse(err, mSessionId); 1833eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1834eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1835eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1836eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mContext != NULL) { 1837eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgEnableGnss(*this, *mLocApi, *mContext, sessionId, techType)); 1838eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1839eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: Context is NULL", __func__); 1840eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1841eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1842eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return sessionId; 1843eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1844eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1845eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1846eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::disableCommand(uint32_t id) 1847eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1848eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: id %u", __func__, id); 1849eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1850eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgDisableGnss : public LocMsg { 1851eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1852eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& mApi; 1853eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& mContext; 1854eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t mSessionId; 1855eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgDisableGnss(GnssAdapter& adapter, 1856eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApiBase& api, 1857eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase& context, 1858eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t sessionId) : 1859eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1860eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1861eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi(api), 1862eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext(context), 1863eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mSessionId(sessionId) {} 1864eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1865eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocationError err = LOCATION_ERROR_SUCCESS; 1866eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t powerVoteId = mAdapter.getPowerVoteId(); 1867eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (powerVoteId != mSessionId) { 1868eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh err = LOCATION_ERROR_ID_UNKNOWN; 1869eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 1870eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mContext.modemPowerVote(false); 1871eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.setPowerVoteId(0); 1872eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApi.setGpsLock(mAdapter.convertGpsLock(ContextBase::mGps_conf.GPS_LOCK)); 1873eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.mXtraObserver.updateLockStatus( 1874eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.convertGpsLock(ContextBase::mGps_conf.GPS_LOCK)); 1875eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1876eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportResponse(err, mSessionId); 1877eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1878eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1879eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1880eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mContext != NULL) { 1881eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgDisableGnss(*this, *mLocApi, *mContext, id)); 1882eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1883eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1884eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1885eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1886eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1887eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportPositionEvent(const UlpLocation& ulpLocation, 1888eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GpsLocationExtended& locationExtended, 1889eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh enum loc_sess_status status, 1890eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosTechMask techMask, 1891eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh bool fromUlp) 1892eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1893eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: fromUlp %u status %u", __func__, fromUlp, status); 1894eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1895eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // if this event is not called from ULP, then try to call into ULP and return if successfull 1896eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!fromUlp) { 1897eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mUlpProxy->reportPosition(ulpLocation, locationExtended, 1898eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh status, techMask)) { 1899eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 1900eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1901eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1902eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1903eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgReportPosition : public LocMsg { 1904eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 1905eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const UlpLocation mUlpLocation; 1906eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GpsLocationExtended mLocationExtended; 1907eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh loc_sess_status mStatus; 1908eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosTechMask mTechMask; 1909eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgReportPosition(GnssAdapter& adapter, 1910eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const UlpLocation& ulpLocation, 1911eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GpsLocationExtended& locationExtended, 1912eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh loc_sess_status status, 1913eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosTechMask techMask) : 1914eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 1915eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 1916eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlpLocation(ulpLocation), 1917eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocationExtended(locationExtended), 1918eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mStatus(status), 1919eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mTechMask(techMask) {} 1920eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 1921eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // extract bug report info - this returns true if consumed by systemstatus 1922eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SystemStatus* s = mAdapter.getSystemStatus(); 1923eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((nullptr != s) && (LOC_SESS_SUCCESS == mStatus)){ 1924eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s->eventPosition(mUlpLocation, mLocationExtended); 1925eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1926eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportPosition(mUlpLocation, mLocationExtended, mStatus, mTechMask); 1927eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1928eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 1929eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1930eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgReportPosition(*this, ulpLocation, locationExtended, status, techMask)); 1931eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 1932eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1933eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 1934eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportPosition(const UlpLocation& ulpLocation, 1935eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GpsLocationExtended& locationExtended, 1936eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh enum loc_sess_status status, 1937eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocPosTechMask techMask) 1938eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 1939eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh bool reported = false; 1940eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // what's in the if is... (line by line) 1941eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 1. this is a final fix; and 1942eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 1.1 it is a Satellite fix; or 1943eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 1.2 it is a sensor fix 1944eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 2. (must be intermediate fix... implicit) 1945eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 2.1 we accepte intermediate; and 1946eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 2.2 it is NOT the case that 1947eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 2.2.1 there is inaccuracy; and 1948eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 2.2.2 we care about inaccuracy; and 1949eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // 2.2.3 the inaccuracy exceeds our tolerance 1950eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((LOC_SESS_SUCCESS == status && 1951eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ((LOC_POS_TECH_MASK_SATELLITE | 1952eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_POS_TECH_MASK_SENSORS | 1953eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_POS_TECH_MASK_HYBRID) & 1954eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh techMask)) || 1955eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (LOC_SESS_INTERMEDIATE == ContextBase::mGps_conf.INTERMEDIATE_POS && 1956eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh !((ulpLocation.gpsLocation.flags & 1957eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_GPS_LOCATION_HAS_ACCURACY) && 1958eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (ContextBase::mGps_conf.ACCURACY_THRES != 0) && 1959eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (ulpLocation.gpsLocation.accuracy > 1960eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ContextBase::mGps_conf.ACCURACY_THRES)))) { 1961eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (locationExtended.flags & GPS_LOCATION_EXTENDED_HAS_GNSS_SV_USED_DATA) { 1962eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnssSvIdUsedInPosAvail = true; 1963eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnssSvIdUsedInPosition = locationExtended.gnss_sv_used_ids; 1964eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1965eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { 1966eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != it->second.trackingCb) { 1967eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh Location location = {}; 1968eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertLocation(location, ulpLocation.gpsLocation, locationExtended, techMask); 1969eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.trackingCb(location); 1970eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1971eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != it->second.gnssLocationInfoCb) { 1972eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssLocationInfoNotification locationInfo = {}; 1973eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertLocationInfo(locationInfo, locationExtended); 1974eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.gnssLocationInfoCb(locationInfo); 1975eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1976eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1977eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reported = true; 1978eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1979eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1980eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NMEA_PROVIDER_AP == ContextBase::mGps_conf.NMEA_PROVIDER && !mTrackingSessions.empty()) { 1981eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /*Only BlankNMEA sentence needs to be processed and sent, if both lat, long is 0 & 1982eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh horReliability is not set. */ 1983eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh bool blank_fix = ((0 == ulpLocation.gpsLocation.latitude) && 1984eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (0 == ulpLocation.gpsLocation.longitude) && 1985eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (LOC_RELIABILITY_NOT_SET == locationExtended.horizontal_reliability)); 1986eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint8_t generate_nmea = (reported && status != LOC_SESS_FAILURE && !blank_fix); 1987eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh std::vector<std::string> nmeaArraystr; 1988eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh loc_nmea_generate_pos(ulpLocation, locationExtended, generate_nmea, nmeaArraystr); 1989eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto sentence : nmeaArraystr) { 1990eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reportNmea(sentence.c_str(), sentence.length()); 1991eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1992eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 1993eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 1994eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // Free the allocated memory for rawData 1995eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh UlpLocation* gp = (UlpLocation*)&(ulpLocation); 1996eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (gp != NULL && gp->rawData != NULL) 1997eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh { 1998eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh delete (char*)gp->rawData; 1999eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gp->rawData = NULL; 2000eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gp->rawDataSize = 0; 2001eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2002eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2003eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2004eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2005eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportSvEvent(const GnssSvNotification& svNotify, 2006eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh bool fromUlp) 2007eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2008eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: fromUlp %u", __func__, fromUlp); 2009eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2010eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // if this event is not called from ULP, then try to call into ULP and return if successfull 2011eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!fromUlp) { 2012eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mUlpProxy->reportSv(svNotify)) { 2013eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 2014eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2015eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2016eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2017eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgReportSv : public LocMsg { 2018eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 2019eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GnssSvNotification mSvNotify; 2020eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgReportSv(GnssAdapter& adapter, 2021eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GnssSvNotification& svNotify) : 2022eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 2023eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 2024eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mSvNotify(svNotify) {} 2025eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2026eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportSv((GnssSvNotification&)mSvNotify); 2027eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2028eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2029eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2030eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgReportSv(*this, svNotify)); 2031eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2032eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2033eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2034eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportSv(GnssSvNotification& svNotify) 2035eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2036eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int numSv = svNotify.count; 2037eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int16_t gnssSvId = 0; 2038eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint64_t svUsedIdMask = 0; 2039eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (int i=0; i < numSv; i++) { 2040eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svUsedIdMask = 0; 2041eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gnssSvId = svNotify.gnssSvs[i].svId; 2042eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (svNotify.gnssSvs[i].type) { 2043eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GPS: 2044eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mGnssSvIdUsedInPosAvail) { 2045eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svUsedIdMask = mGnssSvIdUsedInPosition.gps_sv_used_ids_mask; 2046eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2047eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2048eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GLONASS: 2049eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mGnssSvIdUsedInPosAvail) { 2050eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svUsedIdMask = mGnssSvIdUsedInPosition.glo_sv_used_ids_mask; 2051eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2052eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2053eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_BEIDOU: 2054eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mGnssSvIdUsedInPosAvail) { 2055eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svUsedIdMask = mGnssSvIdUsedInPosition.bds_sv_used_ids_mask; 2056eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2057eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2058eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GALILEO: 2059eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mGnssSvIdUsedInPosAvail) { 2060eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svUsedIdMask = mGnssSvIdUsedInPosition.gal_sv_used_ids_mask; 2061eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2062eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2063eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_QZSS: 2064eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mGnssSvIdUsedInPosAvail) { 2065eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svUsedIdMask = mGnssSvIdUsedInPosition.qzss_sv_used_ids_mask; 2066eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2067eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // QZSS SV id's need to reported as it is to framework, since 2068eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // framework expects it as it is. See GnssStatus.java. 2069eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // SV id passed to here by LocApi is 1-based. 2070eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svNotify.gnssSvs[i].svId += (QZSS_SV_PRN_MIN - 1); 2071eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2072eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 2073eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svUsedIdMask = 0; 2074eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2075eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2076eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2077eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // If SV ID was used in previous position fix, then set USED_IN_FIX 2078eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // flag, else clear the USED_IN_FIX flag. 2079eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (svUsedIdMask & (1 << (gnssSvId - 1))) { 2080eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svNotify.gnssSvs[i].gnssSvOptionsMask |= GNSS_SV_OPTIONS_USED_IN_FIX_BIT; 2081eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2082eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2083eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2084eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { 2085eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != it->second.gnssSvCb) { 2086eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.gnssSvCb(svNotify); 2087eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2088eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2089eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2090eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NMEA_PROVIDER_AP == ContextBase::mGps_conf.NMEA_PROVIDER && !mTrackingSessions.empty()) { 2091eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh std::vector<std::string> nmeaArraystr; 2092eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh loc_nmea_generate_sv(svNotify, nmeaArraystr); 2093eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto sentence : nmeaArraystr) { 2094eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reportNmea(sentence.c_str(), sentence.length()); 2095eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2096eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2097eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2098eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mGnssSvIdUsedInPosAvail = false; 2099eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportNmeaEvent(const char* nmea, size_t length, bool fromUlp) 2103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // if this event is not called from ULP, then try to call into ULP and return if successfull 2105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!fromUlp && !loc_nmea_is_debug(nmea, length)) { 2106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mUlpProxy->reportNmea(nmea, length)) { 2107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 2108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgReportNmea : public LocMsg { 2112eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 2113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const char* mNmea; 2114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh size_t mLength; 2115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgReportNmea(GnssAdapter& adapter, 2116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const char* nmea, 2117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh size_t length) : 2118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 2119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 2120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mNmea(new char[length+1]), 2121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLength(length) { 212287b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava if (mNmea == nullptr) { 212387b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava LOC_LOGE("%s] new allocation failed, fatal error.", __func__); 212487b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava return; 212587b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava } 2126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh strlcpy((char*)mNmea, nmea, length+1); 2127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual ~MsgReportNmea() 2129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh { 2130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh delete[] mNmea; 2131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // extract bug report info - this returns true if consumed by systemstatus 2134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh bool ret = false; 2135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SystemStatus* s = mAdapter.getSystemStatus(); 2136eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != s) { 2137eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh ret = s->setNmeaString(mNmea, mLength); 2138eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2139eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (false == ret) { 2140eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // forward NMEA message to upper layer 2141eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportNmea(mNmea, mLength); 2142eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2143eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2144eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2145eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2146eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgReportNmea(*this, nmea, length)); 2147eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2148eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2149eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2150eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportNmea(const char* nmea, size_t length) 2151eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2152eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssNmeaNotification nmeaNotification = {}; 2153eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh nmeaNotification.size = sizeof(GnssNmeaNotification); 2154eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2155eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct timeval tv; 2156eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gettimeofday(&tv, (struct timezone *) NULL); 2157eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int64_t now = tv.tv_sec * 1000LL + tv.tv_usec / 1000; 2158eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh nmeaNotification.timestamp = now; 2159eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh nmeaNotification.nmea = nmea; 2160eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh nmeaNotification.length = length; 2161eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2162eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { 2163eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != it->second.gnssNmeaCb) { 2164eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.gnssNmeaCb(nmeaNotification); 2165eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2166eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2167eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2168eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2169eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool 2170eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::requestNiNotifyEvent(const GnssNiNotification ¬ify, const void* data) 2171eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2172eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("%s]: notif_type: %d, timeout: %d, default_resp: %d" 2173eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh "requestor_id: %s (encoding: %d) text: %s text (encoding: %d) extras: %s", 2174eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, notify.type, notify.timeout, notify.timeoutResponse, 2175eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh notify.requestor, notify.requestorEncoding, 2176eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh notify.message, notify.messageEncoding, notify.extras); 2177eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2178eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgReportNiNotify : public LocMsg { 2179eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 2180eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GnssNiNotification mNotify; 2181eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const void* mData; 2182eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgReportNiNotify(GnssAdapter& adapter, 2183eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GnssNiNotification& notify, 2184eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const void* data) : 2185eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 2186eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 2187eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mNotify(notify), 2188eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mData(data) {} 2189eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2190eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.requestNiNotify(mNotify, mData); 2191eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2192eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2193eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2194eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgReportNiNotify(*this, notify, data)); 2195eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2196eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 2197eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2198eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2199eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhstatic void* niThreadProc(void *args) 2200eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2201eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NiSession* pSession = (NiSession*)args; 2202eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int rc = 0; /* return code from pthread calls */ 2203eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2204eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct timeval present_time; 2205eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct timespec expire_time; 2206eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2207eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pthread_mutex_lock(&pSession->tLock); 2208eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Calculate absolute expire time */ 2209eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gettimeofday(&present_time, NULL); 2210eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh expire_time.tv_sec = present_time.tv_sec + pSession->respTimeLeft; 2211eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh expire_time.tv_nsec = present_time.tv_usec * 1000; 2212eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: time out set for abs time %ld with delay %d sec", 2213eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, (long)expire_time.tv_sec, pSession->respTimeLeft); 2214eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2215eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh while (!pSession->respRecvd) { 2216eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh rc = pthread_cond_timedwait(&pSession->tCond, 2217eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh &pSession->tLock, 2218eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh &expire_time); 2219eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (rc == ETIMEDOUT) { 2220eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->resp = GNSS_NI_RESPONSE_NO_RESPONSE; 2221eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: time out after valting for specified time. Ret Val %d", 2222eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, rc); 2223eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2224eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2225eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2226eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: Java layer has sent us a user response and return value from " 2227eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh "pthread_cond_timedwait = %d pSession->resp is %u", __func__, rc, pSession->resp); 2228eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->respRecvd = false; /* Reset the user response flag for the next session*/ 2229eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2230eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // adding this check to support modem restart, in which case, we need the thread 2231eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // to exit without calling sending data. We made sure that rawRequest is NULL in 2232eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // loc_eng_ni_reset_on_engine_restart() 2233eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter* adapter = pSession->adapter; 2234eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssNiResponse resp; 2235eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh void* rawRequest = NULL; 2236eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh bool sendResponse = false; 2237eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2238eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL != pSession->rawRequest) { 2239eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (pSession->resp != GNSS_NI_RESPONSE_IGNORE) { 2240eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh resp = pSession->resp; 2241eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh rawRequest = pSession->rawRequest; 2242eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendResponse = true; 2243eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 2244eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh free(pSession->rawRequest); 2245eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2246eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->rawRequest = NULL; 2247eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2248eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pthread_mutex_unlock(&pSession->tLock); 2249eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2250eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->respTimeLeft = 0; 2251eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->reqID = 0; 2252eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2253eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (sendResponse) { 2254eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh adapter->gnssNiResponseCommand(resp, rawRequest); 2255eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2256eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2257eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return NULL; 2258eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2259eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2260eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool 2261eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::requestNiNotify(const GnssNiNotification& notify, const void* data) 2262eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2263eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NiSession* pSession = NULL; 2264eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gnssNiCallback gnssNiCb = nullptr; 2265eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2266eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { 2267eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != it->second.gnssNiCb) { 2268eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gnssNiCb = it->second.gnssNiCb; 2269eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2270eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2271eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2272eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr == gnssNiCb) { 2273eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh EXIT_LOG(%s, "no clients with gnssNiCb."); 2274eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return false; 2275eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2276eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2277eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (notify.type == GNSS_NI_TYPE_EMERGENCY_SUPL) { 2278eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL != mNiData.sessionEs.rawRequest) { 2279eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("%s]: supl es NI in progress, new supl es NI ignored, type: %d", 2280eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, notify.type); 2281eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL != data) { 2282eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh free((void*)data); 2283eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2284eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 2285eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession = &mNiData.sessionEs; 2286eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2287eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 2288eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL != mNiData.session.rawRequest || 2289eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh NULL != mNiData.sessionEs.rawRequest) { 2290eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("%s]: supl NI in progress, new supl NI ignored, type: %d", 2291eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh __func__, notify.type); 2292eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (NULL != data) { 2293eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh free((void*)data); 2294eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2295eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 2296eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession = &mNiData.session; 2297eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2298eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2299eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2300eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (pSession) { 2301eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Save request */ 2302eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->rawRequest = (void*)data; 2303eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->reqID = ++mNiData.reqIDCounter; 2304eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->adapter = this; 2305eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2306eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int sessionId = pSession->reqID; 2307eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2308eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* For robustness, spawn a thread at this point to timeout to clear up the notification 2309eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * status, even though the OEM layer in java does not do so. 2310eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh **/ 2311eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh pSession->respTimeLeft = 2312eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 5 + (notify.timeout != 0 ? notify.timeout : LOC_NI_NO_RESPONSE_TIME); 2313eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2314eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int rc = 0; 2315eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh rc = pthread_create(&pSession->thread, NULL, niThreadProc, pSession); 2316eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (rc) { 2317eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: Loc NI thread is not created.", __func__); 2318eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2319eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh rc = pthread_detach(pSession->thread); 2320eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (rc) { 2321eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGE("%s]: Loc NI thread is not detached.", __func__); 2322eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2323eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2324eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != gnssNiCb) { 2325eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh gnssNiCb(sessionId, notify); 2326eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2327eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2328eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2329eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 2330eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2331eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2332eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2333eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements, 2334eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int msInWeek) 2335eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2336eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 2337eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2338eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct MsgReportGnssMeasurementData : public LocMsg { 2339eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 2340eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssMeasurementsNotification mMeasurementsNotify; 2341eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline MsgReportGnssMeasurementData(GnssAdapter& adapter, 2342eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GnssMeasurementsNotification& measurements, 2343eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int msInWeek) : 2344eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), 2345eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter), 2346eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mMeasurementsNotify(measurements) { 2347eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (-1 != msInWeek) { 2348eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.getAgcInformation(mMeasurementsNotify, msInWeek); 2349eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2350eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2351eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2352eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.reportGnssMeasurementData(mMeasurementsNotify); 2353eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2354eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2355eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2356eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new MsgReportGnssMeasurementData(*this, measurements, msInWeek)); 2357eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2358eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2359eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2360eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportGnssMeasurementData(const GnssMeasurementsNotification& measurements) 2361eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2362eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (auto it=mClientData.begin(); it != mClientData.end(); ++it) { 2363eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != it->second.gnssMeasurementsCb) { 2364eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh it->second.gnssMeasurementsCb(measurements); 2365eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2366eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2367eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2368eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2369eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2370eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet) 2371eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2372eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 2373eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2374eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // We send SvMeasurementSet to AmtProxy/ULPProxy to be forwarded as necessary. 2375eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlpProxy->reportSvMeasurement(svMeasurementSet); 2376eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2377eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2378eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2379eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial) 2380eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2381eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 2382eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2383eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // We send SvMeasurementSet to AmtProxy/ULPProxy to be forwarded as necessary. 2384eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mUlpProxy->reportSvPolynomial(svPolynomial); 2385eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2386eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2387eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* INIT LOC AGPS MANAGER */ 2388eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GnssAdapter::initAgpsCommand(const AgpsCbInfo& cbInfo){ 2389eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2390eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::initAgpsCommand"); 2391eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2392eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Set ATL open/close callbacks */ 2393eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsAtlOpenStatusCb atlOpenStatusCb = 2394eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh [this](int handle, int isSuccess, char* apn, 2395eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AGpsBearerType bearerType, AGpsExtType agpsType) { 2396eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2397eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocApi->atlOpenStatus( 2398eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh handle, isSuccess, apn, bearerType, agpsType); 2399eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2400eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsAtlCloseStatusCb atlCloseStatusCb = 2401eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh [this](int handle, int isSuccess) { 2402eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2403eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocApi->atlCloseStatus(handle, isSuccess); 2404eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2405eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2406eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Register DS Client APIs */ 2407eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientInitFn dsClientInitFn = 2408eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh [this](bool isDueToSSR) { 2409eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2410eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mLocApi->initDataServiceClient(isDueToSSR); 2411eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2412eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2413eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn = 2414eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh [this] { 2415eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2416eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return mLocApi->openAndStartDataCall(); 2417eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2418eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2419eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientStopDataCallFn dsClientStopDataCallFn = 2420eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh [this] { 2421eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2422eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocApi->stopDataCall(); 2423eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2424eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2425eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn = 2426eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh [this] { 2427eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2428eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocApi->closeDataCall(); 2429eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2430eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2431eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientReleaseFn dsClientReleaseFn = 2432eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh [this] { 2433eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2434eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mLocApi->releaseDataServiceClient(); 2435eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2436eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2437eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Send Msg function */ 2438eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SendMsgToAdapterMsgQueueFn sendMsgFn = 2439eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh [this](LocMsg* msg) { 2440eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2441eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(msg); 2442eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2443eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2444eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Message to initialize AGPS module */ 2445eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct AgpsMsgInit: public LocMsg { 2446eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2447eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsManager* mAgpsManager; 2448eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2449eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsFrameworkInterface::AgnssStatusIpV4Cb mFrameworkStatusV4Cb; 2450eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2451eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsAtlOpenStatusCb mAtlOpenStatusCb; 2452eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsAtlCloseStatusCb mAtlCloseStatusCb; 2453eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2454eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientInitFn mDSClientInitFn; 2455eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientOpenAndStartDataCallFn mDSClientOpenAndStartDataCallFn; 2456eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientStopDataCallFn mDSClientStopDataCallFn; 2457eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientCloseDataCallFn mDSClientCloseDataCallFn; 2458eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientReleaseFn mDSClientReleaseFn; 2459eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2460eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SendMsgToAdapterMsgQueueFn mSendMsgFn; 2461eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& mAdapter; 2462eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2463eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline AgpsMsgInit(AgpsManager* agpsManager, 2464eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsFrameworkInterface::AgnssStatusIpV4Cb frameworkStatusV4Cb, 2465eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsAtlOpenStatusCb atlOpenStatusCb, 2466eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsAtlCloseStatusCb atlCloseStatusCb, 2467eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientInitFn dsClientInitFn, 2468eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientOpenAndStartDataCallFn dsClientOpenAndStartDataCallFn, 2469eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientStopDataCallFn dsClientStopDataCallFn, 2470eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientCloseDataCallFn dsClientCloseDataCallFn, 2471eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsDSClientReleaseFn dsClientReleaseFn, 2472eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SendMsgToAdapterMsgQueueFn sendMsgFn, 2473eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssAdapter& adapter) : 2474eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), mAgpsManager(agpsManager), mFrameworkStatusV4Cb( 2475eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh frameworkStatusV4Cb), mAtlOpenStatusCb(atlOpenStatusCb), mAtlCloseStatusCb( 2476eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh atlCloseStatusCb), mDSClientInitFn(dsClientInitFn), mDSClientOpenAndStartDataCallFn( 2477eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh dsClientOpenAndStartDataCallFn), mDSClientStopDataCallFn( 2478eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh dsClientStopDataCallFn), mDSClientCloseDataCallFn( 2479eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh dsClientCloseDataCallFn), mDSClientReleaseFn( 2480eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh dsClientReleaseFn), mSendMsgFn(sendMsgFn), 2481eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter(adapter) { 2482eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2483eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgInit"); 2484eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2485eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2486eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2487eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2488eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgInit::proc()"); 2489eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2490eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager->registerCallbacks(mFrameworkStatusV4Cb, mAtlOpenStatusCb, 2491eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAtlCloseStatusCb, mDSClientInitFn, 2492eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mDSClientOpenAndStartDataCallFn, mDSClientStopDataCallFn, 2493eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mDSClientCloseDataCallFn, mDSClientReleaseFn, mSendMsgFn); 2494eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2495eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager->createAgpsStateMachines(); 2496eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2497eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Register for AGPS event mask */ 2498eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAdapter.updateEvtMask(LOC_API_ADAPTER_BIT_LOCATION_SERVER_REQUEST, 2499eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_REGISTRATION_MASK_ENABLED); 2500eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2501eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2502eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2503eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (mAgpsCbInfo.cbPriority > cbInfo.cbPriority) { 2504eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("Higher priority AGPS CB already registered (%d > %d) !", 2505eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsCbInfo.cbPriority, cbInfo.cbPriority); 2506eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 2507eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } else { 2508eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsCbInfo = cbInfo; 2509eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("Registering AGPS CB %p with priority %d", 2510eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsCbInfo.statusV4Cb, mAgpsCbInfo.cbPriority); 2511eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2512eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2513eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Send message to initialize AGPS Manager */ 2514eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg(new AgpsMsgInit( 2515eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh &mAgpsManager, 2516eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (AgpsFrameworkInterface::AgnssStatusIpV4Cb)cbInfo.statusV4Cb, 2517eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh atlOpenStatusCb, atlCloseStatusCb, 2518eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh dsClientInitFn, dsClientOpenAndStartDataCallFn, 2519eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh dsClientStopDataCallFn, dsClientCloseDataCallFn, 2520eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh dsClientReleaseFn, 2521eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsgFn, 2522eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh *this)); 2523eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2524eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2525eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* GnssAdapter::requestATL 2526eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Method triggered in QMI thread as part of handling below message: 2527eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * eQMI_LOC_SERVER_REQUEST_OPEN_V02 2528eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Triggers the AGPS state machine to setup AGPS call for below WWAN types: 2529eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * eQMI_LOC_WWAN_TYPE_INTERNET_V02 2530eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * eQMI_LOC_WWAN_TYPE_AGNSS_V02 */ 2531eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool GnssAdapter::requestATL(int connHandle, LocAGpsType agpsType){ 2532eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2533eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::requestATL"); 2534eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2535eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg( new AgpsMsgRequestATL( 2536eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh &mAgpsManager, connHandle, (AGpsExtType)agpsType)); 2537eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2538eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 2539eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2540eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2541eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* GnssAdapter::requestSuplES 2542eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Method triggered in QMI thread as part of handling below message: 2543eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * eQMI_LOC_SERVER_REQUEST_OPEN_V02 2544eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Triggers the AGPS state machine to setup AGPS call for below WWAN types: 2545eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * eQMI_LOC_WWAN_TYPE_AGNSS_EMERGENCY_V02 */ 2546eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool GnssAdapter::requestSuplES(int connHandle){ 2547eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2548eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::requestSuplES"); 2549eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2550eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg( new AgpsMsgRequestATL( 2551eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh &mAgpsManager, connHandle, LOC_AGPS_TYPE_SUPL_ES)); 2552eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2553eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 2554eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2555eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2556eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* GnssAdapter::releaseATL 2557eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Method triggered in QMI thread as part of handling below message: 2558eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * eQMI_LOC_SERVER_REQUEST_CLOSE_V02 2559eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Triggers teardown of an existing AGPS call */ 2560eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool GnssAdapter::releaseATL(int connHandle){ 2561eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2562eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::releaseATL"); 2563eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2564eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh /* Release SUPL/INTERNET/SUPL_ES ATL */ 2565eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct AgpsMsgReleaseATL: public LocMsg { 2566eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2567eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsManager* mAgpsManager; 2568eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int mConnHandle; 2569eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2570eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline AgpsMsgReleaseATL(AgpsManager* agpsManager, int connHandle) : 2571eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), mAgpsManager(agpsManager), mConnHandle(connHandle) { 2572eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2573eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgReleaseATL"); 2574eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2575eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2576eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2577eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2578eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgReleaseATL::proc()"); 2579eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager->releaseATL(mConnHandle); 2580eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2581eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2582eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2583eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg( new AgpsMsgReleaseATL(&mAgpsManager, connHandle)); 2584eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2585eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 2586eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2587eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2588eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* GnssAdapter::reportDataCallOpened 2589eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * DS Client data call opened successfully. 2590eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Send message to AGPS Manager to handle. */ 2591eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool GnssAdapter::reportDataCallOpened(){ 2592eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2593eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::reportDataCallOpened"); 2594eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2595eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct AgpsMsgSuplEsOpened: public LocMsg { 2596eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2597eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsManager* mAgpsManager; 2598eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2599eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline AgpsMsgSuplEsOpened(AgpsManager* agpsManager) : 2600eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), mAgpsManager(agpsManager) { 2601eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2602eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgSuplEsOpened"); 2603eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2604eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2605eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2606eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2607eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgSuplEsOpened::proc()"); 2608eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager->reportDataCallOpened(); 2609eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2610eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2611eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2612eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg( new AgpsMsgSuplEsOpened(&mAgpsManager)); 2613eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2614eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 2615eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2616eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2617eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* GnssAdapter::reportDataCallClosed 2618eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * DS Client data call closed. 2619eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh * Send message to AGPS Manager to handle. */ 2620eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool GnssAdapter::reportDataCallClosed(){ 2621eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2622eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::reportDataCallClosed"); 2623eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2624eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct AgpsMsgSuplEsClosed: public LocMsg { 2625eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2626eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsManager* mAgpsManager; 2627eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2628eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline AgpsMsgSuplEsClosed(AgpsManager* agpsManager) : 2629eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), mAgpsManager(agpsManager) { 2630eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2631eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgSuplEsClosed"); 2632eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2633eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2634eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2635eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2636eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgSuplEsClosed::proc()"); 2637eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager->reportDataCallClosed(); 2638eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2639eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2640eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2641eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg( new AgpsMsgSuplEsClosed(&mAgpsManager)); 2642eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2643eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 2644eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2645eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2646eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GnssAdapter::dataConnOpenCommand( 2647eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AGpsExtType agpsType, 2648eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const char* apnName, int apnLen, LocApnIpType ipType){ 2649eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2650eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::frameworkDataConnOpen"); 2651eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2652eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct AgpsMsgAtlOpenSuccess: public LocMsg { 2653eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2654eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsManager* mAgpsManager; 2655eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AGpsExtType mAgpsType; 2656eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh char* mApnName; 2657eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh int mApnLen; 2658eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocApnIpType mIpType; 2659eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2660eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline AgpsMsgAtlOpenSuccess(AgpsManager* agpsManager, AGpsExtType agpsType, 2661eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const char* apnName, int apnLen, LocApnIpType ipType) : 2662eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType), mApnName( 2663eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh new char[apnLen + 1]), mApnLen(apnLen), mIpType(ipType) { 2664eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2665eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgAtlOpenSuccess"); 266687b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava if (mApnName == nullptr) { 266787b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava LOC_LOGE("%s] new allocation failed, fatal error.", __func__); 266887b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava return; 266987b632f0955ccb7e2ad59ed34d02544b29e65e16Saurabh Srivastava } 2670eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh memcpy(mApnName, apnName, apnLen); 2671eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mApnName[apnLen] = 0; 2672eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2673eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2674eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline ~AgpsMsgAtlOpenSuccess() { 2675eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh delete[] mApnName; 2676eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2677eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2678eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2679eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2680eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgAtlOpenSuccess::proc()"); 2681eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager->reportAtlOpenSuccess(mAgpsType, mApnName, mApnLen, 2682eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mIpType); 2683eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2684eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2685eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2686eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg( new AgpsMsgAtlOpenSuccess( 2687eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh &mAgpsManager, (AGpsExtType)agpsType, apnName, apnLen, ipType)); 2688eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2689eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2690eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GnssAdapter::dataConnClosedCommand(AGpsExtType agpsType){ 2691eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2692eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::frameworkDataConnClosed"); 2693eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2694eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct AgpsMsgAtlClosed: public LocMsg { 2695eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2696eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsManager* mAgpsManager; 2697eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AGpsExtType mAgpsType; 2698eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2699eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline AgpsMsgAtlClosed(AgpsManager* agpsManager, AGpsExtType agpsType) : 2700eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType) { 2701eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2702eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgAtlClosed"); 2703eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2704eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2705eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2706eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2707eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgAtlClosed::proc()"); 2708eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager->reportAtlClosed(mAgpsType); 2709eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2710eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2711eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2712eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg( new AgpsMsgAtlClosed(&mAgpsManager, (AGpsExtType)agpsType)); 2713eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2714eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2715eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GnssAdapter::dataConnFailedCommand(AGpsExtType agpsType){ 2716eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2717eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGI("GnssAdapter::frameworkDataConnFailed"); 2718eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2719eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh struct AgpsMsgAtlOpenFailed: public LocMsg { 2720eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2721eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AgpsManager* mAgpsManager; 2722eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh AGpsExtType mAgpsType; 2723eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2724eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline AgpsMsgAtlOpenFailed(AgpsManager* agpsManager, AGpsExtType agpsType) : 2725eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LocMsg(), mAgpsManager(agpsManager), mAgpsType(agpsType) { 2726eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2727eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgAtlOpenFailed"); 2728eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2729eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2730eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh inline virtual void proc() const { 2731eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2732eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("AgpsMsgAtlOpenFailed::proc()"); 2733eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh mAgpsManager->reportAtlOpenFailed(mAgpsType); 2734eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2735eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh }; 2736eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2737eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sendMsg( new AgpsMsgAtlOpenFailed(&mAgpsManager, (AGpsExtType)agpsType)); 2738eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2739eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2740eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid GnssAdapter::convertSatelliteInfo(std::vector<GnssDebugSatelliteInfo>& out, 2741eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const GnssSvType& in_constellation, 2742eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh const SystemStatusReports& in) 2743eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2744eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint64_t sv_mask = 0ULL; 2745eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t svid_min = 0; 2746eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t svid_num = 0; 2747eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint32_t svid_idx = 0; 2748eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2749eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint64_t eph_health_good_mask = 0ULL; 2750eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint64_t eph_health_bad_mask = 0ULL; 2751eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh uint64_t server_perdiction_available_mask = 0ULL; 2752eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh float server_perdiction_age = 0.0f; 2753eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2754eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // set constellationi based parameters 2755eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (in_constellation) { 2756eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GPS: 2757eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_min = GNSS_BUGREPORT_GPS_MIN; 2758eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_num = GPS_NUM; 2759eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_idx = 0; 2760eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mSvHealth.empty()) { 2761eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_good_mask = in.mSvHealth.back().mGpsGoodMask; 2762eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_bad_mask = in.mSvHealth.back().mGpsBadMask; 2763eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2764eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mXtra.empty()) { 2765eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_available_mask = in.mXtra.back().mGpsXtraValid; 2766eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_age = (float)(in.mXtra.back().mGpsXtraAge); 2767eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2768eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2769eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GLONASS: 2770eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_min = GNSS_BUGREPORT_GLO_MIN; 2771eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_num = GLO_NUM; 2772eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_idx = GPS_NUM; 2773eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mSvHealth.empty()) { 2774eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_good_mask = in.mSvHealth.back().mGloGoodMask; 2775eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_bad_mask = in.mSvHealth.back().mGloBadMask; 2776eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2777eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mXtra.empty()) { 2778eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_available_mask = in.mXtra.back().mGloXtraValid; 2779eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_age = (float)(in.mXtra.back().mGloXtraAge); 2780eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2781eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2782eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_QZSS: 2783eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_min = GNSS_BUGREPORT_QZSS_MIN; 2784eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_num = QZSS_NUM; 2785eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_idx = GPS_NUM+GLO_NUM+BDS_NUM+GAL_NUM; 2786eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mSvHealth.empty()) { 2787eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_good_mask = in.mSvHealth.back().mQzssGoodMask; 2788eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_bad_mask = in.mSvHealth.back().mQzssBadMask; 2789eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2790eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mXtra.empty()) { 2791eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_available_mask = in.mXtra.back().mQzssXtraValid; 2792eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_age = (float)(in.mXtra.back().mQzssXtraAge); 2793eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2794eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2795eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_BEIDOU: 2796eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_min = GNSS_BUGREPORT_BDS_MIN; 2797eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_num = BDS_NUM; 2798eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_idx = GPS_NUM+GLO_NUM; 2799eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mSvHealth.empty()) { 2800eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_good_mask = in.mSvHealth.back().mBdsGoodMask; 2801eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_bad_mask = in.mSvHealth.back().mBdsBadMask; 2802eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2803eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mXtra.empty()) { 2804eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_available_mask = in.mXtra.back().mBdsXtraValid; 2805eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_age = (float)(in.mXtra.back().mBdsXtraAge); 2806eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2807eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2808eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GALILEO: 2809eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_min = GNSS_BUGREPORT_GAL_MIN; 2810eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_num = GAL_NUM; 2811eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh svid_idx = GPS_NUM+GLO_NUM+BDS_NUM; 2812eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mSvHealth.empty()) { 2813eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_good_mask = in.mSvHealth.back().mGalGoodMask; 2814eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh eph_health_bad_mask = in.mSvHealth.back().mGalBadMask; 2815eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2816eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mXtra.empty()) { 2817eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_available_mask = in.mXtra.back().mGalXtraValid; 2818eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh server_perdiction_age = (float)(in.mXtra.back().mGalXtraAge); 2819eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2820eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2821eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 2822eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 2823eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2824eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2825eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // extract each sv info from systemstatus report 2826eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for(uint32_t i=0; i<svid_num && (svid_idx+i)<SV_ALL_NUM; i++) { 2827eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2828eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GnssDebugSatelliteInfo s = {}; 2829eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.size = sizeof(s); 2830eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.svid = i + svid_min; 2831eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.constellation = in_constellation; 2832eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2833eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mNavData.empty()) { 2834eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.mEphemerisType = in.mNavData.back().mNav[svid_idx+i].mType; 2835eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.mEphemerisSource = in.mNavData.back().mNav[svid_idx+i].mSource; 2836eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2837eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else { 2838eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.mEphemerisType = GNSS_EPH_TYPE_UNKNOWN; 2839eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.mEphemerisSource = GNSS_EPH_SOURCE_UNKNOWN; 2840eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2841eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2842eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh sv_mask = 0x1ULL << i; 2843eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (eph_health_good_mask & sv_mask) { 2844eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.mEphemerisHealth = GNSS_EPH_HEALTH_GOOD; 2845eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2846eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else if (eph_health_bad_mask & sv_mask) { 2847eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.mEphemerisHealth = GNSS_EPH_HEALTH_BAD; 2848eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2849eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else { 2850eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.mEphemerisHealth = GNSS_EPH_HEALTH_UNKNOWN; 2851eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2852eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2853eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (!in.mNavData.empty()) { 2854eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.ephemerisAgeSeconds = 2855eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (float)(in.mNavData.back().mNav[svid_idx+i].mAgeSec); 2856eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2857eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else { 2858eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.ephemerisAgeSeconds = 0.0f; 2859eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2860eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2861eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (server_perdiction_available_mask & sv_mask) { 2862eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.serverPredictionIsAvailable = true; 2863eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2864eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else { 2865eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.serverPredictionIsAvailable = false; 2866eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2867eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2868eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh s.serverPredictionAgeSeconds = server_perdiction_age; 2869eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh out.push_back(s); 2870eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2871eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2872eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return; 2873eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2874eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2875eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhbool GnssAdapter::getDebugReport(GnssDebugReport& r) 2876eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2877eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGD("%s]: ", __func__); 2878eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2879eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SystemStatus* systemstatus = getSystemStatus(); 2880eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr == systemstatus) { 2881eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return false; 2882eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2883eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2884eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SystemStatusReports reports = {}; 2885eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh systemstatus->getReport(reports, true); 2886eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2887eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.size = sizeof(r); 2888eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2889eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // location block 2890eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.size = sizeof(r.mLocation); 2891eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if(!reports.mLocation.empty() && reports.mLocation.back().mValid) { 2892eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mValid = true; 2893eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.latitude = 2894eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.back().mLocation.gpsLocation.latitude; 2895eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.longitude = 2896eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.back().mLocation.gpsLocation.longitude; 2897eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.altitude = 2898eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.back().mLocation.gpsLocation.altitude; 2899eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.speed = 2900eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (double)(reports.mLocation.back().mLocation.gpsLocation.speed); 2901eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.bearing = 2902eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (double)(reports.mLocation.back().mLocation.gpsLocation.bearing); 2903eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.accuracy = 2904eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (double)(reports.mLocation.back().mLocation.gpsLocation.accuracy); 2905eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2906eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.verticalAccuracyMeters = 2907eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.back().mLocationEx.vert_unc; 2908eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.speedAccuracyMetersPerSecond = 2909eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.back().mLocationEx.speed_unc; 2910eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.bearingAccuracyDegrees = 2911eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.back().mLocationEx.bearing_unc; 2912eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2913eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mUtcReported = 2914eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mLocation.back().mUtcReported; 2915eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2916eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else if(!reports.mBestPosition.empty() && reports.mBestPosition.back().mValid) { 2917eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mValid = true; 2918eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.latitude = 2919eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (double)(reports.mBestPosition.back().mBestLat); 2920eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.longitude = 2921eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (double)(reports.mBestPosition.back().mBestLon); 2922eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.altitude = 2923eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mBestPosition.back().mBestAlt; 2924eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2925eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.timestamp = 2926eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mBestPosition.back().mUtcReported.tv_sec * 1000ULL + 2927eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mBestPosition.back().mUtcReported.tv_nsec / 1000000ULL; 2928eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2929eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else { 2930eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mValid = false; 2931eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2932eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2933eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (r.mLocation.mValid) { 2934eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("getDebugReport - lat=%f lon=%f alt=%f speed=%f", 2935eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.latitude, 2936eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.longitude, 2937eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.altitude, 2938eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mLocation.mLocation.speed); 2939eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2940eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2941eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // time block 2942eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mTime.size = sizeof(r.mTime); 2943eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if(!reports.mTimeAndClock.empty() && reports.mTimeAndClock.back().mTimeValid) { 2944eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mTime.mValid = true; 2945eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mTime.timeEstimate = 2946eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (((int64_t)(reports.mTimeAndClock.back().mGpsWeek)*7 + 2947eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GNSS_UTC_TIME_OFFSET)*24*60*60 - 2948eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (int64_t)(reports.mTimeAndClock.back().mLeapSeconds))*1000ULL + 2949eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (int64_t)(reports.mTimeAndClock.back().mGpsTowMs); 2950eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2951eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mTime.timeUncertaintyNs = 2952eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (float)((reports.mTimeAndClock.back().mTimeUnc + 2953eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mTimeAndClock.back().mLeapSecUnc)*1000); 2954eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mTime.frequencyUncertaintyNsPerSec = 2955eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (float)(reports.mTimeAndClock.back().mClockFreqBiasUnc); 2956eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("getDebugReport - timeestimate=%" PRIu64 " unc=%f frequnc=%f", 2957eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mTime.timeEstimate, 2958eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mTime.timeUncertaintyNs, r.mTime.frequencyUncertaintyNsPerSec); 2959eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2960eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh else { 2961eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh r.mTime.mValid = false; 2962eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 2963eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2964eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh // satellite info block 2965eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_GPS, reports); 2966eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_GLONASS, reports); 2967eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_QZSS, reports); 2968eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_BEIDOU, reports); 2969eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh convertSatelliteInfo(r.mSatelliteInfo, GNSS_SV_TYPE_GALILEO, reports); 2970eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh LOC_LOGV("getDebugReport - satellite=%zu", r.mSatelliteInfo.size()); 2971eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2972eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh return true; 2973eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 2974eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2975eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh/* get AGC information from system status and fill it */ 2976eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhvoid 2977eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain VongsouvanhGnssAdapter::getAgcInformation(GnssMeasurementsNotification& measurements, int msInWeek) 2978eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh{ 2979eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SystemStatus* systemstatus = getSystemStatus(); 2980eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2981eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if (nullptr != systemstatus) { 2982eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh SystemStatusReports reports = {}; 2983eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh systemstatus->getReport(reports, true); 2984eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2985eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh if ((!reports.mRfAndParams.empty()) && (!reports.mTimeAndClock.empty()) && 2986eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mTimeAndClock.back().mTimeValid && 2987eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh (abs(msInWeek - (int)reports.mTimeAndClock.back().mGpsTowMs) < 2000)) { 2988eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2989eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh for (size_t i = 0; i < measurements.count; i++) { 2990eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh switch (measurements.measurements[i].svType) { 2991eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GPS: 2992eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh measurements.measurements[i].agcLevelDb = 2993eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mRfAndParams.back().mAgcGps; 2994eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh measurements.measurements[i].flags |= 2995eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; 2996eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 2997eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 2998eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GALILEO: 2999eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh measurements.measurements[i].agcLevelDb = 3000eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mRfAndParams.back().mAgcGal; 3001eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh measurements.measurements[i].flags |= 3002eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; 3003eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 3004eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 3005eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_GLONASS: 3006eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh measurements.measurements[i].agcLevelDb = 3007eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mRfAndParams.back().mAgcGlo; 3008eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh measurements.measurements[i].flags |= 3009eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; 3010eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 3011eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 3012eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_BEIDOU: 3013eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh measurements.measurements[i].agcLevelDb = 3014eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh reports.mRfAndParams.back().mAgcBds; 3015eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh measurements.measurements[i].flags |= 3016eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh GNSS_MEASUREMENTS_DATA_AUTOMATIC_GAIN_CONTROL_BIT; 3017eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 3018eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 3019eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_QZSS: 3020eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_SBAS: 3021eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh case GNSS_SV_TYPE_UNKNOWN: 3022eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh default: 3023eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh break; 3024eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 3025eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 3026eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 3027eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh } 3028eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} 3029eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh 3030