• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2017, The Linux Foundation. All rights reserved.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are
5  * met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above
9  *       copyright notice, this list of conditions and the following
10  *       disclaimer in the documentation and/or other materials provided
11  *       with the distribution.
12  *     * Neither the name of The Linux Foundation, nor the names of its
13  *       contributors may be used to endorse or promote products derived
14  *       from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 #ifndef GNSS_ADAPTER_H
30 #define GNSS_ADAPTER_H
31 
32 #include <LocAdapterBase.h>
33 #include <LocDualContext.h>
34 #include <UlpProxyBase.h>
35 #include <LocationAPI.h>
36 #include <Agps.h>
37 #include <SystemStatus.h>
38 #include <XtraSystemStatusObserver.h>
39 
40 #define MAX_URL_LEN 256
41 #define NMEA_SENTENCE_MAX_LENGTH 200
42 #define GLONASS_SV_ID_OFFSET 64
43 #define MAX_SATELLITES_IN_USE 12
44 #define LOC_NI_NO_RESPONSE_TIME 20
45 #define LOC_GPS_NI_RESPONSE_IGNORE 4
46 #define ODCPI_EXPECTED_INJECTION_TIME_MS 10000
47 
48 class GnssAdapter;
49 
50 class OdcpiTimer : public LocTimer {
51 public:
OdcpiTimer(GnssAdapter * adapter)52     OdcpiTimer(GnssAdapter* adapter) :
53             LocTimer(), mAdapter(adapter), mActive(false) {}
54 
start()55     inline void start() {
56         mActive = true;
57         LocTimer::start(ODCPI_EXPECTED_INJECTION_TIME_MS, false);
58     }
stop()59     inline void stop() {
60         mActive = false;
61         LocTimer::stop();
62     }
restart()63     inline void restart() {
64         stop();
65         start();
66     }
isActive()67     inline bool isActive() {
68         return mActive;
69     }
70 
71 private:
72     // Override
73     virtual void timeOutCallback() override;
74 
75     GnssAdapter* mAdapter;
76     bool mActive;
77 };
78 
79 typedef struct {
80     pthread_t               thread;        /* NI thread */
81     uint32_t                respTimeLeft;  /* examine time for NI response */
82     bool                    respRecvd;     /* NI User reponse received or not from Java layer*/
83     void*                   rawRequest;
84     uint32_t                reqID;         /* ID to check against response */
85     GnssNiResponse          resp;
86     pthread_cond_t          tCond;
87     pthread_mutex_t         tLock;
88     GnssAdapter*            adapter;
89 } NiSession;
90 typedef struct {
91     NiSession session;    /* SUPL NI Session */
92     NiSession sessionEs;  /* Emergency SUPL NI Session */
93     uint32_t reqIDCounter;
94 } NiData;
95 
96 typedef enum {
97     NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA
98     NMEA_PROVIDER_MP      // Modem Processor Provider of NMEA
99 } NmeaProviderType;
100 typedef struct {
101     GnssSvType svType;
102     const char* talker;
103     uint64_t mask;
104     uint32_t svIdOffset;
105 } NmeaSvMeta;
106 
107 using namespace loc_core;
108 
109 namespace loc_core {
110     class SystemStatus;
111 }
112 
113 class GnssAdapter : public LocAdapterBase {
114 
115     /* ==== ULP ============================================================================ */
116     UlpProxyBase* mUlpProxy;
117 
118     /* ==== CLIENT ========================================================================= */
119     typedef std::map<LocationAPI*, LocationCallbacks> ClientDataMap;
120     ClientDataMap mClientData;
121 
122     /* ==== TRACKING ======================================================================= */
123     TrackingOptionsMap mTrackingSessions;
124     LocPosMode mUlpPositionMode;
125     GnssSvUsedInPosition mGnssSvIdUsedInPosition;
126     bool mGnssSvIdUsedInPosAvail;
127 
128     /* ==== CONTROL ================================================================= */
129     LocationControlCallbacks mControlCallbacks;
130     uint32_t mPowerVoteId;
131     uint32_t mNmeaMask;
132     GnssSvIdConfig mGnssSvIdConfig;
133     GnssSvTypeConfig mGnssSvTypeConfig;
134     GnssSvTypeConfigCallback mGnssSvTypeConfigCb;
135 
136     /* ==== NI ============================================================================= */
137     NiData mNiData;
138 
139     /* ==== AGPS =========================================================================== */
140     // This must be initialized via initAgps()
141     AgpsManager mAgpsManager;
142     AgpsCbInfo mAgpsCbInfo;
143     void initAgps(const AgpsCbInfo& cbInfo);
144 
145     /* ==== ODCPI ========================================================================== */
146     OdcpiRequestCallback mOdcpiRequestCb;
147     bool mOdcpiRequestActive;
148     OdcpiTimer mOdcpiTimer;
149     OdcpiRequestInfo mOdcpiRequest;
150     void odcpiTimerExpire();
151 
152     /* === SystemStatus ===================================================================== */
153     SystemStatus* mSystemStatus;
154     std::string mServerUrl;
155     XtraSystemStatusObserver mXtraObserver;
156 
157     /*==== CONVERSION ===================================================================*/
158     static void convertOptions(LocPosMode& out, const TrackingOptions& trackingOptions);
159     static void convertLocation(Location& out, const UlpLocation& ulpLocation,
160                                 const GpsLocationExtended& locationExtended,
161                                 const LocPosTechMask techMask);
162     static void convertLocationInfo(GnssLocationInfoNotification& out,
163                                     const GpsLocationExtended& locationExtended);
164 
165 public:
166 
167     GnssAdapter();
~GnssAdapter()168     virtual inline ~GnssAdapter() { delete mUlpProxy; }
169 
170     /* ==== SSR ============================================================================ */
171     /* ======== EVENTS ====(Called from QMI Thread)========================================= */
172     virtual void handleEngineUpEvent();
173     /* ======== UTILITIES ================================================================== */
174     void restartSessions();
175 
176     /* ==== ULP ============================================================================ */
177     /* ======== COMMANDS ====(Called from ULP Thread)==================================== */
178     virtual void setUlpProxyCommand(UlpProxyBase* ulp);
179     /* ======== UTILITIES ================================================================== */
180     void setUlpProxy(UlpProxyBase* ulp);
getUlpProxy()181     inline UlpProxyBase* getUlpProxy() { return mUlpProxy; }
182 
183     /* ==== CLIENT ========================================================================= */
184     /* ======== COMMANDS ====(Called from Client Thread)==================================== */
185     void addClientCommand(LocationAPI* client, const LocationCallbacks& callbacks);
186     void removeClientCommand(LocationAPI* client);
187     void requestCapabilitiesCommand(LocationAPI* client);
188     /* ======== UTILITIES ================================================================== */
189     void saveClient(LocationAPI* client, const LocationCallbacks& callbacks);
190     void eraseClient(LocationAPI* client);
191     void updateClientsEventMask();
192     void stopClientSessions(LocationAPI* client);
193     LocationCallbacks getClientCallbacks(LocationAPI* client);
194     LocationCapabilitiesMask getCapabilities();
195     void broadcastCapabilities(LocationCapabilitiesMask);
196     LocationError setSuplHostServer(const char* server, int port);
197 
198     /* ==== TRACKING ======================================================================= */
199     /* ======== COMMANDS ====(Called from Client Thread)==================================== */
200     uint32_t startTrackingCommand(
201             LocationAPI* client, TrackingOptions& trackingOptions);
202     void updateTrackingOptionsCommand(
203             LocationAPI* client, uint32_t id, TrackingOptions& trackingOptions);
204     void stopTrackingCommand(LocationAPI* client, uint32_t id);
205     /* ======================(Called from ULP Thread)======================================= */
206     virtual void setPositionModeCommand(LocPosMode& locPosMode);
207     virtual void startTrackingCommand();
208     virtual void stopTrackingCommand();
209     virtual void getZppCommand();
210     /* ======== RESPONSES ================================================================== */
211     void reportResponse(LocationAPI* client, LocationError err, uint32_t sessionId);
212     /* ======== UTILITIES ================================================================== */
213     bool hasTrackingCallback(LocationAPI* client);
214     bool hasMeasurementsCallback(LocationAPI* client);
215     bool isTrackingSession(LocationAPI* client, uint32_t sessionId);
216     void saveTrackingSession(LocationAPI* client, uint32_t sessionId,
217                              const TrackingOptions& trackingOptions);
218     void eraseTrackingSession(LocationAPI* client, uint32_t sessionId);
219     bool setUlpPositionMode(const LocPosMode& mode);
getUlpPositionMode()220     LocPosMode& getUlpPositionMode() { return mUlpPositionMode; }
221     LocationError startTrackingMultiplex(const TrackingOptions& trackingOptions);
222     LocationError startTracking(const TrackingOptions& trackingOptions);
223     LocationError stopTrackingMultiplex(LocationAPI* client, uint32_t id);
224     LocationError stopTracking();
225     LocationError updateTrackingMultiplex(LocationAPI* client, uint32_t id,
226                                           const TrackingOptions& trackingOptions);
227 
228     /* ==== NI ============================================================================= */
229     /* ======== COMMANDS ====(Called from Client Thread)==================================== */
230     void gnssNiResponseCommand(LocationAPI* client, uint32_t id, GnssNiResponse response);
231     /* ======================(Called from NI Thread)======================================== */
232     void gnssNiResponseCommand(GnssNiResponse response, void* rawRequest);
233     /* ======== UTILITIES ================================================================== */
234     bool hasNiNotifyCallback(LocationAPI* client);
getNiData()235     NiData& getNiData() { return mNiData; }
236 
237     /* ==== CONTROL CLIENT ================================================================= */
238     /* ======== COMMANDS ====(Called from Client Thread)==================================== */
239     uint32_t enableCommand(LocationTechnologyType techType);
240     void disableCommand(uint32_t id);
241     void setControlCallbacksCommand(LocationControlCallbacks& controlCallbacks);
242     void readConfigCommand();
243     void setConfigCommand();
244     uint32_t* gnssUpdateConfigCommand(GnssConfig config);
245     uint32_t* gnssGetConfigCommand(GnssConfigFlagsMask mask);
246     uint32_t gnssDeleteAidingDataCommand(GnssAidingData& data);
247     void gnssUpdateXtraThrottleCommand(const bool enabled);
248 
249     /* ==== GNSS SV TYPE CONFIG ============================================================ */
250     /* ==== COMMANDS ====(Called from Client Thread)======================================== */
251     /* ==== These commands are received directly from client bypassing Location API ======== */
252     void gnssUpdateSvTypeConfigCommand(GnssSvTypeConfig config);
253     void gnssGetSvTypeConfigCommand(GnssSvTypeConfigCallback callback);
254     void gnssResetSvTypeConfigCommand();
255 
256     /* ==== UTILITIES ====================================================================== */
257     LocationError gnssSvIdConfigUpdate(const std::vector<GnssSvIdSource>& blacklistedSvIds);
258     LocationError gnssSvIdConfigUpdate();
259     LocationError gnssSvTypeConfigUpdate(const GnssSvTypeConfig& config);
260     LocationError gnssSvTypeConfigUpdate();
gnssSetSvTypeConfig(const GnssSvTypeConfig & config)261     inline void gnssSetSvTypeConfig(const GnssSvTypeConfig& config)
262     { mGnssSvTypeConfig = config; }
gnssSetSvTypeConfigCallback(GnssSvTypeConfigCallback callback)263     inline void gnssSetSvTypeConfigCallback(GnssSvTypeConfigCallback callback)
264     { mGnssSvTypeConfigCb = callback; }
gnssGetSvTypeConfigCallback()265     inline GnssSvTypeConfigCallback gnssGetSvTypeConfigCallback()
266     { return mGnssSvTypeConfigCb; }
267 
268     /* ========= AGPS ====================================================================== */
269     /* ======== COMMANDS ====(Called from Client Thread)==================================== */
270     void initDefaultAgpsCommand();
271     void initAgpsCommand(const AgpsCbInfo& cbInfo);
272     void dataConnOpenCommand(AGpsExtType agpsType,
273             const char* apnName, int apnLen, AGpsBearerType bearerType);
274     void dataConnClosedCommand(AGpsExtType agpsType);
275     void dataConnFailedCommand(AGpsExtType agpsType);
276 
277     /* ========= ODCPI ===================================================================== */
278     /* ======== COMMANDS ====(Called from Client Thread)==================================== */
279     void initOdcpiCommand(const OdcpiRequestCallback& callback);
280     void injectOdcpiCommand(const Location& location);
281     /* ======== UTILITIES ================================================================== */
282     void initOdcpi(const OdcpiRequestCallback& callback);
283     void injectOdcpi(const Location& location);
284     void odcpiTimerExpireEvent();
285 
286     /* ======== RESPONSES ================================================================== */
287     void reportResponse(LocationError err, uint32_t sessionId);
288     void reportResponse(size_t count, LocationError* errs, uint32_t* ids);
289     /* ======== UTILITIES ================================================================== */
getControlCallbacks()290     LocationControlCallbacks& getControlCallbacks() { return mControlCallbacks; }
setControlCallbacks(const LocationControlCallbacks & controlCallbacks)291     void setControlCallbacks(const LocationControlCallbacks& controlCallbacks)
292     { mControlCallbacks = controlCallbacks; }
setPowerVoteId(uint32_t id)293     void setPowerVoteId(uint32_t id) { mPowerVoteId = id; }
getPowerVoteId()294     uint32_t getPowerVoteId() { return mPowerVoteId; }
295     bool resolveInAddress(const char* hostAddress, struct in_addr* inAddress);
isInSession()296     virtual bool isInSession() { return !mTrackingSessions.empty(); }
297     void initDefaultAgps();
298 
299     /* ==== REPORTS ======================================================================== */
300     /* ======== EVENTS ====(Called from QMI/ULP Thread)===================================== */
301     virtual void reportPositionEvent(const UlpLocation& ulpLocation,
302                                      const GpsLocationExtended& locationExtended,
303                                      enum loc_sess_status status,
304                                      LocPosTechMask techMask,
305                                      bool fromUlp=false);
306     virtual void reportSvEvent(const GnssSvNotification& svNotify, bool fromUlp=false);
307     virtual void reportNmeaEvent(const char* nmea, size_t length, bool fromUlp=false);
308     virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data);
309     virtual void reportGnssMeasurementDataEvent(const GnssMeasurementsNotification& measurements,
310                                                 int msInWeek);
311     virtual void reportSvMeasurementEvent(GnssSvMeasurementSet &svMeasurementSet);
312     virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial);
313     virtual void reportGnssSvIdConfigEvent(const GnssSvIdConfig& config);
314     virtual void reportGnssSvTypeConfigEvent(const GnssSvTypeConfig& config);
315 
316     virtual bool requestATL(int connHandle, LocAGpsType agps_type, LocApnTypeMask mask);
317     virtual bool releaseATL(int connHandle);
318     virtual bool requestSuplES(int connHandle, LocApnTypeMask mask);
319     virtual bool reportDataCallOpened();
320     virtual bool reportDataCallClosed();
321     virtual bool reportOdcpiRequestEvent(OdcpiRequestInfo& request);
322 
323     /* ======== UTILITIES ================================================================= */
324     bool needReport(const UlpLocation& ulpLocation,
325             enum loc_sess_status status, LocPosTechMask techMask);
326     void reportPosition(const UlpLocation &ulpLocation,
327                         const GpsLocationExtended &locationExtended,
328                         enum loc_sess_status status,
329                         LocPosTechMask techMask);
330     void reportSv(GnssSvNotification& svNotify);
331     void reportNmea(const char* nmea, size_t length);
332     bool requestNiNotify(const GnssNiNotification& notify, const void* data);
333     void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements);
334     void reportGnssSvIdConfig(const GnssSvIdConfig& config);
335     void reportGnssSvTypeConfig(const GnssSvTypeConfig& config);
336     void reportOdcpiRequest(const OdcpiRequestInfo& request);
337 
338     /*======== GNSSDEBUG ================================================================*/
339     bool getDebugReport(GnssDebugReport& report);
340     /* get AGC information from system status and fill it */
341     void getAgcInformation(GnssMeasurementsNotification& measurements, int msInWeek);
342 
343     /*==== SYSTEM STATUS ================================================================*/
getSystemStatus(void)344     inline SystemStatus* getSystemStatus(void) { return mSystemStatus; }
getServerUrl(void)345     std::string& getServerUrl(void) { return mServerUrl; }
setServerUrl(const char * server)346     void setServerUrl(const char* server) { mServerUrl.assign(server); }
347 
348     /*==== CONVERSION ===================================================================*/
349     static uint32_t convertGpsLock(const GnssConfigGpsLock gpsLock);
350     static GnssConfigGpsLock convertGpsLock(const uint32_t gpsLock);
351     static uint32_t convertSuplVersion(const GnssConfigSuplVersion suplVersion);
352     static GnssConfigSuplVersion convertSuplVersion(const uint32_t suplVersion);
353     static uint32_t convertLppProfile(const GnssConfigLppProfile lppProfile);
354     static GnssConfigLppProfile convertLppProfile(const uint32_t lppProfile);
355     static uint32_t convertEP4ES(const GnssConfigEmergencyPdnForEmergencySupl);
356     static uint32_t convertSuplEs(const GnssConfigSuplEmergencyServices suplEmergencyServices);
357     static uint32_t convertLppeCp(const GnssConfigLppeControlPlaneMask lppeControlPlaneMask);
358     static GnssConfigLppeControlPlaneMask convertLppeCp(const uint32_t lppeControlPlaneMask);
359     static uint32_t convertLppeUp(const GnssConfigLppeUserPlaneMask lppeUserPlaneMask);
360     static GnssConfigLppeUserPlaneMask convertLppeUp(const uint32_t lppeUserPlaneMask);
361     static uint32_t convertAGloProt(const GnssConfigAGlonassPositionProtocolMask);
362     static uint32_t convertSuplMode(const GnssConfigSuplModeMask suplModeMask);
363     static void convertSatelliteInfo(std::vector<GnssDebugSatelliteInfo>& out,
364                                      const GnssSvType& in_constellation,
365                                      const SystemStatusReports& in);
366     static bool convertToGnssSvIdConfig(
367             const std::vector<GnssSvIdSource>& blacklistedSvIds, GnssSvIdConfig& config);
368     static void convertFromGnssSvIdConfig(
369             const GnssSvIdConfig& svConfig, GnssConfig& config);
370     static void convertGnssSvIdMaskToList(
371             uint64_t svIdMask, std::vector<GnssSvIdSource>& svIds,
372             GnssSvId initialSvId, GnssSvType svType);
373 
374     void injectLocationCommand(double latitude, double longitude, float accuracy);
375     void injectTimeCommand(int64_t time, int64_t timeReference, int32_t uncertainty);
376 
377 };
378 
379 #endif //GNSS_ADAPTER_H
380