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#ifndef GNSS_ADAPTER_H
30eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define GNSS_ADAPTER_H
31eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
32eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <LocAdapterBase.h>
33eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <LocDualContext.h>
34eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <UlpProxyBase.h>
35eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <LocationAPI.h>
36eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <Agps.h>
37eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <SystemStatus.h>
38eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#include <XtraSystemStatusObserver.h>
39eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
40eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define MAX_URL_LEN 256
41eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define NMEA_SENTENCE_MAX_LENGTH 200
42eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define GLONASS_SV_ID_OFFSET 64
43eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define MAX_SATELLITES_IN_USE 12
44eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define LOC_NI_NO_RESPONSE_TIME 20
45eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#define LOC_GPS_NI_RESPONSE_IGNORE 4
46eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
47eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhclass GnssAdapter;
48eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
49eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtypedef struct {
50eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    pthread_t               thread;        /* NI thread */
51eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t                respTimeLeft;  /* examine time for NI response */
52eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool                    respRecvd;     /* NI User reponse received or not from Java layer*/
53eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void*                   rawRequest;
54eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t                reqID;         /* ID to check against response */
55eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssNiResponse          resp;
56eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    pthread_cond_t          tCond;
57eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    pthread_mutex_t         tLock;
58eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssAdapter*            adapter;
59eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} NiSession;
60eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtypedef struct {
61eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    NiSession session;    /* SUPL NI Session */
62eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    NiSession sessionEs;  /* Emergency SUPL NI Session */
63eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t reqIDCounter;
64eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} NiData;
65eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
66eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtypedef enum {
67eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA
68eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    NMEA_PROVIDER_MP      // Modem Processor Provider of NMEA
69eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} NmeaProviderType;
70eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhtypedef struct {
71eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssSvType svType;
72eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    const char* talker;
73eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint64_t mask;
74eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t svIdOffset;
75eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh} NmeaSvMeta;
76eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
77eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhusing namespace loc_core;
78eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
79eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhnamespace loc_core {
80eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    class SystemStatus;
81eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh}
82eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
83eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhclass GnssAdapter : public LocAdapterBase {
84eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== ULP ============================================================================ */
85eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    UlpProxyBase* mUlpProxy;
86eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
87eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== CLIENT ========================================================================= */
88eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    typedef std::map<LocationAPI*, LocationCallbacks> ClientDataMap;
89eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    ClientDataMap mClientData;
90eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
91eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== TRACKING ======================================================================= */
92eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationSessionMap mTrackingSessions;
93eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocPosMode mUlpPositionMode;
94eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssSvUsedInPosition mGnssSvIdUsedInPosition;
95eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool mGnssSvIdUsedInPosAvail;
96eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
97eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== CONTROL ======================================================================== */
98eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationControlCallbacks mControlCallbacks;
99eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t mPowerVoteId;
100eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t mNmeaMask;
101eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
102eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== NI ============================================================================= */
103eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    NiData mNiData;
104eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
105eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== AGPS ========================================================*/
106eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    // This must be initialized via initAgps()
107eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    AgpsManager mAgpsManager;
108eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    AgpsCbInfo mAgpsCbInfo;
109eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
110eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* === SystemStatus ===================================================================== */
111eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    SystemStatus* mSystemStatus;
1128f362b95bd587923b1168244ea6a65d8938b0449Harikrishnan Hariharan    XtraSystemStatusObserver mXtraObserver;
113eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
114eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /*==== CONVERSION ===================================================================*/
115eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static void convertOptions(LocPosMode& out, const LocationOptions& options);
116eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static void convertLocation(Location& out, const LocGpsLocation& locGpsLocation,
117eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                const GpsLocationExtended& locationExtended,
118eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                const LocPosTechMask techMask);
119eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static void convertLocationInfo(GnssLocationInfoNotification& out,
120eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                    const GpsLocationExtended& locationExtended);
121eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
122eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanhpublic:
123eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
124eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    GnssAdapter();
125eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual inline ~GnssAdapter() { delete mUlpProxy; }
126eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
127eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== SSR ============================================================================ */
128eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== EVENTS ====(Called from QMI Thread)========================================= */
129eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void handleEngineUpEvent();
130eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== UTILITIES ================================================================== */
131eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void restartSessions();
132eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
133eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== ULP ============================================================================ */
134eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== COMMANDS ====(Called from ULP Thread)==================================== */
135eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void setUlpProxyCommand(UlpProxyBase* ulp);
136eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== UTILITIES ================================================================== */
137eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void setUlpProxy(UlpProxyBase* ulp);
138eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    inline UlpProxyBase* getUlpProxy() { return mUlpProxy; }
139eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
140eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== CLIENT ========================================================================= */
141eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== COMMANDS ====(Called from Client Thread)==================================== */
142eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void addClientCommand(LocationAPI* client, const LocationCallbacks& callbacks);
143eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void removeClientCommand(LocationAPI* client);
144eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void requestCapabilitiesCommand(LocationAPI* client);
145eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== UTILITIES ================================================================== */
146eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void saveClient(LocationAPI* client, const LocationCallbacks& callbacks);
147eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void eraseClient(LocationAPI* client);
148eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void updateClientsEventMask();
149eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void stopClientSessions(LocationAPI* client);
150eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationCallbacks getClientCallbacks(LocationAPI* client);
151eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationCapabilitiesMask getCapabilities();
152eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void broadcastCapabilities(LocationCapabilitiesMask);
153eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
154eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== TRACKING ======================================================================= */
155eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== COMMANDS ====(Called from Client Thread)==================================== */
156eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t startTrackingCommand(LocationAPI* client, LocationOptions& options);
157eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void updateTrackingOptionsCommand(LocationAPI* client, uint32_t id, LocationOptions& options);
158eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void stopTrackingCommand(LocationAPI* client, uint32_t id);
159eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======================(Called from ULP Thread)======================================= */
160eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void setPositionModeCommand(LocPosMode& locPosMode);
161eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void startTrackingCommand();
162eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void stopTrackingCommand();
163eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void getZppCommand();
164eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== RESPONSES ================================================================== */
165eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void reportResponse(LocationAPI* client, LocationError err, uint32_t sessionId);
166eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== UTILITIES ================================================================== */
167eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool hasTrackingCallback(LocationAPI* client);
168eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool hasMeasurementsCallback(LocationAPI* client);
169eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool isTrackingSession(LocationAPI* client, uint32_t sessionId);
170eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void saveTrackingSession(LocationAPI* client, uint32_t sessionId,
171eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                             const LocationOptions& options);
172eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void eraseTrackingSession(LocationAPI* client, uint32_t sessionId);
173eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void setUlpPositionMode(const LocPosMode& mode) { mUlpPositionMode = mode; }
174eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocPosMode& getUlpPositionMode() { return mUlpPositionMode; }
175eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationError startTrackingMultiplex(const LocationOptions& options);
176eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationError startTracking(const LocationOptions& options);
177eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationError stopTrackingMultiplex(LocationAPI* client, uint32_t id);
178eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationError stopTracking();
179eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationError updateTrackingMultiplex(LocationAPI* client, uint32_t id,
180eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                          const LocationOptions& options);
181eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
182eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== NI ============================================================================= */
183eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== COMMANDS ====(Called from Client Thread)==================================== */
184eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void gnssNiResponseCommand(LocationAPI* client, uint32_t id, GnssNiResponse response);
185eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======================(Called from NI Thread)======================================== */
186eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void gnssNiResponseCommand(GnssNiResponse response, void* rawRequest);
187eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== UTILITIES ================================================================== */
188eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool hasNiNotifyCallback(LocationAPI* client);
189eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    NiData& getNiData() { return mNiData; }
190eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
191eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== CONTROL ======================================================================== */
192eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== COMMANDS ====(Called from Client Thread)==================================== */
193eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t enableCommand(LocationTechnologyType techType);
194eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void disableCommand(uint32_t id);
195eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void setControlCallbacksCommand(LocationControlCallbacks& controlCallbacks);
196eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void readConfigCommand();
197eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void setConfigCommand();
198eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t* gnssUpdateConfigCommand(GnssConfig config);
199eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t gnssDeleteAidingDataCommand(GnssAidingData& data);
200eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
201eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void initAgpsCommand(const AgpsCbInfo& cbInfo);
202eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void dataConnOpenCommand(
203eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            AGpsExtType agpsType,
204eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh            const char* apnName, int apnLen, LocApnIpType ipType);
205eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void dataConnClosedCommand(AGpsExtType agpsType);
206eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void dataConnFailedCommand(AGpsExtType agpsType);
207eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
208eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== RESPONSES ================================================================== */
209eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void reportResponse(LocationError err, uint32_t sessionId);
210eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void reportResponse(size_t count, LocationError* errs, uint32_t* ids);
211eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== UTILITIES ================================================================== */
212eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    LocationControlCallbacks& getControlCallbacks() { return mControlCallbacks; }
213eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void setControlCallbacks(const LocationControlCallbacks& controlCallbacks)
214eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    { mControlCallbacks = controlCallbacks; }
215eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void setPowerVoteId(uint32_t id) { mPowerVoteId = id; }
216eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    uint32_t getPowerVoteId() { return mPowerVoteId; }
217eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool resolveInAddress(const char* hostAddress, struct in_addr* inAddress);
218eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
219eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ==== REPORTS ======================================================================== */
220eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== EVENTS ====(Called from QMI/ULP Thread)===================================== */
221eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void reportPositionEvent(const UlpLocation& ulpLocation,
222eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                     const GpsLocationExtended& locationExtended,
223eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                     enum loc_sess_status status,
224eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                     LocPosTechMask techMask,
225eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                     bool fromUlp=false);
226eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void reportSvEvent(const GnssSvNotification& svNotify, bool fromUlp=false);
227eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void reportNmeaEvent(const char* nmea, size_t length, bool fromUlp=false);
228eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data);
229eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements,
230eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                                int msInWeek);
231eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet);
232eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial);
233eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
234eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual bool requestATL(int connHandle, LocAGpsType agps_type);
235eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual bool releaseATL(int connHandle);
236eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual bool requestSuplES(int connHandle);
237eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual bool reportDataCallOpened();
238eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    virtual bool reportDataCallClosed();
239eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
240eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* ======== UTILITIES ================================================================= */
241eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void reportPosition(const UlpLocation &ulpLocation,
242eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                        const GpsLocationExtended &locationExtended,
243eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                        enum loc_sess_status status,
244eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                        LocPosTechMask techMask);
245eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void reportSv(GnssSvNotification& svNotify);
246eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void reportNmea(const char* nmea, size_t length);
247eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool requestNiNotify(const GnssNiNotification& notify, const void* data);
248eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements);
249eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
250eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /*======== GNSSDEBUG ================================================================*/
251eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    bool getDebugReport(GnssDebugReport& report);
252eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /* get AGC information from system status and fill it */
253eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void getAgcInformation(GnssMeasurementsNotification& measurements, int msInWeek);
254eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
255eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /*==== SYSTEM STATUS ================================================================*/
256eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    inline SystemStatus* getSystemStatus(void) { return mSystemStatus; }
257eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
258eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    /*==== CONVERSION ===================================================================*/
259eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertGpsLock(const GnssConfigGpsLock gpsLock);
260eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static GnssConfigGpsLock convertGpsLock(const uint32_t gpsLock);
261eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertSuplVersion(const GnssConfigSuplVersion suplVersion);
262eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static GnssConfigSuplVersion convertSuplVersion(const uint32_t suplVersion);
263eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertLppProfile(const GnssConfigLppProfile lppProfile);
264eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static GnssConfigLppProfile convertLppProfile(const uint32_t lppProfile);
265eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertEP4ES(const GnssConfigEmergencyPdnForEmergencySupl);
266eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertSuplEs(const GnssConfigSuplEmergencyServices suplEmergencyServices);
267eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertLppeCp(const GnssConfigLppeControlPlaneMask lppeControlPlaneMask);
268eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static GnssConfigLppeControlPlaneMask convertLppeCp(const uint32_t lppeControlPlaneMask);
269eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertLppeUp(const GnssConfigLppeUserPlaneMask lppeUserPlaneMask);
270eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static GnssConfigLppeUserPlaneMask convertLppeUp(const uint32_t lppeUserPlaneMask);
271eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertAGloProt(const GnssConfigAGlonassPositionProtocolMask);
272eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static uint32_t convertSuplMode(const GnssConfigSuplModeMask suplModeMask);
273eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    static void convertSatelliteInfo(std::vector<GnssDebugSatelliteInfo>& out,
274eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                     const GnssSvType& in_constellation,
275eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh                                     const SystemStatusReports& in);
276eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
277eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void injectLocationCommand(double latitude, double longitude, float accuracy);
278eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh    void injectTimeCommand(int64_t time, int64_t timeReference, int32_t uncertainty);
279eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
280eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh};
281eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh
282eee4b7537bec1ef4198a5c0c9cfb8ba232ad60cbAlain Vongsouvanh#endif //GNSS_ADAPTER_H
283