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