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