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