• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
30 #include "GnssAdapter.h"
31 #include "location_interface.h"
32 
33 static GnssAdapter* gGnssAdapter = NULL;
34 
35 static void initialize();
36 static void deinitialize();
37 
38 static void addClient(LocationAPI* client, const LocationCallbacks& callbacks);
39 static void removeClient(LocationAPI* client, removeClientCompleteCallback rmClientCb);
40 static void requestCapabilities(LocationAPI* client);
41 
42 static uint32_t startTracking(LocationAPI* client, TrackingOptions&);
43 static void updateTrackingOptions(LocationAPI* client, uint32_t id, TrackingOptions&);
44 static void stopTracking(LocationAPI* client, uint32_t id);
45 
46 static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response);
47 static uint32_t gnssDeleteAidingData(GnssAidingData& data);
48 static void gnssUpdateXtraThrottle(const bool enabled);
49 
50 static void setControlCallbacks(LocationControlCallbacks& controlCallbacks);
51 static uint32_t enable(LocationTechnologyType techType);
52 static void disable(uint32_t id);
53 static uint32_t* gnssUpdateConfig(GnssConfig config);
54 static uint32_t* gnssGetConfig(GnssConfigFlagsMask mask);
55 
56 static void gnssUpdateSvTypeConfig(GnssSvTypeConfig& config);
57 static void gnssGetSvTypeConfig(GnssSvTypeConfigCallback& callback);
58 static void gnssResetSvTypeConfig();
59 
60 static void injectLocation(double latitude, double longitude, float accuracy);
61 static void injectLocationExt(const GnssLocationInfoNotification &locationInfo);
62 static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty);
63 
64 static void agpsInit(const AgpsCbInfo& cbInfo);
65 static void agpsDataConnOpen(AGpsExtType agpsType, const char* apnName, int apnLen, int ipType);
66 static void agpsDataConnClosed(AGpsExtType agpsType);
67 static void agpsDataConnFailed(AGpsExtType agpsType);
68 static void getDebugReport(GnssDebugReport& report);
69 static void updateConnectionStatus(bool connected, int8_t type, bool roaming = false,
70                                    NetworkHandle networkHandle = NETWORK_HANDLE_UNKNOWN);
71 static void getGnssEnergyConsumed(GnssEnergyConsumedCallback energyConsumedCb);
72 static void enableNfwLocationAccess(bool enable);
73 static void nfwInit(const NfwCbInfo& cbInfo);
74 static void getPowerStateChanges(void* powerStateCb);
75 
76 static void odcpiInit(const OdcpiRequestCallback& callback);
77 static void odcpiInject(const Location& location);
78 
79 static void blockCPI(double latitude, double longitude, float accuracy,
80                      int blockDurationMsec, double latLonDiffThreshold);
81 static void updateBatteryStatus(bool charging);
82 static void updateSystemPowerState(PowerStateType systemPowerState);
83 static uint32_t setConstrainedTunc (bool enable, float tuncConstraint,
84                                     uint32_t energyBudget);
85 static uint32_t setPositionAssistedClockEstimator(bool enable);
86 static uint32_t gnssUpdateSvConfig(const GnssSvTypeConfig& svTypeConfig,
87                                    const GnssSvIdConfig& svIdConfig);
88 static uint32_t gnssResetSvConfig();
89 static uint32_t configLeverArm(const LeverArmConfigInfo& configInfo);
90 static uint32_t configRobustLocation(bool enable, bool enableForE911);
91 
92 static const GnssInterface gGnssInterface = {
93     sizeof(GnssInterface),
94     initialize,
95     deinitialize,
96     addClient,
97     removeClient,
98     requestCapabilities,
99     startTracking,
100     updateTrackingOptions,
101     stopTracking,
102     gnssNiResponse,
103     setControlCallbacks,
104     enable,
105     disable,
106     gnssUpdateConfig,
107     gnssGetConfig,
108     gnssUpdateSvTypeConfig,
109     gnssGetSvTypeConfig,
110     gnssResetSvTypeConfig,
111     gnssDeleteAidingData,
112     gnssUpdateXtraThrottle,
113     injectLocation,
114     injectTime,
115     agpsInit,
116     agpsDataConnOpen,
117     agpsDataConnClosed,
118     agpsDataConnFailed,
119     getDebugReport,
120     updateConnectionStatus,
121     odcpiInit,
122     odcpiInject,
123     blockCPI,
124     getGnssEnergyConsumed,
125     enableNfwLocationAccess,
126     nfwInit,
127     getPowerStateChanges,
128     injectLocationExt,
129     updateBatteryStatus,
130     updateSystemPowerState,
131     setConstrainedTunc,
132     setPositionAssistedClockEstimator,
133     gnssUpdateSvConfig,
134     gnssResetSvConfig,
135     configLeverArm,
136     configRobustLocation,
137 };
138 
139 #ifndef DEBUG_X86
getGnssInterface()140 extern "C" const GnssInterface* getGnssInterface()
141 #else
142 const GnssInterface* getGnssInterface()
143 #endif // DEBUG_X86
144 {
145    gGnssInterface.initialize();
146    return &gGnssInterface;
147 }
148 
initialize()149 static void initialize()
150 {
151     if (NULL == gGnssAdapter) {
152         gGnssAdapter = new GnssAdapter();
153     }
154 }
155 
deinitialize()156 static void deinitialize()
157 {
158     if (NULL != gGnssAdapter) {
159         delete gGnssAdapter;
160         gGnssAdapter = NULL;
161     }
162 }
163 
addClient(LocationAPI * client,const LocationCallbacks & callbacks)164 static void addClient(LocationAPI* client, const LocationCallbacks& callbacks)
165 {
166     if (NULL != gGnssAdapter) {
167         gGnssAdapter->addClientCommand(client, callbacks);
168     }
169 }
170 
removeClient(LocationAPI * client,removeClientCompleteCallback rmClientCb)171 static void removeClient(LocationAPI* client, removeClientCompleteCallback rmClientCb)
172 {
173     if (NULL != gGnssAdapter) {
174         gGnssAdapter->removeClientCommand(client, rmClientCb);
175     }
176 }
177 
requestCapabilities(LocationAPI * client)178 static void requestCapabilities(LocationAPI* client)
179 {
180     if (NULL != gGnssAdapter) {
181         gGnssAdapter->requestCapabilitiesCommand(client);
182     }
183 }
184 
startTracking(LocationAPI * client,TrackingOptions & trackingOptions)185 static uint32_t startTracking(
186         LocationAPI* client, TrackingOptions& trackingOptions)
187 {
188     if (NULL != gGnssAdapter) {
189         return gGnssAdapter->startTrackingCommand(client, trackingOptions);
190     } else {
191         return 0;
192     }
193 }
194 
updateTrackingOptions(LocationAPI * client,uint32_t id,TrackingOptions & trackingOptions)195 static void updateTrackingOptions(
196         LocationAPI* client, uint32_t id, TrackingOptions& trackingOptions)
197 {
198     if (NULL != gGnssAdapter) {
199         gGnssAdapter->updateTrackingOptionsCommand(
200                 client, id, trackingOptions);
201     }
202 }
203 
stopTracking(LocationAPI * client,uint32_t id)204 static void stopTracking(LocationAPI* client, uint32_t id)
205 {
206     if (NULL != gGnssAdapter) {
207         gGnssAdapter->stopTrackingCommand(client, id);
208     }
209 }
210 
gnssNiResponse(LocationAPI * client,uint32_t id,GnssNiResponse response)211 static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response)
212 {
213     if (NULL != gGnssAdapter) {
214         gGnssAdapter->gnssNiResponseCommand(client, id, response);
215     }
216 }
217 
setControlCallbacks(LocationControlCallbacks & controlCallbacks)218 static void setControlCallbacks(LocationControlCallbacks& controlCallbacks)
219 {
220     if (NULL != gGnssAdapter) {
221         gGnssAdapter->setControlCallbacksCommand(controlCallbacks);
222     }
223 }
224 
enable(LocationTechnologyType techType)225 static uint32_t enable(LocationTechnologyType techType)
226 {
227     if (NULL != gGnssAdapter) {
228         return gGnssAdapter->enableCommand(techType);
229     } else {
230         return 0;
231     }
232 }
233 
disable(uint32_t id)234 static void disable(uint32_t id)
235 {
236     if (NULL != gGnssAdapter) {
237         gGnssAdapter->disableCommand(id);
238     }
239 }
240 
gnssUpdateConfig(GnssConfig config)241 static uint32_t* gnssUpdateConfig(GnssConfig config)
242 {
243     if (NULL != gGnssAdapter) {
244         return gGnssAdapter->gnssUpdateConfigCommand(config);
245     } else {
246         return NULL;
247     }
248 }
249 
gnssGetConfig(GnssConfigFlagsMask mask)250 static uint32_t* gnssGetConfig(GnssConfigFlagsMask mask)
251 {
252     if (NULL != gGnssAdapter) {
253         return gGnssAdapter->gnssGetConfigCommand(mask);
254     } else {
255         return NULL;
256     }
257 }
258 
gnssUpdateSvTypeConfig(GnssSvTypeConfig & config)259 static void gnssUpdateSvTypeConfig(GnssSvTypeConfig& config)
260 {
261     if (NULL != gGnssAdapter) {
262         gGnssAdapter->gnssUpdateSvTypeConfigCommand(config);
263     }
264 }
265 
gnssGetSvTypeConfig(GnssSvTypeConfigCallback & callback)266 static void gnssGetSvTypeConfig(GnssSvTypeConfigCallback& callback)
267 {
268     if (NULL != gGnssAdapter) {
269         gGnssAdapter->gnssGetSvTypeConfigCommand(callback);
270     }
271 }
272 
gnssResetSvTypeConfig()273 static void gnssResetSvTypeConfig()
274 {
275     if (NULL != gGnssAdapter) {
276         gGnssAdapter->gnssResetSvTypeConfigCommand();
277     }
278 }
279 
gnssDeleteAidingData(GnssAidingData & data)280 static uint32_t gnssDeleteAidingData(GnssAidingData& data)
281 {
282     if (NULL != gGnssAdapter) {
283         return gGnssAdapter->gnssDeleteAidingDataCommand(data);
284     } else {
285         return 0;
286     }
287 }
288 
gnssUpdateXtraThrottle(const bool enabled)289 static void gnssUpdateXtraThrottle(const bool enabled)
290 {
291     if (NULL != gGnssAdapter) {
292         gGnssAdapter->gnssUpdateXtraThrottleCommand(enabled);
293     }
294 }
295 
injectLocation(double latitude,double longitude,float accuracy)296 static void injectLocation(double latitude, double longitude, float accuracy)
297 {
298    if (NULL != gGnssAdapter) {
299        gGnssAdapter->injectLocationCommand(latitude, longitude, accuracy);
300    }
301 }
302 
injectTime(int64_t time,int64_t timeReference,int32_t uncertainty)303 static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty)
304 {
305    if (NULL != gGnssAdapter) {
306        gGnssAdapter->injectTimeCommand(time, timeReference, uncertainty);
307    }
308 }
309 
agpsInit(const AgpsCbInfo & cbInfo)310 static void agpsInit(const AgpsCbInfo& cbInfo) {
311 
312     if (NULL != gGnssAdapter) {
313         gGnssAdapter->initAgpsCommand(cbInfo);
314     }
315 }
agpsDataConnOpen(AGpsExtType agpsType,const char * apnName,int apnLen,int ipType)316 static void agpsDataConnOpen(
317         AGpsExtType agpsType, const char* apnName, int apnLen, int ipType) {
318 
319     if (NULL != gGnssAdapter) {
320         gGnssAdapter->dataConnOpenCommand(
321                 agpsType, apnName, apnLen, (AGpsBearerType)ipType);
322     }
323 }
agpsDataConnClosed(AGpsExtType agpsType)324 static void agpsDataConnClosed(AGpsExtType agpsType) {
325 
326     if (NULL != gGnssAdapter) {
327         gGnssAdapter->dataConnClosedCommand(agpsType);
328     }
329 }
agpsDataConnFailed(AGpsExtType agpsType)330 static void agpsDataConnFailed(AGpsExtType agpsType) {
331 
332     if (NULL != gGnssAdapter) {
333         gGnssAdapter->dataConnFailedCommand(agpsType);
334     }
335 }
336 
getDebugReport(GnssDebugReport & report)337 static void getDebugReport(GnssDebugReport& report) {
338 
339     if (NULL != gGnssAdapter) {
340         gGnssAdapter->getDebugReport(report);
341     }
342 }
343 
updateConnectionStatus(bool connected,int8_t type,bool roaming,NetworkHandle networkHandle)344 static void updateConnectionStatus(bool connected, int8_t type,
345                                    bool roaming, NetworkHandle networkHandle) {
346     if (NULL != gGnssAdapter) {
347         gGnssAdapter->getSystemStatus()->eventConnectionStatus(
348                 connected, type, roaming, networkHandle);
349     }
350 }
351 
odcpiInit(const OdcpiRequestCallback & callback)352 static void odcpiInit(const OdcpiRequestCallback& callback)
353 {
354     if (NULL != gGnssAdapter) {
355         gGnssAdapter->initOdcpiCommand(callback);
356     }
357 }
358 
odcpiInject(const Location & location)359 static void odcpiInject(const Location& location)
360 {
361     if (NULL != gGnssAdapter) {
362         gGnssAdapter->injectOdcpiCommand(location);
363     }
364 }
365 
blockCPI(double latitude,double longitude,float accuracy,int blockDurationMsec,double latLonDiffThreshold)366 static void blockCPI(double latitude, double longitude, float accuracy,
367                      int blockDurationMsec, double latLonDiffThreshold) {
368     if (NULL != gGnssAdapter) {
369         gGnssAdapter->blockCPICommand(latitude, longitude, accuracy,
370                                       blockDurationMsec, latLonDiffThreshold);
371     }
372 }
373 
getGnssEnergyConsumed(GnssEnergyConsumedCallback energyConsumedCb)374 static void getGnssEnergyConsumed(GnssEnergyConsumedCallback energyConsumedCb) {
375     if (NULL != gGnssAdapter) {
376         gGnssAdapter->getGnssEnergyConsumedCommand(energyConsumedCb);
377     }
378 }
379 
enableNfwLocationAccess(bool enable)380 static void enableNfwLocationAccess(bool enable) {
381     if (NULL != gGnssAdapter) {
382         gGnssAdapter->nfwControlCommand(enable);
383     }
384 }
385 
nfwInit(const NfwCbInfo & cbInfo)386 static void nfwInit(const NfwCbInfo& cbInfo) {
387     if (NULL != gGnssAdapter) {
388         gGnssAdapter->initNfwCommand(cbInfo);
389     }
390 }
getPowerStateChanges(void * powerStateCb)391 static void getPowerStateChanges(void* powerStateCb)
392 {
393     if (NULL != gGnssAdapter) {
394         gGnssAdapter->getPowerStateChangesCommand(powerStateCb);
395     }
396 }
397 
injectLocationExt(const GnssLocationInfoNotification & locationInfo)398 static void injectLocationExt(const GnssLocationInfoNotification &locationInfo)
399 {
400    if (NULL != gGnssAdapter) {
401        gGnssAdapter->injectLocationExtCommand(locationInfo);
402    }
403 }
404 
updateBatteryStatus(bool charging)405 static void updateBatteryStatus(bool charging) {
406     if (NULL != gGnssAdapter) {
407         gGnssAdapter->getSystemStatus()->updatePowerConnectState(charging);
408     }
409 }
410 
updateSystemPowerState(PowerStateType systemPowerState)411 static void updateSystemPowerState(PowerStateType systemPowerState) {
412    if (NULL != gGnssAdapter) {
413        gGnssAdapter->updateSystemPowerStateCommand(systemPowerState);
414    }
415 }
416 
setConstrainedTunc(bool enable,float tuncConstraint,uint32_t energyBudget)417 static uint32_t setConstrainedTunc (bool enable, float tuncConstraint, uint32_t energyBudget) {
418     if (NULL != gGnssAdapter) {
419         return gGnssAdapter->setConstrainedTuncCommand(enable, tuncConstraint, energyBudget);
420     } else {
421         return 0;
422     }
423 }
424 
setPositionAssistedClockEstimator(bool enable)425 static uint32_t setPositionAssistedClockEstimator(bool enable) {
426     if (NULL != gGnssAdapter) {
427         return gGnssAdapter->setPositionAssistedClockEstimatorCommand(enable);
428     } else {
429         return 0;
430     }
431 }
432 
gnssUpdateSvConfig(const GnssSvTypeConfig & svTypeConfig,const GnssSvIdConfig & svIdConfig)433 static uint32_t gnssUpdateSvConfig(
434         const GnssSvTypeConfig& svTypeConfig,
435         const GnssSvIdConfig& svIdConfig) {
436     if (NULL != gGnssAdapter) {
437         return gGnssAdapter->gnssUpdateSvConfigCommand(
438                 svTypeConfig, svIdConfig);
439     } else {
440         return 0;
441     }
442 }
443 
gnssResetSvConfig()444 static uint32_t gnssResetSvConfig() {
445     if (NULL != gGnssAdapter) {
446         return gGnssAdapter->gnssResetSvConfigCommand();
447     } else {
448         return 0;
449     }
450 }
451 
configLeverArm(const LeverArmConfigInfo & configInfo)452 static uint32_t configLeverArm(const LeverArmConfigInfo& configInfo){
453     if (NULL != gGnssAdapter) {
454         return gGnssAdapter->configLeverArmCommand(configInfo);
455     } else {
456         return 0;
457     }
458 }
459 
configRobustLocation(bool enable,bool enableForE911)460 static uint32_t configRobustLocation(bool enable, bool enableForE911){
461     if (NULL != gGnssAdapter) {
462         return gGnssAdapter->configRobustLocationCommand(enable, enableForE911);
463     } else {
464         return 0;
465     }
466 }
467