1 /* Copyright (c) 2009-2016, 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 #define LOG_NDDEBUG 0 31 #define LOG_TAG "LocSvc_eng" 32 33 #include <stdint.h> 34 #include <stdio.h> 35 #include <stdlib.h> 36 #include <unistd.h> 37 #include <dlfcn.h> 38 #include <ctype.h> 39 #include <math.h> 40 #include <pthread.h> 41 #include <arpa/inet.h> 42 #include <netinet/in.h> /* struct sockaddr_in */ 43 #include <sys/socket.h> 44 #include <sys/time.h> 45 #include <netdb.h> 46 #include <time.h> 47 #include <new> 48 #include <LocEngAdapter.h> 49 50 #include <cutils/sched_policy.h> 51 #ifndef USE_GLIB 52 #include <utils/SystemClock.h> 53 #include <utils/Log.h> 54 #endif /* USE_GLIB */ 55 56 #ifdef USE_GLIB 57 #include <glib.h> 58 #include <sys/syscall.h> 59 #endif /* USE_GLIB */ 60 61 #include <string.h> 62 63 #include <loc_eng.h> 64 #include <loc_eng_ni.h> 65 #include <loc_eng_dmn_conn.h> 66 #include <loc_eng_dmn_conn_handler.h> 67 #include <loc_eng_msg.h> 68 #include <loc_eng_nmea.h> 69 #include <msg_q.h> 70 #include <loc.h> 71 #include "log_util.h" 72 #include "platform_lib_includes.h" 73 #include "loc_core_log.h" 74 #include "loc_eng_log.h" 75 76 #define SUCCESS TRUE 77 #define FAILURE FALSE 78 79 #ifndef GPS_CONF_FILE 80 #define GPS_CONF_FILE "/etc/gps.conf" //??? platform independent 81 #endif 82 83 #ifndef SAP_CONF_FILE 84 #define SAP_CONF_FILE "/etc/sap.conf" 85 #endif 86 87 #define XTRA1_GPSONEXTRA "xtra1.gpsonextra.net" 88 89 using namespace loc_core; 90 91 boolean configAlreadyRead = false; 92 unsigned int agpsStatus = 0; 93 94 /* Parameter spec table */ 95 static const loc_param_s_type gps_conf_table[] = 96 { 97 {"GPS_LOCK", &gps_conf.GPS_LOCK, NULL, 'n'}, 98 {"SUPL_VER", &gps_conf.SUPL_VER, NULL, 'n'}, 99 {"LPP_PROFILE", &gps_conf.LPP_PROFILE, NULL, 'n'}, 100 {"A_GLONASS_POS_PROTOCOL_SELECT", &gps_conf.A_GLONASS_POS_PROTOCOL_SELECT, NULL, 'n'}, 101 {"AGPS_CERT_WRITABLE_MASK", &gps_conf.AGPS_CERT_WRITABLE_MASK, NULL, 'n'}, 102 {"SUPL_MODE", &gps_conf.SUPL_MODE, NULL, 'n'}, 103 {"INTERMEDIATE_POS", &gps_conf.INTERMEDIATE_POS, NULL, 'n'}, 104 {"ACCURACY_THRES", &gps_conf.ACCURACY_THRES, NULL, 'n'}, 105 {"NMEA_PROVIDER", &gps_conf.NMEA_PROVIDER, NULL, 'n'}, 106 {"CAPABILITIES", &gps_conf.CAPABILITIES, NULL, 'n'}, 107 {"XTRA_VERSION_CHECK", &gps_conf.XTRA_VERSION_CHECK, NULL, 'n'}, 108 {"XTRA_SERVER_1", &gps_conf.XTRA_SERVER_1, NULL, 's'}, 109 {"XTRA_SERVER_2", &gps_conf.XTRA_SERVER_2, NULL, 's'}, 110 {"XTRA_SERVER_3", &gps_conf.XTRA_SERVER_3, NULL, 's'}, 111 {"USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL", &gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL, NULL, 'n'}, 112 }; 113 114 static const loc_param_s_type sap_conf_table[] = 115 { 116 {"GYRO_BIAS_RANDOM_WALK", &sap_conf.GYRO_BIAS_RANDOM_WALK, &sap_conf.GYRO_BIAS_RANDOM_WALK_VALID, 'f'}, 117 {"ACCEL_RANDOM_WALK_SPECTRAL_DENSITY", &sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY, &sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'}, 118 {"ANGLE_RANDOM_WALK_SPECTRAL_DENSITY", &sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY, &sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'}, 119 {"RATE_RANDOM_WALK_SPECTRAL_DENSITY", &sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY, &sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'}, 120 {"VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY", &sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY, &sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 'f'}, 121 {"SENSOR_ACCEL_BATCHES_PER_SEC", &sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC, NULL, 'n'}, 122 {"SENSOR_ACCEL_SAMPLES_PER_BATCH", &sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH, NULL, 'n'}, 123 {"SENSOR_GYRO_BATCHES_PER_SEC", &sap_conf.SENSOR_GYRO_BATCHES_PER_SEC, NULL, 'n'}, 124 {"SENSOR_GYRO_SAMPLES_PER_BATCH", &sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH, NULL, 'n'}, 125 {"SENSOR_ACCEL_BATCHES_PER_SEC_HIGH", &sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH, NULL, 'n'}, 126 {"SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH", &sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH, NULL, 'n'}, 127 {"SENSOR_GYRO_BATCHES_PER_SEC_HIGH", &sap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH, NULL, 'n'}, 128 {"SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH", &sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH, NULL, 'n'}, 129 {"SENSOR_CONTROL_MODE", &sap_conf.SENSOR_CONTROL_MODE, NULL, 'n'}, 130 {"SENSOR_USAGE", &sap_conf.SENSOR_USAGE, NULL, 'n'}, 131 {"SENSOR_ALGORITHM_CONFIG_MASK", &sap_conf.SENSOR_ALGORITHM_CONFIG_MASK, NULL, 'n'}, 132 {"SENSOR_PROVIDER", &sap_conf.SENSOR_PROVIDER, NULL, 'n'} 133 }; 134 135 static void loc_default_parameters(void) 136 { 137 /*Defaults for gps.conf*/ 138 gps_conf.INTERMEDIATE_POS = 0; 139 gps_conf.ACCURACY_THRES = 0; 140 gps_conf.NMEA_PROVIDER = 0; 141 gps_conf.GPS_LOCK = 0; 142 gps_conf.SUPL_VER = 0x10000; 143 gps_conf.SUPL_MODE = 0x3; 144 gps_conf.CAPABILITIES = 0x7; 145 /* LTE Positioning Profile configuration is disable by default*/ 146 gps_conf.LPP_PROFILE = 0; 147 /*By default no positioning protocol is selected on A-GLONASS system*/ 148 gps_conf.A_GLONASS_POS_PROTOCOL_SELECT = 0; 149 /*XTRA version check is disabled by default*/ 150 gps_conf.XTRA_VERSION_CHECK=0; 151 /*Use emergency PDN by default*/ 152 gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL = 1; 153 154 /*Defaults for sap.conf*/ 155 sap_conf.GYRO_BIAS_RANDOM_WALK = 0; 156 sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC = 2; 157 sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH = 5; 158 sap_conf.SENSOR_GYRO_BATCHES_PER_SEC = 2; 159 sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH = 5; 160 sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH = 4; 161 sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH = 25; 162 sap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH = 4; 163 sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH = 25; 164 sap_conf.SENSOR_CONTROL_MODE = 0; /* AUTO */ 165 sap_conf.SENSOR_USAGE = 0; /* Enabled */ 166 sap_conf.SENSOR_ALGORITHM_CONFIG_MASK = 0; /* INS Disabled = FALSE*/ 167 /* Values MUST be set by OEMs in configuration for sensor-assisted 168 navigation to work. There are NO default values */ 169 sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY = 0; 170 sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY = 0; 171 sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY = 0; 172 sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY = 0; 173 sap_conf.GYRO_BIAS_RANDOM_WALK_VALID = 0; 174 sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0; 175 sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0; 176 sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0; 177 sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID = 0; 178 /* default provider is SSC */ 179 sap_conf.SENSOR_PROVIDER = 1; 180 181 /* None of the 10 slots for agps certificates are writable by default */ 182 gps_conf.AGPS_CERT_WRITABLE_MASK = 0; 183 } 184 185 // 2nd half of init(), singled out for 186 // modem restart to use. 187 static int loc_eng_reinit(loc_eng_data_s_type &loc_eng_data); 188 static void loc_eng_agps_reinit(loc_eng_data_s_type &loc_eng_data); 189 190 static int loc_eng_set_server(loc_eng_data_s_type &loc_eng_data, 191 LocServerType type, const char *hostname, int port); 192 // Internal functions 193 static void loc_inform_gps_status(loc_eng_data_s_type &loc_eng_data, 194 GpsStatusValue status); 195 static void loc_eng_report_status(loc_eng_data_s_type &loc_eng_data, 196 GpsStatusValue status); 197 static void loc_eng_process_conn_request(loc_eng_data_s_type &loc_eng_data, 198 int connHandle, AGpsType agps_type); 199 static void loc_eng_agps_close_status(loc_eng_data_s_type &loc_eng_data, int is_succ); 200 static void loc_eng_handle_engine_down(loc_eng_data_s_type &loc_eng_data) ; 201 static void loc_eng_handle_engine_up(loc_eng_data_s_type &loc_eng_data) ; 202 203 static int loc_eng_start_handler(loc_eng_data_s_type &loc_eng_data); 204 static int loc_eng_stop_handler(loc_eng_data_s_type &loc_eng_data); 205 static int loc_eng_get_zpp_handler(loc_eng_data_s_type &loc_eng_data); 206 static void deleteAidingData(loc_eng_data_s_type &logEng); 207 static AgpsStateMachine* 208 getAgpsStateMachine(loc_eng_data_s_type& logEng, AGpsExtType agpsType); 209 static int dataCallCb(void *cb_data); 210 static void update_aiding_data_for_deletion(loc_eng_data_s_type& loc_eng_data) { 211 if (loc_eng_data.engine_status != GPS_STATUS_ENGINE_ON && 212 loc_eng_data.aiding_data_for_deletion != 0) 213 { 214 loc_eng_data.adapter->deleteAidingData(loc_eng_data.aiding_data_for_deletion); 215 loc_eng_data.aiding_data_for_deletion = 0; 216 } 217 } 218 219 static void* noProc(void* data) 220 { 221 return NULL; 222 } 223 224 /********************************************************************* 225 * definitions of the static messages used in the file 226 *********************************************************************/ 227 // case LOC_ENG_MSG_REQUEST_NI: 228 LocEngRequestNi::LocEngRequestNi(void* locEng, 229 GpsNiNotification ¬if, 230 const void* data) : 231 LocMsg(), mLocEng(locEng), mNotify(notif), mPayload(data) { 232 locallog(); 233 } 234 void LocEngRequestNi::proc() const { 235 loc_eng_ni_request_handler(*((loc_eng_data_s_type*)mLocEng), 236 &mNotify, mPayload); 237 } 238 void LocEngRequestNi::locallog() const 239 { 240 LOC_LOGV("id: %d\n type: %s\n flags: %d\n time out: %d\n " 241 "default response: %s\n requestor id encoding: %s\n" 242 " text encoding: %s\n passThroughData: %p", 243 mNotify.notification_id, 244 loc_get_ni_type_name(mNotify.ni_type), 245 mNotify.notify_flags, 246 mNotify.timeout, 247 loc_get_ni_response_name(mNotify.default_response), 248 loc_get_ni_encoding_name(mNotify.requestor_id_encoding), 249 loc_get_ni_encoding_name(mNotify.text_encoding), 250 mPayload); 251 } 252 inline void LocEngRequestNi::log() const { 253 locallog(); 254 } 255 256 // case LOC_ENG_MSG_INFORM_NI_RESPONSE: 257 // in loc_eng_ni.cpp 258 259 // case LOC_ENG_MSG_START_FIX: 260 LocEngStartFix::LocEngStartFix(LocEngAdapter* adapter) : 261 LocMsg(), mAdapter(adapter) 262 { 263 locallog(); 264 } 265 inline void LocEngStartFix::proc() const 266 { 267 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mAdapter->getOwner(); 268 loc_eng_start_handler(*locEng); 269 } 270 inline void LocEngStartFix::locallog() const 271 { 272 LOC_LOGV("LocEngStartFix"); 273 } 274 inline void LocEngStartFix::log() const 275 { 276 locallog(); 277 } 278 void LocEngStartFix::send() const { 279 mAdapter->sendMsg(this); 280 } 281 282 // case LOC_ENG_MSG_STOP_FIX: 283 LocEngStopFix::LocEngStopFix(LocEngAdapter* adapter) : 284 LocMsg(), mAdapter(adapter) 285 { 286 locallog(); 287 } 288 inline void LocEngStopFix::proc() const 289 { 290 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mAdapter->getOwner(); 291 loc_eng_stop_handler(*locEng); 292 } 293 inline void LocEngStopFix::locallog() const 294 { 295 LOC_LOGV("LocEngStopFix"); 296 } 297 inline void LocEngStopFix::log() const 298 { 299 locallog(); 300 } 301 void LocEngStopFix::send() const { 302 mAdapter->sendMsg(this); 303 } 304 305 // case LOC_ENG_MSG_SET_POSITION_MODE: 306 LocEngPositionMode::LocEngPositionMode(LocEngAdapter* adapter, 307 LocPosMode &mode) : 308 LocMsg(), mAdapter(adapter), mPosMode(mode) 309 { 310 mPosMode.logv(); 311 } 312 inline void LocEngPositionMode::proc() const { 313 mAdapter->setPositionMode(&mPosMode); 314 } 315 inline void LocEngPositionMode::log() const { 316 mPosMode.logv(); 317 } 318 void LocEngPositionMode::send() const { 319 mAdapter->sendMsg(this); 320 } 321 322 LocEngGetZpp::LocEngGetZpp(LocEngAdapter* adapter) : 323 LocMsg(), mAdapter(adapter) 324 { 325 locallog(); 326 } 327 inline void LocEngGetZpp::proc() const 328 { 329 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mAdapter->getOwner(); 330 loc_eng_get_zpp_handler(*locEng); 331 } 332 inline void LocEngGetZpp::locallog() const 333 { 334 LOC_LOGV("LocEngGetZpp"); 335 } 336 inline void LocEngGetZpp::log() const 337 { 338 locallog(); 339 } 340 void LocEngGetZpp::send() const { 341 mAdapter->sendMsg(this); 342 } 343 344 struct LocEngSetTime : public LocMsg { 345 LocEngAdapter* mAdapter; 346 const GpsUtcTime mTime; 347 const int64_t mTimeReference; 348 const int mUncertainty; 349 inline LocEngSetTime(LocEngAdapter* adapter, 350 GpsUtcTime t, int64_t tf, int unc) : 351 LocMsg(), mAdapter(adapter), 352 mTime(t), mTimeReference(tf), mUncertainty(unc) 353 { 354 locallog(); 355 } 356 inline virtual void proc() const { 357 mAdapter->setTime(mTime, mTimeReference, mUncertainty); 358 } 359 inline void locallog() const { 360 LOC_LOGV("time: %lld\n timeReference: %lld\n uncertainty: %d", 361 mTime, mTimeReference, mUncertainty); 362 } 363 inline virtual void log() const { 364 locallog(); 365 } 366 }; 367 368 // case LOC_ENG_MSG_INJECT_LOCATION: 369 struct LocEngInjectLocation : public LocMsg { 370 LocEngAdapter* mAdapter; 371 const double mLatitude; 372 const double mLongitude; 373 const float mAccuracy; 374 inline LocEngInjectLocation(LocEngAdapter* adapter, 375 double lat, double lon, float accur) : 376 LocMsg(), mAdapter(adapter), 377 mLatitude(lat), mLongitude(lon), mAccuracy(accur) 378 { 379 locallog(); 380 } 381 inline virtual void proc() const { 382 mAdapter->injectPosition(mLatitude, mLongitude, mAccuracy); 383 } 384 inline void locallog() const { 385 LOC_LOGV("latitude: %f\n longitude: %f\n accuracy: %f", 386 mLatitude, mLongitude, mAccuracy); 387 } 388 inline virtual void log() const { 389 locallog(); 390 } 391 }; 392 393 // case LOC_ENG_MSG_SET_SERVER_IPV4: 394 struct LocEngSetServerIpv4 : public LocMsg { 395 LocEngAdapter* mAdapter; 396 const unsigned int mNlAddr; 397 const int mPort; 398 const LocServerType mServerType; 399 inline LocEngSetServerIpv4(LocEngAdapter* adapter, 400 unsigned int ip, 401 int port, 402 LocServerType type) : 403 LocMsg(), mAdapter(adapter), 404 mNlAddr(ip), mPort(port), mServerType(type) 405 { 406 locallog(); 407 } 408 inline virtual void proc() const { 409 mAdapter->setServer(mNlAddr, mPort, mServerType); 410 } 411 inline void locallog() const { 412 LOC_LOGV("LocEngSetServerIpv4 - addr: %x, port: %d, type: %s", 413 mNlAddr, mPort, loc_get_server_type_name(mServerType)); 414 } 415 inline virtual void log() const { 416 locallog(); 417 } 418 }; 419 420 // case LOC_ENG_MSG_SET_SERVER_URL: 421 struct LocEngSetServerUrl : public LocMsg { 422 LocEngAdapter* mAdapter; 423 const int mLen; 424 char* mUrl; 425 inline LocEngSetServerUrl(LocEngAdapter* adapter, 426 char* urlString, 427 int url_len) : 428 LocMsg(), mAdapter(adapter), 429 mLen(url_len), mUrl(new char[mLen+1]) 430 { 431 memcpy((void*)mUrl, (void*)urlString, url_len); 432 mUrl[mLen] = 0; 433 locallog(); 434 } 435 inline ~LocEngSetServerUrl() 436 { 437 delete[] mUrl; 438 } 439 inline virtual void proc() const { 440 mAdapter->setServer(mUrl, mLen); 441 } 442 inline void locallog() const { 443 LOC_LOGV("LocEngSetServerUrl - url: %s", mUrl); 444 } 445 inline virtual void log() const { 446 locallog(); 447 } 448 }; 449 450 // case LOC_ENG_MSG_A_GLONASS_PROTOCOL: 451 struct LocEngAGlonassProtocol : public LocMsg { 452 LocEngAdapter* mAdapter; 453 const unsigned long mAGlonassProtocl; 454 inline LocEngAGlonassProtocol(LocEngAdapter* adapter, 455 unsigned long protocol) : 456 LocMsg(), mAdapter(adapter), mAGlonassProtocl(protocol) 457 { 458 locallog(); 459 } 460 inline virtual void proc() const { 461 mAdapter->setAGLONASSProtocol(mAGlonassProtocl); 462 } 463 inline void locallog() const { 464 LOC_LOGV("A-GLONASS protocol: 0x%lx", mAGlonassProtocl); 465 } 466 inline virtual void log() const { 467 locallog(); 468 } 469 }; 470 471 // case LOC_ENG_MSG_SUPL_VERSION: 472 struct LocEngSuplVer : public LocMsg { 473 LocEngAdapter* mAdapter; 474 const int mSuplVer; 475 inline LocEngSuplVer(LocEngAdapter* adapter, 476 int suplVer) : 477 LocMsg(), mAdapter(adapter), mSuplVer(suplVer) 478 { 479 locallog(); 480 } 481 inline virtual void proc() const { 482 mAdapter->setSUPLVersion(mSuplVer); 483 } 484 inline void locallog() const { 485 LOC_LOGV("SUPL Version: %d", mSuplVer); 486 } 487 inline virtual void log() const { 488 locallog(); 489 } 490 }; 491 492 struct LocEngSuplMode : public LocMsg { 493 UlpProxyBase* mUlp; 494 495 inline LocEngSuplMode(UlpProxyBase* ulp) : 496 LocMsg(), mUlp(ulp) 497 { 498 locallog(); 499 } 500 inline virtual void proc() const { 501 mUlp->setCapabilities(ContextBase::getCarrierCapabilities()); 502 } 503 inline void locallog() const { 504 } 505 inline virtual void log() const { 506 locallog(); 507 } 508 }; 509 510 // case LOC_ENG_MSG_LPP_CONFIG: 511 struct LocEngLppConfig : public LocMsg { 512 LocEngAdapter* mAdapter; 513 const int mLppConfig; 514 inline LocEngLppConfig(LocEngAdapter* adapter, 515 int lppConfig) : 516 LocMsg(), mAdapter(adapter), mLppConfig(lppConfig) 517 { 518 locallog(); 519 } 520 inline virtual void proc() const { 521 mAdapter->setLPPConfig(mLppConfig); 522 } 523 inline void locallog() const { 524 LOC_LOGV("LocEngLppConfig - profile: %d", mLppConfig); 525 } 526 inline virtual void log() const { 527 locallog(); 528 } 529 }; 530 531 // case LOC_ENG_MSG_SET_SENSOR_CONTROL_CONFIG: 532 struct LocEngSensorControlConfig : public LocMsg { 533 LocEngAdapter* mAdapter; 534 const int mSensorsDisabled; 535 const int mSensorProvider; 536 inline LocEngSensorControlConfig(LocEngAdapter* adapter, 537 int sensorsDisabled, int sensorProvider) : 538 LocMsg(), mAdapter(adapter), mSensorsDisabled(sensorsDisabled), 539 mSensorProvider(sensorProvider) 540 { 541 locallog(); 542 } 543 inline virtual void proc() const { 544 mAdapter->setSensorControlConfig(mSensorsDisabled, mSensorProvider); 545 } 546 inline void locallog() const { 547 LOC_LOGV("LocEngSensorControlConfig - Sensors Disabled: %d, Sensor Provider: %d", 548 mSensorsDisabled, mSensorProvider); 549 } 550 inline virtual void log() const { 551 locallog(); 552 } 553 }; 554 555 // case LOC_ENG_MSG_SET_SENSOR_PROPERTIES: 556 struct LocEngSensorProperties : public LocMsg { 557 LocEngAdapter* mAdapter; 558 const bool mGyroBiasVarianceRandomWalkValid; 559 const float mGyroBiasVarianceRandomWalk; 560 const bool mAccelRandomWalkValid; 561 const float mAccelRandomWalk; 562 const bool mAngleRandomWalkValid; 563 const float mAngleRandomWalk; 564 const bool mRateRandomWalkValid; 565 const float mRateRandomWalk; 566 const bool mVelocityRandomWalkValid; 567 const float mVelocityRandomWalk; 568 inline LocEngSensorProperties(LocEngAdapter* adapter, 569 bool gyroBiasRandomWalk_valid, 570 float gyroBiasRandomWalk, 571 bool accelRandomWalk_valid, 572 float accelRandomWalk, 573 bool angleRandomWalk_valid, 574 float angleRandomWalk, 575 bool rateRandomWalk_valid, 576 float rateRandomWalk, 577 bool velocityRandomWalk_valid, 578 float velocityRandomWalk) : 579 LocMsg(), mAdapter(adapter), 580 mGyroBiasVarianceRandomWalkValid(gyroBiasRandomWalk_valid), 581 mGyroBiasVarianceRandomWalk(gyroBiasRandomWalk), 582 mAccelRandomWalkValid(accelRandomWalk_valid), 583 mAccelRandomWalk(accelRandomWalk), 584 mAngleRandomWalkValid(angleRandomWalk_valid), 585 mAngleRandomWalk(angleRandomWalk), 586 mRateRandomWalkValid(rateRandomWalk_valid), 587 mRateRandomWalk(rateRandomWalk), 588 mVelocityRandomWalkValid(velocityRandomWalk_valid), 589 mVelocityRandomWalk(velocityRandomWalk) 590 { 591 locallog(); 592 } 593 inline virtual void proc() const { 594 mAdapter->setSensorProperties(mGyroBiasVarianceRandomWalkValid, 595 mGyroBiasVarianceRandomWalk, 596 mAccelRandomWalkValid, 597 mAccelRandomWalk, 598 mAngleRandomWalkValid, 599 mAngleRandomWalk, 600 mRateRandomWalkValid, 601 mRateRandomWalk, 602 mVelocityRandomWalkValid, 603 mVelocityRandomWalk); 604 } 605 inline void locallog() const { 606 LOC_LOGV("Sensor properties validity, Gyro Random walk: %d " 607 "Accel Random Walk: %d " 608 "Angle Random Walk: %d Rate Random Walk: %d " 609 "Velocity Random Walk: %d\n" 610 "Sensor properties, Gyro Random walk: %f " 611 "Accel Random Walk: %f " 612 "Angle Random Walk: %f Rate Random Walk: %f " 613 "Velocity Random Walk: %f", 614 mGyroBiasVarianceRandomWalkValid, 615 mAccelRandomWalkValid, 616 mAngleRandomWalkValid, 617 mRateRandomWalkValid, 618 mVelocityRandomWalkValid, 619 mGyroBiasVarianceRandomWalk, 620 mAccelRandomWalk, 621 mAngleRandomWalk, 622 mRateRandomWalk, 623 mVelocityRandomWalk 624 ); 625 } 626 inline virtual void log() const { 627 locallog(); 628 } 629 }; 630 631 // case LOC_ENG_MSG_SET_SENSOR_PERF_CONTROL_CONFIG: 632 struct LocEngSensorPerfControlConfig : public LocMsg { 633 LocEngAdapter* mAdapter; 634 const int mControlMode; 635 const int mAccelSamplesPerBatch; 636 const int mAccelBatchesPerSec; 637 const int mGyroSamplesPerBatch; 638 const int mGyroBatchesPerSec; 639 const int mAccelSamplesPerBatchHigh; 640 const int mAccelBatchesPerSecHigh; 641 const int mGyroSamplesPerBatchHigh; 642 const int mGyroBatchesPerSecHigh; 643 const int mAlgorithmConfig; 644 inline LocEngSensorPerfControlConfig(LocEngAdapter* adapter, 645 int controlMode, 646 int accelSamplesPerBatch, 647 int accelBatchesPerSec, 648 int gyroSamplesPerBatch, 649 int gyroBatchesPerSec, 650 int accelSamplesPerBatchHigh, 651 int accelBatchesPerSecHigh, 652 int gyroSamplesPerBatchHigh, 653 int gyroBatchesPerSecHigh, 654 int algorithmConfig) : 655 LocMsg(), mAdapter(adapter), 656 mControlMode(controlMode), 657 mAccelSamplesPerBatch(accelSamplesPerBatch), 658 mAccelBatchesPerSec(accelBatchesPerSec), 659 mGyroSamplesPerBatch(gyroSamplesPerBatch), 660 mGyroBatchesPerSec(gyroBatchesPerSec), 661 mAccelSamplesPerBatchHigh(accelSamplesPerBatchHigh), 662 mAccelBatchesPerSecHigh(accelBatchesPerSecHigh), 663 mGyroSamplesPerBatchHigh(gyroSamplesPerBatchHigh), 664 mGyroBatchesPerSecHigh(gyroBatchesPerSecHigh), 665 mAlgorithmConfig(algorithmConfig) 666 { 667 locallog(); 668 } 669 inline virtual void proc() const { 670 mAdapter->setSensorPerfControlConfig(mControlMode, 671 mAccelSamplesPerBatch, 672 mAccelBatchesPerSec, 673 mGyroSamplesPerBatch, 674 mGyroBatchesPerSec, 675 mAccelSamplesPerBatchHigh, 676 mAccelBatchesPerSecHigh, 677 mGyroSamplesPerBatchHigh, 678 mGyroBatchesPerSecHigh, 679 mAlgorithmConfig); 680 } 681 inline void locallog() const { 682 LOC_LOGV("Sensor Perf Control Config (performanceControlMode)(%u) " 683 "accel(#smp,#batches) (%u,%u) " 684 "gyro(#smp,#batches) (%u,%u), " 685 "accel_high(#smp,#batches) (%u,%u) " 686 "gyro_high(#smp,#batches) (%u,%u), " 687 "algorithmConfig(%u)\n", 688 mControlMode, 689 mAccelSamplesPerBatch, mAccelBatchesPerSec, 690 mGyroSamplesPerBatch, mGyroBatchesPerSec, 691 mAccelSamplesPerBatchHigh, mAccelBatchesPerSecHigh, 692 mGyroSamplesPerBatchHigh, mGyroBatchesPerSecHigh, 693 mAlgorithmConfig); 694 } 695 inline virtual void log() const { 696 locallog(); 697 } 698 }; 699 700 // case LOC_ENG_MSG_EXT_POWER_CONFIG: 701 struct LocEngExtPowerConfig : public LocMsg { 702 LocEngAdapter* mAdapter; 703 const int mIsBatteryCharging; 704 inline LocEngExtPowerConfig(LocEngAdapter* adapter, 705 int isBatteryCharging) : 706 LocMsg(), mAdapter(adapter), 707 mIsBatteryCharging(isBatteryCharging) 708 { 709 locallog(); 710 } 711 inline virtual void proc() const { 712 mAdapter->setExtPowerConfig(mIsBatteryCharging); 713 } 714 inline void locallog() const { 715 LOC_LOGV("LocEngExtPowerConfig - isBatteryCharging: %d", 716 mIsBatteryCharging); 717 } 718 inline virtual void log() const { 719 locallog(); 720 } 721 }; 722 723 // case LOC_ENG_MSG_REPORT_POSITION: 724 LocEngReportPosition::LocEngReportPosition(LocAdapterBase* adapter, 725 UlpLocation &loc, 726 GpsLocationExtended &locExtended, 727 void* locExt, 728 enum loc_sess_status st, 729 LocPosTechMask technology) : 730 LocMsg(), mAdapter(adapter), mLocation(loc), 731 mLocationExtended(locExtended), 732 mLocationExt(((loc_eng_data_s_type*) 733 ((LocEngAdapter*) 734 (mAdapter))->getOwner())->location_ext_parser(locExt)), 735 mStatus(st), mTechMask(technology) 736 { 737 locallog(); 738 } 739 void LocEngReportPosition::proc() const { 740 LocEngAdapter* adapter = (LocEngAdapter*)mAdapter; 741 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)adapter->getOwner(); 742 743 if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION) { 744 bool reported = false; 745 if (locEng->location_cb != NULL) { 746 if (LOC_SESS_FAILURE == mStatus) { 747 // in case we want to handle the failure case 748 locEng->location_cb(NULL, NULL); 749 reported = true; 750 } 751 // what's in the else if is... (line by line) 752 // 1. this is a final fix; and 753 // 1.1 it is a Satellite fix; or 754 // 1.2 it is a sensor fix 755 // 2. (must be intermediate fix... implicit) 756 // 2.1 we accepte intermediate; and 757 // 2.2 it is NOT the case that 758 // 2.2.1 there is inaccuracy; and 759 // 2.2.2 we care about inaccuracy; and 760 // 2.2.3 the inaccuracy exceeds our tolerance 761 else if ((LOC_SESS_SUCCESS == mStatus && 762 ((LOC_POS_TECH_MASK_SATELLITE | 763 LOC_POS_TECH_MASK_SENSORS | 764 LOC_POS_TECH_MASK_HYBRID) & 765 mTechMask)) || 766 (LOC_SESS_INTERMEDIATE == locEng->intermediateFix && 767 !((mLocation.gpsLocation.flags & 768 GPS_LOCATION_HAS_ACCURACY) && 769 (gps_conf.ACCURACY_THRES != 0) && 770 (mLocation.gpsLocation.accuracy > 771 gps_conf.ACCURACY_THRES)))) { 772 locEng->location_cb((UlpLocation*)&(mLocation), 773 (void*)mLocationExt); 774 reported = true; 775 } 776 } 777 778 // if we have reported this fix 779 if (reported && 780 // and if this is a singleshot 781 GPS_POSITION_RECURRENCE_SINGLE == 782 locEng->adapter->getPositionMode().recurrence) { 783 if (LOC_SESS_INTERMEDIATE == mStatus) { 784 // modem could be still working for a final fix, 785 // although we no longer need it. So stopFix(). 786 locEng->adapter->stopFix(); 787 } 788 // turn off the session flag. 789 locEng->adapter->setInSession(false); 790 } 791 792 LOC_LOGV("LocEngReportPosition::proc() - generateNmea: %d, position source: %d, " 793 "engine_status: %d, isInSession: %d", 794 locEng->generateNmea, mLocation.position_source, 795 locEng->engine_status, locEng->adapter->isInSession()); 796 797 if (locEng->generateNmea && 798 locEng->adapter->isInSession()) 799 { 800 unsigned char generate_nmea = reported && 801 (mStatus != LOC_SESS_FAILURE); 802 loc_eng_nmea_generate_pos(locEng, mLocation, mLocationExtended, 803 generate_nmea); 804 } 805 806 // Free the allocated memory for rawData 807 UlpLocation* gp = (UlpLocation*)&(mLocation); 808 if (gp != NULL && gp->rawData != NULL) 809 { 810 delete (char*)gp->rawData; 811 gp->rawData = NULL; 812 gp->rawDataSize = 0; 813 } 814 } 815 } 816 void LocEngReportPosition::locallog() const { 817 LOC_LOGV("LocEngReportPosition"); 818 } 819 void LocEngReportPosition::log() const { 820 locallog(); 821 } 822 void LocEngReportPosition::send() const { 823 mAdapter->sendMsg(this); 824 } 825 826 827 // case LOC_ENG_MSG_REPORT_SV: 828 LocEngReportSv::LocEngReportSv(LocAdapterBase* adapter, 829 GnssSvStatus &sv, 830 GpsLocationExtended &locExtended, 831 void* svExt) : 832 LocMsg(), mAdapter(adapter), mSvStatus(sv), 833 mLocationExtended(locExtended), 834 mSvExt(((loc_eng_data_s_type*) 835 ((LocEngAdapter*) 836 (mAdapter))->getOwner())->sv_ext_parser(svExt)) 837 { 838 locallog(); 839 } 840 void LocEngReportSv::proc() const { 841 LocEngAdapter* adapter = (LocEngAdapter*)mAdapter; 842 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)adapter->getOwner(); 843 844 if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION) 845 { 846 if (locEng->gnss_sv_status_cb != NULL) { 847 LOC_LOGE("Calling gnss_sv_status_cb"); 848 locEng->gnss_sv_status_cb((GnssSvStatus*)&(mSvStatus)); 849 } 850 851 if (locEng->generateNmea) 852 { 853 loc_eng_nmea_generate_sv(locEng, mSvStatus, mLocationExtended); 854 } 855 } 856 } 857 void LocEngReportSv::locallog() const { 858 LOC_LOGV("%s:%d] LocEngReportSv",__func__, __LINE__); 859 } 860 inline void LocEngReportSv::log() const { 861 locallog(); 862 } 863 void LocEngReportSv::send() const { 864 mAdapter->sendMsg(this); 865 } 866 867 // case LOC_ENG_MSG_REPORT_STATUS: 868 LocEngReportStatus::LocEngReportStatus(LocAdapterBase* adapter, 869 GpsStatusValue engineStatus) : 870 LocMsg(), mAdapter(adapter), mStatus(engineStatus) 871 { 872 locallog(); 873 } 874 inline void LocEngReportStatus::proc() const 875 { 876 LocEngAdapter* adapter = (LocEngAdapter*)mAdapter; 877 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)adapter->getOwner(); 878 879 loc_eng_report_status(*locEng, mStatus); 880 update_aiding_data_for_deletion(*locEng); 881 } 882 inline void LocEngReportStatus::locallog() const { 883 LOC_LOGV("LocEngReportStatus"); 884 } 885 inline void LocEngReportStatus::log() const { 886 locallog(); 887 } 888 889 // case LOC_ENG_MSG_REPORT_NMEA: 890 LocEngReportNmea::LocEngReportNmea(void* locEng, 891 const char* data, int len) : 892 LocMsg(), mLocEng(locEng), mNmea(new char[len]), mLen(len) 893 { 894 memcpy((void*)mNmea, (void*)data, len); 895 locallog(); 896 } 897 void LocEngReportNmea::proc() const { 898 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*) mLocEng; 899 900 struct timeval tv; 901 gettimeofday(&tv, (struct timezone *) NULL); 902 int64_t now = tv.tv_sec * 1000LL + tv.tv_usec / 1000; 903 904 if (locEng->nmea_cb != NULL) 905 locEng->nmea_cb(now, mNmea, mLen); 906 } 907 inline void LocEngReportNmea::locallog() const { 908 LOC_LOGV("LocEngReportNmea"); 909 } 910 inline void LocEngReportNmea::log() const { 911 locallog(); 912 } 913 914 // case LOC_ENG_MSG_REPORT_XTRA_SERVER: 915 LocEngReportXtraServer::LocEngReportXtraServer(void* locEng, 916 const char *url1, 917 const char *url2, 918 const char *url3, 919 const int maxlength) : 920 LocMsg(), mLocEng(locEng), mMaxLen(maxlength), 921 mServers(new char[3*(mMaxLen+1)]) 922 { 923 char * cptr = mServers; 924 memset(mServers, 0, 3*(mMaxLen+1)); 925 926 // Override modem URLs with uncommented gps.conf urls 927 if( gps_conf.XTRA_SERVER_1[0] != '\0' ) { 928 url1 = &gps_conf.XTRA_SERVER_1[0]; 929 } 930 if( gps_conf.XTRA_SERVER_2[0] != '\0' ) { 931 url2 = &gps_conf.XTRA_SERVER_2[0]; 932 } 933 if( gps_conf.XTRA_SERVER_3[0] != '\0' ) { 934 url3 = &gps_conf.XTRA_SERVER_3[0]; 935 } 936 // copy non xtra1.gpsonextra.net URLs into the forwarding buffer. 937 if( NULL == strcasestr(url1, XTRA1_GPSONEXTRA) ) { 938 strlcpy(cptr, url1, mMaxLen + 1); 939 cptr += mMaxLen + 1; 940 } 941 if( NULL == strcasestr(url2, XTRA1_GPSONEXTRA) ) { 942 strlcpy(cptr, url2, mMaxLen + 1); 943 cptr += mMaxLen + 1; 944 } 945 if( NULL == strcasestr(url3, XTRA1_GPSONEXTRA) ) { 946 strlcpy(cptr, url3, mMaxLen + 1); 947 } 948 locallog(); 949 } 950 951 void LocEngReportXtraServer::proc() const { 952 loc_eng_xtra_data_s_type* locEngXtra = 953 &(((loc_eng_data_s_type*)mLocEng)->xtra_module_data); 954 955 if (locEngXtra->report_xtra_server_cb != NULL) { 956 CALLBACK_LOG_CALLFLOW("report_xtra_server_cb", %s, mServers); 957 locEngXtra->report_xtra_server_cb(mServers, 958 &(mServers[mMaxLen+1]), 959 &(mServers[(mMaxLen+1)<<1])); 960 } else { 961 LOC_LOGE("Callback function for request xtra is NULL"); 962 } 963 } 964 inline void LocEngReportXtraServer::locallog() const { 965 LOC_LOGV("LocEngReportXtraServers: server1: %s\n server2: %s\n" 966 " server3: %s\n", 967 mServers, &mServers[mMaxLen+1], &mServers[(mMaxLen+1)<<1]); 968 } 969 inline void LocEngReportXtraServer::log() const { 970 locallog(); 971 } 972 973 // case LOC_ENG_MSG_REQUEST_BIT: 974 // case LOC_ENG_MSG_RELEASE_BIT: 975 LocEngReqRelBIT::LocEngReqRelBIT(void* locEng, AGpsExtType type, 976 int ipv4, char* ipv6, bool isReq) : 977 LocMsg(), mLocEng(locEng), mType(type), mIPv4Addr(ipv4), 978 mIPv6Addr(ipv6 ? new char[16] : NULL), mIsReq(isReq) { 979 if (NULL != ipv6) 980 memcpy(mIPv6Addr, ipv6, 16); 981 locallog(); 982 } 983 inline LocEngReqRelBIT::~LocEngReqRelBIT() { 984 if (mIPv6Addr) { 985 delete[] mIPv6Addr; 986 } 987 } 988 void LocEngReqRelBIT::proc() const { 989 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 990 BITSubscriber s(getAgpsStateMachine(*locEng, mType), 991 mIPv4Addr, mIPv6Addr); 992 AgpsStateMachine* sm = (AgpsStateMachine*)s.mStateMachine; 993 994 if (mIsReq) { 995 sm->subscribeRsrc((Subscriber*)&s); 996 } else { 997 sm->unsubscribeRsrc((Subscriber*)&s); 998 } 999 } 1000 inline void LocEngReqRelBIT::locallog() const { 1001 LOC_LOGV("LocEngRequestBIT - ipv4: %d.%d.%d.%d, ipv6: %s", 1002 (unsigned char)mIPv4Addr, 1003 (unsigned char)(mIPv4Addr>>8), 1004 (unsigned char)(mIPv4Addr>>16), 1005 (unsigned char)(mIPv4Addr>>24), 1006 NULL != mIPv6Addr ? mIPv6Addr : ""); 1007 } 1008 inline void LocEngReqRelBIT::log() const { 1009 locallog(); 1010 } 1011 void LocEngReqRelBIT::send() const { 1012 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1013 locEng->adapter->sendMsg(this); 1014 } 1015 1016 // case LOC_ENG_MSG_RELEASE_BIT: 1017 struct LocEngReleaseBIT : public LocMsg { 1018 const BITSubscriber mSubscriber; 1019 inline LocEngReleaseBIT(const AgpsStateMachine* stateMachine, 1020 unsigned int ipv4, char* ipv6) : 1021 LocMsg(), 1022 mSubscriber(stateMachine, ipv4, ipv6) 1023 { 1024 locallog(); 1025 } 1026 inline virtual void proc() const 1027 { 1028 AgpsStateMachine* sm = (AgpsStateMachine*)mSubscriber.mStateMachine; 1029 sm->unsubscribeRsrc((Subscriber*)&mSubscriber); 1030 } 1031 inline void locallog() const { 1032 LOC_LOGV("LocEngReleaseBIT - ipv4: %d.%d.%d.%d, ipv6: %s", 1033 (unsigned char)(mSubscriber.ID>>24), 1034 (unsigned char)(mSubscriber.ID>>16), 1035 (unsigned char)(mSubscriber.ID>>8), 1036 (unsigned char)mSubscriber.ID, 1037 NULL != mSubscriber.mIPv6Addr ? mSubscriber.mIPv6Addr : ""); 1038 } 1039 virtual void log() const { 1040 locallog(); 1041 } 1042 }; 1043 1044 // LocEngSuplEsOpened 1045 LocEngSuplEsOpened::LocEngSuplEsOpened(void* locEng) : 1046 LocMsg(), mLocEng(locEng) { 1047 locallog(); 1048 } 1049 void LocEngSuplEsOpened::proc() const { 1050 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1051 if (locEng->ds_nif) { 1052 AgpsStateMachine* sm = locEng->ds_nif; 1053 sm->onRsrcEvent(RSRC_GRANTED); 1054 } 1055 } 1056 void LocEngSuplEsOpened::locallog() const { 1057 LOC_LOGV("LocEngSuplEsOpened"); 1058 } 1059 void LocEngSuplEsOpened::log() const { 1060 locallog(); 1061 } 1062 1063 // LocEngSuplEsClosed 1064 LocEngSuplEsClosed::LocEngSuplEsClosed(void* locEng) : 1065 LocMsg(), mLocEng(locEng) { 1066 locallog(); 1067 } 1068 void LocEngSuplEsClosed::proc() const { 1069 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1070 if (locEng->ds_nif) { 1071 AgpsStateMachine* sm = locEng->ds_nif; 1072 sm->onRsrcEvent(RSRC_RELEASED); 1073 } 1074 } 1075 void LocEngSuplEsClosed::locallog() const { 1076 LOC_LOGV("LocEngSuplEsClosed"); 1077 } 1078 void LocEngSuplEsClosed::log() const { 1079 locallog(); 1080 } 1081 1082 1083 // case LOC_ENG_MSG_REQUEST_SUPL_ES: 1084 LocEngRequestSuplEs::LocEngRequestSuplEs(void* locEng, int id) : 1085 LocMsg(), mLocEng(locEng), mID(id) { 1086 locallog(); 1087 } 1088 void LocEngRequestSuplEs::proc() const { 1089 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1090 if (locEng->ds_nif) { 1091 AgpsStateMachine* sm = locEng->ds_nif; 1092 DSSubscriber s(sm, mID); 1093 sm->subscribeRsrc((Subscriber*)&s); 1094 } 1095 else if (locEng->agnss_nif) { 1096 AgpsStateMachine *sm = locEng->agnss_nif; 1097 ATLSubscriber s(mID, 1098 sm, 1099 locEng->adapter, 1100 false); 1101 sm->subscribeRsrc((Subscriber*)&s); 1102 LOC_LOGD("%s:%d]: Using regular ATL for SUPL ES", __func__, __LINE__); 1103 } 1104 else { 1105 locEng->adapter->atlOpenStatus(mID, 0, NULL, -1, -1); 1106 } 1107 } 1108 inline void LocEngRequestSuplEs::locallog() const { 1109 LOC_LOGV("LocEngRequestSuplEs"); 1110 } 1111 inline void LocEngRequestSuplEs::log() const { 1112 locallog(); 1113 } 1114 1115 // case LOC_ENG_MSG_REQUEST_ATL: 1116 LocEngRequestATL::LocEngRequestATL(void* locEng, int id, 1117 AGpsExtType agps_type) : 1118 LocMsg(), mLocEng(locEng), mID(id), mType(agps_type) { 1119 locallog(); 1120 } 1121 void LocEngRequestATL::proc() const { 1122 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1123 AgpsStateMachine* sm = (AgpsStateMachine*) 1124 getAgpsStateMachine(*locEng, mType); 1125 if (sm) { 1126 ATLSubscriber s(mID, 1127 sm, 1128 locEng->adapter, 1129 AGPS_TYPE_INVALID == mType); 1130 sm->subscribeRsrc((Subscriber*)&s); 1131 } else { 1132 locEng->adapter->atlOpenStatus(mID, 0, NULL, -1, mType); 1133 } 1134 } 1135 inline void LocEngRequestATL::locallog() const { 1136 LOC_LOGV("LocEngRequestATL"); 1137 } 1138 inline void LocEngRequestATL::log() const { 1139 locallog(); 1140 } 1141 1142 // case LOC_ENG_MSG_RELEASE_ATL: 1143 LocEngReleaseATL::LocEngReleaseATL(void* locEng, int id) : 1144 LocMsg(), mLocEng(locEng), mID(id) { 1145 locallog(); 1146 } 1147 void LocEngReleaseATL::proc() const { 1148 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1149 1150 if (locEng->agnss_nif) { 1151 ATLSubscriber s1(mID, locEng->agnss_nif, locEng->adapter, false); 1152 if (locEng->agnss_nif->unsubscribeRsrc((Subscriber*)&s1)) { 1153 LOC_LOGD("%s:%d]: Unsubscribed from agnss_nif", 1154 __func__, __LINE__); 1155 return; 1156 } 1157 } 1158 1159 if (locEng->internet_nif) { 1160 ATLSubscriber s2(mID, locEng->internet_nif, locEng->adapter, false); 1161 if (locEng->internet_nif->unsubscribeRsrc((Subscriber*)&s2)) { 1162 LOC_LOGD("%s:%d]: Unsubscribed from internet_nif", 1163 __func__, __LINE__); 1164 return; 1165 } 1166 } 1167 1168 if (locEng->ds_nif) { 1169 DSSubscriber s3(locEng->ds_nif, mID); 1170 if (locEng->ds_nif->unsubscribeRsrc((Subscriber*)&s3)) { 1171 LOC_LOGD("%s:%d]: Unsubscribed from ds_nif", 1172 __func__, __LINE__); 1173 return; 1174 } 1175 } 1176 1177 LOC_LOGW("%s:%d]: Could not release ATL. " 1178 "No subscribers found\n", 1179 __func__, __LINE__); 1180 locEng->adapter->atlCloseStatus(mID, 0); 1181 } 1182 inline void LocEngReleaseATL::locallog() const { 1183 LOC_LOGV("LocEngReleaseATL"); 1184 } 1185 inline void LocEngReleaseATL::log() const { 1186 locallog(); 1187 } 1188 1189 // case LOC_ENG_MSG_REQUEST_WIFI: 1190 // case LOC_ENG_MSG_RELEASE_WIFI: 1191 LocEngReqRelWifi::LocEngReqRelWifi(void* locEng, AGpsExtType type, 1192 loc_if_req_sender_id_e_type sender_id, 1193 char* s, char* p, bool isReq) : 1194 LocMsg(), mLocEng(locEng), mType(type), mSenderId(sender_id), 1195 mSSID(NULL == s ? NULL : new char[SSID_BUF_SIZE]), 1196 mPassword(NULL == p ? NULL : new char[SSID_BUF_SIZE]), 1197 mIsReq(isReq) { 1198 if (NULL != s) 1199 strlcpy(mSSID, s, SSID_BUF_SIZE); 1200 if (NULL != p) 1201 strlcpy(mPassword, p, SSID_BUF_SIZE); 1202 locallog(); 1203 } 1204 LocEngReqRelWifi::~LocEngReqRelWifi() { 1205 if (NULL != mSSID) { 1206 delete[] mSSID; 1207 } 1208 if (NULL != mPassword) { 1209 delete[] mPassword; 1210 } 1211 } 1212 void LocEngReqRelWifi::proc() const { 1213 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1214 if (locEng->wifi_nif) { 1215 WIFISubscriber s(locEng->wifi_nif, mSSID, mPassword, mSenderId); 1216 if (mIsReq) { 1217 locEng->wifi_nif->subscribeRsrc((Subscriber*)&s); 1218 } else { 1219 locEng->wifi_nif->unsubscribeRsrc((Subscriber*)&s); 1220 } 1221 } else { 1222 locEng->adapter->atlOpenStatus(mSenderId, 0, NULL, -1, mType); 1223 } 1224 } 1225 inline void LocEngReqRelWifi::locallog() const { 1226 LOC_LOGV("%s - senderId: %d, ssid: %s, password: %s", 1227 mIsReq ? "LocEngRequestWifi" : "LocEngReleaseWifi", 1228 mSenderId, 1229 NULL != mSSID ? mSSID : "", 1230 NULL != mPassword ? mPassword : ""); 1231 } 1232 inline void LocEngReqRelWifi::log() const { 1233 locallog(); 1234 } 1235 void LocEngReqRelWifi::send() const { 1236 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1237 locEng->adapter->sendMsg(this); 1238 } 1239 1240 // case LOC_ENG_MSG_REQUEST_XTRA_DATA: 1241 LocEngRequestXtra::LocEngRequestXtra(void* locEng) : 1242 mLocEng(locEng) { 1243 locallog(); 1244 } 1245 void LocEngRequestXtra::proc() const 1246 { 1247 loc_eng_xtra_data_s_type* locEngXtra = 1248 &(((loc_eng_data_s_type*)mLocEng)->xtra_module_data); 1249 1250 if (locEngXtra->download_request_cb != NULL) { 1251 CALLBACK_LOG_CALLFLOW("download_request_cb", %p, mLocEng); 1252 locEngXtra->download_request_cb(); 1253 } else { 1254 LOC_LOGE("Callback function for request xtra is NULL"); 1255 } 1256 } 1257 inline void LocEngRequestXtra::locallog() const { 1258 LOC_LOGV("LocEngReqXtra"); 1259 } 1260 inline void LocEngRequestXtra::log() const { 1261 locallog(); 1262 } 1263 1264 // case LOC_ENG_MSG_REQUEST_TIME: 1265 LocEngRequestTime::LocEngRequestTime(void* locEng) : 1266 LocMsg(), mLocEng(locEng) 1267 { 1268 locallog(); 1269 } 1270 void LocEngRequestTime::proc() const { 1271 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1272 if (gps_conf.CAPABILITIES & GPS_CAPABILITY_ON_DEMAND_TIME) { 1273 if (locEng->request_utc_time_cb != NULL) { 1274 locEng->request_utc_time_cb(); 1275 } else { 1276 LOC_LOGE("Callback function for request time is NULL"); 1277 } 1278 } 1279 } 1280 inline void LocEngRequestTime::locallog() const { 1281 LOC_LOGV("LocEngReqTime"); 1282 } 1283 inline void LocEngRequestTime::log() const { 1284 locallog(); 1285 } 1286 1287 // case LOC_ENG_MSG_DELETE_AIDING_DATA: 1288 struct LocEngDelAidData : public LocMsg { 1289 loc_eng_data_s_type* mLocEng; 1290 const GpsAidingData mType; 1291 inline LocEngDelAidData(loc_eng_data_s_type* locEng, 1292 GpsAidingData f) : 1293 LocMsg(), mLocEng(locEng), mType(f) 1294 { 1295 locallog(); 1296 } 1297 inline virtual void proc() const { 1298 mLocEng->aiding_data_for_deletion = mType; 1299 update_aiding_data_for_deletion(*mLocEng); 1300 } 1301 inline void locallog() const { 1302 LOC_LOGV("aiding data msak %d", mType); 1303 } 1304 virtual void log() const { 1305 locallog(); 1306 } 1307 }; 1308 1309 // case LOC_ENG_MSG_ENABLE_DATA: 1310 struct LocEngEnableData : public LocMsg { 1311 LocEngAdapter* mAdapter; 1312 const int mEnable; 1313 char* mAPN; 1314 const int mLen; 1315 inline LocEngEnableData(LocEngAdapter* adapter, 1316 const char* name, int len, int enable) : 1317 LocMsg(), mAdapter(adapter), 1318 mEnable(enable), mAPN(NULL), mLen(len) 1319 { 1320 if (NULL != name) { 1321 mAPN = new char[len+1]; 1322 memcpy((void*)mAPN, (void*)name, len); 1323 mAPN[len] = 0; 1324 } 1325 locallog(); 1326 } 1327 inline ~LocEngEnableData() { 1328 if (NULL != mAPN) { 1329 delete[] mAPN; 1330 } 1331 } 1332 inline virtual void proc() const { 1333 mAdapter->enableData(mEnable); 1334 if (NULL != mAPN) { 1335 mAdapter->setAPN(mAPN, mLen); 1336 } 1337 } 1338 inline void locallog() const { 1339 LOC_LOGV("apn: %s\n enable: %d", 1340 (NULL == mAPN) ? "NULL" : mAPN, mEnable); 1341 } 1342 inline virtual void log() const { 1343 locallog(); 1344 } 1345 }; 1346 1347 // case LOC_ENG_MSG_INJECT_XTRA_DATA: 1348 // loc_eng_xtra.cpp 1349 1350 // case LOC_ENG_MSG_SET_CAPABILITIES: 1351 struct LocEngSetCapabilities : public LocMsg { 1352 loc_eng_data_s_type* mLocEng; 1353 inline LocEngSetCapabilities(loc_eng_data_s_type* locEng) : 1354 LocMsg(), mLocEng(locEng) 1355 { 1356 locallog(); 1357 } 1358 inline virtual void proc() const { 1359 if (NULL != mLocEng->set_capabilities_cb) { 1360 LOC_LOGV("calling set_capabilities_cb 0x%x", 1361 gps_conf.CAPABILITIES); 1362 mLocEng->set_capabilities_cb(gps_conf.CAPABILITIES); 1363 } else { 1364 LOC_LOGV("set_capabilities_cb is NULL.\n"); 1365 } 1366 } 1367 inline void locallog() const 1368 { 1369 LOC_LOGV("LocEngSetCapabilities"); 1370 } 1371 inline virtual void log() const 1372 { 1373 locallog(); 1374 } 1375 }; 1376 1377 struct LocEngSetSystemInfo : public LocMsg { 1378 loc_eng_data_s_type* mLocEng; 1379 inline LocEngSetSystemInfo(loc_eng_data_s_type* locEng) : 1380 LocMsg(), mLocEng(locEng) 1381 { 1382 locallog(); 1383 } 1384 inline virtual void proc() const { 1385 if (NULL != mLocEng->set_system_info_cb) { 1386 LOC_LOGV("calling set_system_info_cb 0x%x", 1387 mLocEng->adapter->mGnssInfo.year_of_hw); 1388 mLocEng->set_system_info_cb(&(mLocEng->adapter->mGnssInfo)); 1389 } 1390 else { 1391 LOC_LOGV("set_system_info_cb is NULL.\n"); 1392 } 1393 } 1394 inline void locallog() const 1395 { 1396 LOC_LOGV("LocEngSetSystemInfo"); 1397 } 1398 inline virtual void log() const 1399 { 1400 locallog(); 1401 } 1402 }; 1403 1404 // case LOC_ENG_MSG_LOC_INIT: 1405 struct LocEngInit : public LocMsg { 1406 loc_eng_data_s_type* mLocEng; 1407 inline LocEngInit(loc_eng_data_s_type* locEng) : 1408 LocMsg(), mLocEng(locEng) 1409 { 1410 locallog(); 1411 } 1412 inline virtual void proc() const { 1413 loc_eng_reinit(*mLocEng); 1414 // set the capabilities 1415 mLocEng->adapter->sendMsg(new LocEngSetCapabilities(mLocEng)); 1416 mLocEng->adapter->sendMsg(new LocEngSetSystemInfo(mLocEng)); 1417 } 1418 inline void locallog() const 1419 { 1420 LOC_LOGV("LocEngInit"); 1421 } 1422 inline virtual void log() const 1423 { 1424 locallog(); 1425 } 1426 }; 1427 1428 // case LOC_ENG_MSG_REQUEST_XTRA_SERVER: 1429 // loc_eng_xtra.cpp 1430 1431 // case LOC_ENG_MSG_ATL_OPEN_SUCCESS: 1432 struct LocEngAtlOpenSuccess : public LocMsg { 1433 AgpsStateMachine* mStateMachine; 1434 const int mLen; 1435 char* mAPN; 1436 const AGpsBearerType mBearerType; 1437 inline LocEngAtlOpenSuccess(AgpsStateMachine* statemachine, 1438 const char* name, 1439 int len, 1440 AGpsBearerType btype) : 1441 LocMsg(), 1442 mStateMachine(statemachine), mLen(len), 1443 mAPN(new char[len+1]), mBearerType(btype) 1444 { 1445 memcpy((void*)mAPN, (void*)name, len); 1446 mAPN[len] = 0; 1447 locallog(); 1448 } 1449 inline ~LocEngAtlOpenSuccess() 1450 { 1451 delete[] mAPN; 1452 } 1453 inline virtual void proc() const { 1454 mStateMachine->setBearer(mBearerType); 1455 mStateMachine->setAPN(mAPN, mLen); 1456 mStateMachine->onRsrcEvent(RSRC_GRANTED); 1457 } 1458 inline void locallog() const { 1459 LOC_LOGV("LocEngAtlOpenSuccess agps type: %s\n apn: %s\n" 1460 " bearer type: %s", 1461 loc_get_agps_type_name(mStateMachine->getType()), 1462 mAPN, 1463 loc_get_agps_bear_name(mBearerType)); 1464 } 1465 inline virtual void log() const { 1466 locallog(); 1467 } 1468 }; 1469 1470 // case LOC_ENG_MSG_ATL_CLOSED: 1471 struct LocEngAtlClosed : public LocMsg { 1472 AgpsStateMachine* mStateMachine; 1473 inline LocEngAtlClosed(AgpsStateMachine* statemachine) : 1474 LocMsg(), mStateMachine(statemachine) { 1475 locallog(); 1476 } 1477 inline virtual void proc() const { 1478 mStateMachine->onRsrcEvent(RSRC_RELEASED); 1479 } 1480 inline void locallog() const { 1481 LOC_LOGV("LocEngAtlClosed"); 1482 } 1483 inline virtual void log() const { 1484 locallog(); 1485 } 1486 }; 1487 1488 // case LOC_ENG_MSG_ATL_OPEN_FAILED: 1489 struct LocEngAtlOpenFailed : public LocMsg { 1490 AgpsStateMachine* mStateMachine; 1491 inline LocEngAtlOpenFailed(AgpsStateMachine* statemachine) : 1492 LocMsg(), mStateMachine(statemachine) { 1493 locallog(); 1494 } 1495 inline virtual void proc() const { 1496 mStateMachine->onRsrcEvent(RSRC_DENIED); 1497 } 1498 inline void locallog() const { 1499 LOC_LOGV("LocEngAtlOpenFailed"); 1500 } 1501 inline virtual void log() const { 1502 locallog(); 1503 } 1504 }; 1505 1506 // case LOC_ENG_MSG_ENGINE_DOWN: 1507 LocEngDown::LocEngDown(void* locEng) : 1508 LocMsg(), mLocEng(locEng) { 1509 locallog(); 1510 } 1511 inline void LocEngDown::proc() const { 1512 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1513 loc_eng_handle_engine_down(*locEng); 1514 } 1515 inline void LocEngDown::locallog() const { 1516 LOC_LOGV("LocEngDown"); 1517 } 1518 inline void LocEngDown::log() const { 1519 locallog(); 1520 } 1521 1522 // case LOC_ENG_MSG_ENGINE_UP: 1523 LocEngUp::LocEngUp(void* locEng) : 1524 LocMsg(), mLocEng(locEng) { 1525 locallog(); 1526 } 1527 inline void LocEngUp::proc() const { 1528 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1529 loc_eng_handle_engine_up(*locEng); 1530 } 1531 inline void LocEngUp::locallog() const { 1532 LOC_LOGV("LocEngUp"); 1533 } 1534 inline void LocEngUp::log() const { 1535 locallog(); 1536 } 1537 1538 struct LocEngDataClientInit : public LocMsg { 1539 loc_eng_data_s_type* mLocEng; 1540 inline LocEngDataClientInit(loc_eng_data_s_type* locEng) : 1541 LocMsg(), mLocEng(locEng) { 1542 locallog(); 1543 } 1544 virtual void proc() const { 1545 loc_eng_data_s_type *locEng = (loc_eng_data_s_type *)mLocEng; 1546 if(!locEng->adapter->initDataServiceClient()) { 1547 locEng->ds_nif = new DSStateMachine(servicerTypeExt, 1548 (void *)dataCallCb, 1549 locEng->adapter); 1550 } 1551 } 1552 void locallog() const { 1553 LOC_LOGV("LocEngDataClientInit\n"); 1554 } 1555 virtual void log() const { 1556 locallog(); 1557 } 1558 }; 1559 1560 struct LocEngInstallAGpsCert : public LocMsg { 1561 LocEngAdapter* mpAdapter; 1562 const size_t mNumberOfCerts; 1563 const uint32_t mSlotBitMask; 1564 DerEncodedCertificate* mpData; 1565 inline LocEngInstallAGpsCert(LocEngAdapter* adapter, 1566 const DerEncodedCertificate* pData, 1567 size_t numberOfCerts, 1568 uint32_t slotBitMask) : 1569 LocMsg(), mpAdapter(adapter), 1570 mNumberOfCerts(numberOfCerts), mSlotBitMask(slotBitMask), 1571 mpData(new DerEncodedCertificate[mNumberOfCerts]) 1572 { 1573 for (int i=0; i < mNumberOfCerts; i++) { 1574 mpData[i].data = new u_char[pData[i].length]; 1575 if (mpData[i].data) { 1576 memcpy(mpData[i].data, (void*)pData[i].data, pData[i].length); 1577 mpData[i].length = pData[i].length; 1578 } else { 1579 LOC_LOGE("malloc failed for cert#%d", i); 1580 break; 1581 } 1582 } 1583 locallog(); 1584 } 1585 inline ~LocEngInstallAGpsCert() 1586 { 1587 for (int i=0; i < mNumberOfCerts; i++) { 1588 if (mpData[i].data) { 1589 delete[] mpData[i].data; 1590 } 1591 } 1592 delete[] mpData; 1593 } 1594 inline virtual void proc() const { 1595 mpAdapter->installAGpsCert(mpData, mNumberOfCerts, mSlotBitMask); 1596 } 1597 inline void locallog() const { 1598 LOC_LOGV("LocEngInstallAGpsCert - certs=%u mask=%u", 1599 mNumberOfCerts, mSlotBitMask); 1600 } 1601 inline virtual void log() const { 1602 locallog(); 1603 } 1604 }; 1605 1606 struct LocEngUpdateRegistrationMask : public LocMsg { 1607 loc_eng_data_s_type* mLocEng; 1608 LOC_API_ADAPTER_EVENT_MASK_T mMask; 1609 loc_registration_mask_status mIsEnabled; 1610 inline LocEngUpdateRegistrationMask(loc_eng_data_s_type* locEng, 1611 LOC_API_ADAPTER_EVENT_MASK_T mask, 1612 loc_registration_mask_status isEnabled) : 1613 LocMsg(), mLocEng(locEng), mMask(mask), mIsEnabled(isEnabled) { 1614 locallog(); 1615 } 1616 inline virtual void proc() const { 1617 loc_eng_data_s_type *locEng = (loc_eng_data_s_type *)mLocEng; 1618 locEng->adapter->updateRegistrationMask(mMask, 1619 mIsEnabled); 1620 } 1621 void locallog() const { 1622 LOC_LOGV("LocEngUpdateRegistrationMask\n"); 1623 } 1624 virtual void log() const { 1625 locallog(); 1626 } 1627 }; 1628 1629 struct LocEngGnssConstellationConfig : public LocMsg { 1630 LocEngAdapter* mAdapter; 1631 inline LocEngGnssConstellationConfig(LocEngAdapter* adapter) : 1632 LocMsg(), mAdapter(adapter) { 1633 locallog(); 1634 } 1635 inline virtual void proc() const { 1636 mAdapter->mGnssInfo.size = sizeof(GnssSystemInfo); 1637 if (mAdapter->gnssConstellationConfig()) { 1638 LOC_LOGV("Modem supports GNSS measurements\n"); 1639 gps_conf.CAPABILITIES |= GPS_CAPABILITY_MEASUREMENTS; 1640 mAdapter->mGnssInfo.year_of_hw = 2016; 1641 } else { 1642 mAdapter->mGnssInfo.year_of_hw = 2015; 1643 LOC_LOGV("Modem does not support GNSS measurements\n"); 1644 } 1645 } 1646 void locallog() const { 1647 LOC_LOGV("LocEngGnssConstellationConfig\n"); 1648 } 1649 virtual void log() const { 1650 locallog(); 1651 } 1652 }; 1653 1654 // case LOC_ENG_MSG_REPORT_GNSS_MEASUREMENT: 1655 LocEngReportGnssMeasurement::LocEngReportGnssMeasurement(void* locEng, 1656 GnssData &gnssData) : 1657 LocMsg(), mLocEng(locEng), mGnssData(gnssData) 1658 { 1659 locallog(); 1660 } 1661 void LocEngReportGnssMeasurement::proc() const { 1662 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*) mLocEng; 1663 if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION) 1664 { 1665 if (locEng->gnss_measurement_cb != NULL) { 1666 LOC_LOGV("Calling gnss_measurement_cb"); 1667 locEng->gnss_measurement_cb((GnssData*)&(mGnssData)); 1668 } 1669 } 1670 } 1671 1672 void LocEngReportGnssMeasurement::locallog() const { 1673 IF_LOC_LOGV { 1674 LOC_LOGV("%s:%d]: Received in GPS HAL." 1675 "GNSS Measurements count: %d \n", 1676 __func__, __LINE__, mGnssData.measurement_count); 1677 for (int i =0; i< mGnssData.measurement_count && i < GNSS_MAX_SVS; i++) { 1678 LOC_LOGV(" GNSS measurement data in GPS HAL: \n" 1679 " GPS_HAL => Measurement ID | svid | time_offset_ns | state |" 1680 " c_n0_dbhz | pseudorange_rate_mps |" 1681 " pseudorange_rate_uncertainty_mps |" 1682 " accumulated_delta_range_state | flags \n" 1683 " GPS_HAL => %d | %d | %f | %d | %f | %f | %f | %d | %d \n", 1684 i, 1685 mGnssData.measurements[i].svid, 1686 mGnssData.measurements[i].time_offset_ns, 1687 mGnssData.measurements[i].state, 1688 mGnssData.measurements[i].c_n0_dbhz, 1689 mGnssData.measurements[i].pseudorange_rate_mps, 1690 mGnssData.measurements[i].pseudorange_rate_uncertainty_mps, 1691 mGnssData.measurements[i].accumulated_delta_range_state, 1692 mGnssData.measurements[i].flags); 1693 } 1694 LOC_LOGV(" GPS_HAL => Clocks Info: \n" 1695 " time_ns | full_bias_ns | bias_ns | bias_uncertainty_ns | " 1696 " drift_nsps | drift_uncertainty_nsps | hw_clock_discontinuity_count | flags" 1697 " GPS_HAL => Clocks Info: %lld | %lld | %g | %g | %g | %g | %d | 0x%04x\n", 1698 mGnssData.clock.time_ns, 1699 mGnssData.clock.full_bias_ns, 1700 mGnssData.clock.bias_ns, 1701 mGnssData.clock.bias_uncertainty_ns, 1702 mGnssData.clock.drift_nsps, 1703 mGnssData.clock.drift_uncertainty_nsps, 1704 mGnssData.clock.hw_clock_discontinuity_count, 1705 mGnssData.clock.flags); 1706 } 1707 } 1708 1709 inline void LocEngReportGnssMeasurement::log() const { 1710 locallog(); 1711 } 1712 1713 /********************************************************************* 1714 * Initialization checking macros 1715 *********************************************************************/ 1716 #define STATE_CHECK(ctx, x, ret) \ 1717 if (!(ctx)) \ 1718 { \ 1719 /* Not intialized, abort */\ 1720 LOC_LOGE("%s: log_eng state error: %s", __func__, x); \ 1721 EXIT_LOG(%s, x); \ 1722 ret; \ 1723 } 1724 #define INIT_CHECK(ctx, ret) STATE_CHECK(ctx, "instance not initialized", ret) 1725 1726 /*=========================================================================== 1727 FUNCTION loc_eng_init 1728 1729 DESCRIPTION 1730 Initialize the location engine, this include setting up global datas 1731 and registers location engien with loc api service. 1732 1733 DEPENDENCIES 1734 None 1735 1736 RETURN VALUE 1737 0: success 1738 1739 SIDE EFFECTS 1740 N/A 1741 1742 ===========================================================================*/ 1743 int loc_eng_init(loc_eng_data_s_type &loc_eng_data, LocCallbacks* callbacks, 1744 LOC_API_ADAPTER_EVENT_MASK_T event, ContextBase* context) 1745 1746 { 1747 int ret_val = 0; 1748 1749 ENTRY_LOG_CALLFLOW(); 1750 if (NULL == callbacks || 0 == event) { 1751 LOC_LOGE("loc_eng_init: bad parameters cb %p eMask %d", callbacks, event); 1752 ret_val = -1; 1753 EXIT_LOG(%d, ret_val); 1754 return ret_val; 1755 } 1756 1757 STATE_CHECK((NULL == loc_eng_data.adapter), 1758 "instance already initialized", return 0); 1759 1760 memset(&loc_eng_data, 0, sizeof (loc_eng_data)); 1761 1762 // Save callbacks 1763 loc_eng_data.location_cb = callbacks->location_cb; 1764 loc_eng_data.sv_status_cb = callbacks->sv_status_cb; 1765 loc_eng_data.status_cb = callbacks->status_cb; 1766 loc_eng_data.nmea_cb = callbacks->nmea_cb; 1767 loc_eng_data.set_capabilities_cb = callbacks->set_capabilities_cb; 1768 loc_eng_data.acquire_wakelock_cb = callbacks->acquire_wakelock_cb; 1769 loc_eng_data.release_wakelock_cb = callbacks->release_wakelock_cb; 1770 loc_eng_data.request_utc_time_cb = callbacks->request_utc_time_cb; 1771 loc_eng_data.set_system_info_cb = callbacks->set_system_info_cb; 1772 loc_eng_data.gnss_sv_status_cb = callbacks->gnss_sv_status_cb; 1773 loc_eng_data.location_ext_parser = callbacks->location_ext_parser ? 1774 callbacks->location_ext_parser : noProc; 1775 loc_eng_data.sv_ext_parser = callbacks->sv_ext_parser ? 1776 callbacks->sv_ext_parser : noProc; 1777 loc_eng_data.intermediateFix = gps_conf.INTERMEDIATE_POS; 1778 // initial states taken care of by the memset above 1779 // loc_eng_data.engine_status -- GPS_STATUS_NONE; 1780 // loc_eng_data.fix_session_status -- GPS_STATUS_NONE; 1781 // loc_eng_data.mute_session_state -- LOC_MUTE_SESS_NONE; 1782 1783 if ((event & LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT) && (gps_conf.NMEA_PROVIDER == NMEA_PROVIDER_AP)) 1784 { 1785 event = event ^ LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT; // unregister for modem NMEA report 1786 loc_eng_data.generateNmea = true; 1787 } 1788 else 1789 { 1790 loc_eng_data.generateNmea = false; 1791 } 1792 1793 loc_eng_data.adapter = 1794 new LocEngAdapter(event, &loc_eng_data, context, 1795 (LocThread::tCreate)callbacks->create_thread_cb); 1796 1797 loc_eng_data.adapter->mGnssInfo.size = sizeof(GnssSystemInfo); 1798 loc_eng_data.adapter->mGnssInfo.year_of_hw = 2015; 1799 LOC_LOGD("loc_eng_init created client, id = %p\n", 1800 loc_eng_data.adapter); 1801 loc_eng_data.adapter->sendMsg(new LocEngInit(&loc_eng_data)); 1802 1803 EXIT_LOG(%d, ret_val); 1804 return ret_val; 1805 } 1806 1807 static int loc_eng_reinit(loc_eng_data_s_type &loc_eng_data) 1808 { 1809 ENTRY_LOG(); 1810 int ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 1811 LocEngAdapter* adapter = loc_eng_data.adapter; 1812 1813 adapter->sendMsg(new LocEngGnssConstellationConfig(adapter)); 1814 adapter->sendMsg(new LocEngSuplVer(adapter, gps_conf.SUPL_VER)); 1815 adapter->sendMsg(new LocEngLppConfig(adapter, gps_conf.LPP_PROFILE)); 1816 adapter->sendMsg(new LocEngSensorControlConfig(adapter, sap_conf.SENSOR_USAGE, 1817 sap_conf.SENSOR_PROVIDER)); 1818 adapter->sendMsg(new LocEngAGlonassProtocol(adapter, gps_conf.A_GLONASS_POS_PROTOCOL_SELECT)); 1819 1820 /* Make sure at least one of the sensor property is specified by the user in the gps.conf file. */ 1821 if( sap_conf.GYRO_BIAS_RANDOM_WALK_VALID || 1822 sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 1823 sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 1824 sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 1825 sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID ) { 1826 adapter->sendMsg(new LocEngSensorProperties(adapter, 1827 sap_conf.GYRO_BIAS_RANDOM_WALK_VALID, 1828 sap_conf.GYRO_BIAS_RANDOM_WALK, 1829 sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 1830 sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY, 1831 sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 1832 sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY, 1833 sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 1834 sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY, 1835 sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 1836 sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY)); 1837 } 1838 1839 adapter->sendMsg(new LocEngSensorPerfControlConfig(adapter, 1840 sap_conf.SENSOR_CONTROL_MODE, 1841 sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH, 1842 sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC, 1843 sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH, 1844 sap_conf.SENSOR_GYRO_BATCHES_PER_SEC, 1845 sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH, 1846 sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH, 1847 sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH, 1848 sap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH, 1849 sap_conf.SENSOR_ALGORITHM_CONFIG_MASK)); 1850 1851 adapter->sendMsg(new LocEngEnableData(adapter, NULL, 0, (agpsStatus ? 1:0))); 1852 1853 loc_eng_xtra_version_check(loc_eng_data, gps_conf.XTRA_VERSION_CHECK); 1854 1855 LOC_LOGD("loc_eng_reinit reinit() successful"); 1856 EXIT_LOG(%d, ret_val); 1857 return ret_val; 1858 } 1859 1860 /*=========================================================================== 1861 FUNCTION loc_eng_cleanup 1862 1863 DESCRIPTION 1864 Cleans location engine. The location client handle will be released. 1865 1866 DEPENDENCIES 1867 None 1868 1869 RETURN VALUE 1870 None 1871 1872 SIDE EFFECTS 1873 N/A 1874 1875 ===========================================================================*/ 1876 void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data) 1877 { 1878 ENTRY_LOG_CALLFLOW(); 1879 INIT_CHECK(loc_eng_data.adapter, return); 1880 1881 // XTRA has no state, so we are fine with it. 1882 1883 // we need to check and clear NI 1884 #if 0 1885 // we need to check and clear ATL 1886 if (NULL != loc_eng_data.agnss_nif) { 1887 delete loc_eng_data.agnss_nif; 1888 loc_eng_data.agnss_nif = NULL; 1889 } 1890 if (NULL != loc_eng_data.internet_nif) { 1891 delete loc_eng_data.internet_nif; 1892 loc_eng_data.internet_nif = NULL; 1893 } 1894 #endif 1895 if (loc_eng_data.adapter->isInSession()) 1896 { 1897 LOC_LOGD("loc_eng_cleanup: fix not stopped. stop it now."); 1898 loc_eng_stop(loc_eng_data); 1899 } 1900 1901 #if 0 // can't afford to actually clean up, for many reason. 1902 1903 LOC_LOGD("loc_eng_init: client opened. close it now."); 1904 delete loc_eng_data.adapter; 1905 loc_eng_data.adapter = NULL; 1906 1907 loc_eng_dmn_conn_loc_api_server_unblock(); 1908 loc_eng_dmn_conn_loc_api_server_join(); 1909 1910 #endif 1911 1912 EXIT_LOG(%s, VOID_RET); 1913 } 1914 1915 1916 /*=========================================================================== 1917 FUNCTION loc_eng_start 1918 1919 DESCRIPTION 1920 Starts the tracking session 1921 1922 DEPENDENCIES 1923 None 1924 1925 RETURN VALUE 1926 0: success 1927 1928 SIDE EFFECTS 1929 N/A 1930 1931 ===========================================================================*/ 1932 int loc_eng_start(loc_eng_data_s_type &loc_eng_data) 1933 { 1934 ENTRY_LOG_CALLFLOW(); 1935 INIT_CHECK(loc_eng_data.adapter, return -1); 1936 1937 if(! loc_eng_data.adapter->getUlpProxy()->sendStartFix()) 1938 { 1939 loc_eng_data.adapter->sendMsg(new LocEngStartFix(loc_eng_data.adapter)); 1940 } 1941 1942 EXIT_LOG(%d, 0); 1943 return 0; 1944 } 1945 1946 static int loc_eng_start_handler(loc_eng_data_s_type &loc_eng_data) 1947 { 1948 ENTRY_LOG(); 1949 int ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 1950 1951 if (!loc_eng_data.adapter->isInSession()) { 1952 ret_val = loc_eng_data.adapter->startFix(); 1953 1954 if (ret_val == LOC_API_ADAPTER_ERR_SUCCESS || 1955 ret_val == LOC_API_ADAPTER_ERR_ENGINE_DOWN || 1956 ret_val == LOC_API_ADAPTER_ERR_PHONE_OFFLINE || 1957 ret_val == LOC_API_ADAPTER_ERR_INTERNAL) 1958 { 1959 loc_eng_data.adapter->setInSession(TRUE); 1960 } 1961 } 1962 1963 EXIT_LOG(%d, ret_val); 1964 return ret_val; 1965 } 1966 1967 /*=========================================================================== 1968 FUNCTION loc_eng_stop_wrapper 1969 1970 DESCRIPTION 1971 Stops the tracking session 1972 1973 DEPENDENCIES 1974 None 1975 1976 RETURN VALUE 1977 0: success 1978 1979 SIDE EFFECTS 1980 N/A 1981 1982 ===========================================================================*/ 1983 int loc_eng_stop(loc_eng_data_s_type &loc_eng_data) 1984 { 1985 ENTRY_LOG_CALLFLOW(); 1986 INIT_CHECK(loc_eng_data.adapter, return -1); 1987 1988 if(! loc_eng_data.adapter->getUlpProxy()->sendStopFix()) 1989 { 1990 loc_eng_data.adapter->sendMsg(new LocEngStopFix(loc_eng_data.adapter)); 1991 } 1992 1993 EXIT_LOG(%d, 0); 1994 return 0; 1995 } 1996 1997 static int loc_eng_stop_handler(loc_eng_data_s_type &loc_eng_data) 1998 { 1999 ENTRY_LOG(); 2000 int ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 2001 2002 if (loc_eng_data.adapter->isInSession()) { 2003 2004 ret_val = loc_eng_data.adapter->stopFix(); 2005 loc_eng_data.adapter->setInSession(FALSE); 2006 } 2007 2008 EXIT_LOG(%d, ret_val); 2009 return ret_val; 2010 } 2011 2012 /*=========================================================================== 2013 FUNCTION loc_eng_mute_one_session 2014 2015 DESCRIPTION 2016 Mutes one session 2017 2018 DEPENDENCIES 2019 None 2020 2021 RETURN VALUE 2022 0: Success 2023 2024 SIDE EFFECTS 2025 N/A 2026 2027 ===========================================================================*/ 2028 void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data) 2029 { 2030 ENTRY_LOG(); 2031 loc_eng_data.mute_session_state = LOC_MUTE_SESS_WAIT; 2032 EXIT_LOG(%s, VOID_RET); 2033 } 2034 2035 /*=========================================================================== 2036 FUNCTION loc_eng_set_position_mode 2037 2038 DESCRIPTION 2039 Sets the mode and fix frequency for the tracking session. 2040 2041 DEPENDENCIES 2042 None 2043 2044 RETURN VALUE 2045 0: success 2046 2047 SIDE EFFECTS 2048 N/A 2049 2050 ===========================================================================*/ 2051 int loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data, 2052 LocPosMode ¶ms) 2053 { 2054 ENTRY_LOG_CALLFLOW(); 2055 INIT_CHECK(loc_eng_data.adapter, return -1); 2056 2057 // The position mode for AUTO/GSS/QCA1530 can only be standalone 2058 if (!(gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB) && 2059 !(gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) && 2060 (params.mode != LOC_POSITION_MODE_STANDALONE)) { 2061 params.mode = LOC_POSITION_MODE_STANDALONE; 2062 LOC_LOGD("Position mode changed to standalone for target with AUTO/GSS/qca1530."); 2063 } 2064 2065 if(! loc_eng_data.adapter->getUlpProxy()->sendFixMode(params)) 2066 { 2067 LocEngAdapter* adapter = loc_eng_data.adapter; 2068 adapter->sendMsg(new LocEngPositionMode(adapter, params)); 2069 } 2070 2071 EXIT_LOG(%d, 0); 2072 return 0; 2073 } 2074 2075 /*=========================================================================== 2076 FUNCTION loc_eng_inject_time 2077 2078 DESCRIPTION 2079 This is used by Java native function to do time injection. 2080 2081 DEPENDENCIES 2082 None 2083 2084 RETURN VALUE 2085 0 2086 2087 SIDE EFFECTS 2088 N/A 2089 2090 ===========================================================================*/ 2091 int loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data, GpsUtcTime time, 2092 int64_t timeReference, int uncertainty) 2093 { 2094 ENTRY_LOG_CALLFLOW(); 2095 INIT_CHECK(loc_eng_data.adapter, return -1); 2096 LocEngAdapter* adapter = loc_eng_data.adapter; 2097 2098 adapter->sendMsg(new LocEngSetTime(adapter, time, timeReference, 2099 uncertainty)); 2100 2101 EXIT_LOG(%d, 0); 2102 return 0; 2103 } 2104 2105 2106 /*=========================================================================== 2107 FUNCTION loc_eng_inject_location 2108 2109 DESCRIPTION 2110 This is used by Java native function to do location injection. 2111 2112 DEPENDENCIES 2113 None 2114 2115 RETURN VALUE 2116 0 : Successful 2117 error code : Failure 2118 2119 SIDE EFFECTS 2120 N/A 2121 ===========================================================================*/ 2122 int loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data, double latitude, 2123 double longitude, float accuracy) 2124 { 2125 ENTRY_LOG_CALLFLOW(); 2126 INIT_CHECK(loc_eng_data.adapter, return -1); 2127 LocEngAdapter* adapter = loc_eng_data.adapter; 2128 if(adapter->mSupportsPositionInjection) 2129 { 2130 adapter->sendMsg(new LocEngInjectLocation(adapter, latitude, longitude, 2131 accuracy)); 2132 } 2133 2134 EXIT_LOG(%d, 0); 2135 return 0; 2136 } 2137 2138 2139 /*=========================================================================== 2140 FUNCTION loc_eng_delete_aiding_data 2141 2142 DESCRIPTION 2143 This is used by Java native function to delete the aiding data. The function 2144 updates the global variable for the aiding data to be deleted. If the GPS 2145 engine is off, the aiding data will be deleted. Otherwise, the actual action 2146 will happen when gps engine is turned off. 2147 2148 DEPENDENCIES 2149 Assumes the aiding data type specified in GpsAidingData matches with 2150 LOC API specification. 2151 2152 RETURN VALUE 2153 None 2154 2155 SIDE EFFECTS 2156 N/A 2157 2158 ===========================================================================*/ 2159 void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data, GpsAidingData f) 2160 { 2161 ENTRY_LOG_CALLFLOW(); 2162 INIT_CHECK(loc_eng_data.adapter, return); 2163 2164 loc_eng_data.adapter->sendMsg(new LocEngDelAidData(&loc_eng_data, f)); 2165 2166 EXIT_LOG(%s, VOID_RET); 2167 } 2168 2169 /*=========================================================================== 2170 2171 FUNCTION loc_inform_gps_state 2172 2173 DESCRIPTION 2174 Informs the GPS Provider about the GPS status 2175 2176 DEPENDENCIES 2177 None 2178 2179 RETURN VALUE 2180 None 2181 2182 SIDE EFFECTS 2183 N/A 2184 2185 ===========================================================================*/ 2186 static void loc_inform_gps_status(loc_eng_data_s_type &loc_eng_data, GpsStatusValue status) 2187 { 2188 ENTRY_LOG(); 2189 2190 if (loc_eng_data.status_cb) 2191 { 2192 GpsStatus gs = { sizeof(gs),status }; 2193 CALLBACK_LOG_CALLFLOW("status_cb", %s, 2194 loc_get_gps_status_name(gs.status)); 2195 loc_eng_data.status_cb(&gs); 2196 } 2197 2198 EXIT_LOG(%s, VOID_RET); 2199 } 2200 2201 static int loc_eng_get_zpp_handler(loc_eng_data_s_type &loc_eng_data) 2202 { 2203 ENTRY_LOG(); 2204 int ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 2205 UlpLocation location; 2206 LocPosTechMask tech_mask = LOC_POS_TECH_MASK_DEFAULT; 2207 GpsLocationExtended locationExtended; 2208 memset(&locationExtended, 0, sizeof (GpsLocationExtended)); 2209 locationExtended.size = sizeof(locationExtended); 2210 2211 ret_val = loc_eng_data.adapter->getZpp(location.gpsLocation, tech_mask); 2212 //Mark the location source as from ZPP 2213 location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO; 2214 location.position_source = ULP_LOCATION_IS_FROM_ZPP; 2215 2216 loc_eng_data.adapter->getUlpProxy()->reportPosition(location, 2217 locationExtended, 2218 NULL, 2219 LOC_SESS_SUCCESS, 2220 tech_mask); 2221 2222 EXIT_LOG(%d, ret_val); 2223 return ret_val; 2224 } 2225 2226 /* 2227 Callback function passed to Data Services State Machine 2228 This becomes part of the state machine's servicer and 2229 is used to send requests to the data services client 2230 */ 2231 static int dataCallCb(void *cb_data) 2232 { 2233 LOC_LOGD("Enter dataCallCb\n"); 2234 int ret=0; 2235 if(cb_data != NULL) { 2236 dsCbData *cbData = (dsCbData *)cb_data; 2237 LocEngAdapter *locAdapter = (LocEngAdapter *)cbData->mAdapter; 2238 if(cbData->action == GPS_REQUEST_AGPS_DATA_CONN) { 2239 LOC_LOGD("dataCallCb GPS_REQUEST_AGPS_DATA_CONN\n"); 2240 ret = locAdapter->openAndStartDataCall(); 2241 } 2242 else if(cbData->action == GPS_RELEASE_AGPS_DATA_CONN) { 2243 LOC_LOGD("dataCallCb GPS_RELEASE_AGPS_DATA_CONN\n"); 2244 locAdapter->stopDataCall(); 2245 } 2246 } 2247 else { 2248 LOC_LOGE("NULL argument received. Failing.\n"); 2249 ret = -1; 2250 goto err; 2251 } 2252 2253 err: 2254 LOC_LOGD("Exit dataCallCb ret = %d\n", ret); 2255 return ret; 2256 } 2257 2258 /*=========================================================================== 2259 FUNCTION loc_eng_agps_reinit 2260 2261 DESCRIPTION 2262 2nd half of loc_eng_agps_init(), singled out for modem restart to use. 2263 2264 DEPENDENCIES 2265 NONE 2266 2267 RETURN VALUE 2268 0 2269 2270 SIDE EFFECTS 2271 N/A 2272 2273 ===========================================================================*/ 2274 static void loc_eng_agps_reinit(loc_eng_data_s_type &loc_eng_data) 2275 { 2276 ENTRY_LOG(); 2277 2278 // Set server addresses which came before init 2279 if (loc_eng_data.supl_host_set) 2280 { 2281 loc_eng_set_server(loc_eng_data, LOC_AGPS_SUPL_SERVER, 2282 loc_eng_data.supl_host_buf, 2283 loc_eng_data.supl_port_buf); 2284 } 2285 2286 if (loc_eng_data.c2k_host_set) 2287 { 2288 loc_eng_set_server(loc_eng_data, LOC_AGPS_CDMA_PDE_SERVER, 2289 loc_eng_data.c2k_host_buf, 2290 loc_eng_data.c2k_port_buf); 2291 } 2292 EXIT_LOG(%s, VOID_RET); 2293 } 2294 /*=========================================================================== 2295 FUNCTION loc_eng_agps_init 2296 2297 DESCRIPTION 2298 Initialize the AGps interface. 2299 2300 DEPENDENCIES 2301 NONE 2302 2303 RETURN VALUE 2304 0 2305 2306 SIDE EFFECTS 2307 N/A 2308 2309 ===========================================================================*/ 2310 void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data, AGpsExtCallbacks* callbacks) 2311 { 2312 ENTRY_LOG_CALLFLOW(); 2313 INIT_CHECK(loc_eng_data.adapter, return); 2314 STATE_CHECK((NULL == loc_eng_data.agps_status_cb), 2315 "agps instance already initialized", 2316 return); 2317 if (callbacks == NULL) { 2318 LOC_LOGE("loc_eng_agps_init: bad parameters cb %p", callbacks); 2319 EXIT_LOG(%s, VOID_RET); 2320 return; 2321 } 2322 LocEngAdapter* adapter = loc_eng_data.adapter; 2323 loc_eng_data.agps_status_cb = callbacks->status_cb; 2324 2325 loc_eng_data.internet_nif = new AgpsStateMachine(servicerTypeAgps, 2326 (void *)loc_eng_data.agps_status_cb, 2327 AGPS_TYPE_WWAN_ANY, 2328 false); 2329 loc_eng_data.wifi_nif = new AgpsStateMachine(servicerTypeAgps, 2330 (void *)loc_eng_data.agps_status_cb, 2331 AGPS_TYPE_WIFI, 2332 true); 2333 2334 if ((gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) || 2335 (gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB)) { 2336 loc_eng_data.agnss_nif = new AgpsStateMachine(servicerTypeAgps, 2337 (void *)loc_eng_data.agps_status_cb, 2338 AGPS_TYPE_SUPL, 2339 false); 2340 2341 if (adapter->mSupportsAgpsRequests) { 2342 if(gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { 2343 loc_eng_data.adapter->sendMsg(new LocEngDataClientInit(&loc_eng_data)); 2344 } 2345 loc_eng_dmn_conn_loc_api_server_launch(callbacks->create_thread_cb, 2346 NULL, NULL, &loc_eng_data); 2347 } 2348 loc_eng_agps_reinit(loc_eng_data); 2349 } 2350 2351 EXIT_LOG(%s, VOID_RET); 2352 } 2353 2354 static void deleteAidingData(loc_eng_data_s_type &logEng) { 2355 if (logEng.engine_status != GPS_STATUS_ENGINE_ON && 2356 logEng.aiding_data_for_deletion != 0) { 2357 logEng.adapter->deleteAidingData(logEng.aiding_data_for_deletion); 2358 logEng.aiding_data_for_deletion = 0; 2359 } 2360 } 2361 2362 static AgpsStateMachine* 2363 getAgpsStateMachine(loc_eng_data_s_type &locEng, AGpsExtType agpsType) { 2364 AgpsStateMachine* stateMachine; 2365 switch (agpsType) { 2366 case AGPS_TYPE_WIFI: { 2367 stateMachine = locEng.wifi_nif; 2368 break; 2369 } 2370 case AGPS_TYPE_INVALID: 2371 case AGPS_TYPE_SUPL: { 2372 stateMachine = locEng.agnss_nif; 2373 break; 2374 } 2375 case AGPS_TYPE_SUPL_ES: { 2376 locEng.ds_nif ? 2377 stateMachine = locEng.ds_nif: 2378 stateMachine = locEng.agnss_nif; 2379 break; 2380 } 2381 default: 2382 stateMachine = locEng.internet_nif; 2383 } 2384 return stateMachine; 2385 } 2386 2387 /*=========================================================================== 2388 FUNCTION loc_eng_agps_open 2389 2390 DESCRIPTION 2391 This function is called when on-demand data connection opening is successful. 2392 It should inform engine about the data open result. 2393 2394 DEPENDENCIES 2395 NONE 2396 2397 RETURN VALUE 2398 0 2399 2400 SIDE EFFECTS 2401 N/A 2402 2403 ===========================================================================*/ 2404 int loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType, 2405 const char* apn, AGpsBearerType bearerType) 2406 { 2407 ENTRY_LOG_CALLFLOW(); 2408 INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb, 2409 return -1); 2410 2411 if (apn == NULL) 2412 { 2413 LOC_LOGE("APN Name NULL\n"); 2414 return 0; 2415 } 2416 2417 LOC_LOGD("loc_eng_agps_open APN name = [%s]", apn); 2418 2419 int apn_len = smaller_of(strlen (apn), MAX_APN_LEN); 2420 AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType); 2421 2422 loc_eng_data.adapter->sendMsg( 2423 new LocEngAtlOpenSuccess(sm, apn, apn_len, bearerType)); 2424 2425 EXIT_LOG(%d, 0); 2426 return 0; 2427 } 2428 2429 /*=========================================================================== 2430 FUNCTION loc_eng_agps_closed 2431 2432 DESCRIPTION 2433 This function is called when on-demand data connection closing is done. 2434 It should inform engine about the data close result. 2435 2436 DEPENDENCIES 2437 NONE 2438 2439 RETURN VALUE 2440 0 2441 2442 SIDE EFFECTS 2443 N/A 2444 2445 ===========================================================================*/ 2446 int loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType) 2447 { 2448 ENTRY_LOG_CALLFLOW(); 2449 INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb, 2450 return -1); 2451 2452 AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType); 2453 loc_eng_data.adapter->sendMsg(new LocEngAtlClosed(sm)); 2454 2455 EXIT_LOG(%d, 0); 2456 return 0; 2457 } 2458 2459 /*=========================================================================== 2460 FUNCTION loc_eng_agps_open_failed 2461 2462 DESCRIPTION 2463 This function is called when on-demand data connection opening has failed. 2464 It should inform engine about the data open result. 2465 2466 DEPENDENCIES 2467 NONE 2468 2469 RETURN VALUE 2470 0 2471 2472 SIDE EFFECTS 2473 N/A 2474 2475 ===========================================================================*/ 2476 int loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType) 2477 { 2478 ENTRY_LOG_CALLFLOW(); 2479 INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb, 2480 return -1); 2481 2482 AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType); 2483 loc_eng_data.adapter->sendMsg(new LocEngAtlOpenFailed(sm)); 2484 2485 EXIT_LOG(%d, 0); 2486 return 0; 2487 } 2488 2489 /*=========================================================================== 2490 2491 FUNCTION resolve_in_addr 2492 2493 DESCRIPTION 2494 Translates a hostname to in_addr struct 2495 2496 DEPENDENCIES 2497 n/a 2498 2499 RETURN VALUE 2500 TRUE if successful 2501 2502 SIDE EFFECTS 2503 n/a 2504 2505 ===========================================================================*/ 2506 static boolean resolve_in_addr(const char *host_addr, struct in_addr *in_addr_ptr) 2507 { 2508 ENTRY_LOG(); 2509 boolean ret_val = TRUE; 2510 2511 struct hostent *hp; 2512 hp = gethostbyname(host_addr); 2513 if (hp != NULL) /* DNS OK */ 2514 { 2515 memcpy(in_addr_ptr, hp->h_addr_list[0], hp->h_length); 2516 } 2517 else 2518 { 2519 /* Try IP representation */ 2520 if (inet_aton(host_addr, in_addr_ptr) == 0) 2521 { 2522 /* IP not valid */ 2523 LOC_LOGE("DNS query on '%s' failed\n", host_addr); 2524 ret_val = FALSE; 2525 } 2526 } 2527 2528 EXIT_LOG(%s, loc_logger_boolStr[ret_val!=0]); 2529 return ret_val; 2530 } 2531 2532 /*=========================================================================== 2533 FUNCTION loc_eng_set_server 2534 2535 DESCRIPTION 2536 This is used to set the default AGPS server. Server address is obtained 2537 from gps.conf. 2538 2539 DEPENDENCIES 2540 NONE 2541 2542 RETURN VALUE 2543 0 2544 2545 SIDE EFFECTS 2546 N/A 2547 2548 ===========================================================================*/ 2549 static int loc_eng_set_server(loc_eng_data_s_type &loc_eng_data, 2550 LocServerType type, const char* hostname, int port) 2551 { 2552 ENTRY_LOG(); 2553 int ret = 0; 2554 LocEngAdapter* adapter = loc_eng_data.adapter; 2555 2556 if (LOC_AGPS_SUPL_SERVER == type) { 2557 char url[MAX_URL_LEN]; 2558 unsigned int len = 0; 2559 const char nohost[] = "NONE"; 2560 if (hostname == NULL || 2561 strncasecmp(nohost, hostname, sizeof(nohost)) == 0) { 2562 url[0] = NULL; 2563 } else { 2564 len = snprintf(url, sizeof(url), "%s:%u", hostname, (unsigned) port); 2565 } 2566 2567 if (sizeof(url) > len) { 2568 adapter->sendMsg(new LocEngSetServerUrl(adapter, url, len)); 2569 } 2570 } else if (LOC_AGPS_CDMA_PDE_SERVER == type || 2571 LOC_AGPS_CUSTOM_PDE_SERVER == type || 2572 LOC_AGPS_MPC_SERVER == type) { 2573 struct in_addr addr; 2574 if (!resolve_in_addr(hostname, &addr)) 2575 { 2576 LOC_LOGE("loc_eng_set_server, hostname %s cannot be resolved.\n", hostname); 2577 ret = -2; 2578 } else { 2579 unsigned int ip = htonl(addr.s_addr); 2580 adapter->sendMsg(new LocEngSetServerIpv4(adapter, ip, port, type)); 2581 } 2582 } else { 2583 LOC_LOGE("loc_eng_set_server, type %d cannot be resolved.\n", type); 2584 } 2585 2586 EXIT_LOG(%d, ret); 2587 return ret; 2588 } 2589 2590 /*=========================================================================== 2591 FUNCTION loc_eng_set_server_proxy 2592 2593 DESCRIPTION 2594 If loc_eng_set_server is called before loc_eng_init, it doesn't work. This 2595 proxy buffers server settings and calls loc_eng_set_server when the client is 2596 open. 2597 2598 DEPENDENCIES 2599 NONE 2600 2601 RETURN VALUE 2602 0 2603 2604 SIDE EFFECTS 2605 N/A 2606 2607 ===========================================================================*/ 2608 int loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data, 2609 LocServerType type, 2610 const char* hostname, int port) 2611 { 2612 ENTRY_LOG_CALLFLOW(); 2613 int ret_val = 0; 2614 2615 LOC_LOGV("save the address, type: %d, hostname: %s, port: %d", 2616 (int) type, hostname, port); 2617 switch (type) 2618 { 2619 case LOC_AGPS_SUPL_SERVER: 2620 strlcpy(loc_eng_data.supl_host_buf, hostname, 2621 sizeof(loc_eng_data.supl_host_buf)); 2622 loc_eng_data.supl_port_buf = port; 2623 loc_eng_data.supl_host_set = 1; 2624 break; 2625 case LOC_AGPS_CDMA_PDE_SERVER: 2626 strlcpy(loc_eng_data.c2k_host_buf, hostname, 2627 sizeof(loc_eng_data.c2k_host_buf)); 2628 loc_eng_data.c2k_port_buf = port; 2629 loc_eng_data.c2k_host_set = 1; 2630 break; 2631 default: 2632 LOC_LOGE("loc_eng_set_server_proxy, unknown server type = %d", (int) type); 2633 } 2634 2635 if (NULL != loc_eng_data.adapter) 2636 { 2637 ret_val = loc_eng_set_server(loc_eng_data, type, hostname, port); 2638 } 2639 2640 EXIT_LOG(%d, ret_val); 2641 return ret_val; 2642 } 2643 2644 /*=========================================================================== 2645 FUNCTION loc_eng_agps_ril_update_network_availability 2646 2647 DESCRIPTION 2648 Sets data call allow vs disallow flag to modem 2649 This is the only member of sLocEngAGpsRilInterface implemented. 2650 2651 DEPENDENCIES 2652 None 2653 2654 RETURN VALUE 2655 0: success 2656 2657 SIDE EFFECTS 2658 N/A 2659 2660 ===========================================================================*/ 2661 void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data, 2662 int available, const char* apn) 2663 { 2664 ENTRY_LOG_CALLFLOW(); 2665 2666 //This is to store the status of data availability over the network. 2667 //If GPS is not enabled, the INIT_CHECK will fail and the modem will 2668 //not be updated with the network's availability. Since the data status 2669 //can change before GPS is enabled the, storing the status will enable 2670 //us to inform the modem after GPS is enabled 2671 agpsStatus = available; 2672 2673 INIT_CHECK(loc_eng_data.adapter, return); 2674 if (apn != NULL) 2675 { 2676 LOC_LOGD("loc_eng_agps_ril_update_network_availability: APN Name = [%s]\n", apn); 2677 int apn_len = smaller_of(strlen (apn), MAX_APN_LEN); 2678 LocEngAdapter* adapter = loc_eng_data.adapter; 2679 adapter->sendMsg(new LocEngEnableData(adapter, apn, apn_len, available)); 2680 } 2681 EXIT_LOG(%s, VOID_RET); 2682 } 2683 2684 int loc_eng_agps_install_certificates(loc_eng_data_s_type &loc_eng_data, 2685 const DerEncodedCertificate* certificates, 2686 size_t numberOfCerts) 2687 { 2688 ENTRY_LOG_CALLFLOW(); 2689 int ret_val = AGPS_CERTIFICATE_OPERATION_SUCCESS; 2690 2691 uint32_t slotBitMask = gps_conf.AGPS_CERT_WRITABLE_MASK; 2692 uint32_t slotCount = 0; 2693 for (uint32_t slotBitMaskCounter=slotBitMask; slotBitMaskCounter; slotCount++) { 2694 slotBitMaskCounter &= slotBitMaskCounter - 1; 2695 } 2696 LOC_LOGD("SlotBitMask=%u SlotCount=%u NumberOfCerts=%u", 2697 slotBitMask, slotCount, numberOfCerts); 2698 2699 LocEngAdapter* adapter = loc_eng_data.adapter; 2700 2701 if (numberOfCerts == 0) { 2702 LOC_LOGE("No certs to install, since numberOfCerts is zero"); 2703 ret_val = AGPS_CERTIFICATE_OPERATION_SUCCESS; 2704 } else if (!adapter) { 2705 LOC_LOGE("adapter is null!"); 2706 ret_val = AGPS_CERTIFICATE_ERROR_GENERIC; 2707 } else if (slotCount < numberOfCerts) { 2708 LOC_LOGE("Not enough cert slots (%u) to install %u certs!", 2709 slotCount, numberOfCerts); 2710 ret_val = AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES; 2711 } else { 2712 for (int i=0; i < numberOfCerts; ++i) 2713 { 2714 if (certificates[i].length > AGPS_CERTIFICATE_MAX_LENGTH) { 2715 LOC_LOGE("cert#(%u) length of %u is too big! greater than %u", 2716 certificates[i].length, AGPS_CERTIFICATE_MAX_LENGTH); 2717 ret_val = AGPS_CERTIFICATE_ERROR_GENERIC; 2718 break; 2719 } 2720 } 2721 2722 if (ret_val == AGPS_CERTIFICATE_OPERATION_SUCCESS) { 2723 adapter->sendMsg(new LocEngInstallAGpsCert(adapter, 2724 certificates, 2725 numberOfCerts, 2726 slotBitMask)); 2727 } 2728 } 2729 2730 EXIT_LOG(%d, ret_val); 2731 return ret_val; 2732 } 2733 2734 void loc_eng_configuration_update (loc_eng_data_s_type &loc_eng_data, 2735 const char* config_data, int32_t length) 2736 { 2737 ENTRY_LOG_CALLFLOW(); 2738 2739 if (config_data && length > 0) { 2740 loc_gps_cfg_s_type gps_conf_tmp = gps_conf; 2741 UTIL_UPDATE_CONF(config_data, length, gps_conf_table); 2742 LocEngAdapter* adapter = loc_eng_data.adapter; 2743 2744 // it is possible that HAL is not init'ed at this time 2745 if (adapter) { 2746 if (gps_conf_tmp.SUPL_VER != gps_conf.SUPL_VER) { 2747 adapter->sendMsg(new LocEngSuplVer(adapter, gps_conf.SUPL_VER)); 2748 } 2749 if (gps_conf_tmp.LPP_PROFILE != gps_conf.LPP_PROFILE) { 2750 adapter->sendMsg(new LocEngLppConfig(adapter, gps_conf.LPP_PROFILE)); 2751 } 2752 if (gps_conf_tmp.A_GLONASS_POS_PROTOCOL_SELECT != gps_conf.A_GLONASS_POS_PROTOCOL_SELECT) { 2753 adapter->sendMsg(new LocEngAGlonassProtocol(adapter, 2754 gps_conf.A_GLONASS_POS_PROTOCOL_SELECT)); 2755 } 2756 if (gps_conf_tmp.SUPL_MODE != gps_conf.SUPL_MODE) { 2757 adapter->sendMsg(new LocEngSuplMode(adapter->getUlpProxy())); 2758 } 2759 } 2760 2761 gps_conf_tmp.SUPL_VER = gps_conf.SUPL_VER; 2762 gps_conf_tmp.LPP_PROFILE = gps_conf.LPP_PROFILE; 2763 gps_conf_tmp.A_GLONASS_POS_PROTOCOL_SELECT = gps_conf.A_GLONASS_POS_PROTOCOL_SELECT; 2764 gps_conf_tmp.GPS_LOCK = gps_conf.GPS_LOCK; 2765 gps_conf = gps_conf_tmp; 2766 } 2767 2768 EXIT_LOG(%s, VOID_RET); 2769 } 2770 2771 /*=========================================================================== 2772 FUNCTION loc_eng_report_status 2773 2774 DESCRIPTION 2775 Reports GPS engine state to Java layer. 2776 2777 DEPENDENCIES 2778 N/A 2779 2780 RETURN VALUE 2781 N/A 2782 2783 SIDE EFFECTS 2784 N/A 2785 2786 ===========================================================================*/ 2787 static void loc_eng_report_status (loc_eng_data_s_type &loc_eng_data, GpsStatusValue status) 2788 { 2789 ENTRY_LOG(); 2790 // Switch from WAIT to MUTE, for "engine on" or "session begin" event 2791 if (status == GPS_STATUS_SESSION_BEGIN || status == GPS_STATUS_ENGINE_ON) 2792 { 2793 if (loc_eng_data.mute_session_state == LOC_MUTE_SESS_WAIT) 2794 { 2795 LOC_LOGD("loc_eng_report_status: mute_session_state changed from WAIT to IN SESSION"); 2796 loc_eng_data.mute_session_state = LOC_MUTE_SESS_IN_SESSION; 2797 } 2798 } 2799 2800 // Switch off MUTE session 2801 if (loc_eng_data.mute_session_state == LOC_MUTE_SESS_IN_SESSION && 2802 (status == GPS_STATUS_SESSION_END || status == GPS_STATUS_ENGINE_OFF)) 2803 { 2804 LOC_LOGD("loc_eng_report_status: mute_session_state changed from IN SESSION to NONE"); 2805 loc_eng_data.mute_session_state = LOC_MUTE_SESS_NONE; 2806 } 2807 2808 // Session End is not reported during Android navigating state 2809 boolean navigating = loc_eng_data.adapter->isInSession(); 2810 if (status != GPS_STATUS_NONE && 2811 !(status == GPS_STATUS_SESSION_END && navigating) && 2812 !(status == GPS_STATUS_SESSION_BEGIN && !navigating)) 2813 { 2814 if (loc_eng_data.mute_session_state != LOC_MUTE_SESS_IN_SESSION) 2815 { 2816 // Inform GpsLocationProvider about mNavigating status 2817 loc_inform_gps_status(loc_eng_data, status); 2818 } 2819 else { 2820 LOC_LOGD("loc_eng_report_status: muting the status report."); 2821 } 2822 } 2823 2824 // Only keeps ENGINE ON/OFF in engine_status 2825 if (status == GPS_STATUS_ENGINE_ON || status == GPS_STATUS_ENGINE_OFF) 2826 { 2827 loc_eng_data.engine_status = status; 2828 } 2829 2830 // Only keeps SESSION BEGIN/END in fix_session_status 2831 if (status == GPS_STATUS_SESSION_BEGIN || status == GPS_STATUS_SESSION_END) 2832 { 2833 loc_eng_data.fix_session_status = status; 2834 } 2835 EXIT_LOG(%s, VOID_RET); 2836 } 2837 2838 /*=========================================================================== 2839 FUNCTION loc_eng_handle_engine_down 2840 loc_eng_handle_engine_up 2841 2842 DESCRIPTION 2843 Calls this function when it is detected that modem restart is happening. 2844 Either we detected the modem is down or received modem up event. 2845 This must be called from the deferred thread to avoid race condition. 2846 2847 DEPENDENCIES 2848 None 2849 2850 RETURN VALUE 2851 None 2852 2853 SIDE EFFECTS 2854 N/A 2855 2856 ===========================================================================*/ 2857 void loc_eng_handle_engine_down(loc_eng_data_s_type &loc_eng_data) 2858 { 2859 ENTRY_LOG(); 2860 loc_eng_ni_reset_on_engine_restart(loc_eng_data); 2861 loc_eng_report_status(loc_eng_data, GPS_STATUS_ENGINE_OFF); 2862 EXIT_LOG(%s, VOID_RET); 2863 } 2864 2865 void loc_eng_handle_engine_up(loc_eng_data_s_type &loc_eng_data) 2866 { 2867 ENTRY_LOG(); 2868 loc_eng_reinit(loc_eng_data); 2869 2870 loc_eng_data.adapter->requestPowerVote(); 2871 2872 if (loc_eng_data.agps_status_cb != NULL) { 2873 if (loc_eng_data.agnss_nif) 2874 loc_eng_data.agnss_nif->dropAllSubscribers(); 2875 if (loc_eng_data.internet_nif) 2876 loc_eng_data.internet_nif->dropAllSubscribers(); 2877 2878 loc_eng_agps_reinit(loc_eng_data); 2879 } 2880 2881 // modem is back up. If we crashed in the middle of navigating, we restart. 2882 if (loc_eng_data.adapter->isInSession()) { 2883 // This sets the copy in adapter to modem 2884 loc_eng_data.adapter->setInSession(false); 2885 loc_eng_data.adapter->sendMsg(new LocEngStartFix(loc_eng_data.adapter)); 2886 } 2887 EXIT_LOG(%s, VOID_RET); 2888 } 2889 2890 #ifdef USE_GLIB 2891 /*=========================================================================== 2892 FUNCTION set_sched_policy 2893 2894 DESCRIPTION 2895 Local copy of this function which bypasses android set_sched_policy 2896 2897 DEPENDENCIES 2898 None 2899 2900 RETURN VALUE 2901 0 2902 2903 SIDE EFFECTS 2904 N/A 2905 2906 ===========================================================================*/ 2907 static int set_sched_policy(int tid, SchedPolicy policy) 2908 { 2909 return 0; 2910 } 2911 #endif /* USE_GLIB */ 2912 2913 /*=========================================================================== 2914 FUNCTION loc_eng_read_config 2915 2916 DESCRIPTION 2917 Initiates the reading of the gps config file stored in /etc dir 2918 2919 DEPENDENCIES 2920 None 2921 2922 RETURN VALUE 2923 0: success 2924 2925 SIDE EFFECTS 2926 N/A 2927 2928 ===========================================================================*/ 2929 int loc_eng_read_config(void) 2930 { 2931 ENTRY_LOG_CALLFLOW(); 2932 if(configAlreadyRead == false) 2933 { 2934 // Initialize our defaults before reading of configuration file overwrites them. 2935 loc_default_parameters(); 2936 // We only want to parse the conf file once. This is a good place to ensure that. 2937 // In fact one day the conf file should go into context. 2938 UTIL_READ_CONF(GPS_CONF_FILE, gps_conf_table); 2939 UTIL_READ_CONF(SAP_CONF_FILE, sap_conf_table); 2940 configAlreadyRead = true; 2941 } else { 2942 LOC_LOGV("GPS Config file has already been read\n"); 2943 } 2944 2945 EXIT_LOG(%d, 0); 2946 return 0; 2947 } 2948 2949 /*=========================================================================== 2950 FUNCTION loc_eng_gps_measurement_init 2951 2952 DESCRIPTION 2953 Initialize gps measurement module. 2954 2955 DEPENDENCIES 2956 N/A 2957 2958 RETURN VALUE 2959 0: success 2960 2961 SIDE EFFECTS 2962 N/A 2963 2964 ===========================================================================*/ 2965 int loc_eng_gps_measurement_init(loc_eng_data_s_type &loc_eng_data, 2966 GpsMeasurementCallbacks* callbacks) 2967 { 2968 ENTRY_LOG_CALLFLOW(); 2969 2970 STATE_CHECK((NULL == loc_eng_data.gnss_measurement_cb), 2971 "gnss measurement already initialized", 2972 return GPS_MEASUREMENT_ERROR_ALREADY_INIT); 2973 STATE_CHECK((callbacks != NULL), 2974 "callbacks can not be NULL", 2975 return GPS_MEASUREMENT_ERROR_GENERIC); 2976 STATE_CHECK(loc_eng_data.adapter, 2977 "GpsInterface must be initialized first", 2978 return GPS_MEASUREMENT_ERROR_GENERIC); 2979 2980 // updated the mask 2981 LOC_API_ADAPTER_EVENT_MASK_T event = LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; 2982 loc_eng_data.adapter->sendMsg(new LocEngUpdateRegistrationMask( 2983 &loc_eng_data, 2984 event, 2985 LOC_REGISTRATION_MASK_ENABLED)); 2986 // set up the callback 2987 loc_eng_data.gnss_measurement_cb = callbacks->gnss_measurement_callback; 2988 LOC_LOGD ("%s, event masks updated successfully", __func__); 2989 2990 return GPS_MEASUREMENT_OPERATION_SUCCESS; 2991 } 2992 2993 /*=========================================================================== 2994 FUNCTION loc_eng_gps_measurement_close 2995 2996 DESCRIPTION 2997 Close gps measurement module. 2998 2999 DEPENDENCIES 3000 N/A 3001 3002 RETURN VALUE 3003 N/A 3004 3005 SIDE EFFECTS 3006 N/A 3007 3008 ===========================================================================*/ 3009 void loc_eng_gps_measurement_close(loc_eng_data_s_type &loc_eng_data) 3010 { 3011 ENTRY_LOG_CALLFLOW(); 3012 3013 INIT_CHECK(loc_eng_data.adapter, return); 3014 3015 // updated the mask 3016 LOC_API_ADAPTER_EVENT_MASK_T event = LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; 3017 loc_eng_data.adapter->sendMsg(new LocEngUpdateRegistrationMask( 3018 &loc_eng_data, 3019 event, 3020 LOC_REGISTRATION_MASK_DISABLED)); 3021 // set up the callback 3022 loc_eng_data.gnss_measurement_cb = NULL; 3023 EXIT_LOG(%d, 0); 3024 } 3025