1 /* Copyright (c) 2017-2020 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 <LocContext.h> 34 #include <IOsObserver.h> 35 #include <EngineHubProxyBase.h> 36 #include <LocationAPI.h> 37 #include <Agps.h> 38 #include <SystemStatus.h> 39 #include <XtraSystemStatusObserver.h> 40 #include <map> 41 #include <functional> 42 #include <loc_misc_utils.h> 43 #include <queue> 44 #include <NativeAgpsHandler.h> 45 46 #define MAX_URL_LEN 256 47 #define NMEA_SENTENCE_MAX_LENGTH 200 48 #define GLONASS_SV_ID_OFFSET 64 49 #define MAX_SATELLITES_IN_USE 12 50 #define LOC_NI_NO_RESPONSE_TIME 20 51 #define LOC_GPS_NI_RESPONSE_IGNORE 4 52 #define ODCPI_EXPECTED_INJECTION_TIME_MS 10000 53 #define DELETE_AIDING_DATA_EXPECTED_TIME_MS 5000 54 55 class GnssAdapter; 56 57 typedef std::map<LocationSessionKey, LocationOptions> LocationSessionMap; 58 typedef std::map<LocationSessionKey, TrackingOptions> TrackingOptionsMap; 59 60 class OdcpiTimer : public LocTimer { 61 public: OdcpiTimer(GnssAdapter * adapter)62 OdcpiTimer(GnssAdapter* adapter) : 63 LocTimer(), mAdapter(adapter), mActive(false) {} 64 start()65 inline void start() { 66 mActive = true; 67 LocTimer::start(ODCPI_EXPECTED_INJECTION_TIME_MS, false); 68 } stop()69 inline void stop() { 70 mActive = false; 71 LocTimer::stop(); 72 } restart()73 inline void restart() { 74 stop(); 75 start(); 76 } isActive()77 inline bool isActive() { 78 return mActive; 79 } 80 81 private: 82 // Override 83 virtual void timeOutCallback() override; 84 85 GnssAdapter* mAdapter; 86 bool mActive; 87 }; 88 89 typedef struct { 90 pthread_t thread; /* NI thread */ 91 uint32_t respTimeLeft; /* examine time for NI response */ 92 bool respRecvd; /* NI User reponse received or not from Java layer*/ 93 void* rawRequest; 94 uint32_t reqID; /* ID to check against response */ 95 GnssNiResponse resp; 96 pthread_cond_t tCond; 97 pthread_mutex_t tLock; 98 GnssAdapter* adapter; 99 } NiSession; 100 typedef struct { 101 NiSession session; /* SUPL NI Session */ 102 NiSession sessionEs; /* Emergency SUPL NI Session */ 103 uint32_t reqIDCounter; 104 } NiData; 105 106 typedef enum { 107 NMEA_PROVIDER_AP = 0, // Application Processor Provider of NMEA 108 NMEA_PROVIDER_MP // Modem Processor Provider of NMEA 109 } NmeaProviderType; 110 typedef struct { 111 GnssSvType svType; 112 const char* talker; 113 uint64_t mask; 114 uint32_t svIdOffset; 115 } NmeaSvMeta; 116 117 typedef struct { 118 double latitude; 119 double longitude; 120 float accuracy; 121 // the CPI will be blocked until the boot time 122 // specified in blockedTillTsMs 123 int64_t blockedTillTsMs; 124 // CPIs whose both latitude and longitude differ 125 // no more than latLonThreshold will be blocked 126 // in units of degree 127 double latLonDiffThreshold; 128 } BlockCPIInfo; 129 130 typedef struct { 131 bool isValid; 132 bool enable; 133 float tuncThresholdMs; // need to be specified if enable is true 134 uint32_t energyBudget; // need to be specified if enable is true 135 } TuncConfigInfo; 136 137 typedef struct { 138 bool isValid; 139 bool enable; 140 } PaceConfigInfo; 141 142 typedef struct { 143 bool isValid; 144 bool enable; 145 bool enableFor911; 146 } RobustLocationConfigInfo; 147 148 typedef struct { 149 TuncConfigInfo tuncConfigInfo; 150 PaceConfigInfo paceConfigInfo; 151 RobustLocationConfigInfo robustLocationConfigInfo; 152 LeverArmConfigInfo leverArmConfigInfo; 153 } LocIntegrationConfigInfo; 154 155 using namespace loc_core; 156 157 namespace loc_core { 158 class SystemStatus; 159 } 160 161 typedef std::function<void( 162 uint64_t gnssEnergyConsumedFromFirstBoot 163 )> GnssEnergyConsumedCallback; 164 165 typedef void* QDgnssListenerHDL; 166 typedef std::function<void( 167 bool sessionActive 168 )> QDgnssSessionActiveCb; 169 170 struct CdfwInterface { 171 void (*startDgnssApiService)(const MsgTask& msgTask); 172 QDgnssListenerHDL (*createUsableReporter)( 173 QDgnssSessionActiveCb sessionActiveCb); 174 void (*destroyUsableReporter)(QDgnssListenerHDL handle); 175 void (*reportUsable)(QDgnssListenerHDL handle, bool usable); 176 }; 177 178 typedef uint16_t DGnssStateBitMask; 179 #define DGNSS_STATE_ENABLE_NTRIP_COMMAND 0X01 180 #define DGNSS_STATE_NO_NMEA_PENDING 0X02 181 #define DGNSS_STATE_NTRIP_SESSION_STARTED 0X04 182 183 class GnssReportLoggerUtil { 184 public: 185 typedef void (*LogGnssLatency)(const GnssLatencyInfo& gnssLatencyMeasInfo); 186 GnssReportLoggerUtil()187 GnssReportLoggerUtil() : mLogLatency(nullptr) { 188 const char* libname = "liblocdiagiface.so"; 189 void* libHandle = nullptr; 190 mLogLatency = (LogGnssLatency)dlGetSymFromLib(libHandle, libname, "LogGnssLatency"); 191 } 192 193 bool isLogEnabled(); 194 void log(const GnssLatencyInfo& gnssLatencyMeasInfo); 195 196 private: 197 LogGnssLatency mLogLatency; 198 }; 199 200 class GnssAdapter : public LocAdapterBase { 201 202 /* ==== Engine Hub ===================================================================== */ 203 EngineHubProxyBase* mEngHubProxy; 204 bool mNHzNeeded; 205 bool mSPEAlreadyRunningAtHighestInterval; 206 207 /* ==== TRACKING ======================================================================= */ 208 TrackingOptionsMap mTimeBasedTrackingSessions; 209 LocationSessionMap mDistanceBasedTrackingSessions; 210 LocPosMode mLocPositionMode; 211 GnssSvUsedInPosition mGnssSvIdUsedInPosition; 212 bool mGnssSvIdUsedInPosAvail; 213 GnssSvMbUsedInPosition mGnssMbSvIdUsedInPosition; 214 bool mGnssMbSvIdUsedInPosAvail; 215 216 /* ==== CONTROL ======================================================================== */ 217 LocationControlCallbacks mControlCallbacks; 218 uint32_t mAfwControlId; 219 uint32_t mNmeaMask; 220 uint64_t mPrevNmeaRptTimeNsec; 221 GnssSvIdConfig mGnssSvIdConfig; 222 GnssSvTypeConfig mGnssSeconaryBandConfig; 223 GnssSvTypeConfig mGnssSvTypeConfig; 224 GnssSvTypeConfigCallback mGnssSvTypeConfigCb; 225 bool mSupportNfwControl; 226 LocIntegrationConfigInfo mLocConfigInfo; 227 228 /* ==== NI ============================================================================= */ 229 NiData mNiData; 230 231 /* ==== AGPS =========================================================================== */ 232 // This must be initialized via initAgps() 233 AgpsManager mAgpsManager; 234 void initAgps(const AgpsCbInfo& cbInfo); 235 236 /* ==== NFW =========================================================================== */ 237 NfwStatusCb mNfwCb; 238 IsInEmergencySession mIsE911Session; initNfw(const NfwCbInfo & cbInfo)239 inline void initNfw(const NfwCbInfo& cbInfo) { 240 mNfwCb = (NfwStatusCb)cbInfo.visibilityControlCb; 241 mIsE911Session = (IsInEmergencySession)cbInfo.isInEmergencySession; 242 } 243 244 /* ==== Measurement Corrections========================================================= */ 245 bool mIsMeasCorrInterfaceOpen; 246 measCorrSetCapabilitiesCb mMeasCorrSetCapabilitiesCb; 247 bool initMeasCorr(bool bSendCbWhenNotSupported); 248 bool mIsAntennaInfoInterfaceOpened; 249 250 /* ==== DGNSS Data Usable Report======================================================== */ 251 QDgnssListenerHDL mQDgnssListenerHDL; 252 const CdfwInterface* mCdfwInterface; 253 bool mDGnssNeedReport; 254 bool mDGnssDataUsage; 255 void reportDGnssDataUsable(const GnssSvMeasurementSet &svMeasurementSet); 256 257 /* ==== ODCPI ========================================================================== */ 258 OdcpiRequestCallback mOdcpiRequestCb; 259 bool mOdcpiRequestActive; 260 OdcpiPrioritytype mCallbackPriority; 261 OdcpiTimer mOdcpiTimer; 262 OdcpiRequestInfo mOdcpiRequest; 263 void odcpiTimerExpire(); 264 265 /* ==== DELETEAIDINGDATA =============================================================== */ 266 int64_t mLastDeleteAidingDataTime; 267 268 /* === SystemStatus ===================================================================== */ 269 SystemStatus* mSystemStatus; 270 std::string mServerUrl; 271 std::string mMoServerUrl; 272 XtraSystemStatusObserver mXtraObserver; 273 LocationSystemInfo mLocSystemInfo; 274 std::vector<GnssSvIdSource> mBlacklistedSvIds; 275 PowerStateType mSystemPowerState; 276 277 /* === Misc ===================================================================== */ 278 BlockCPIInfo mBlockCPIInfo; 279 bool mPowerOn; 280 uint32_t mAllowFlpNetworkFixes; 281 std::queue<GnssLatencyInfo> mGnssLatencyInfoQueue; 282 GnssReportLoggerUtil mLogger; 283 bool mDreIntEnabled; 284 285 /* === NativeAgpsHandler ======================================================== */ 286 NativeAgpsHandler mNativeAgpsHandler; 287 288 /* === Misc callback from QMI LOC API ============================================== */ 289 GnssEnergyConsumedCallback mGnssEnergyConsumedCb; 290 std::function<void(bool)> mPowerStateCb; 291 292 /*==== CONVERSION ===================================================================*/ 293 static void convertOptions(LocPosMode& out, const TrackingOptions& trackingOptions); 294 static void convertLocation(Location& out, const UlpLocation& ulpLocation, 295 const GpsLocationExtended& locationExtended); 296 static void convertLocationInfo(GnssLocationInfoNotification& out, 297 const GpsLocationExtended& locationExtended, 298 loc_sess_status status); 299 static uint16_t getNumSvUsed(uint64_t svUsedIdsMask, 300 int totalSvCntInThisConstellation); 301 302 /* ======== UTILITIES ================================================================== */ 303 inline void initOdcpi(const OdcpiRequestCallback& callback, OdcpiPrioritytype priority); 304 inline void injectOdcpi(const Location& location); 305 static bool isFlpClient(LocationCallbacks& locationCallbacks); 306 307 /*==== DGnss Ntrip Source ==========================================================*/ 308 StartDgnssNtripParams mStartDgnssNtripParams; 309 bool mSendNmeaConsent; 310 DGnssStateBitMask mDgnssState; 311 void checkUpdateDgnssNtrip(bool isLocationValid); 312 void stopDgnssNtrip(); 313 uint64_t mDgnssLastNmeaBootTimeMilli; 314 315 protected: 316 317 /* ==== CLIENT ========================================================================= */ 318 virtual void updateClientsEventMask(); 319 virtual void stopClientSessions(LocationAPI* client); 320 inline void setNmeaReportRateConfig(); 321 void logLatencyInfo(); 322 323 public: 324 GnssAdapter(); ~GnssAdapter()325 virtual inline ~GnssAdapter() { } 326 327 /* ==== SSR ============================================================================ */ 328 /* ======== EVENTS ====(Called from QMI Thread)========================================= */ 329 virtual void handleEngineUpEvent(); 330 /* ======== UTILITIES ================================================================== */ 331 void restartSessions(bool modemSSR = false); 332 void checkAndRestartTimeBasedSession(); 333 void checkAndRestartSPESession(); 334 void suspendSessions(); 335 336 /* ==== CLIENT ========================================================================= */ 337 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 338 virtual void addClientCommand(LocationAPI* client, const LocationCallbacks& callbacks); 339 340 /* ==== TRACKING ======================================================================= */ 341 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 342 uint32_t startTrackingCommand( 343 LocationAPI* client, TrackingOptions& trackingOptions); 344 void updateTrackingOptionsCommand( 345 LocationAPI* client, uint32_t id, TrackingOptions& trackingOptions); 346 void stopTrackingCommand(LocationAPI* client, uint32_t id); 347 /* ======== RESPONSES ================================================================== */ 348 void reportResponse(LocationAPI* client, LocationError err, uint32_t sessionId); 349 /* ======== UTILITIES ================================================================== */ 350 bool isTimeBasedTrackingSession(LocationAPI* client, uint32_t sessionId); 351 bool isDistanceBasedTrackingSession(LocationAPI* client, uint32_t sessionId); 352 bool hasCallbacksToStartTracking(LocationAPI* client); 353 bool isTrackingSession(LocationAPI* client, uint32_t sessionId); 354 void saveTrackingSession(LocationAPI* client, uint32_t sessionId, 355 const TrackingOptions& trackingOptions); 356 void eraseTrackingSession(LocationAPI* client, uint32_t sessionId); 357 358 bool setLocPositionMode(const LocPosMode& mode); getLocPositionMode()359 LocPosMode& getLocPositionMode() { return mLocPositionMode; } 360 361 bool startTimeBasedTrackingMultiplex(LocationAPI* client, uint32_t sessionId, 362 const TrackingOptions& trackingOptions); 363 void startTimeBasedTracking(LocationAPI* client, uint32_t sessionId, 364 const TrackingOptions& trackingOptions); 365 bool stopTimeBasedTrackingMultiplex(LocationAPI* client, uint32_t id); 366 void stopTracking(LocationAPI* client, uint32_t id); 367 bool updateTrackingMultiplex(LocationAPI* client, uint32_t id, 368 const TrackingOptions& trackingOptions); 369 void updateTracking(LocationAPI* client, uint32_t sessionId, 370 const TrackingOptions& updatedOptions, const TrackingOptions& oldOptions); 371 bool checkAndSetSPEToRunforNHz(TrackingOptions & out); 372 373 void setConstrainedTunc(bool enable, float tuncConstraint, 374 uint32_t energyBudget, uint32_t sessionId); 375 void setPositionAssistedClockEstimator(bool enable, uint32_t sessionId); 376 void gnssUpdateSvConfig(uint32_t sessionId, 377 const GnssSvTypeConfig& constellationEnablementConfig, 378 const GnssSvIdConfig& blacklistSvConfig); 379 380 void gnssUpdateSecondaryBandConfig( 381 uint32_t sessionId, const GnssSvTypeConfig& secondaryBandConfig); 382 void gnssGetSecondaryBandConfig(uint32_t sessionId); 383 void resetSvConfig(uint32_t sessionId); 384 void configLeverArm(uint32_t sessionId, const LeverArmConfigInfo& configInfo); 385 void configRobustLocation(uint32_t sessionId, bool enable, bool enableForE911); 386 void configMinGpsWeek(uint32_t sessionId, uint16_t minGpsWeek); 387 388 /* ==== NI ============================================================================= */ 389 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 390 void gnssNiResponseCommand(LocationAPI* client, uint32_t id, GnssNiResponse response); 391 /* ======================(Called from NI Thread)======================================== */ 392 void gnssNiResponseCommand(GnssNiResponse response, void* rawRequest); 393 /* ======== UTILITIES ================================================================== */ 394 bool hasNiNotifyCallback(LocationAPI* client); getNiData()395 NiData& getNiData() { return mNiData; } 396 397 /* ==== CONTROL CLIENT ================================================================= */ 398 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 399 uint32_t enableCommand(LocationTechnologyType techType); 400 void disableCommand(uint32_t id); 401 void setControlCallbacksCommand(LocationControlCallbacks& controlCallbacks); 402 void readConfigCommand(); 403 void requestUlpCommand(); 404 void initEngHubProxyCommand(); 405 uint32_t* gnssUpdateConfigCommand(const GnssConfig& config); 406 uint32_t* gnssGetConfigCommand(GnssConfigFlagsMask mask); 407 uint32_t gnssDeleteAidingDataCommand(GnssAidingData& data); 408 void deleteAidingData(const GnssAidingData &data, uint32_t sessionId); 409 void gnssUpdateXtraThrottleCommand(const bool enabled); 410 std::vector<LocationError> gnssUpdateConfig(const std::string& oldMoServerUrl, 411 const std::string& moServerUrl, 412 const std::string& serverUrl, 413 GnssConfig& gnssConfigRequested, 414 GnssConfig& gnssConfigNeedEngineUpdate, size_t count = 0); 415 416 /* ==== GNSS SV TYPE CONFIG ============================================================ */ 417 /* ==== COMMANDS ====(Called from Client Thread)======================================== */ 418 /* ==== These commands are received directly from client bypassing Location API ======== */ 419 void gnssUpdateSvTypeConfigCommand(GnssSvTypeConfig config); 420 void gnssGetSvTypeConfigCommand(GnssSvTypeConfigCallback callback); 421 void gnssResetSvTypeConfigCommand(); 422 423 /* ==== UTILITIES ====================================================================== */ 424 LocationError gnssSvIdConfigUpdateSync(const std::vector<GnssSvIdSource>& blacklistedSvIds); 425 LocationError gnssSvIdConfigUpdateSync(); 426 void gnssSvIdConfigUpdate(const std::vector<GnssSvIdSource>& blacklistedSvIds); 427 void gnssSvIdConfigUpdate(); 428 void gnssSvTypeConfigUpdate(const GnssSvTypeConfig& config); 429 void gnssSvTypeConfigUpdate(bool sendReset = false); gnssSetSvTypeConfig(const GnssSvTypeConfig & config)430 inline void gnssSetSvTypeConfig(const GnssSvTypeConfig& config) 431 { mGnssSvTypeConfig = config; } gnssSetSvTypeConfigCallback(GnssSvTypeConfigCallback callback)432 inline void gnssSetSvTypeConfigCallback(GnssSvTypeConfigCallback callback) 433 { mGnssSvTypeConfigCb = callback; } gnssGetSvTypeConfigCallback()434 inline GnssSvTypeConfigCallback gnssGetSvTypeConfigCallback() 435 { return mGnssSvTypeConfigCb; } 436 void setConfig(); 437 void gnssSecondaryBandConfigUpdate(LocApiResponse* locApiResponse= nullptr); 438 439 /* ========= AGPS ====================================================================== */ 440 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 441 void initDefaultAgpsCommand(); 442 void initAgpsCommand(const AgpsCbInfo& cbInfo); 443 void initNfwCommand(const NfwCbInfo& cbInfo); 444 void dataConnOpenCommand(AGpsExtType agpsType, 445 const char* apnName, int apnLen, AGpsBearerType bearerType); 446 void dataConnClosedCommand(AGpsExtType agpsType); 447 void dataConnFailedCommand(AGpsExtType agpsType); 448 void getGnssEnergyConsumedCommand(GnssEnergyConsumedCallback energyConsumedCb); 449 void nfwControlCommand(bool enable); 450 uint32_t setConstrainedTuncCommand (bool enable, float tuncConstraint, 451 uint32_t energyBudget); 452 uint32_t setPositionAssistedClockEstimatorCommand (bool enable); 453 uint32_t gnssUpdateSvConfigCommand(const GnssSvTypeConfig& constellationEnablementConfig, 454 const GnssSvIdConfig& blacklistSvConfig); 455 uint32_t gnssUpdateSecondaryBandConfigCommand( 456 const GnssSvTypeConfig& secondaryBandConfig); 457 uint32_t gnssGetSecondaryBandConfigCommand(); 458 uint32_t configLeverArmCommand(const LeverArmConfigInfo& configInfo); 459 uint32_t configRobustLocationCommand(bool enable, bool enableForE911); 460 bool openMeasCorrCommand(const measCorrSetCapabilitiesCb setCapabilitiesCb); 461 bool measCorrSetCorrectionsCommand(const GnssMeasurementCorrections gnssMeasCorr); closeMeasCorrCommand()462 inline void closeMeasCorrCommand() { mIsMeasCorrInterfaceOpen = false; } 463 uint32_t antennaInfoInitCommand(const antennaInfoCb antennaInfoCallback); antennaInfoCloseCommand()464 inline void antennaInfoCloseCommand() { mIsAntennaInfoInterfaceOpened = false; } 465 uint32_t configMinGpsWeekCommand(uint16_t minGpsWeek); 466 uint32_t configDeadReckoningEngineParamsCommand(const DeadReckoningEngineConfig& dreConfig); 467 uint32_t configEngineRunStateCommand(PositioningEngineMask engType, 468 LocEngineRunState engState); 469 470 /* ========= ODCPI ===================================================================== */ 471 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 472 void initOdcpiCommand(const OdcpiRequestCallback& callback, OdcpiPrioritytype priority); 473 void injectOdcpiCommand(const Location& location); 474 /* ======== RESPONSES ================================================================== */ 475 void reportResponse(LocationError err, uint32_t sessionId); 476 void reportResponse(size_t count, LocationError* errs, uint32_t* ids); 477 /* ======== UTILITIES ================================================================== */ getControlCallbacks()478 LocationControlCallbacks& getControlCallbacks() { return mControlCallbacks; } setControlCallbacks(const LocationControlCallbacks & controlCallbacks)479 void setControlCallbacks(const LocationControlCallbacks& controlCallbacks) 480 { mControlCallbacks = controlCallbacks; } setAfwControlId(uint32_t id)481 void setAfwControlId(uint32_t id) { mAfwControlId = id; } getAfwControlId()482 uint32_t getAfwControlId() { return mAfwControlId; } isInSession()483 virtual bool isInSession() { return !mTimeBasedTrackingSessions.empty(); } 484 void initDefaultAgps(); 485 bool initEngHubProxy(); 486 void initCDFWService(); 487 void odcpiTimerExpireEvent(); 488 489 /* ==== REPORTS ======================================================================== */ 490 /* ======== EVENTS ====(Called from QMI/EngineHub Thread)===================================== */ 491 virtual void reportPositionEvent(const UlpLocation& ulpLocation, 492 const GpsLocationExtended& locationExtended, 493 enum loc_sess_status status, 494 LocPosTechMask techMask, 495 GnssDataNotification* pDataNotify = nullptr, 496 int msInWeek = -1); 497 virtual void reportEnginePositionsEvent(unsigned int count, 498 EngineLocationInfo* locationArr); 499 500 virtual void reportSvEvent(const GnssSvNotification& svNotify, 501 bool fromEngineHub=false); 502 virtual void reportNmeaEvent(const char* nmea, size_t length); 503 virtual void reportDataEvent(const GnssDataNotification& dataNotify, int msInWeek); 504 virtual bool requestNiNotifyEvent(const GnssNiNotification& notify, const void* data, 505 const LocInEmergency emergencyState); 506 virtual void reportGnssMeasurementsEvent(const GnssMeasurements& gnssMeasurements, 507 int msInWeek); 508 virtual void reportSvPolynomialEvent(GnssSvPolynomial &svPolynomial); 509 virtual void reportSvEphemerisEvent(GnssSvEphemerisReport & svEphemeris); 510 virtual void reportGnssSvIdConfigEvent(const GnssSvIdConfig& config); 511 virtual void reportGnssSvTypeConfigEvent(const GnssSvTypeConfig& config); 512 virtual void reportGnssConfigEvent(uint32_t sessionId, const GnssConfig& gnssConfig); 513 virtual bool reportGnssEngEnergyConsumedEvent(uint64_t energyConsumedSinceFirstBoot); 514 virtual void reportLocationSystemInfoEvent(const LocationSystemInfo& locationSystemInfo); 515 516 virtual bool requestATL(int connHandle, LocAGpsType agps_type, LocApnTypeMask apn_type_mask); 517 virtual bool releaseATL(int connHandle); 518 virtual bool requestOdcpiEvent(OdcpiRequestInfo& request); 519 virtual bool reportDeleteAidingDataEvent(GnssAidingData& aidingData); 520 virtual bool reportKlobucharIonoModelEvent(GnssKlobucharIonoModel& ionoModel); 521 virtual bool reportGnssAdditionalSystemInfoEvent( 522 GnssAdditionalSystemInfo& additionalSystemInfo); 523 virtual void reportNfwNotificationEvent(GnssNfwNotification& notification); 524 virtual void reportLatencyInfoEvent(const GnssLatencyInfo& gnssLatencyInfo); 525 virtual bool reportQwesCapabilities 526 ( 527 const std::unordered_map<LocationQwesFeatureType, bool> &featureMap 528 ); 529 void reportPdnTypeFromWds(int pdnType, AGpsExtType agpsType, std::string apnName, 530 AGpsBearerType bearerType); 531 532 /* ======== UTILITIES ================================================================= */ 533 bool needReportForGnssClient(const UlpLocation& ulpLocation, 534 enum loc_sess_status status, LocPosTechMask techMask); 535 bool needReportForFlpClient(enum loc_sess_status status, LocPosTechMask techMask); 536 bool needToGenerateNmeaReport(const uint32_t &gpsTimeOfWeekMs, 537 const struct timespec32_t &apTimeStamp); 538 void reportPosition(const UlpLocation &ulpLocation, 539 const GpsLocationExtended &locationExtended, 540 enum loc_sess_status status, 541 LocPosTechMask techMask); 542 void reportEnginePositions(unsigned int count, 543 const EngineLocationInfo* locationArr); 544 void reportSv(GnssSvNotification& svNotify); 545 void reportNmea(const char* nmea, size_t length); 546 void reportData(GnssDataNotification& dataNotify); 547 bool requestNiNotify(const GnssNiNotification& notify, const void* data, 548 const bool bInformNiAccept); 549 void reportGnssMeasurementData(const GnssMeasurementsNotification& measurements); 550 void reportGnssSvIdConfig(const GnssSvIdConfig& config); 551 void reportGnssSvTypeConfig(const GnssSvTypeConfig& config); 552 void reportGnssConfig(uint32_t sessionId, const GnssConfig& gnssConfig); 553 void requestOdcpi(const OdcpiRequestInfo& request); 554 void invokeGnssEnergyConsumedCallback(uint64_t energyConsumedSinceFirstBoot); 555 void saveGnssEnergyConsumedCallback(GnssEnergyConsumedCallback energyConsumedCb); 556 void reportLocationSystemInfo(const LocationSystemInfo & locationSystemInfo); reportNfwNotification(const GnssNfwNotification & notification)557 inline void reportNfwNotification(const GnssNfwNotification& notification) { 558 if (NULL != mNfwCb) { 559 mNfwCb(notification); 560 } 561 } getE911State(void)562 inline bool getE911State(void) { 563 if (NULL != mIsE911Session) { 564 return mIsE911Session(); 565 } 566 return false; 567 } 568 569 void updateSystemPowerState(PowerStateType systemPowerState); 570 void reportSvPolynomial(const GnssSvPolynomial &svPolynomial); 571 572 573 std::vector<double> parseDoublesString(char* dString); 574 void reportGnssAntennaInformation(const antennaInfoCb antennaInfoCallback); 575 576 /*======== GNSSDEBUG ================================================================*/ 577 bool getDebugReport(GnssDebugReport& report); 578 /* get AGC information from system status and fill it */ 579 void getAgcInformation(GnssMeasurementsNotification& measurements, int msInWeek); 580 /* get Data information from system status and fill it */ 581 void getDataInformation(GnssDataNotification& data, int msInWeek); 582 583 /*==== SYSTEM STATUS ================================================================*/ getSystemStatus(void)584 inline SystemStatus* getSystemStatus(void) { return mSystemStatus; } getServerUrl(void)585 std::string& getServerUrl(void) { return mServerUrl; } getMoServerUrl(void)586 std::string& getMoServerUrl(void) { return mMoServerUrl; } 587 588 /*==== CONVERSION ===================================================================*/ 589 static uint32_t convertSuplVersion(const GnssConfigSuplVersion suplVersion); 590 static uint32_t convertEP4ES(const GnssConfigEmergencyPdnForEmergencySupl); 591 static uint32_t convertSuplEs(const GnssConfigSuplEmergencyServices suplEmergencyServices); 592 static uint32_t convertLppeCp(const GnssConfigLppeControlPlaneMask lppeControlPlaneMask); 593 static uint32_t convertLppeUp(const GnssConfigLppeUserPlaneMask lppeUserPlaneMask); 594 static uint32_t convertAGloProt(const GnssConfigAGlonassPositionProtocolMask); 595 static uint32_t convertSuplMode(const GnssConfigSuplModeMask suplModeMask); 596 static void convertSatelliteInfo(std::vector<GnssDebugSatelliteInfo>& out, 597 const GnssSvType& in_constellation, 598 const SystemStatusReports& in); 599 static bool convertToGnssSvIdConfig( 600 const std::vector<GnssSvIdSource>& blacklistedSvIds, GnssSvIdConfig& config); 601 static void convertFromGnssSvIdConfig( 602 const GnssSvIdConfig& svConfig, std::vector<GnssSvIdSource>& blacklistedSvIds); 603 static void convertGnssSvIdMaskToList( 604 uint64_t svIdMask, std::vector<GnssSvIdSource>& svIds, 605 GnssSvId initialSvId, GnssSvType svType); 606 static void computeVRPBasedLla(const UlpLocation& loc, GpsLocationExtended& locExt, 607 const LeverArmConfigInfo& leverArmConfigInfo); 608 609 void injectLocationCommand(double latitude, double longitude, float accuracy); 610 void injectLocationExtCommand(const GnssLocationInfoNotification &locationInfo); 611 612 void injectTimeCommand(int64_t time, int64_t timeReference, int32_t uncertainty); 613 void blockCPICommand(double latitude, double longitude, float accuracy, 614 int blockDurationMsec, double latLonDiffThreshold); 615 616 /* ==== MISCELLANEOUS ================================================================== */ 617 /* ======== COMMANDS ====(Called from Client Thread)==================================== */ 618 void getPowerStateChangesCommand(std::function<void(bool)> powerStateCb); 619 /* ======== UTILITIES ================================================================== */ 620 void reportPowerStateIfChanged(); savePowerStateCallback(std::function<void (bool)> powerStateCb)621 void savePowerStateCallback(std::function<void(bool)> powerStateCb){ 622 mPowerStateCb = powerStateCb; } getPowerState()623 bool getPowerState() { return mPowerOn; } getSystemPowerState()624 inline PowerStateType getSystemPowerState() { return mSystemPowerState; } 625 setAllowFlpNetworkFixes(uint32_t allow)626 void setAllowFlpNetworkFixes(uint32_t allow) { mAllowFlpNetworkFixes = allow; } getAllowFlpNetworkFixes()627 uint32_t getAllowFlpNetworkFixes() { return mAllowFlpNetworkFixes; } 628 void setSuplHostServer(const char* server, int port, LocServerType type); 629 void notifyClientOfCachedLocationSystemInfo(LocationAPI* client, 630 const LocationCallbacks& callbacks); 631 LocationCapabilitiesMask getCapabilities(); 632 void updateSystemPowerStateCommand(PowerStateType systemPowerState); 633 634 /*==== DGnss Usable Report Flag ====================================================*/ setDGnssUsableFLag(bool dGnssNeedReport)635 inline void setDGnssUsableFLag(bool dGnssNeedReport) { mDGnssNeedReport = dGnssNeedReport;} isNMEAPrintEnabled()636 inline bool isNMEAPrintEnabled() { 637 return ((mContext != NULL) && (0 != mContext->mGps_conf.ENABLE_NMEA_PRINT)); 638 } 639 640 /*==== DGnss Ntrip Source ==========================================================*/ updateNTRIPGGAConsentCommand(bool consentAccepted)641 void updateNTRIPGGAConsentCommand(bool consentAccepted) { mSendNmeaConsent = consentAccepted; } 642 void enablePPENtripStreamCommand(const GnssNtripConnectionParams& params, bool enableRTKEngine); 643 void disablePPENtripStreamCommand(); 644 void handleEnablePPENtrip(const GnssNtripConnectionParams& params); 645 void handleDisablePPENtrip(); 646 void reportGGAToNtrip(const char* nmea); isDgnssNmeaRequired()647 inline bool isDgnssNmeaRequired() { return mSendNmeaConsent && 648 mStartDgnssNtripParams.ntripParams.requiresNmeaLocation;} 649 }; 650 651 #endif //GNSS_ADAPTER_H 652