1/* Copyright (c) 2017, 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
33static GnssAdapter* gGnssAdapter = NULL;
34
35static void initialize();
36static void deinitialize();
37
38static void addClient(LocationAPI* client, const LocationCallbacks& callbacks);
39static void removeClient(LocationAPI* client);
40static void requestCapabilities(LocationAPI* client);
41
42static uint32_t startTracking(LocationAPI* client, LocationOptions& options);
43static void updateTrackingOptions(LocationAPI* client, uint32_t id, LocationOptions& options);
44static void stopTracking(LocationAPI* client, uint32_t id);
45
46static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response);
47static uint32_t gnssDeleteAidingData(GnssAidingData& data);
48
49static void setControlCallbacks(LocationControlCallbacks& controlCallbacks);
50static uint32_t enable(LocationTechnologyType techType);
51static void disable(uint32_t id);
52static uint32_t* gnssUpdateConfig(GnssConfig config);
53
54static void injectLocation(double latitude, double longitude, float accuracy);
55static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty);
56
57static void agpsInit(void* statusV4Cb);
58static void agpsDataConnOpen(AGpsExtType agpsType, const char* apnName, int apnLen, int ipType);
59static void agpsDataConnClosed(AGpsExtType agpsType);
60static void agpsDataConnFailed(AGpsExtType agpsType);
61static void getDebugReport(GnssDebugReport& report);
62
63static const GnssInterface gGnssInterface = {
64    sizeof(GnssInterface),
65    initialize,
66    deinitialize,
67    addClient,
68    removeClient,
69    requestCapabilities,
70    startTracking,
71    updateTrackingOptions,
72    stopTracking,
73    gnssNiResponse,
74    setControlCallbacks,
75    enable,
76    disable,
77    gnssUpdateConfig,
78    gnssDeleteAidingData,
79    injectLocation,
80    injectTime,
81    agpsInit,
82    agpsDataConnOpen,
83    agpsDataConnClosed,
84    agpsDataConnFailed,
85    getDebugReport,
86};
87
88#ifndef DEBUG_X86
89extern "C" const GnssInterface* getGnssInterface()
90#else
91const GnssInterface* getGnssInterface()
92#endif // DEBUG_X86
93{
94   return &gGnssInterface;
95}
96
97static void initialize()
98{
99    if (NULL == gGnssAdapter) {
100        gGnssAdapter = new GnssAdapter();
101    }
102}
103
104static void deinitialize()
105{
106    if (NULL != gGnssAdapter) {
107        delete gGnssAdapter;
108        gGnssAdapter = NULL;
109    }
110}
111
112static void addClient(LocationAPI* client, const LocationCallbacks& callbacks)
113{
114    if (NULL != gGnssAdapter) {
115        gGnssAdapter->addClientCommand(client, callbacks);
116    }
117}
118
119static void removeClient(LocationAPI* client)
120{
121    if (NULL != gGnssAdapter) {
122        gGnssAdapter->removeClientCommand(client);
123    }
124}
125
126static void requestCapabilities(LocationAPI* client)
127{
128    if (NULL != gGnssAdapter) {
129        gGnssAdapter->requestCapabilitiesCommand(client);
130    }
131}
132
133static uint32_t startTracking(LocationAPI* client, LocationOptions& options)
134{
135    if (NULL != gGnssAdapter) {
136        return gGnssAdapter->startTrackingCommand(client, options);
137    } else {
138        return 0;
139    }
140}
141
142static void updateTrackingOptions(LocationAPI* client, uint32_t id, LocationOptions& options)
143{
144    if (NULL != gGnssAdapter) {
145        gGnssAdapter->updateTrackingOptionsCommand(client, id, options);
146    }
147}
148
149static void stopTracking(LocationAPI* client, uint32_t id)
150{
151    if (NULL != gGnssAdapter) {
152        gGnssAdapter->stopTrackingCommand(client, id);
153    }
154}
155
156static void gnssNiResponse(LocationAPI* client, uint32_t id, GnssNiResponse response)
157{
158    if (NULL != gGnssAdapter) {
159        gGnssAdapter->gnssNiResponseCommand(client, id, response);
160    }
161}
162
163static void setControlCallbacks(LocationControlCallbacks& controlCallbacks)
164{
165    if (NULL != gGnssAdapter) {
166        return gGnssAdapter->setControlCallbacksCommand(controlCallbacks);
167    }
168}
169
170static uint32_t enable(LocationTechnologyType techType)
171{
172    if (NULL != gGnssAdapter) {
173        return gGnssAdapter->enableCommand(techType);
174    } else {
175        return 0;
176    }
177}
178
179static void disable(uint32_t id)
180{
181    if (NULL != gGnssAdapter) {
182        return gGnssAdapter->disableCommand(id);
183    }
184}
185
186static uint32_t* gnssUpdateConfig(GnssConfig config)
187{
188    if (NULL != gGnssAdapter) {
189        return gGnssAdapter->gnssUpdateConfigCommand(config);
190    } else {
191        return NULL;
192    }
193}
194
195static uint32_t gnssDeleteAidingData(GnssAidingData& data)
196{
197    if (NULL != gGnssAdapter) {
198        return gGnssAdapter->gnssDeleteAidingDataCommand(data);
199    } else {
200        return 0;
201    }
202}
203
204static void injectLocation(double latitude, double longitude, float accuracy)
205{
206   if (NULL != gGnssAdapter) {
207       gGnssAdapter->injectLocationCommand(latitude, longitude, accuracy);
208   }
209}
210
211static void injectTime(int64_t time, int64_t timeReference, int32_t uncertainty)
212{
213   if (NULL != gGnssAdapter) {
214       gGnssAdapter->injectTimeCommand(time, timeReference, uncertainty);
215   }
216}
217
218static void agpsInit(void* statusV4Cb) {
219
220    if (NULL != gGnssAdapter) {
221        gGnssAdapter->initAgpsCommand(statusV4Cb);
222    }
223}
224static void agpsDataConnOpen(
225        AGpsExtType agpsType, const char* apnName, int apnLen, int ipType) {
226
227    if (NULL != gGnssAdapter) {
228        gGnssAdapter->dataConnOpenCommand(
229                agpsType, apnName, apnLen, ipType);
230    }
231}
232static void agpsDataConnClosed(AGpsExtType agpsType) {
233
234    if (NULL != gGnssAdapter) {
235        gGnssAdapter->dataConnClosedCommand(agpsType);
236    }
237}
238static void agpsDataConnFailed(AGpsExtType agpsType) {
239
240    if (NULL != gGnssAdapter) {
241        gGnssAdapter->dataConnFailedCommand(agpsType);
242    }
243}
244
245static void getDebugReport(GnssDebugReport& report) {
246
247    if (NULL != gGnssAdapter) {
248        gGnssAdapter->getDebugReport(report);
249    }
250}
251