• 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 static uint32_t configMinGpsWeek(uint16_t minGpsWeek);
92 static uint32_t configBodyToSensorMountParams(const BodyToSensorMountParams& b2sParams);
93 
94 static bool measCorrInit(const measCorrSetCapabilitiesCb setCapabilitiesCb);
95 static bool measCorrSetCorrections(const GnssMeasurementCorrections gnssMeasCorr);
96 static void measCorrClose();
97 static uint32_t antennaInfoInit(const antennaInfoCb antennaInfoCallback);
98 static void antennaInfoClose();
99 
100 static const GnssInterface gGnssInterface = {
101     sizeof(GnssInterface),
102     initialize,
103     deinitialize,
104     addClient,
105     removeClient,
106     requestCapabilities,
107     startTracking,
108     updateTrackingOptions,
109     stopTracking,
110     gnssNiResponse,
111     setControlCallbacks,
112     enable,
113     disable,
114     gnssUpdateConfig,
115     gnssGetConfig,
116     gnssUpdateSvTypeConfig,
117     gnssGetSvTypeConfig,
118     gnssResetSvTypeConfig,
119     gnssDeleteAidingData,
120     gnssUpdateXtraThrottle,
121     injectLocation,
122     injectTime,
123     agpsInit,
124     agpsDataConnOpen,
125     agpsDataConnClosed,
126     agpsDataConnFailed,
127     getDebugReport,
128     updateConnectionStatus,
129     odcpiInit,
130     odcpiInject,
131     blockCPI,
132     getGnssEnergyConsumed,
133     enableNfwLocationAccess,
134     nfwInit,
135     getPowerStateChanges,
136     injectLocationExt,
137     updateBatteryStatus,
138     updateSystemPowerState,
139     setConstrainedTunc,
140     setPositionAssistedClockEstimator,
141     gnssUpdateSvConfig,
142     gnssResetSvConfig,
143     configLeverArm,
144     measCorrInit,
145     measCorrSetCorrections,
146     measCorrClose,
147     antennaInfoInit,
148     antennaInfoClose,
149     configRobustLocation,
150     configMinGpsWeek,
151     configBodyToSensorMountParams,
152 };
153 
154 #ifndef DEBUG_X86
getGnssInterface()155 extern "C" const GnssInterface* getGnssInterface()
156 #else
157 const GnssInterface* getGnssInterface()
158 #endif // DEBUG_X86
159 {
160    gGnssInterface.initialize();
161    return &gGnssInterface;
162 }
163 
initialize()164 static void initialize()
165 {
166     if (NULL == gGnssAdapter) {
167         gGnssAdapter = new GnssAdapter();
168     }
169 }
170 
deinitialize()171 static void deinitialize()
172 {
173     if (NULL != gGnssAdapter) {
174         delete gGnssAdapter;
175         gGnssAdapter = NULL;
176     }
177 }
178 
addClient(LocationAPI * client,const LocationCallbacks & callbacks)179 static void addClient(LocationAPI* client, const LocationCallbacks& callbacks)
180 {
181     if (NULL != gGnssAdapter) {
182         gGnssAdapter->addClientCommand(client, callbacks);
183     }
184 }
185 
removeClient(LocationAPI * client,removeClientCompleteCallback rmClientCb)186 static void removeClient(LocationAPI* client, removeClientCompleteCallback rmClientCb)
187 {
188     if (NULL != gGnssAdapter) {
189         gGnssAdapter->removeClientCommand(client, rmClientCb);
190     }
191 }
192 
requestCapabilities(LocationAPI * client)193 static void requestCapabilities(LocationAPI* client)
194 {
195     if (NULL != gGnssAdapter) {
196         gGnssAdapter->requestCapabilitiesCommand(client);
197     }
198 }
199 
startTracking(LocationAPI * client,TrackingOptions & trackingOptions)200 static uint32_t startTracking(
201         LocationAPI* client, TrackingOptions& trackingOptions)
202 {
203     if (NULL != gGnssAdapter) {
204         return gGnssAdapter->startTrackingCommand(client, trackingOptions);
205     } else {
206         return 0;
207     }
208 }
209 
updateTrackingOptions(LocationAPI * client,uint32_t id,TrackingOptions & trackingOptions)210 static void updateTrackingOptions(
211         LocationAPI* client, uint32_t id, TrackingOptions& trackingOptions)
212 {
213     if (NULL != gGnssAdapter) {
214         gGnssAdapter->updateTrackingOptionsCommand(
215                 client, id, trackingOptions);
216     }
217 }
218 
stopTracking(LocationAPI * client,uint32_t id)219 static void stopTracking(LocationAPI* client, uint32_t id)
220 {
221     if (NULL != gGnssAdapter) {
222         gGnssAdapter->stopTrackingCommand(client, id);
223     }
224 }
225 
gnssNiResponse(LocationAPI * client,uint32_t id,GnssNiResponse response)226 static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response)
227 {
228     if (NULL != gGnssAdapter) {
229         gGnssAdapter->gnssNiResponseCommand(client, id, response);
230     }
231 }
232 
setControlCallbacks(LocationControlCallbacks & controlCallbacks)233 static void setControlCallbacks(LocationControlCallbacks& controlCallbacks)
234 {
235     if (NULL != gGnssAdapter) {
236         gGnssAdapter->setControlCallbacksCommand(controlCallbacks);
237     }
238 }
239 
enable(LocationTechnologyType techType)240 static uint32_t enable(LocationTechnologyType techType)
241 {
242     if (NULL != gGnssAdapter) {
243         return gGnssAdapter->enableCommand(techType);
244     } else {
245         return 0;
246     }
247 }
248 
disable(uint32_t id)249 static void disable(uint32_t id)
250 {
251     if (NULL != gGnssAdapter) {
252         gGnssAdapter->disableCommand(id);
253     }
254 }
255 
gnssUpdateConfig(GnssConfig config)256 static uint32_t* gnssUpdateConfig(GnssConfig config)
257 {
258     if (NULL != gGnssAdapter) {
259         return gGnssAdapter->gnssUpdateConfigCommand(config);
260     } else {
261         return NULL;
262     }
263 }
264 
gnssGetConfig(GnssConfigFlagsMask mask)265 static uint32_t* gnssGetConfig(GnssConfigFlagsMask mask)
266 {
267     if (NULL != gGnssAdapter) {
268         return gGnssAdapter->gnssGetConfigCommand(mask);
269     } else {
270         return NULL;
271     }
272 }
273 
gnssUpdateSvTypeConfig(GnssSvTypeConfig & config)274 static void gnssUpdateSvTypeConfig(GnssSvTypeConfig& config)
275 {
276     if (NULL != gGnssAdapter) {
277         gGnssAdapter->gnssUpdateSvTypeConfigCommand(config);
278     }
279 }
280 
gnssGetSvTypeConfig(GnssSvTypeConfigCallback & callback)281 static void gnssGetSvTypeConfig(GnssSvTypeConfigCallback& callback)
282 {
283     if (NULL != gGnssAdapter) {
284         gGnssAdapter->gnssGetSvTypeConfigCommand(callback);
285     }
286 }
287 
gnssResetSvTypeConfig()288 static void gnssResetSvTypeConfig()
289 {
290     if (NULL != gGnssAdapter) {
291         gGnssAdapter->gnssResetSvTypeConfigCommand();
292     }
293 }
294 
gnssDeleteAidingData(GnssAidingData & data)295 static uint32_t gnssDeleteAidingData(GnssAidingData& data)
296 {
297     if (NULL != gGnssAdapter) {
298         return gGnssAdapter->gnssDeleteAidingDataCommand(data);
299     } else {
300         return 0;
301     }
302 }
303 
gnssUpdateXtraThrottle(const bool enabled)304 static void gnssUpdateXtraThrottle(const bool enabled)
305 {
306     if (NULL != gGnssAdapter) {
307         gGnssAdapter->gnssUpdateXtraThrottleCommand(enabled);
308     }
309 }
310 
injectLocation(double latitude,double longitude,float accuracy)311 static void injectLocation(double latitude, double longitude, float accuracy)
312 {
313    if (NULL != gGnssAdapter) {
314        gGnssAdapter->injectLocationCommand(latitude, longitude, accuracy);
315    }
316 }
317 
injectTime(int64_t time,int64_t timeReference,int32_t uncertainty)318 static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty)
319 {
320    if (NULL != gGnssAdapter) {
321        gGnssAdapter->injectTimeCommand(time, timeReference, uncertainty);
322    }
323 }
324 
agpsInit(const AgpsCbInfo & cbInfo)325 static void agpsInit(const AgpsCbInfo& cbInfo) {
326 
327     if (NULL != gGnssAdapter) {
328         gGnssAdapter->initAgpsCommand(cbInfo);
329     }
330 }
agpsDataConnOpen(AGpsExtType agpsType,const char * apnName,int apnLen,int ipType)331 static void agpsDataConnOpen(
332         AGpsExtType agpsType, const char* apnName, int apnLen, int ipType) {
333 
334     if (NULL != gGnssAdapter) {
335         gGnssAdapter->dataConnOpenCommand(
336                 agpsType, apnName, apnLen, (AGpsBearerType)ipType);
337     }
338 }
agpsDataConnClosed(AGpsExtType agpsType)339 static void agpsDataConnClosed(AGpsExtType agpsType) {
340 
341     if (NULL != gGnssAdapter) {
342         gGnssAdapter->dataConnClosedCommand(agpsType);
343     }
344 }
agpsDataConnFailed(AGpsExtType agpsType)345 static void agpsDataConnFailed(AGpsExtType agpsType) {
346 
347     if (NULL != gGnssAdapter) {
348         gGnssAdapter->dataConnFailedCommand(agpsType);
349     }
350 }
351 
getDebugReport(GnssDebugReport & report)352 static void getDebugReport(GnssDebugReport& report) {
353 
354     if (NULL != gGnssAdapter) {
355         gGnssAdapter->getDebugReport(report);
356     }
357 }
358 
updateConnectionStatus(bool connected,int8_t type,bool roaming,NetworkHandle networkHandle)359 static void updateConnectionStatus(bool connected, int8_t type,
360                                    bool roaming, NetworkHandle networkHandle) {
361     if (NULL != gGnssAdapter) {
362         gGnssAdapter->getSystemStatus()->eventConnectionStatus(
363                 connected, type, roaming, networkHandle);
364     }
365 }
366 
odcpiInit(const OdcpiRequestCallback & callback)367 static void odcpiInit(const OdcpiRequestCallback& callback)
368 {
369     if (NULL != gGnssAdapter) {
370         gGnssAdapter->initOdcpiCommand(callback);
371     }
372 }
373 
odcpiInject(const Location & location)374 static void odcpiInject(const Location& location)
375 {
376     if (NULL != gGnssAdapter) {
377         gGnssAdapter->injectOdcpiCommand(location);
378     }
379 }
380 
blockCPI(double latitude,double longitude,float accuracy,int blockDurationMsec,double latLonDiffThreshold)381 static void blockCPI(double latitude, double longitude, float accuracy,
382                      int blockDurationMsec, double latLonDiffThreshold) {
383     if (NULL != gGnssAdapter) {
384         gGnssAdapter->blockCPICommand(latitude, longitude, accuracy,
385                                       blockDurationMsec, latLonDiffThreshold);
386     }
387 }
388 
getGnssEnergyConsumed(GnssEnergyConsumedCallback energyConsumedCb)389 static void getGnssEnergyConsumed(GnssEnergyConsumedCallback energyConsumedCb) {
390     if (NULL != gGnssAdapter) {
391         gGnssAdapter->getGnssEnergyConsumedCommand(energyConsumedCb);
392     }
393 }
394 
enableNfwLocationAccess(bool enable)395 static void enableNfwLocationAccess(bool enable) {
396     if (NULL != gGnssAdapter) {
397         gGnssAdapter->nfwControlCommand(enable);
398     }
399 }
400 
nfwInit(const NfwCbInfo & cbInfo)401 static void nfwInit(const NfwCbInfo& cbInfo) {
402     if (NULL != gGnssAdapter) {
403         gGnssAdapter->initNfwCommand(cbInfo);
404     }
405 }
406 
getPowerStateChanges(void * powerStateCb)407 static void getPowerStateChanges(void* powerStateCb)
408 {
409     if (NULL != gGnssAdapter) {
410         gGnssAdapter->getPowerStateChangesCommand(powerStateCb);
411     }
412 }
413 
injectLocationExt(const GnssLocationInfoNotification & locationInfo)414 static void injectLocationExt(const GnssLocationInfoNotification &locationInfo)
415 {
416    if (NULL != gGnssAdapter) {
417        gGnssAdapter->injectLocationExtCommand(locationInfo);
418    }
419 }
420 
updateBatteryStatus(bool charging)421 static void updateBatteryStatus(bool charging) {
422     if (NULL != gGnssAdapter) {
423         gGnssAdapter->getSystemStatus()->updatePowerConnectState(charging);
424     }
425 }
426 
updateSystemPowerState(PowerStateType systemPowerState)427 static void updateSystemPowerState(PowerStateType systemPowerState) {
428    if (NULL != gGnssAdapter) {
429        gGnssAdapter->updateSystemPowerStateCommand(systemPowerState);
430    }
431 }
432 
setConstrainedTunc(bool enable,float tuncConstraint,uint32_t energyBudget)433 static uint32_t setConstrainedTunc (bool enable, float tuncConstraint, uint32_t energyBudget) {
434     if (NULL != gGnssAdapter) {
435         return gGnssAdapter->setConstrainedTuncCommand(enable, tuncConstraint, energyBudget);
436     } else {
437         return 0;
438     }
439 }
440 
setPositionAssistedClockEstimator(bool enable)441 static uint32_t setPositionAssistedClockEstimator(bool enable) {
442     if (NULL != gGnssAdapter) {
443         return gGnssAdapter->setPositionAssistedClockEstimatorCommand(enable);
444     } else {
445         return 0;
446     }
447 }
448 
gnssUpdateSvConfig(const GnssSvTypeConfig & svTypeConfig,const GnssSvIdConfig & svIdConfig)449 static uint32_t gnssUpdateSvConfig(
450         const GnssSvTypeConfig& svTypeConfig,
451         const GnssSvIdConfig& svIdConfig) {
452     if (NULL != gGnssAdapter) {
453         return gGnssAdapter->gnssUpdateSvConfigCommand(
454                 svTypeConfig, svIdConfig);
455     } else {
456         return 0;
457     }
458 }
459 
gnssResetSvConfig()460 static uint32_t gnssResetSvConfig() {
461     if (NULL != gGnssAdapter) {
462         return gGnssAdapter->gnssResetSvConfigCommand();
463     } else {
464         return 0;
465     }
466 }
467 
configLeverArm(const LeverArmConfigInfo & configInfo)468 static uint32_t configLeverArm(const LeverArmConfigInfo& configInfo){
469     if (NULL != gGnssAdapter) {
470         return gGnssAdapter->configLeverArmCommand(configInfo);
471     } else {
472         return 0;
473     }
474 }
475 
measCorrInit(const measCorrSetCapabilitiesCb setCapabilitiesCb)476 static bool measCorrInit(const measCorrSetCapabilitiesCb setCapabilitiesCb) {
477     if (NULL != gGnssAdapter) {
478         return gGnssAdapter->openMeasCorrCommand(setCapabilitiesCb);
479     } else {
480         return false;
481     }
482 }
483 
measCorrSetCorrections(const GnssMeasurementCorrections gnssMeasCorr)484 static bool measCorrSetCorrections(const GnssMeasurementCorrections gnssMeasCorr) {
485     if (NULL != gGnssAdapter) {
486         return gGnssAdapter->measCorrSetCorrectionsCommand(gnssMeasCorr);
487     } else {
488         return false;
489     }
490 }
491 
measCorrClose()492 static void measCorrClose() {
493     if (NULL != gGnssAdapter) {
494         gGnssAdapter->closeMeasCorrCommand();
495     }
496 }
497 
antennaInfoInit(const antennaInfoCb antennaInfoCallback)498 static uint32_t antennaInfoInit(const antennaInfoCb antennaInfoCallback) {
499     if (NULL != gGnssAdapter) {
500         return gGnssAdapter->antennaInfoInitCommand(antennaInfoCallback);
501     } else {
502         return ANTENNA_INFO_ERROR_GENERIC;
503     }
504 }
505 
antennaInfoClose()506 static void antennaInfoClose() {
507     if (NULL != gGnssAdapter) {
508         return gGnssAdapter->antennaInfoCloseCommand();
509 	}
510 }
511 
configRobustLocation(bool enable,bool enableForE911)512 static uint32_t configRobustLocation(bool enable, bool enableForE911){
513     if (NULL != gGnssAdapter) {
514         return gGnssAdapter->configRobustLocationCommand(enable, enableForE911);
515     } else {
516         return 0;
517     }
518 }
519 
configMinGpsWeek(uint16_t minGpsWeek)520 static uint32_t configMinGpsWeek(uint16_t minGpsWeek){
521     if (NULL != gGnssAdapter) {
522         return gGnssAdapter->configMinGpsWeekCommand(minGpsWeek);
523     } else {
524         return 0;
525     }
526 }
527 
configBodyToSensorMountParams(const BodyToSensorMountParams & b2sParams)528 static uint32_t configBodyToSensorMountParams(const BodyToSensorMountParams& b2sParams){
529     if (NULL != gGnssAdapter) {
530         return gGnssAdapter->configBodyToSensorMountParamsCommand(b2sParams);
531     } else {
532         return 0;
533     }
534 }
535