1 /* Copyright (c) 2011-2014, 2016-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 LOC_API_BASE_H 30 #define LOC_API_BASE_H 31 32 #include <stddef.h> 33 #include <ctype.h> 34 #include <gps_extended.h> 35 #include <LocationAPI.h> 36 #include <MsgTask.h> 37 #include <LocSharedLock.h> 38 #include <log_util.h> 39 #ifdef NO_UNORDERED_SET_OR_MAP 40 #include <map> 41 #else 42 #include <unordered_map> 43 #endif 44 #include <inttypes.h> 45 #include <functional> 46 47 using namespace loc_util; 48 49 namespace loc_core { 50 51 class ContextBase; 52 struct LocApiResponse; 53 template <typename> struct LocApiResponseData; 54 55 int hexcode(char *hexstring, int string_size, 56 const char *data, int data_size); 57 int decodeAddress(char *addr_string, int string_size, 58 const char *data, int data_size); 59 60 #define MAX_ADAPTERS 10 61 #define MAX_FEATURE_LENGTH 100 62 63 #define TO_ALL_ADAPTERS(adapters, call) \ 64 for (int i = 0; i < MAX_ADAPTERS && NULL != (adapters)[i]; i++) { \ 65 call; \ 66 } 67 68 #define TO_1ST_HANDLING_ADAPTER(adapters, call) \ 69 for (int i = 0; i <MAX_ADAPTERS && NULL != (adapters)[i] && !(call); i++); 70 71 class LocAdapterBase; 72 struct LocSsrMsg; 73 struct LocOpenMsg; 74 75 typedef struct 76 { 77 uint32_t accumulatedDistance; 78 uint32_t numOfBatchedPositions; 79 } LocApiBatchData; 80 81 typedef struct 82 { 83 uint32_t hwId; 84 } LocApiGeofenceData; 85 86 struct LocApiMsg: LocMsg { 87 private: 88 std::function<void ()> mProcImpl; procLocApiMsg89 inline virtual void proc() const { 90 mProcImpl(); 91 } 92 public: LocApiMsgLocApiMsg93 inline LocApiMsg(std::function<void ()> procImpl ) : 94 mProcImpl(procImpl) {} 95 }; 96 97 class LocApiProxyBase { 98 public: LocApiProxyBase()99 inline LocApiProxyBase() {} ~LocApiProxyBase()100 inline virtual ~LocApiProxyBase() {} getSibling2()101 inline virtual void* getSibling2() { return NULL; } getGloRfLoss(uint32_t left,uint32_t center,uint32_t right,uint8_t gloFrequency)102 inline virtual double getGloRfLoss(uint32_t left, 103 uint32_t center, uint32_t right, uint8_t gloFrequency) { return 0.0; } 104 }; 105 106 class LocApiBase { 107 friend struct LocSsrMsg; 108 //LocOpenMsg calls open() which makes it necessary to declare 109 //it as a friend 110 friend struct LocOpenMsg; 111 friend struct LocCloseMsg; 112 friend struct LocKillMsg; 113 friend class ContextBase; 114 static MsgTask* mMsgTask; 115 static volatile int32_t mMsgTaskRefCount; 116 LocAdapterBase* mLocAdapters[MAX_ADAPTERS]; 117 118 protected: 119 ContextBase *mContext; 120 virtual enum loc_api_adapter_err 121 open(LOC_API_ADAPTER_EVENT_MASK_T mask); 122 virtual enum loc_api_adapter_err 123 close(); 124 LOC_API_ADAPTER_EVENT_MASK_T getEvtMask(); 125 LOC_API_ADAPTER_EVENT_MASK_T mMask; 126 uint32_t mNmeaMask; 127 LocApiBase(LOC_API_ADAPTER_EVENT_MASK_T excludedMask, 128 ContextBase* context = NULL); ~LocApiBase()129 inline virtual ~LocApiBase() { 130 android_atomic_dec(&mMsgTaskRefCount); 131 if (nullptr != mMsgTask && 0 == mMsgTaskRefCount) { 132 delete mMsgTask; 133 mMsgTask = nullptr; 134 } 135 } 136 bool isInSession(); 137 const LOC_API_ADAPTER_EVENT_MASK_T mExcludedMask; 138 bool isMaster(); 139 140 public: sendMsg(const LocMsg * msg)141 inline void sendMsg(const LocMsg* msg) const { 142 if (nullptr != mMsgTask) { 143 mMsgTask->sendMsg(msg); 144 } 145 } destroy()146 inline void destroy() { 147 close(); 148 struct LocKillMsg : public LocMsg { 149 LocApiBase* mLocApi; 150 inline LocKillMsg(LocApiBase* locApi) : LocMsg(), mLocApi(locApi) {} 151 inline virtual void proc() const { 152 delete mLocApi; 153 } 154 }; 155 sendMsg(new LocKillMsg(this)); 156 } 157 158 static bool needReport(const UlpLocation& ulpLocation, 159 enum loc_sess_status status, 160 LocPosTechMask techMask); 161 162 void addAdapter(LocAdapterBase* adapter); 163 void removeAdapter(LocAdapterBase* adapter); 164 165 // upward calls 166 void handleEngineUpEvent(); 167 void handleEngineDownEvent(); 168 void reportPosition(UlpLocation& location, 169 GpsLocationExtended& locationExtended, 170 enum loc_sess_status status, 171 LocPosTechMask loc_technology_mask = 172 LOC_POS_TECH_MASK_DEFAULT, 173 GnssDataNotification* pDataNotify = nullptr, 174 int msInWeek = -1); 175 void reportSv(GnssSvNotification& svNotify); 176 void reportSvPolynomial(GnssSvPolynomial &svPolynomial); 177 void reportSvEphemeris(GnssSvEphemerisReport &svEphemeris); 178 void reportStatus(LocGpsStatusValue status); 179 void reportNmea(const char* nmea, int length); 180 void reportData(GnssDataNotification& dataNotify, int msInWeek); 181 void reportXtraServer(const char* url1, const char* url2, 182 const char* url3, const int maxlength); 183 void reportLocationSystemInfo(const LocationSystemInfo& locationSystemInfo); 184 void requestXtraData(); 185 void requestTime(); 186 void requestLocation(); 187 void requestATL(int connHandle, LocAGpsType agps_type, LocApnTypeMask apn_type_mask); 188 void releaseATL(int connHandle); 189 void requestNiNotify(GnssNiNotification ¬ify, const void* data, 190 const LocInEmergency emergencyState); 191 void reportGnssMeasurements(GnssMeasurements& gnssMeasurements, int msInWeek); 192 void reportWwanZppFix(LocGpsLocation &zppLoc); 193 void reportZppBestAvailableFix(LocGpsLocation &zppLoc, GpsLocationExtended &location_extended, 194 LocPosTechMask tech_mask); 195 void reportGnssSvIdConfig(const GnssSvIdConfig& config); 196 void reportGnssSvTypeConfig(const GnssSvTypeConfig& config); 197 void requestOdcpi(OdcpiRequestInfo& request); 198 void reportGnssEngEnergyConsumedEvent(uint64_t energyConsumedSinceFirstBoot); 199 void reportDeleteAidingDataEvent(GnssAidingData& aidingData); 200 void reportKlobucharIonoModel(GnssKlobucharIonoModel& ionoModel); 201 void reportGnssAdditionalSystemInfo(GnssAdditionalSystemInfo& additionalSystemInfo); 202 void sendNfwNotification(GnssNfwNotification& notification); 203 void reportGnssConfig(uint32_t sessionId, const GnssConfig& gnssConfig); 204 void reportLatencyInfo(GnssLatencyInfo& gnssLatencyInfo); 205 void reportQwesCapabilities 206 ( 207 const std::unordered_map<LocationQwesFeatureType, bool> &featureMap 208 ); 209 210 void geofenceBreach(size_t count, uint32_t* hwIds, Location& location, 211 GeofenceBreachType breachType, uint64_t timestamp); 212 void geofenceStatus(GeofenceStatusAvailable available); 213 void reportDBTPosition(UlpLocation &location, 214 GpsLocationExtended &locationExtended, 215 enum loc_sess_status status, 216 LocPosTechMask loc_technology_mask); 217 void reportLocations(Location* locations, size_t count, BatchingMode batchingMode); 218 void reportCompletedTrips(uint32_t accumulated_distance); 219 void handleBatchStatusEvent(BatchingStatus batchStatus); 220 221 // downward calls 222 virtual void* getSibling(); 223 virtual LocApiProxyBase* getLocApiProxy(); 224 virtual void startFix(const LocPosMode& fixCriteria, LocApiResponse* adapterResponse); 225 virtual void stopFix(LocApiResponse* adapterResponse); 226 virtual void deleteAidingData(const GnssAidingData& data, LocApiResponse* adapterResponse); 227 virtual void injectPosition(double latitude, double longitude, float accuracy, 228 bool onDemandCpi); 229 virtual void injectPosition(const GnssLocationInfoNotification &locationInfo, 230 bool onDemandCpi=false); 231 virtual void injectPosition(const Location& location, bool onDemandCpi); 232 virtual void setTime(LocGpsUtcTime time, int64_t timeReference, int uncertainty); 233 virtual void atlOpenStatus(int handle, int is_succ, char* apn, uint32_t apnLen, 234 AGpsBearerType bear, LocAGpsType agpsType, LocApnTypeMask mask); 235 virtual void atlCloseStatus(int handle, int is_succ); 236 virtual LocationError setServerSync(const char* url, int len, LocServerType type); 237 virtual LocationError setServerSync(unsigned int ip, int port, LocServerType type); 238 virtual void informNiResponse(GnssNiResponse userResponse, const void* passThroughData); 239 virtual LocationError setSUPLVersionSync(GnssConfigSuplVersion version); 240 virtual enum loc_api_adapter_err setNMEATypesSync(uint32_t typesMask); 241 virtual LocationError setLPPConfigSync(GnssConfigLppProfileMask profileMask); 242 virtual enum loc_api_adapter_err setSensorPropertiesSync( 243 bool gyroBiasVarianceRandomWalk_valid, float gyroBiasVarianceRandomWalk, 244 bool accelBiasVarianceRandomWalk_valid, float accelBiasVarianceRandomWalk, 245 bool angleBiasVarianceRandomWalk_valid, float angleBiasVarianceRandomWalk, 246 bool rateBiasVarianceRandomWalk_valid, float rateBiasVarianceRandomWalk, 247 bool velocityBiasVarianceRandomWalk_valid, float velocityBiasVarianceRandomWalk); 248 virtual enum loc_api_adapter_err setSensorPerfControlConfigSync(int controlMode, 249 int accelSamplesPerBatch, int accelBatchesPerSec, int gyroSamplesPerBatch, 250 int gyroBatchesPerSec, int accelSamplesPerBatchHigh, int accelBatchesPerSecHigh, 251 int gyroSamplesPerBatchHigh, int gyroBatchesPerSecHigh, int algorithmConfig); 252 virtual LocationError 253 setAGLONASSProtocolSync(GnssConfigAGlonassPositionProtocolMask aGlonassProtocol); 254 virtual LocationError setLPPeProtocolCpSync(GnssConfigLppeControlPlaneMask lppeCP); 255 virtual LocationError setLPPeProtocolUpSync(GnssConfigLppeUserPlaneMask lppeUP); 256 virtual GnssConfigSuplVersion convertSuplVersion(const uint32_t suplVersion); 257 virtual GnssConfigLppeControlPlaneMask convertLppeCp(const uint32_t lppeControlPlaneMask); 258 virtual GnssConfigLppeUserPlaneMask convertLppeUp(const uint32_t lppeUserPlaneMask); 259 virtual LocationError setEmergencyExtensionWindowSync(const uint32_t emergencyExtensionSeconds); 260 virtual void setMeasurementCorrections( 261 const GnssMeasurementCorrections& gnssMeasurementCorrections); 262 263 virtual void getWwanZppFix(); 264 virtual void getBestAvailableZppFix(); 265 virtual LocationError setGpsLockSync(GnssConfigGpsLock lock); 266 virtual void requestForAidingData(GnssAidingDataSvMask svDataMask); 267 virtual LocationError setXtraVersionCheckSync(uint32_t check); 268 /* Requests for SV/Constellation Control */ 269 virtual LocationError setBlacklistSvSync(const GnssSvIdConfig& config); 270 virtual void setBlacklistSv(const GnssSvIdConfig& config, 271 LocApiResponse *adapterResponse=nullptr); 272 virtual void getBlacklistSv(); 273 virtual void setConstellationControl(const GnssSvTypeConfig& config, 274 LocApiResponse *adapterResponse=nullptr); 275 virtual void getConstellationControl(); 276 virtual void resetConstellationControl(LocApiResponse *adapterResponse=nullptr); 277 278 virtual void setConstrainedTuncMode(bool enabled, 279 float tuncConstraint, 280 uint32_t energyBudget, 281 LocApiResponse* adapterResponse=nullptr); 282 virtual void setPositionAssistedClockEstimatorMode(bool enabled, 283 LocApiResponse* adapterResponse=nullptr); 284 virtual void getGnssEnergyConsumed(); 285 286 virtual void addGeofence(uint32_t clientId, const GeofenceOption& options, 287 const GeofenceInfo& info, LocApiResponseData<LocApiGeofenceData>* adapterResponseData); 288 virtual void removeGeofence(uint32_t hwId, uint32_t clientId, LocApiResponse* adapterResponse); 289 virtual void pauseGeofence(uint32_t hwId, uint32_t clientId, LocApiResponse* adapterResponse); 290 virtual void resumeGeofence(uint32_t hwId, uint32_t clientId, LocApiResponse* adapterResponse); 291 virtual void modifyGeofence(uint32_t hwId, uint32_t clientId, const GeofenceOption& options, 292 LocApiResponse* adapterResponse); 293 294 virtual void startTimeBasedTracking(const TrackingOptions& options, 295 LocApiResponse* adapterResponse); 296 virtual void stopTimeBasedTracking(LocApiResponse* adapterResponse); 297 virtual void startDistanceBasedTracking(uint32_t sessionId, const LocationOptions& options, 298 LocApiResponse* adapterResponse); 299 virtual void stopDistanceBasedTracking(uint32_t sessionId, 300 LocApiResponse* adapterResponse = nullptr); 301 virtual void startBatching(uint32_t sessionId, const LocationOptions& options, 302 uint32_t accuracy, uint32_t timeout, LocApiResponse* adapterResponse); 303 virtual void stopBatching(uint32_t sessionId, LocApiResponse* adapterResponse); 304 virtual LocationError startOutdoorTripBatchingSync(uint32_t tripDistance, 305 uint32_t tripTbf, uint32_t timeout); 306 virtual void startOutdoorTripBatching(uint32_t tripDistance, 307 uint32_t tripTbf, uint32_t timeout, LocApiResponse* adapterResponse); 308 virtual void reStartOutdoorTripBatching(uint32_t ongoingTripDistance, 309 uint32_t ongoingTripInterval, uint32_t batchingTimeout, 310 LocApiResponse* adapterResponse); 311 virtual LocationError stopOutdoorTripBatchingSync(bool deallocBatchBuffer = true); 312 virtual void stopOutdoorTripBatching(bool deallocBatchBuffer = true, 313 LocApiResponse* adapterResponse = nullptr); 314 virtual LocationError getBatchedLocationsSync(size_t count); 315 virtual void getBatchedLocations(size_t count, LocApiResponse* adapterResponse); 316 virtual LocationError getBatchedTripLocationsSync(size_t count, uint32_t accumulatedDistance); 317 virtual void getBatchedTripLocations(size_t count, uint32_t accumulatedDistance, 318 LocApiResponse* adapterResponse); 319 virtual LocationError queryAccumulatedTripDistanceSync(uint32_t &accumulated_trip_distance, 320 uint32_t &numOfBatchedPositions); 321 virtual void queryAccumulatedTripDistance( 322 LocApiResponseData<LocApiBatchData>* adapterResponseData); 323 virtual void setBatchSize(size_t size); 324 virtual void setTripBatchSize(size_t size); 325 virtual void addToCallQueue(LocApiResponse* adapterResponse); 326 327 void updateEvtMask(); 328 void updateNmeaMask(uint32_t mask); 329 330 virtual void updateSystemPowerState(PowerStateType systemPowerState); 331 332 virtual void configRobustLocation(bool enable, bool enableForE911, 333 LocApiResponse* adapterResponse=nullptr); 334 virtual void getRobustLocationConfig(uint32_t sessionId, LocApiResponse* adapterResponse); 335 virtual void configMinGpsWeek(uint16_t minGpsWeek, 336 LocApiResponse* adapterResponse=nullptr); 337 virtual void getMinGpsWeek(uint32_t sessionId, LocApiResponse* adapterResponse); 338 339 virtual LocationError setParameterSync(const GnssConfig & gnssConfig); 340 virtual void getParameter(uint32_t sessionId, GnssConfigFlagsMask flags, 341 LocApiResponse* adapterResponse=nullptr); 342 343 virtual void configConstellationMultiBand(const GnssSvTypeConfig& secondaryBandConfig, 344 LocApiResponse* adapterResponse=nullptr); 345 virtual void getConstellationMultiBandConfig(uint32_t sessionId, 346 LocApiResponse* adapterResponse=nullptr); 347 }; 348 349 class ElapsedRealtimeEstimator { 350 private: 351 int64_t mCurrentClockDiff; 352 int64_t mPrevUtcTimeNanos; 353 int64_t mPrevBootTimeNanos; 354 int64_t mFixTimeStablizationThreshold; 355 int64_t mInitialTravelTime; 356 int64_t mPrevDataTimeNanos; 357 public: 358 ElapsedRealtimeEstimator(int64_t travelTimeNanosEstimate)359 ElapsedRealtimeEstimator(int64_t travelTimeNanosEstimate): 360 mInitialTravelTime(travelTimeNanosEstimate) {reset();} 361 int64_t getElapsedRealtimeEstimateNanos(int64_t curDataTimeNanos, 362 bool isCurDataTimeTrustable, int64_t tbf); getElapsedRealtimeUncNanos()363 inline int64_t getElapsedRealtimeUncNanos() { return 5000000;} 364 void reset(); 365 366 static int64_t getElapsedRealtimeQtimer(int64_t qtimerTicksAtOrigin); 367 static bool getCurrentTime(struct timespec& currentTime, int64_t& sinceBootTimeNanos); 368 }; 369 370 typedef LocApiBase* (getLocApi_t)(LOC_API_ADAPTER_EVENT_MASK_T exMask, 371 ContextBase *context); 372 373 } // namespace loc_core 374 375 #endif //LOC_API_BASE_H 376