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 &notify, 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