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