1 /* Copyright (c) 2011-2014, 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 #define LOG_NDDEBUG 0
30 #define LOG_TAG "LocSvc_LocApiBase"
31
32 #include <dlfcn.h>
33 #include <LocApiBase.h>
34 #include <LocAdapterBase.h>
35 #include <log_util.h>
36 #include <LocDualContext.h>
37
38 namespace loc_core {
39
40 #define TO_ALL_LOCADAPTERS(call) TO_ALL_ADAPTERS(mLocAdapters, (call))
41 #define TO_1ST_HANDLING_LOCADAPTERS(call) TO_1ST_HANDLING_ADAPTER(mLocAdapters, (call))
42
hexcode(char * hexstring,int string_size,const char * data,int data_size)43 int hexcode(char *hexstring, int string_size,
44 const char *data, int data_size)
45 {
46 int i;
47 for (i = 0; i < data_size; i++)
48 {
49 char ch = data[i];
50 if (i*2 + 3 <= string_size)
51 {
52 snprintf(&hexstring[i*2], 3, "%02X", ch);
53 }
54 else {
55 break;
56 }
57 }
58 return i;
59 }
60
decodeAddress(char * addr_string,int string_size,const char * data,int data_size)61 int decodeAddress(char *addr_string, int string_size,
62 const char *data, int data_size)
63 {
64 const char addr_prefix = 0x91;
65 int i, idxOutput = 0;
66
67 if (!data || !addr_string) { return 0; }
68
69 if (data[0] != addr_prefix)
70 {
71 LOC_LOGW("decodeAddress: address prefix is not 0x%x but 0x%x", addr_prefix, data[0]);
72 addr_string[0] = '\0';
73 return 0; // prefix not correct
74 }
75
76 for (i = 1; i < data_size; i++)
77 {
78 unsigned char ch = data[i], low = ch & 0x0F, hi = ch >> 4;
79 if (low <= 9 && idxOutput < string_size - 1) { addr_string[idxOutput++] = low + '0'; }
80 if (hi <= 9 && idxOutput < string_size - 1) { addr_string[idxOutput++] = hi + '0'; }
81 }
82
83 addr_string[idxOutput] = '\0'; // Terminates the string
84
85 return idxOutput;
86 }
87
88 struct LocSsrMsg : public LocMsg {
89 LocApiBase* mLocApi;
LocSsrMsgloc_core::LocSsrMsg90 inline LocSsrMsg(LocApiBase* locApi) :
91 LocMsg(), mLocApi(locApi)
92 {
93 locallog();
94 }
procloc_core::LocSsrMsg95 inline virtual void proc() const {
96 mLocApi->close();
97 mLocApi->open(mLocApi->getEvtMask());
98 }
locallogloc_core::LocSsrMsg99 inline void locallog() {
100 LOC_LOGV("LocSsrMsg");
101 }
logloc_core::LocSsrMsg102 inline virtual void log() {
103 locallog();
104 }
105 };
106
107 struct LocOpenMsg : public LocMsg {
108 LocApiBase* mLocApi;
109 LOC_API_ADAPTER_EVENT_MASK_T mMask;
LocOpenMsgloc_core::LocOpenMsg110 inline LocOpenMsg(LocApiBase* locApi,
111 LOC_API_ADAPTER_EVENT_MASK_T mask) :
112 LocMsg(), mLocApi(locApi), mMask(mask)
113 {
114 locallog();
115 }
procloc_core::LocOpenMsg116 inline virtual void proc() const {
117 mLocApi->open(mMask);
118 }
locallogloc_core::LocOpenMsg119 inline void locallog() {
120 LOC_LOGV("%s:%d]: LocOpen Mask: %x\n",
121 __func__, __LINE__, mMask);
122 }
logloc_core::LocOpenMsg123 inline virtual void log() {
124 locallog();
125 }
126 };
127
LocApiBase(const MsgTask * msgTask,LOC_API_ADAPTER_EVENT_MASK_T excludedMask,ContextBase * context)128 LocApiBase::LocApiBase(const MsgTask* msgTask,
129 LOC_API_ADAPTER_EVENT_MASK_T excludedMask,
130 ContextBase* context) :
131 mExcludedMask(excludedMask), mMsgTask(msgTask),
132 mMask(0), mSupportedMsg(0), mContext(context)
133 {
134 memset(mLocAdapters, 0, sizeof(mLocAdapters));
135 }
136
getEvtMask()137 LOC_API_ADAPTER_EVENT_MASK_T LocApiBase::getEvtMask()
138 {
139 LOC_API_ADAPTER_EVENT_MASK_T mask = 0;
140
141 TO_ALL_LOCADAPTERS(mask |= mLocAdapters[i]->getEvtMask());
142
143 return mask & ~mExcludedMask;
144 }
145
isInSession()146 bool LocApiBase::isInSession()
147 {
148 bool inSession = false;
149
150 for (int i = 0;
151 !inSession && i < MAX_ADAPTERS && NULL != mLocAdapters[i];
152 i++) {
153 inSession = mLocAdapters[i]->isInSession();
154 }
155
156 return inSession;
157 }
158
addAdapter(LocAdapterBase * adapter)159 void LocApiBase::addAdapter(LocAdapterBase* adapter)
160 {
161 for (int i = 0; i < MAX_ADAPTERS && mLocAdapters[i] != adapter; i++) {
162 if (mLocAdapters[i] == NULL) {
163 mLocAdapters[i] = adapter;
164 mMsgTask->sendMsg(new LocOpenMsg(this,
165 (adapter->getEvtMask())));
166 break;
167 }
168 }
169 }
170
removeAdapter(LocAdapterBase * adapter)171 void LocApiBase::removeAdapter(LocAdapterBase* adapter)
172 {
173 for (int i = 0;
174 i < MAX_ADAPTERS && NULL != mLocAdapters[i];
175 i++) {
176 if (mLocAdapters[i] == adapter) {
177 mLocAdapters[i] = NULL;
178
179 // shift the rest of the adapters up so that the pointers
180 // in the array do not have holes. This should be more
181 // performant, because the array maintenance is much much
182 // less frequent than event handlings, which need to linear
183 // search all the adapters
184 int j = i;
185 while (++i < MAX_ADAPTERS && mLocAdapters[i] != NULL);
186
187 // i would be MAX_ADAPTERS or point to a NULL
188 i--;
189 // i now should point to a none NULL adapter within valid
190 // range although i could be equal to j, but it won't hurt.
191 // No need to check it, as it gains nothing.
192 mLocAdapters[j] = mLocAdapters[i];
193 // this makes sure that we exit the for loop
194 mLocAdapters[i] = NULL;
195
196 // if we have an empty list of adapters
197 if (0 == i) {
198 close();
199 } else {
200 // else we need to remove the bit
201 mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask()));
202 }
203 }
204 }
205 }
206
updateEvtMask()207 void LocApiBase::updateEvtMask()
208 {
209 mMsgTask->sendMsg(new LocOpenMsg(this, getEvtMask()));
210 }
211
handleEngineUpEvent()212 void LocApiBase::handleEngineUpEvent()
213 {
214 // This will take care of renegotiating the loc handle
215 mMsgTask->sendMsg(new LocSsrMsg(this));
216
217 LocDualContext::injectFeatureConfig(mContext);
218
219 // loop through adapters, and deliver to all adapters.
220 TO_ALL_LOCADAPTERS(mLocAdapters[i]->handleEngineUpEvent());
221 }
222
handleEngineDownEvent()223 void LocApiBase::handleEngineDownEvent()
224 {
225 // loop through adapters, and deliver to all adapters.
226 TO_ALL_LOCADAPTERS(mLocAdapters[i]->handleEngineDownEvent());
227 }
228
reportPosition(UlpLocation & location,GpsLocationExtended & locationExtended,void * locationExt,enum loc_sess_status status,LocPosTechMask loc_technology_mask)229 void LocApiBase::reportPosition(UlpLocation &location,
230 GpsLocationExtended &locationExtended,
231 void* locationExt,
232 enum loc_sess_status status,
233 LocPosTechMask loc_technology_mask)
234 {
235 // print the location info before delivering
236 LOC_LOGV("flags: %d\n source: %d\n latitude: %f\n longitude: %f\n "
237 "altitude: %f\n speed: %f\n bearing: %f\n accuracy: %f\n "
238 "timestamp: %lld\n rawDataSize: %d\n rawData: %p\n "
239 "Session status: %d\n Technology mask: %u",
240 location.gpsLocation.flags, location.position_source,
241 location.gpsLocation.latitude, location.gpsLocation.longitude,
242 location.gpsLocation.altitude, location.gpsLocation.speed,
243 location.gpsLocation.bearing, location.gpsLocation.accuracy,
244 location.gpsLocation.timestamp, location.rawDataSize,
245 location.rawData, status, loc_technology_mask);
246 // loop through adapters, and deliver to all adapters.
247 TO_ALL_LOCADAPTERS(
248 mLocAdapters[i]->reportPosition(location,
249 locationExtended,
250 locationExt,
251 status,
252 loc_technology_mask)
253 );
254 }
255
reportSv(QtiGnssSvStatus & svStatus,GpsLocationExtended & locationExtended,void * svExt)256 void LocApiBase::reportSv(QtiGnssSvStatus &svStatus,
257 GpsLocationExtended &locationExtended,
258 void* svExt)
259 {
260 // print the SV info before delivering
261 LOC_LOGV("num sv: %d\n ephemeris mask: %dxn almanac mask: %x\n gps/glo/bds in use"
262 " mask: %x/%x/%x\n sv: prn snr elevation azimuth",
263 svStatus.num_svs, svStatus.ephemeris_mask,
264 svStatus.almanac_mask, svStatus.gps_used_in_fix_mask,
265 svStatus.glo_used_in_fix_mask, svStatus.bds_used_in_fix_mask);
266 for (int i = 0; i < svStatus.num_svs && i < GPS_MAX_SVS; i++) {
267 LOC_LOGV(" %d: %d %f %f %f",
268 i,
269 svStatus.sv_list[i].prn,
270 svStatus.sv_list[i].snr,
271 svStatus.sv_list[i].elevation,
272 svStatus.sv_list[i].azimuth);
273 }
274 // loop through adapters, and deliver to all adapters.
275 TO_ALL_LOCADAPTERS(
276 mLocAdapters[i]->reportSv(svStatus,
277 locationExtended,
278 svExt)
279 );
280 }
281
reportStatus(GpsStatusValue status)282 void LocApiBase::reportStatus(GpsStatusValue status)
283 {
284 // loop through adapters, and deliver to all adapters.
285 TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportStatus(status));
286 }
287
reportNmea(const char * nmea,int length)288 void LocApiBase::reportNmea(const char* nmea, int length)
289 {
290 // loop through adapters, and deliver to all adapters.
291 TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportNmea(nmea, length));
292 }
293
reportXtraServer(const char * url1,const char * url2,const char * url3,const int maxlength)294 void LocApiBase::reportXtraServer(const char* url1, const char* url2,
295 const char* url3, const int maxlength)
296 {
297 // loop through adapters, and deliver to the first handling adapter.
298 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportXtraServer(url1, url2, url3, maxlength));
299
300 }
301
requestXtraData()302 void LocApiBase::requestXtraData()
303 {
304 // loop through adapters, and deliver to the first handling adapter.
305 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestXtraData());
306 }
307
requestTime()308 void LocApiBase::requestTime()
309 {
310 // loop through adapters, and deliver to the first handling adapter.
311 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestTime());
312 }
313
requestLocation()314 void LocApiBase::requestLocation()
315 {
316 // loop through adapters, and deliver to the first handling adapter.
317 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestLocation());
318 }
319
requestATL(int connHandle,AGpsType agps_type)320 void LocApiBase::requestATL(int connHandle, AGpsType agps_type)
321 {
322 // loop through adapters, and deliver to the first handling adapter.
323 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestATL(connHandle, agps_type));
324 }
325
releaseATL(int connHandle)326 void LocApiBase::releaseATL(int connHandle)
327 {
328 // loop through adapters, and deliver to the first handling adapter.
329 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->releaseATL(connHandle));
330 }
331
requestSuplES(int connHandle)332 void LocApiBase::requestSuplES(int connHandle)
333 {
334 // loop through adapters, and deliver to the first handling adapter.
335 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestSuplES(connHandle));
336 }
337
reportDataCallOpened()338 void LocApiBase::reportDataCallOpened()
339 {
340 // loop through adapters, and deliver to the first handling adapter.
341 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportDataCallOpened());
342 }
343
reportDataCallClosed()344 void LocApiBase::reportDataCallClosed()
345 {
346 // loop through adapters, and deliver to the first handling adapter.
347 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->reportDataCallClosed());
348 }
349
requestNiNotify(GpsNiNotification & notify,const void * data)350 void LocApiBase::requestNiNotify(GpsNiNotification ¬ify, const void* data)
351 {
352 // loop through adapters, and deliver to the first handling adapter.
353 TO_1ST_HANDLING_LOCADAPTERS(mLocAdapters[i]->requestNiNotify(notify, data));
354 }
355
saveSupportedMsgList(uint64_t supportedMsgList)356 void LocApiBase::saveSupportedMsgList(uint64_t supportedMsgList)
357 {
358 mSupportedMsg = supportedMsgList;
359 }
360
getSibling()361 void* LocApiBase :: getSibling()
362 DEFAULT_IMPL(NULL)
363
364 LocApiProxyBase* LocApiBase :: getLocApiProxy()
365 DEFAULT_IMPL(NULL)
366
367 void LocApiBase::reportGpsMeasurementData(GpsData &gpsMeasurementData)
368 {
369 // loop through adapters, and deliver to all adapters.
370 TO_ALL_LOCADAPTERS(mLocAdapters[i]->reportGpsMeasurementData(gpsMeasurementData));
371 }
372
373 enum loc_api_adapter_err LocApiBase::
open(LOC_API_ADAPTER_EVENT_MASK_T mask)374 open(LOC_API_ADAPTER_EVENT_MASK_T mask)
375 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
376
377 enum loc_api_adapter_err LocApiBase::
378 close()
379 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
380
381 enum loc_api_adapter_err LocApiBase::
382 startFix(const LocPosMode& posMode)
383 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
384
385 enum loc_api_adapter_err LocApiBase::
386 stopFix()
387 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
388
389 enum loc_api_adapter_err LocApiBase::
390 deleteAidingData(GpsAidingData f)
391 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
392
393 enum loc_api_adapter_err LocApiBase::
394 enableData(int enable)
395 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
396
397 enum loc_api_adapter_err LocApiBase::
398 setAPN(char* apn, int len)
399 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
400
401 enum loc_api_adapter_err LocApiBase::
402 injectPosition(double latitude, double longitude, float accuracy)
403 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
404
405 enum loc_api_adapter_err LocApiBase::
406 setTime(GpsUtcTime time, int64_t timeReference, int uncertainty)
407 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
408
409 enum loc_api_adapter_err LocApiBase::
410 setXtraData(char* data, int length)
411 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
412
413 enum loc_api_adapter_err LocApiBase::
414 requestXtraServer()
415 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
416
417 enum loc_api_adapter_err LocApiBase::
418 atlOpenStatus(int handle, int is_succ, char* apn,
419 AGpsBearerType bear, AGpsType agpsType)
420 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
421
422 enum loc_api_adapter_err LocApiBase::
423 atlCloseStatus(int handle, int is_succ)
424 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
425
426 enum loc_api_adapter_err LocApiBase::
427 setPositionMode(const LocPosMode& posMode)
428 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
429
430 enum loc_api_adapter_err LocApiBase::
431 setServer(const char* url, int len)
432 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
433
434 enum loc_api_adapter_err LocApiBase::
435 setServer(unsigned int ip, int port,
436 LocServerType type)
437 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
438
439 enum loc_api_adapter_err LocApiBase::
440 informNiResponse(GpsUserResponseType userResponse,
441 const void* passThroughData)
442 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
443
444 enum loc_api_adapter_err LocApiBase::
445 setSUPLVersion(uint32_t version)
446 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
447
448 enum loc_api_adapter_err LocApiBase::
449 setLPPConfig(uint32_t profile)
450 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
451
452 enum loc_api_adapter_err LocApiBase::
453 setSensorControlConfig(int sensorUsage,
454 int sensorProvider)
455 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
456
457 enum loc_api_adapter_err LocApiBase::
458 setSensorProperties(bool gyroBiasVarianceRandomWalk_valid,
459 float gyroBiasVarianceRandomWalk,
460 bool accelBiasVarianceRandomWalk_valid,
461 float accelBiasVarianceRandomWalk,
462 bool angleBiasVarianceRandomWalk_valid,
463 float angleBiasVarianceRandomWalk,
464 bool rateBiasVarianceRandomWalk_valid,
465 float rateBiasVarianceRandomWalk,
466 bool velocityBiasVarianceRandomWalk_valid,
467 float velocityBiasVarianceRandomWalk)
468 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
469
470 enum loc_api_adapter_err LocApiBase::
471 setSensorPerfControlConfig(int controlMode,
472 int accelSamplesPerBatch,
473 int accelBatchesPerSec,
474 int gyroSamplesPerBatch,
475 int gyroBatchesPerSec,
476 int accelSamplesPerBatchHigh,
477 int accelBatchesPerSecHigh,
478 int gyroSamplesPerBatchHigh,
479 int gyroBatchesPerSecHigh,
480 int algorithmConfig)
481 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
482
483 enum loc_api_adapter_err LocApiBase::
484 setExtPowerConfig(int isBatteryCharging)
485 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
486
487 enum loc_api_adapter_err LocApiBase::
488 setAGLONASSProtocol(unsigned long aGlonassProtocol)
489 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
490
491 enum loc_api_adapter_err LocApiBase::
492 getWwanZppFix(GpsLocation& zppLoc)
493 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
494
495 enum loc_api_adapter_err LocApiBase::
496 getBestAvailableZppFix(GpsLocation& zppLoc)
497 {
498 memset(&zppLoc, 0, sizeof(zppLoc));
499 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
500 }
501
502 enum loc_api_adapter_err LocApiBase::
getBestAvailableZppFix(GpsLocation & zppLoc,LocPosTechMask & tech_mask)503 getBestAvailableZppFix(GpsLocation & zppLoc, LocPosTechMask & tech_mask)
504 {
505 memset(&zppLoc, 0, sizeof(zppLoc));
506 memset(&tech_mask, 0, sizeof(tech_mask));
507 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
508 }
509
510 int LocApiBase::
511 initDataServiceClient()
512 DEFAULT_IMPL(-1)
513
514 int LocApiBase::
515 openAndStartDataCall()
516 DEFAULT_IMPL(-1)
517
518 void LocApiBase::
519 stopDataCall()
520 DEFAULT_IMPL()
521
522 void LocApiBase::
523 closeDataCall()
524 DEFAULT_IMPL()
525
526 int LocApiBase::
527 setGpsLock(LOC_GPS_LOCK_MASK lock)
528 DEFAULT_IMPL(-1)
529
530 void LocApiBase::
531 installAGpsCert(const DerEncodedCertificate* pData,
532 size_t length,
533 uint32_t slotBitMask)
534 DEFAULT_IMPL()
535
536 int LocApiBase::
537 getGpsLock()
538 DEFAULT_IMPL(-1)
539
540 enum loc_api_adapter_err LocApiBase::
541 setXtraVersionCheck(enum xtra_version_check check)
542 DEFAULT_IMPL(LOC_API_ADAPTER_ERR_SUCCESS)
543
544 int LocApiBase::
545 updateRegistrationMask(LOC_API_ADAPTER_EVENT_MASK_T event,
546 loc_registration_mask_status isEnabled)
547 DEFAULT_IMPL(-1)
548
549 bool LocApiBase::
550 gnssConstellationConfig()
551 DEFAULT_IMPL(false)
552
553 } // namespace loc_core
554