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 &notify, 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