1 /* Copyright (c) 2017-2019, 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
83 static const GnssInterface gGnssInterface = {
84 sizeof(GnssInterface),
85 initialize,
86 deinitialize,
87 addClient,
88 removeClient,
89 requestCapabilities,
90 startTracking,
91 updateTrackingOptions,
92 stopTracking,
93 gnssNiResponse,
94 setControlCallbacks,
95 enable,
96 disable,
97 gnssUpdateConfig,
98 gnssGetConfig,
99 gnssUpdateSvTypeConfig,
100 gnssGetSvTypeConfig,
101 gnssResetSvTypeConfig,
102 gnssDeleteAidingData,
103 gnssUpdateXtraThrottle,
104 injectLocation,
105 injectTime,
106 agpsInit,
107 agpsDataConnOpen,
108 agpsDataConnClosed,
109 agpsDataConnFailed,
110 getDebugReport,
111 updateConnectionStatus,
112 odcpiInit,
113 odcpiInject,
114 blockCPI,
115 getGnssEnergyConsumed,
116 enableNfwLocationAccess,
117 nfwInit,
118 getPowerStateChanges,
119 injectLocationExt,
120 updateBatteryStatus
121 };
122
123 #ifndef DEBUG_X86
getGnssInterface()124 extern "C" const GnssInterface* getGnssInterface()
125 #else
126 const GnssInterface* getGnssInterface()
127 #endif // DEBUG_X86
128 {
129 return &gGnssInterface;
130 }
131
initialize()132 static void initialize()
133 {
134 if (NULL == gGnssAdapter) {
135 gGnssAdapter = new GnssAdapter();
136 }
137 }
138
deinitialize()139 static void deinitialize()
140 {
141 if (NULL != gGnssAdapter) {
142 delete gGnssAdapter;
143 gGnssAdapter = NULL;
144 }
145 }
146
addClient(LocationAPI * client,const LocationCallbacks & callbacks)147 static void addClient(LocationAPI* client, const LocationCallbacks& callbacks)
148 {
149 if (NULL != gGnssAdapter) {
150 gGnssAdapter->addClientCommand(client, callbacks);
151 }
152 }
153
removeClient(LocationAPI * client,removeClientCompleteCallback rmClientCb)154 static void removeClient(LocationAPI* client, removeClientCompleteCallback rmClientCb)
155 {
156 if (NULL != gGnssAdapter) {
157 gGnssAdapter->removeClientCommand(client, rmClientCb);
158 }
159 }
160
requestCapabilities(LocationAPI * client)161 static void requestCapabilities(LocationAPI* client)
162 {
163 if (NULL != gGnssAdapter) {
164 gGnssAdapter->requestCapabilitiesCommand(client);
165 }
166 }
167
startTracking(LocationAPI * client,TrackingOptions & trackingOptions)168 static uint32_t startTracking(
169 LocationAPI* client, TrackingOptions& trackingOptions)
170 {
171 if (NULL != gGnssAdapter) {
172 return gGnssAdapter->startTrackingCommand(client, trackingOptions);
173 } else {
174 return 0;
175 }
176 }
177
updateTrackingOptions(LocationAPI * client,uint32_t id,TrackingOptions & trackingOptions)178 static void updateTrackingOptions(
179 LocationAPI* client, uint32_t id, TrackingOptions& trackingOptions)
180 {
181 if (NULL != gGnssAdapter) {
182 gGnssAdapter->updateTrackingOptionsCommand(
183 client, id, trackingOptions);
184 }
185 }
186
stopTracking(LocationAPI * client,uint32_t id)187 static void stopTracking(LocationAPI* client, uint32_t id)
188 {
189 if (NULL != gGnssAdapter) {
190 gGnssAdapter->stopTrackingCommand(client, id);
191 }
192 }
193
gnssNiResponse(LocationAPI * client,uint32_t id,GnssNiResponse response)194 static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response)
195 {
196 if (NULL != gGnssAdapter) {
197 gGnssAdapter->gnssNiResponseCommand(client, id, response);
198 }
199 }
200
setControlCallbacks(LocationControlCallbacks & controlCallbacks)201 static void setControlCallbacks(LocationControlCallbacks& controlCallbacks)
202 {
203 if (NULL != gGnssAdapter) {
204 gGnssAdapter->setControlCallbacksCommand(controlCallbacks);
205 }
206 }
207
enable(LocationTechnologyType techType)208 static uint32_t enable(LocationTechnologyType techType)
209 {
210 if (NULL != gGnssAdapter) {
211 return gGnssAdapter->enableCommand(techType);
212 } else {
213 return 0;
214 }
215 }
216
disable(uint32_t id)217 static void disable(uint32_t id)
218 {
219 if (NULL != gGnssAdapter) {
220 gGnssAdapter->disableCommand(id);
221 }
222 }
223
gnssUpdateConfig(GnssConfig config)224 static uint32_t* gnssUpdateConfig(GnssConfig config)
225 {
226 if (NULL != gGnssAdapter) {
227 return gGnssAdapter->gnssUpdateConfigCommand(config);
228 } else {
229 return NULL;
230 }
231 }
232
gnssGetConfig(GnssConfigFlagsMask mask)233 static uint32_t* gnssGetConfig(GnssConfigFlagsMask mask)
234 {
235 if (NULL != gGnssAdapter) {
236 return gGnssAdapter->gnssGetConfigCommand(mask);
237 } else {
238 return NULL;
239 }
240 }
241
gnssUpdateSvTypeConfig(GnssSvTypeConfig & config)242 static void gnssUpdateSvTypeConfig(GnssSvTypeConfig& config)
243 {
244 if (NULL != gGnssAdapter) {
245 gGnssAdapter->gnssUpdateSvTypeConfigCommand(config);
246 }
247 }
248
gnssGetSvTypeConfig(GnssSvTypeConfigCallback & callback)249 static void gnssGetSvTypeConfig(GnssSvTypeConfigCallback& callback)
250 {
251 if (NULL != gGnssAdapter) {
252 gGnssAdapter->gnssGetSvTypeConfigCommand(callback);
253 }
254 }
255
gnssResetSvTypeConfig()256 static void gnssResetSvTypeConfig()
257 {
258 if (NULL != gGnssAdapter) {
259 gGnssAdapter->gnssResetSvTypeConfigCommand();
260 }
261 }
262
gnssDeleteAidingData(GnssAidingData & data)263 static uint32_t gnssDeleteAidingData(GnssAidingData& data)
264 {
265 if (NULL != gGnssAdapter) {
266 return gGnssAdapter->gnssDeleteAidingDataCommand(data);
267 } else {
268 return 0;
269 }
270 }
271
gnssUpdateXtraThrottle(const bool enabled)272 static void gnssUpdateXtraThrottle(const bool enabled)
273 {
274 if (NULL != gGnssAdapter) {
275 gGnssAdapter->gnssUpdateXtraThrottleCommand(enabled);
276 }
277 }
278
injectLocation(double latitude,double longitude,float accuracy)279 static void injectLocation(double latitude, double longitude, float accuracy)
280 {
281 if (NULL != gGnssAdapter) {
282 gGnssAdapter->injectLocationCommand(latitude, longitude, accuracy);
283 }
284 }
285
injectTime(int64_t time,int64_t timeReference,int32_t uncertainty)286 static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty)
287 {
288 if (NULL != gGnssAdapter) {
289 gGnssAdapter->injectTimeCommand(time, timeReference, uncertainty);
290 }
291 }
292
agpsInit(const AgpsCbInfo & cbInfo)293 static void agpsInit(const AgpsCbInfo& cbInfo) {
294
295 if (NULL != gGnssAdapter) {
296 gGnssAdapter->initAgpsCommand(cbInfo);
297 }
298 }
agpsDataConnOpen(AGpsExtType agpsType,const char * apnName,int apnLen,int ipType)299 static void agpsDataConnOpen(
300 AGpsExtType agpsType, const char* apnName, int apnLen, int ipType) {
301
302 if (NULL != gGnssAdapter) {
303 gGnssAdapter->dataConnOpenCommand(
304 agpsType, apnName, apnLen, (AGpsBearerType)ipType);
305 }
306 }
agpsDataConnClosed(AGpsExtType agpsType)307 static void agpsDataConnClosed(AGpsExtType agpsType) {
308
309 if (NULL != gGnssAdapter) {
310 gGnssAdapter->dataConnClosedCommand(agpsType);
311 }
312 }
agpsDataConnFailed(AGpsExtType agpsType)313 static void agpsDataConnFailed(AGpsExtType agpsType) {
314
315 if (NULL != gGnssAdapter) {
316 gGnssAdapter->dataConnFailedCommand(agpsType);
317 }
318 }
319
getDebugReport(GnssDebugReport & report)320 static void getDebugReport(GnssDebugReport& report) {
321
322 if (NULL != gGnssAdapter) {
323 gGnssAdapter->getDebugReport(report);
324 }
325 }
326
updateConnectionStatus(bool connected,int8_t type,bool roaming,NetworkHandle networkHandle)327 static void updateConnectionStatus(bool connected, int8_t type,
328 bool roaming, NetworkHandle networkHandle) {
329 if (NULL != gGnssAdapter) {
330 gGnssAdapter->getSystemStatus()->eventConnectionStatus(
331 connected, type, roaming, networkHandle);
332 }
333 }
334
odcpiInit(const OdcpiRequestCallback & callback)335 static void odcpiInit(const OdcpiRequestCallback& callback)
336 {
337 if (NULL != gGnssAdapter) {
338 gGnssAdapter->initOdcpiCommand(callback);
339 }
340 }
341
odcpiInject(const Location & location)342 static void odcpiInject(const Location& location)
343 {
344 if (NULL != gGnssAdapter) {
345 gGnssAdapter->injectOdcpiCommand(location);
346 }
347 }
348
blockCPI(double latitude,double longitude,float accuracy,int blockDurationMsec,double latLonDiffThreshold)349 static void blockCPI(double latitude, double longitude, float accuracy,
350 int blockDurationMsec, double latLonDiffThreshold) {
351 if (NULL != gGnssAdapter) {
352 gGnssAdapter->blockCPICommand(latitude, longitude, accuracy,
353 blockDurationMsec, latLonDiffThreshold);
354 }
355 }
356
getGnssEnergyConsumed(GnssEnergyConsumedCallback energyConsumedCb)357 static void getGnssEnergyConsumed(GnssEnergyConsumedCallback energyConsumedCb) {
358 if (NULL != gGnssAdapter) {
359 gGnssAdapter->getGnssEnergyConsumedCommand(energyConsumedCb);
360 }
361 }
362
enableNfwLocationAccess(bool enable)363 static void enableNfwLocationAccess(bool enable) {
364 if (NULL != gGnssAdapter) {
365 gGnssAdapter->nfwControlCommand(enable);
366 }
367 }
368
nfwInit(const NfwCbInfo & cbInfo)369 static void nfwInit(const NfwCbInfo& cbInfo) {
370 if (NULL != gGnssAdapter) {
371 gGnssAdapter->initNfwCommand(cbInfo);
372 }
373 }
getPowerStateChanges(void * powerStateCb)374 static void getPowerStateChanges(void* powerStateCb)
375 {
376 if (NULL != gGnssAdapter) {
377 gGnssAdapter->getPowerStateChangesCommand(powerStateCb);
378 }
379 }
380
injectLocationExt(const GnssLocationInfoNotification & locationInfo)381 static void injectLocationExt(const GnssLocationInfoNotification &locationInfo)
382 {
383 if (NULL != gGnssAdapter) {
384 gGnssAdapter->injectLocationExtCommand(locationInfo);
385 }
386 }
387
updateBatteryStatus(bool charging)388 static void updateBatteryStatus(bool charging) {
389 if (NULL != gGnssAdapter) {
390 gGnssAdapter->getSystemStatus()->updatePowerConnectState(charging);
391 }
392 }
393