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 locEng->gnss_sv_status_cb((GnssSvStatus*)&(mSvStatus)); 848 } 849 850 if (locEng->generateNmea) 851 { 852 loc_eng_nmea_generate_sv(locEng, mSvStatus, mLocationExtended); 853 } 854 } 855 } 856 void LocEngReportSv::locallog() const { 857 LOC_LOGV("%s:%d] LocEngReportSv",__func__, __LINE__); 858 } 859 inline void LocEngReportSv::log() const { 860 locallog(); 861 } 862 void LocEngReportSv::send() const { 863 mAdapter->sendMsg(this); 864 } 865 866 // case LOC_ENG_MSG_REPORT_STATUS: 867 LocEngReportStatus::LocEngReportStatus(LocAdapterBase* adapter, 868 GpsStatusValue engineStatus) : 869 LocMsg(), mAdapter(adapter), mStatus(engineStatus) 870 { 871 locallog(); 872 } 873 inline void LocEngReportStatus::proc() const 874 { 875 LocEngAdapter* adapter = (LocEngAdapter*)mAdapter; 876 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)adapter->getOwner(); 877 878 loc_eng_report_status(*locEng, mStatus); 879 update_aiding_data_for_deletion(*locEng); 880 } 881 inline void LocEngReportStatus::locallog() const { 882 LOC_LOGV("LocEngReportStatus"); 883 } 884 inline void LocEngReportStatus::log() const { 885 locallog(); 886 } 887 888 // case LOC_ENG_MSG_REPORT_NMEA: 889 LocEngReportNmea::LocEngReportNmea(void* locEng, 890 const char* data, int len) : 891 LocMsg(), mLocEng(locEng), mNmea(new char[len]), mLen(len) 892 { 893 memcpy((void*)mNmea, (void*)data, len); 894 locallog(); 895 } 896 void LocEngReportNmea::proc() const { 897 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*) mLocEng; 898 899 struct timeval tv; 900 gettimeofday(&tv, (struct timezone *) NULL); 901 int64_t now = tv.tv_sec * 1000LL + tv.tv_usec / 1000; 902 903 if (locEng->nmea_cb != NULL) 904 locEng->nmea_cb(now, mNmea, mLen); 905 } 906 inline void LocEngReportNmea::locallog() const { 907 LOC_LOGV("LocEngReportNmea"); 908 } 909 inline void LocEngReportNmea::log() const { 910 locallog(); 911 } 912 913 // case LOC_ENG_MSG_REPORT_XTRA_SERVER: 914 LocEngReportXtraServer::LocEngReportXtraServer(void* locEng, 915 const char *url1, 916 const char *url2, 917 const char *url3, 918 const int maxlength) : 919 LocMsg(), mLocEng(locEng), mMaxLen(maxlength), 920 mServers(new char[3*(mMaxLen+1)]) 921 { 922 char * cptr = mServers; 923 memset(mServers, 0, 3*(mMaxLen+1)); 924 925 // Override modem URLs with uncommented gps.conf urls 926 if( gps_conf.XTRA_SERVER_1[0] != '\0' ) { 927 url1 = &gps_conf.XTRA_SERVER_1[0]; 928 } 929 if( gps_conf.XTRA_SERVER_2[0] != '\0' ) { 930 url2 = &gps_conf.XTRA_SERVER_2[0]; 931 } 932 if( gps_conf.XTRA_SERVER_3[0] != '\0' ) { 933 url3 = &gps_conf.XTRA_SERVER_3[0]; 934 } 935 // copy non xtra1.gpsonextra.net URLs into the forwarding buffer. 936 if( NULL == strcasestr(url1, XTRA1_GPSONEXTRA) ) { 937 strlcpy(cptr, url1, mMaxLen + 1); 938 cptr += mMaxLen + 1; 939 } 940 if( NULL == strcasestr(url2, XTRA1_GPSONEXTRA) ) { 941 strlcpy(cptr, url2, mMaxLen + 1); 942 cptr += mMaxLen + 1; 943 } 944 if( NULL == strcasestr(url3, XTRA1_GPSONEXTRA) ) { 945 strlcpy(cptr, url3, mMaxLen + 1); 946 } 947 locallog(); 948 } 949 950 void LocEngReportXtraServer::proc() const { 951 loc_eng_xtra_data_s_type* locEngXtra = 952 &(((loc_eng_data_s_type*)mLocEng)->xtra_module_data); 953 954 if (locEngXtra->report_xtra_server_cb != NULL) { 955 CALLBACK_LOG_CALLFLOW("report_xtra_server_cb", %s, mServers); 956 locEngXtra->report_xtra_server_cb(mServers, 957 &(mServers[mMaxLen+1]), 958 &(mServers[(mMaxLen+1)<<1])); 959 } else { 960 LOC_LOGE("Callback function for request xtra is NULL"); 961 } 962 } 963 inline void LocEngReportXtraServer::locallog() const { 964 LOC_LOGV("LocEngReportXtraServers: server1: %s\n server2: %s\n" 965 " server3: %s\n", 966 mServers, &mServers[mMaxLen+1], &mServers[(mMaxLen+1)<<1]); 967 } 968 inline void LocEngReportXtraServer::log() const { 969 locallog(); 970 } 971 972 // case LOC_ENG_MSG_REQUEST_BIT: 973 // case LOC_ENG_MSG_RELEASE_BIT: 974 LocEngReqRelBIT::LocEngReqRelBIT(void* locEng, AGpsExtType type, 975 int ipv4, char* ipv6, bool isReq) : 976 LocMsg(), mLocEng(locEng), mType(type), mIPv4Addr(ipv4), 977 mIPv6Addr(ipv6 ? new char[16] : NULL), mIsReq(isReq) { 978 if (NULL != ipv6) 979 memcpy(mIPv6Addr, ipv6, 16); 980 locallog(); 981 } 982 inline LocEngReqRelBIT::~LocEngReqRelBIT() { 983 if (mIPv6Addr) { 984 delete[] mIPv6Addr; 985 } 986 } 987 void LocEngReqRelBIT::proc() const { 988 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 989 BITSubscriber s(getAgpsStateMachine(*locEng, mType), 990 mIPv4Addr, mIPv6Addr); 991 AgpsStateMachine* sm = (AgpsStateMachine*)s.mStateMachine; 992 993 if (mIsReq) { 994 sm->subscribeRsrc((Subscriber*)&s); 995 } else { 996 sm->unsubscribeRsrc((Subscriber*)&s); 997 } 998 } 999 inline void LocEngReqRelBIT::locallog() const { 1000 LOC_LOGV("LocEngRequestBIT - ipv4: %d.%d.%d.%d, ipv6: %s", 1001 (unsigned char)mIPv4Addr, 1002 (unsigned char)(mIPv4Addr>>8), 1003 (unsigned char)(mIPv4Addr>>16), 1004 (unsigned char)(mIPv4Addr>>24), 1005 NULL != mIPv6Addr ? mIPv6Addr : ""); 1006 } 1007 inline void LocEngReqRelBIT::log() const { 1008 locallog(); 1009 } 1010 void LocEngReqRelBIT::send() const { 1011 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1012 locEng->adapter->sendMsg(this); 1013 } 1014 1015 // case LOC_ENG_MSG_RELEASE_BIT: 1016 struct LocEngReleaseBIT : public LocMsg { 1017 const BITSubscriber mSubscriber; 1018 inline LocEngReleaseBIT(const AgpsStateMachine* stateMachine, 1019 unsigned int ipv4, char* ipv6) : 1020 LocMsg(), 1021 mSubscriber(stateMachine, ipv4, ipv6) 1022 { 1023 locallog(); 1024 } 1025 inline virtual void proc() const 1026 { 1027 AgpsStateMachine* sm = (AgpsStateMachine*)mSubscriber.mStateMachine; 1028 sm->unsubscribeRsrc((Subscriber*)&mSubscriber); 1029 } 1030 inline void locallog() const { 1031 LOC_LOGV("LocEngReleaseBIT - ipv4: %d.%d.%d.%d, ipv6: %s", 1032 (unsigned char)(mSubscriber.ID>>24), 1033 (unsigned char)(mSubscriber.ID>>16), 1034 (unsigned char)(mSubscriber.ID>>8), 1035 (unsigned char)mSubscriber.ID, 1036 NULL != mSubscriber.mIPv6Addr ? mSubscriber.mIPv6Addr : ""); 1037 } 1038 virtual void log() const { 1039 locallog(); 1040 } 1041 }; 1042 1043 // LocEngSuplEsOpened 1044 LocEngSuplEsOpened::LocEngSuplEsOpened(void* locEng) : 1045 LocMsg(), mLocEng(locEng) { 1046 locallog(); 1047 } 1048 void LocEngSuplEsOpened::proc() const { 1049 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1050 if (locEng->ds_nif) { 1051 AgpsStateMachine* sm = locEng->ds_nif; 1052 sm->onRsrcEvent(RSRC_GRANTED); 1053 } 1054 } 1055 void LocEngSuplEsOpened::locallog() const { 1056 LOC_LOGV("LocEngSuplEsOpened"); 1057 } 1058 void LocEngSuplEsOpened::log() const { 1059 locallog(); 1060 } 1061 1062 // LocEngSuplEsClosed 1063 LocEngSuplEsClosed::LocEngSuplEsClosed(void* locEng) : 1064 LocMsg(), mLocEng(locEng) { 1065 locallog(); 1066 } 1067 void LocEngSuplEsClosed::proc() const { 1068 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1069 if (locEng->ds_nif) { 1070 AgpsStateMachine* sm = locEng->ds_nif; 1071 sm->onRsrcEvent(RSRC_RELEASED); 1072 } 1073 } 1074 void LocEngSuplEsClosed::locallog() const { 1075 LOC_LOGV("LocEngSuplEsClosed"); 1076 } 1077 void LocEngSuplEsClosed::log() const { 1078 locallog(); 1079 } 1080 1081 1082 // case LOC_ENG_MSG_REQUEST_SUPL_ES: 1083 LocEngRequestSuplEs::LocEngRequestSuplEs(void* locEng, int id) : 1084 LocMsg(), mLocEng(locEng), mID(id) { 1085 locallog(); 1086 } 1087 void LocEngRequestSuplEs::proc() const { 1088 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1089 if (locEng->ds_nif) { 1090 AgpsStateMachine* sm = locEng->ds_nif; 1091 DSSubscriber s(sm, mID); 1092 sm->subscribeRsrc((Subscriber*)&s); 1093 } 1094 else if (locEng->agnss_nif) { 1095 AgpsStateMachine *sm = locEng->agnss_nif; 1096 ATLSubscriber s(mID, 1097 sm, 1098 locEng->adapter, 1099 false); 1100 sm->subscribeRsrc((Subscriber*)&s); 1101 LOC_LOGD("%s:%d]: Using regular ATL for SUPL ES", __func__, __LINE__); 1102 } 1103 else { 1104 locEng->adapter->atlOpenStatus(mID, 0, NULL, -1, -1); 1105 } 1106 } 1107 inline void LocEngRequestSuplEs::locallog() const { 1108 LOC_LOGV("LocEngRequestSuplEs"); 1109 } 1110 inline void LocEngRequestSuplEs::log() const { 1111 locallog(); 1112 } 1113 1114 // case LOC_ENG_MSG_REQUEST_ATL: 1115 LocEngRequestATL::LocEngRequestATL(void* locEng, int id, 1116 AGpsExtType agps_type) : 1117 LocMsg(), mLocEng(locEng), mID(id), mType(agps_type) { 1118 locallog(); 1119 } 1120 void LocEngRequestATL::proc() const { 1121 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1122 AgpsStateMachine* sm = (AgpsStateMachine*) 1123 getAgpsStateMachine(*locEng, mType); 1124 if (sm) { 1125 ATLSubscriber s(mID, 1126 sm, 1127 locEng->adapter, 1128 AGPS_TYPE_INVALID == mType); 1129 sm->subscribeRsrc((Subscriber*)&s); 1130 } else { 1131 locEng->adapter->atlOpenStatus(mID, 0, NULL, -1, mType); 1132 } 1133 } 1134 inline void LocEngRequestATL::locallog() const { 1135 LOC_LOGV("LocEngRequestATL"); 1136 } 1137 inline void LocEngRequestATL::log() const { 1138 locallog(); 1139 } 1140 1141 // case LOC_ENG_MSG_RELEASE_ATL: 1142 LocEngReleaseATL::LocEngReleaseATL(void* locEng, int id) : 1143 LocMsg(), mLocEng(locEng), mID(id) { 1144 locallog(); 1145 } 1146 void LocEngReleaseATL::proc() const { 1147 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1148 1149 if (locEng->agnss_nif) { 1150 ATLSubscriber s1(mID, locEng->agnss_nif, locEng->adapter, false); 1151 if (locEng->agnss_nif->unsubscribeRsrc((Subscriber*)&s1)) { 1152 LOC_LOGD("%s:%d]: Unsubscribed from agnss_nif", 1153 __func__, __LINE__); 1154 return; 1155 } 1156 } 1157 1158 if (locEng->internet_nif) { 1159 ATLSubscriber s2(mID, locEng->internet_nif, locEng->adapter, false); 1160 if (locEng->internet_nif->unsubscribeRsrc((Subscriber*)&s2)) { 1161 LOC_LOGD("%s:%d]: Unsubscribed from internet_nif", 1162 __func__, __LINE__); 1163 return; 1164 } 1165 } 1166 1167 if (locEng->ds_nif) { 1168 DSSubscriber s3(locEng->ds_nif, mID); 1169 if (locEng->ds_nif->unsubscribeRsrc((Subscriber*)&s3)) { 1170 LOC_LOGD("%s:%d]: Unsubscribed from ds_nif", 1171 __func__, __LINE__); 1172 return; 1173 } 1174 } 1175 1176 LOC_LOGW("%s:%d]: Could not release ATL. " 1177 "No subscribers found\n", 1178 __func__, __LINE__); 1179 locEng->adapter->atlCloseStatus(mID, 0); 1180 } 1181 inline void LocEngReleaseATL::locallog() const { 1182 LOC_LOGV("LocEngReleaseATL"); 1183 } 1184 inline void LocEngReleaseATL::log() const { 1185 locallog(); 1186 } 1187 1188 // case LOC_ENG_MSG_REQUEST_WIFI: 1189 // case LOC_ENG_MSG_RELEASE_WIFI: 1190 LocEngReqRelWifi::LocEngReqRelWifi(void* locEng, AGpsExtType type, 1191 loc_if_req_sender_id_e_type sender_id, 1192 char* s, char* p, bool isReq) : 1193 LocMsg(), mLocEng(locEng), mType(type), mSenderId(sender_id), 1194 mSSID(NULL == s ? NULL : new char[SSID_BUF_SIZE]), 1195 mPassword(NULL == p ? NULL : new char[SSID_BUF_SIZE]), 1196 mIsReq(isReq) { 1197 if (NULL != s) 1198 strlcpy(mSSID, s, SSID_BUF_SIZE); 1199 if (NULL != p) 1200 strlcpy(mPassword, p, SSID_BUF_SIZE); 1201 locallog(); 1202 } 1203 LocEngReqRelWifi::~LocEngReqRelWifi() { 1204 if (NULL != mSSID) { 1205 delete[] mSSID; 1206 } 1207 if (NULL != mPassword) { 1208 delete[] mPassword; 1209 } 1210 } 1211 void LocEngReqRelWifi::proc() const { 1212 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1213 if (locEng->wifi_nif) { 1214 WIFISubscriber s(locEng->wifi_nif, mSSID, mPassword, mSenderId); 1215 if (mIsReq) { 1216 locEng->wifi_nif->subscribeRsrc((Subscriber*)&s); 1217 } else { 1218 locEng->wifi_nif->unsubscribeRsrc((Subscriber*)&s); 1219 } 1220 } else { 1221 locEng->adapter->atlOpenStatus(mSenderId, 0, NULL, -1, mType); 1222 } 1223 } 1224 inline void LocEngReqRelWifi::locallog() const { 1225 LOC_LOGV("%s - senderId: %d, ssid: %s, password: %s", 1226 mIsReq ? "LocEngRequestWifi" : "LocEngReleaseWifi", 1227 mSenderId, 1228 NULL != mSSID ? mSSID : "", 1229 NULL != mPassword ? mPassword : ""); 1230 } 1231 inline void LocEngReqRelWifi::log() const { 1232 locallog(); 1233 } 1234 void LocEngReqRelWifi::send() const { 1235 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1236 locEng->adapter->sendMsg(this); 1237 } 1238 1239 // case LOC_ENG_MSG_REQUEST_XTRA_DATA: 1240 LocEngRequestXtra::LocEngRequestXtra(void* locEng) : 1241 mLocEng(locEng) { 1242 locallog(); 1243 } 1244 void LocEngRequestXtra::proc() const 1245 { 1246 loc_eng_xtra_data_s_type* locEngXtra = 1247 &(((loc_eng_data_s_type*)mLocEng)->xtra_module_data); 1248 1249 if (locEngXtra->download_request_cb != NULL) { 1250 CALLBACK_LOG_CALLFLOW("download_request_cb", %p, mLocEng); 1251 locEngXtra->download_request_cb(); 1252 } else { 1253 LOC_LOGE("Callback function for request xtra is NULL"); 1254 } 1255 } 1256 inline void LocEngRequestXtra::locallog() const { 1257 LOC_LOGV("LocEngReqXtra"); 1258 } 1259 inline void LocEngRequestXtra::log() const { 1260 locallog(); 1261 } 1262 1263 // case LOC_ENG_MSG_REQUEST_TIME: 1264 LocEngRequestTime::LocEngRequestTime(void* locEng) : 1265 LocMsg(), mLocEng(locEng) 1266 { 1267 locallog(); 1268 } 1269 void LocEngRequestTime::proc() const { 1270 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1271 if (gps_conf.CAPABILITIES & GPS_CAPABILITY_ON_DEMAND_TIME) { 1272 if (locEng->request_utc_time_cb != NULL) { 1273 locEng->request_utc_time_cb(); 1274 } else { 1275 LOC_LOGE("Callback function for request time is NULL"); 1276 } 1277 } 1278 } 1279 inline void LocEngRequestTime::locallog() const { 1280 LOC_LOGV("LocEngReqTime"); 1281 } 1282 inline void LocEngRequestTime::log() const { 1283 locallog(); 1284 } 1285 1286 // case LOC_ENG_MSG_DELETE_AIDING_DATA: 1287 struct LocEngDelAidData : public LocMsg { 1288 loc_eng_data_s_type* mLocEng; 1289 const GpsAidingData mType; 1290 inline LocEngDelAidData(loc_eng_data_s_type* locEng, 1291 GpsAidingData f) : 1292 LocMsg(), mLocEng(locEng), mType(f) 1293 { 1294 locallog(); 1295 } 1296 inline virtual void proc() const { 1297 mLocEng->aiding_data_for_deletion = mType; 1298 update_aiding_data_for_deletion(*mLocEng); 1299 } 1300 inline void locallog() const { 1301 LOC_LOGV("aiding data msak %d", mType); 1302 } 1303 virtual void log() const { 1304 locallog(); 1305 } 1306 }; 1307 1308 // case LOC_ENG_MSG_ENABLE_DATA: 1309 struct LocEngEnableData : public LocMsg { 1310 LocEngAdapter* mAdapter; 1311 const int mEnable; 1312 char* mAPN; 1313 const int mLen; 1314 inline LocEngEnableData(LocEngAdapter* adapter, 1315 const char* name, int len, int enable) : 1316 LocMsg(), mAdapter(adapter), 1317 mEnable(enable), mAPN(NULL), mLen(len) 1318 { 1319 if (NULL != name) { 1320 mAPN = new char[len+1]; 1321 memcpy((void*)mAPN, (void*)name, len); 1322 mAPN[len] = 0; 1323 } 1324 locallog(); 1325 } 1326 inline ~LocEngEnableData() { 1327 if (NULL != mAPN) { 1328 delete[] mAPN; 1329 } 1330 } 1331 inline virtual void proc() const { 1332 mAdapter->enableData(mEnable); 1333 if (NULL != mAPN) { 1334 mAdapter->setAPN(mAPN, mLen); 1335 } 1336 } 1337 inline void locallog() const { 1338 LOC_LOGV("apn: %s\n enable: %d", 1339 (NULL == mAPN) ? "NULL" : mAPN, mEnable); 1340 } 1341 inline virtual void log() const { 1342 locallog(); 1343 } 1344 }; 1345 1346 // case LOC_ENG_MSG_INJECT_XTRA_DATA: 1347 // loc_eng_xtra.cpp 1348 1349 // case LOC_ENG_MSG_SET_CAPABILITIES: 1350 struct LocEngSetCapabilities : public LocMsg { 1351 loc_eng_data_s_type* mLocEng; 1352 inline LocEngSetCapabilities(loc_eng_data_s_type* locEng) : 1353 LocMsg(), mLocEng(locEng) 1354 { 1355 locallog(); 1356 } 1357 inline virtual void proc() const { 1358 if (NULL != mLocEng->set_capabilities_cb) { 1359 LOC_LOGV("calling set_capabilities_cb 0x%x", 1360 gps_conf.CAPABILITIES); 1361 mLocEng->set_capabilities_cb(gps_conf.CAPABILITIES); 1362 } else { 1363 LOC_LOGV("set_capabilities_cb is NULL.\n"); 1364 } 1365 } 1366 inline void locallog() const 1367 { 1368 LOC_LOGV("LocEngSetCapabilities"); 1369 } 1370 inline virtual void log() const 1371 { 1372 locallog(); 1373 } 1374 }; 1375 1376 struct LocEngSetSystemInfo : public LocMsg { 1377 loc_eng_data_s_type* mLocEng; 1378 inline LocEngSetSystemInfo(loc_eng_data_s_type* locEng) : 1379 LocMsg(), mLocEng(locEng) 1380 { 1381 locallog(); 1382 } 1383 inline virtual void proc() const { 1384 if (NULL != mLocEng->set_system_info_cb) { 1385 LOC_LOGV("calling set_system_info_cb 0x%x", 1386 mLocEng->adapter->mGnssInfo.year_of_hw); 1387 mLocEng->set_system_info_cb(&(mLocEng->adapter->mGnssInfo)); 1388 } 1389 else { 1390 LOC_LOGV("set_system_info_cb is NULL.\n"); 1391 } 1392 } 1393 inline void locallog() const 1394 { 1395 LOC_LOGV("LocEngSetSystemInfo"); 1396 } 1397 inline virtual void log() const 1398 { 1399 locallog(); 1400 } 1401 }; 1402 1403 // case LOC_ENG_MSG_LOC_INIT: 1404 struct LocEngInit : public LocMsg { 1405 loc_eng_data_s_type* mLocEng; 1406 inline LocEngInit(loc_eng_data_s_type* locEng) : 1407 LocMsg(), mLocEng(locEng) 1408 { 1409 locallog(); 1410 } 1411 inline virtual void proc() const { 1412 loc_eng_reinit(*mLocEng); 1413 // set the capabilities 1414 mLocEng->adapter->sendMsg(new LocEngSetCapabilities(mLocEng)); 1415 mLocEng->adapter->sendMsg(new LocEngSetSystemInfo(mLocEng)); 1416 } 1417 inline void locallog() const 1418 { 1419 LOC_LOGV("LocEngInit"); 1420 } 1421 inline virtual void log() const 1422 { 1423 locallog(); 1424 } 1425 }; 1426 1427 // case LOC_ENG_MSG_REQUEST_XTRA_SERVER: 1428 // loc_eng_xtra.cpp 1429 1430 // case LOC_ENG_MSG_ATL_OPEN_SUCCESS: 1431 struct LocEngAtlOpenSuccess : public LocMsg { 1432 AgpsStateMachine* mStateMachine; 1433 const int mLen; 1434 char* mAPN; 1435 const AGpsBearerType mBearerType; 1436 inline LocEngAtlOpenSuccess(AgpsStateMachine* statemachine, 1437 const char* name, 1438 int len, 1439 AGpsBearerType btype) : 1440 LocMsg(), 1441 mStateMachine(statemachine), mLen(len), 1442 mAPN(new char[len+1]), mBearerType(btype) 1443 { 1444 memcpy((void*)mAPN, (void*)name, len); 1445 mAPN[len] = 0; 1446 locallog(); 1447 } 1448 inline ~LocEngAtlOpenSuccess() 1449 { 1450 delete[] mAPN; 1451 } 1452 inline virtual void proc() const { 1453 mStateMachine->setBearer(mBearerType); 1454 mStateMachine->setAPN(mAPN, mLen); 1455 mStateMachine->onRsrcEvent(RSRC_GRANTED); 1456 } 1457 inline void locallog() const { 1458 LOC_LOGV("LocEngAtlOpenSuccess agps type: %s\n apn: %s\n" 1459 " bearer type: %s", 1460 loc_get_agps_type_name(mStateMachine->getType()), 1461 mAPN, 1462 loc_get_agps_bear_name(mBearerType)); 1463 } 1464 inline virtual void log() const { 1465 locallog(); 1466 } 1467 }; 1468 1469 // case LOC_ENG_MSG_ATL_CLOSED: 1470 struct LocEngAtlClosed : public LocMsg { 1471 AgpsStateMachine* mStateMachine; 1472 inline LocEngAtlClosed(AgpsStateMachine* statemachine) : 1473 LocMsg(), mStateMachine(statemachine) { 1474 locallog(); 1475 } 1476 inline virtual void proc() const { 1477 mStateMachine->onRsrcEvent(RSRC_RELEASED); 1478 } 1479 inline void locallog() const { 1480 LOC_LOGV("LocEngAtlClosed"); 1481 } 1482 inline virtual void log() const { 1483 locallog(); 1484 } 1485 }; 1486 1487 // case LOC_ENG_MSG_ATL_OPEN_FAILED: 1488 struct LocEngAtlOpenFailed : public LocMsg { 1489 AgpsStateMachine* mStateMachine; 1490 inline LocEngAtlOpenFailed(AgpsStateMachine* statemachine) : 1491 LocMsg(), mStateMachine(statemachine) { 1492 locallog(); 1493 } 1494 inline virtual void proc() const { 1495 mStateMachine->onRsrcEvent(RSRC_DENIED); 1496 } 1497 inline void locallog() const { 1498 LOC_LOGV("LocEngAtlOpenFailed"); 1499 } 1500 inline virtual void log() const { 1501 locallog(); 1502 } 1503 }; 1504 1505 // case LOC_ENG_MSG_ENGINE_DOWN: 1506 LocEngDown::LocEngDown(void* locEng) : 1507 LocMsg(), mLocEng(locEng) { 1508 locallog(); 1509 } 1510 inline void LocEngDown::proc() const { 1511 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1512 loc_eng_handle_engine_down(*locEng); 1513 } 1514 inline void LocEngDown::locallog() const { 1515 LOC_LOGV("LocEngDown"); 1516 } 1517 inline void LocEngDown::log() const { 1518 locallog(); 1519 } 1520 1521 // case LOC_ENG_MSG_ENGINE_UP: 1522 LocEngUp::LocEngUp(void* locEng) : 1523 LocMsg(), mLocEng(locEng) { 1524 locallog(); 1525 } 1526 inline void LocEngUp::proc() const { 1527 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*)mLocEng; 1528 loc_eng_handle_engine_up(*locEng); 1529 } 1530 inline void LocEngUp::locallog() const { 1531 LOC_LOGV("LocEngUp"); 1532 } 1533 inline void LocEngUp::log() const { 1534 locallog(); 1535 } 1536 1537 struct LocEngDataClientInit : public LocMsg { 1538 loc_eng_data_s_type* mLocEng; 1539 inline LocEngDataClientInit(loc_eng_data_s_type* locEng) : 1540 LocMsg(), mLocEng(locEng) { 1541 locallog(); 1542 } 1543 virtual void proc() const { 1544 loc_eng_data_s_type *locEng = (loc_eng_data_s_type *)mLocEng; 1545 if(!locEng->adapter->initDataServiceClient()) { 1546 locEng->ds_nif = new DSStateMachine(servicerTypeExt, 1547 (void *)dataCallCb, 1548 locEng->adapter); 1549 } 1550 } 1551 void locallog() const { 1552 LOC_LOGV("LocEngDataClientInit\n"); 1553 } 1554 virtual void log() const { 1555 locallog(); 1556 } 1557 }; 1558 1559 struct LocEngInstallAGpsCert : public LocMsg { 1560 LocEngAdapter* mpAdapter; 1561 const size_t mNumberOfCerts; 1562 const uint32_t mSlotBitMask; 1563 DerEncodedCertificate* mpData; 1564 inline LocEngInstallAGpsCert(LocEngAdapter* adapter, 1565 const DerEncodedCertificate* pData, 1566 size_t numberOfCerts, 1567 uint32_t slotBitMask) : 1568 LocMsg(), mpAdapter(adapter), 1569 mNumberOfCerts(numberOfCerts), mSlotBitMask(slotBitMask), 1570 mpData(new DerEncodedCertificate[mNumberOfCerts]) 1571 { 1572 for (int i=0; i < mNumberOfCerts; i++) { 1573 mpData[i].data = new u_char[pData[i].length]; 1574 if (mpData[i].data) { 1575 memcpy(mpData[i].data, (void*)pData[i].data, pData[i].length); 1576 mpData[i].length = pData[i].length; 1577 } else { 1578 LOC_LOGE("malloc failed for cert#%d", i); 1579 break; 1580 } 1581 } 1582 locallog(); 1583 } 1584 inline ~LocEngInstallAGpsCert() 1585 { 1586 for (int i=0; i < mNumberOfCerts; i++) { 1587 if (mpData[i].data) { 1588 delete[] mpData[i].data; 1589 } 1590 } 1591 delete[] mpData; 1592 } 1593 inline virtual void proc() const { 1594 mpAdapter->installAGpsCert(mpData, mNumberOfCerts, mSlotBitMask); 1595 } 1596 inline void locallog() const { 1597 LOC_LOGV("LocEngInstallAGpsCert - certs=%u mask=%u", 1598 mNumberOfCerts, mSlotBitMask); 1599 } 1600 inline virtual void log() const { 1601 locallog(); 1602 } 1603 }; 1604 1605 struct LocEngUpdateRegistrationMask : public LocMsg { 1606 loc_eng_data_s_type* mLocEng; 1607 LOC_API_ADAPTER_EVENT_MASK_T mMask; 1608 loc_registration_mask_status mIsEnabled; 1609 inline LocEngUpdateRegistrationMask(loc_eng_data_s_type* locEng, 1610 LOC_API_ADAPTER_EVENT_MASK_T mask, 1611 loc_registration_mask_status isEnabled) : 1612 LocMsg(), mLocEng(locEng), mMask(mask), mIsEnabled(isEnabled) { 1613 locallog(); 1614 } 1615 inline virtual void proc() const { 1616 loc_eng_data_s_type *locEng = (loc_eng_data_s_type *)mLocEng; 1617 locEng->adapter->updateRegistrationMask(mMask, 1618 mIsEnabled); 1619 } 1620 void locallog() const { 1621 LOC_LOGV("LocEngUpdateRegistrationMask\n"); 1622 } 1623 virtual void log() const { 1624 locallog(); 1625 } 1626 }; 1627 1628 struct LocEngGnssConstellationConfig : public LocMsg { 1629 LocEngAdapter* mAdapter; 1630 inline LocEngGnssConstellationConfig(LocEngAdapter* adapter) : 1631 LocMsg(), mAdapter(adapter) { 1632 locallog(); 1633 } 1634 inline virtual void proc() const { 1635 mAdapter->mGnssInfo.size = sizeof(GnssSystemInfo); 1636 if (mAdapter->gnssConstellationConfig()) { 1637 LOC_LOGV("Modem supports GNSS measurements\n"); 1638 gps_conf.CAPABILITIES |= GPS_CAPABILITY_MEASUREMENTS; 1639 mAdapter->mGnssInfo.year_of_hw = 2016; 1640 } else { 1641 mAdapter->mGnssInfo.year_of_hw = 2015; 1642 LOC_LOGV("Modem does not support GNSS measurements\n"); 1643 } 1644 } 1645 void locallog() const { 1646 LOC_LOGV("LocEngGnssConstellationConfig\n"); 1647 } 1648 virtual void log() const { 1649 locallog(); 1650 } 1651 }; 1652 1653 // case LOC_ENG_MSG_REPORT_GNSS_MEASUREMENT: 1654 LocEngReportGnssMeasurement::LocEngReportGnssMeasurement(void* locEng, 1655 GnssData &gnssData) : 1656 LocMsg(), mLocEng(locEng), mGnssData(gnssData) 1657 { 1658 locallog(); 1659 } 1660 void LocEngReportGnssMeasurement::proc() const { 1661 loc_eng_data_s_type* locEng = (loc_eng_data_s_type*) mLocEng; 1662 if (locEng->mute_session_state != LOC_MUTE_SESS_IN_SESSION) 1663 { 1664 if (locEng->gnss_measurement_cb != NULL) { 1665 LOC_LOGV("Calling gnss_measurement_cb"); 1666 locEng->gnss_measurement_cb((GnssData*)&(mGnssData)); 1667 } 1668 } 1669 } 1670 void LocEngReportGnssMeasurement::locallog() const { 1671 IF_LOC_LOGV { 1672 LOC_LOGV("%s:%d]: Received in GPS HAL." 1673 "GNSS Measurements count: %d \n", 1674 __func__, __LINE__, mGnssData.measurement_count); 1675 for (int i =0; i< mGnssData.measurement_count && i < GNSS_MAX_SVS; i++) { 1676 LOC_LOGV(" GNSS measurement data in GPS HAL: \n" 1677 " GPS_HAL => Measurement ID | svid | time_offset_ns | state |" 1678 " c_n0_dbhz | pseudorange_rate_mps |" 1679 " pseudorange_rate_uncertainty_mps |" 1680 " accumulated_delta_range_state | flags \n" 1681 " GPS_HAL => %d | %d | %f | %d | %f | %f | %f | %d | %d \n", 1682 i, 1683 mGnssData.measurements[i].svid, 1684 mGnssData.measurements[i].time_offset_ns, 1685 mGnssData.measurements[i].state, 1686 mGnssData.measurements[i].c_n0_dbhz, 1687 mGnssData.measurements[i].pseudorange_rate_mps, 1688 mGnssData.measurements[i].pseudorange_rate_uncertainty_mps, 1689 mGnssData.measurements[i].accumulated_delta_range_state, 1690 mGnssData.measurements[i].flags); 1691 } 1692 LOC_LOGV(" GPS_HAL => Clocks Info: \n" 1693 " time_ns | full_bias_ns | bias_ns | bias_uncertainty_ns | " 1694 " drift_nsps | drift_uncertainty_nsps | hw_clock_discontinuity_count | flags" 1695 " GPS_HAL => Clocks Info: %lld | %lld | %g | %g | %g | %g | %d | 0x%04x\n", 1696 mGnssData.clock.time_ns, 1697 mGnssData.clock.full_bias_ns, 1698 mGnssData.clock.bias_ns, 1699 mGnssData.clock.bias_uncertainty_ns, 1700 mGnssData.clock.drift_nsps, 1701 mGnssData.clock.drift_uncertainty_nsps, 1702 mGnssData.clock.hw_clock_discontinuity_count, 1703 mGnssData.clock.flags); 1704 } 1705 } 1706 inline void LocEngReportGnssMeasurement::log() const { 1707 locallog(); 1708 } 1709 1710 /********************************************************************* 1711 * Initialization checking macros 1712 *********************************************************************/ 1713 #define STATE_CHECK(ctx, x, ret) \ 1714 if (!(ctx)) \ 1715 { \ 1716 /* Not intialized, abort */\ 1717 LOC_LOGE("%s: log_eng state error: %s", __func__, x); \ 1718 EXIT_LOG(%s, x); \ 1719 ret; \ 1720 } 1721 #define INIT_CHECK(ctx, ret) STATE_CHECK(ctx, "instance not initialized", ret) 1722 1723 /*=========================================================================== 1724 FUNCTION loc_eng_init 1725 1726 DESCRIPTION 1727 Initialize the location engine, this include setting up global datas 1728 and registers location engien with loc api service. 1729 1730 DEPENDENCIES 1731 None 1732 1733 RETURN VALUE 1734 0: success 1735 1736 SIDE EFFECTS 1737 N/A 1738 1739 ===========================================================================*/ 1740 int loc_eng_init(loc_eng_data_s_type &loc_eng_data, LocCallbacks* callbacks, 1741 LOC_API_ADAPTER_EVENT_MASK_T event, ContextBase* context) 1742 1743 { 1744 int ret_val = 0; 1745 1746 ENTRY_LOG_CALLFLOW(); 1747 if (NULL == callbacks || 0 == event) { 1748 LOC_LOGE("loc_eng_init: bad parameters cb %p eMask %d", callbacks, event); 1749 ret_val = -1; 1750 EXIT_LOG(%d, ret_val); 1751 return ret_val; 1752 } 1753 1754 STATE_CHECK((NULL == loc_eng_data.adapter), 1755 "instance already initialized", return 0); 1756 1757 memset(&loc_eng_data, 0, sizeof (loc_eng_data)); 1758 1759 // Save callbacks 1760 loc_eng_data.location_cb = callbacks->location_cb; 1761 loc_eng_data.sv_status_cb = callbacks->sv_status_cb; 1762 loc_eng_data.status_cb = callbacks->status_cb; 1763 loc_eng_data.nmea_cb = callbacks->nmea_cb; 1764 loc_eng_data.set_capabilities_cb = callbacks->set_capabilities_cb; 1765 loc_eng_data.acquire_wakelock_cb = callbacks->acquire_wakelock_cb; 1766 loc_eng_data.release_wakelock_cb = callbacks->release_wakelock_cb; 1767 loc_eng_data.request_utc_time_cb = callbacks->request_utc_time_cb; 1768 loc_eng_data.set_system_info_cb = callbacks->set_system_info_cb; 1769 loc_eng_data.gnss_sv_status_cb = callbacks->gnss_sv_status_cb; 1770 loc_eng_data.location_ext_parser = callbacks->location_ext_parser ? 1771 callbacks->location_ext_parser : noProc; 1772 loc_eng_data.sv_ext_parser = callbacks->sv_ext_parser ? 1773 callbacks->sv_ext_parser : noProc; 1774 loc_eng_data.intermediateFix = gps_conf.INTERMEDIATE_POS; 1775 // initial states taken care of by the memset above 1776 // loc_eng_data.engine_status -- GPS_STATUS_NONE; 1777 // loc_eng_data.fix_session_status -- GPS_STATUS_NONE; 1778 // loc_eng_data.mute_session_state -- LOC_MUTE_SESS_NONE; 1779 1780 if ((event & LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT) && (gps_conf.NMEA_PROVIDER == NMEA_PROVIDER_AP)) 1781 { 1782 event = event ^ LOC_API_ADAPTER_BIT_NMEA_1HZ_REPORT; // unregister for modem NMEA report 1783 loc_eng_data.generateNmea = true; 1784 } 1785 else 1786 { 1787 loc_eng_data.generateNmea = false; 1788 } 1789 1790 loc_eng_data.adapter = 1791 new LocEngAdapter(event, &loc_eng_data, context, 1792 (LocThread::tCreate)callbacks->create_thread_cb); 1793 1794 loc_eng_data.adapter->mGnssInfo.size = sizeof(GnssSystemInfo); 1795 loc_eng_data.adapter->mGnssInfo.year_of_hw = 2015; 1796 LOC_LOGD("loc_eng_init created client, id = %p\n", 1797 loc_eng_data.adapter); 1798 loc_eng_data.adapter->sendMsg(new LocEngInit(&loc_eng_data)); 1799 1800 EXIT_LOG(%d, ret_val); 1801 return ret_val; 1802 } 1803 1804 static int loc_eng_reinit(loc_eng_data_s_type &loc_eng_data) 1805 { 1806 ENTRY_LOG(); 1807 int ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 1808 LocEngAdapter* adapter = loc_eng_data.adapter; 1809 1810 adapter->sendMsg(new LocEngGnssConstellationConfig(adapter)); 1811 adapter->sendMsg(new LocEngSuplVer(adapter, gps_conf.SUPL_VER)); 1812 adapter->sendMsg(new LocEngLppConfig(adapter, gps_conf.LPP_PROFILE)); 1813 adapter->sendMsg(new LocEngSensorControlConfig(adapter, sap_conf.SENSOR_USAGE, 1814 sap_conf.SENSOR_PROVIDER)); 1815 adapter->sendMsg(new LocEngAGlonassProtocol(adapter, gps_conf.A_GLONASS_POS_PROTOCOL_SELECT)); 1816 1817 /* Make sure at least one of the sensor property is specified by the user in the gps.conf file. */ 1818 if( sap_conf.GYRO_BIAS_RANDOM_WALK_VALID || 1819 sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 1820 sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 1821 sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID || 1822 sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID ) { 1823 adapter->sendMsg(new LocEngSensorProperties(adapter, 1824 sap_conf.GYRO_BIAS_RANDOM_WALK_VALID, 1825 sap_conf.GYRO_BIAS_RANDOM_WALK, 1826 sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 1827 sap_conf.ACCEL_RANDOM_WALK_SPECTRAL_DENSITY, 1828 sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 1829 sap_conf.ANGLE_RANDOM_WALK_SPECTRAL_DENSITY, 1830 sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 1831 sap_conf.RATE_RANDOM_WALK_SPECTRAL_DENSITY, 1832 sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY_VALID, 1833 sap_conf.VELOCITY_RANDOM_WALK_SPECTRAL_DENSITY)); 1834 } 1835 1836 adapter->sendMsg(new LocEngSensorPerfControlConfig(adapter, 1837 sap_conf.SENSOR_CONTROL_MODE, 1838 sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH, 1839 sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC, 1840 sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH, 1841 sap_conf.SENSOR_GYRO_BATCHES_PER_SEC, 1842 sap_conf.SENSOR_ACCEL_SAMPLES_PER_BATCH_HIGH, 1843 sap_conf.SENSOR_ACCEL_BATCHES_PER_SEC_HIGH, 1844 sap_conf.SENSOR_GYRO_SAMPLES_PER_BATCH_HIGH, 1845 sap_conf.SENSOR_GYRO_BATCHES_PER_SEC_HIGH, 1846 sap_conf.SENSOR_ALGORITHM_CONFIG_MASK)); 1847 1848 adapter->sendMsg(new LocEngEnableData(adapter, NULL, 0, (agpsStatus ? 1:0))); 1849 1850 loc_eng_xtra_version_check(loc_eng_data, gps_conf.XTRA_VERSION_CHECK); 1851 1852 LOC_LOGD("loc_eng_reinit reinit() successful"); 1853 EXIT_LOG(%d, ret_val); 1854 return ret_val; 1855 } 1856 1857 /*=========================================================================== 1858 FUNCTION loc_eng_cleanup 1859 1860 DESCRIPTION 1861 Cleans location engine. The location client handle will be released. 1862 1863 DEPENDENCIES 1864 None 1865 1866 RETURN VALUE 1867 None 1868 1869 SIDE EFFECTS 1870 N/A 1871 1872 ===========================================================================*/ 1873 void loc_eng_cleanup(loc_eng_data_s_type &loc_eng_data) 1874 { 1875 ENTRY_LOG_CALLFLOW(); 1876 INIT_CHECK(loc_eng_data.adapter, return); 1877 1878 // XTRA has no state, so we are fine with it. 1879 1880 // we need to check and clear NI 1881 #if 0 1882 // we need to check and clear ATL 1883 if (NULL != loc_eng_data.agnss_nif) { 1884 delete loc_eng_data.agnss_nif; 1885 loc_eng_data.agnss_nif = NULL; 1886 } 1887 if (NULL != loc_eng_data.internet_nif) { 1888 delete loc_eng_data.internet_nif; 1889 loc_eng_data.internet_nif = NULL; 1890 } 1891 #endif 1892 if (loc_eng_data.adapter->isInSession()) 1893 { 1894 LOC_LOGD("loc_eng_cleanup: fix not stopped. stop it now."); 1895 loc_eng_stop(loc_eng_data); 1896 } 1897 1898 #if 0 // can't afford to actually clean up, for many reason. 1899 1900 LOC_LOGD("loc_eng_init: client opened. close it now."); 1901 delete loc_eng_data.adapter; 1902 loc_eng_data.adapter = NULL; 1903 1904 loc_eng_dmn_conn_loc_api_server_unblock(); 1905 loc_eng_dmn_conn_loc_api_server_join(); 1906 1907 #endif 1908 1909 EXIT_LOG(%s, VOID_RET); 1910 } 1911 1912 1913 /*=========================================================================== 1914 FUNCTION loc_eng_start 1915 1916 DESCRIPTION 1917 Starts the tracking session 1918 1919 DEPENDENCIES 1920 None 1921 1922 RETURN VALUE 1923 0: success 1924 1925 SIDE EFFECTS 1926 N/A 1927 1928 ===========================================================================*/ 1929 int loc_eng_start(loc_eng_data_s_type &loc_eng_data) 1930 { 1931 ENTRY_LOG_CALLFLOW(); 1932 INIT_CHECK(loc_eng_data.adapter, return -1); 1933 1934 if(! loc_eng_data.adapter->getUlpProxy()->sendStartFix()) 1935 { 1936 loc_eng_data.adapter->sendMsg(new LocEngStartFix(loc_eng_data.adapter)); 1937 } 1938 1939 EXIT_LOG(%d, 0); 1940 return 0; 1941 } 1942 1943 static int loc_eng_start_handler(loc_eng_data_s_type &loc_eng_data) 1944 { 1945 ENTRY_LOG(); 1946 int ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 1947 1948 if (!loc_eng_data.adapter->isInSession()) { 1949 ret_val = loc_eng_data.adapter->startFix(); 1950 1951 if (ret_val == LOC_API_ADAPTER_ERR_SUCCESS || 1952 ret_val == LOC_API_ADAPTER_ERR_ENGINE_DOWN || 1953 ret_val == LOC_API_ADAPTER_ERR_PHONE_OFFLINE || 1954 ret_val == LOC_API_ADAPTER_ERR_INTERNAL) 1955 { 1956 loc_eng_data.adapter->setInSession(TRUE); 1957 } 1958 } 1959 1960 EXIT_LOG(%d, ret_val); 1961 return ret_val; 1962 } 1963 1964 /*=========================================================================== 1965 FUNCTION loc_eng_stop_wrapper 1966 1967 DESCRIPTION 1968 Stops the tracking session 1969 1970 DEPENDENCIES 1971 None 1972 1973 RETURN VALUE 1974 0: success 1975 1976 SIDE EFFECTS 1977 N/A 1978 1979 ===========================================================================*/ 1980 int loc_eng_stop(loc_eng_data_s_type &loc_eng_data) 1981 { 1982 ENTRY_LOG_CALLFLOW(); 1983 INIT_CHECK(loc_eng_data.adapter, return -1); 1984 1985 if(! loc_eng_data.adapter->getUlpProxy()->sendStopFix()) 1986 { 1987 loc_eng_data.adapter->sendMsg(new LocEngStopFix(loc_eng_data.adapter)); 1988 } 1989 1990 EXIT_LOG(%d, 0); 1991 return 0; 1992 } 1993 1994 static int loc_eng_stop_handler(loc_eng_data_s_type &loc_eng_data) 1995 { 1996 ENTRY_LOG(); 1997 int ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 1998 1999 if (loc_eng_data.adapter->isInSession()) { 2000 2001 ret_val = loc_eng_data.adapter->stopFix(); 2002 loc_eng_data.adapter->setInSession(FALSE); 2003 } 2004 2005 EXIT_LOG(%d, ret_val); 2006 return ret_val; 2007 } 2008 2009 /*=========================================================================== 2010 FUNCTION loc_eng_mute_one_session 2011 2012 DESCRIPTION 2013 Mutes one session 2014 2015 DEPENDENCIES 2016 None 2017 2018 RETURN VALUE 2019 0: Success 2020 2021 SIDE EFFECTS 2022 N/A 2023 2024 ===========================================================================*/ 2025 void loc_eng_mute_one_session(loc_eng_data_s_type &loc_eng_data) 2026 { 2027 ENTRY_LOG(); 2028 loc_eng_data.mute_session_state = LOC_MUTE_SESS_WAIT; 2029 EXIT_LOG(%s, VOID_RET); 2030 } 2031 2032 /*=========================================================================== 2033 FUNCTION loc_eng_set_position_mode 2034 2035 DESCRIPTION 2036 Sets the mode and fix frequency for the tracking session. 2037 2038 DEPENDENCIES 2039 None 2040 2041 RETURN VALUE 2042 0: success 2043 2044 SIDE EFFECTS 2045 N/A 2046 2047 ===========================================================================*/ 2048 int loc_eng_set_position_mode(loc_eng_data_s_type &loc_eng_data, 2049 LocPosMode ¶ms) 2050 { 2051 ENTRY_LOG_CALLFLOW(); 2052 INIT_CHECK(loc_eng_data.adapter, return -1); 2053 2054 // The position mode for AUTO/GSS/QCA1530 can only be standalone 2055 if (!(gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB) && 2056 !(gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) && 2057 (params.mode != LOC_POSITION_MODE_STANDALONE)) { 2058 params.mode = LOC_POSITION_MODE_STANDALONE; 2059 LOC_LOGD("Position mode changed to standalone for target with AUTO/GSS/qca1530."); 2060 } 2061 2062 if(! loc_eng_data.adapter->getUlpProxy()->sendFixMode(params)) 2063 { 2064 LocEngAdapter* adapter = loc_eng_data.adapter; 2065 adapter->sendMsg(new LocEngPositionMode(adapter, params)); 2066 } 2067 2068 EXIT_LOG(%d, 0); 2069 return 0; 2070 } 2071 2072 /*=========================================================================== 2073 FUNCTION loc_eng_inject_time 2074 2075 DESCRIPTION 2076 This is used by Java native function to do time injection. 2077 2078 DEPENDENCIES 2079 None 2080 2081 RETURN VALUE 2082 0 2083 2084 SIDE EFFECTS 2085 N/A 2086 2087 ===========================================================================*/ 2088 int loc_eng_inject_time(loc_eng_data_s_type &loc_eng_data, GpsUtcTime time, 2089 int64_t timeReference, int uncertainty) 2090 { 2091 ENTRY_LOG_CALLFLOW(); 2092 INIT_CHECK(loc_eng_data.adapter, return -1); 2093 LocEngAdapter* adapter = loc_eng_data.adapter; 2094 2095 adapter->sendMsg(new LocEngSetTime(adapter, time, timeReference, 2096 uncertainty)); 2097 2098 EXIT_LOG(%d, 0); 2099 return 0; 2100 } 2101 2102 2103 /*=========================================================================== 2104 FUNCTION loc_eng_inject_location 2105 2106 DESCRIPTION 2107 This is used by Java native function to do location injection. 2108 2109 DEPENDENCIES 2110 None 2111 2112 RETURN VALUE 2113 0 : Successful 2114 error code : Failure 2115 2116 SIDE EFFECTS 2117 N/A 2118 ===========================================================================*/ 2119 int loc_eng_inject_location(loc_eng_data_s_type &loc_eng_data, double latitude, 2120 double longitude, float accuracy) 2121 { 2122 ENTRY_LOG_CALLFLOW(); 2123 INIT_CHECK(loc_eng_data.adapter, return -1); 2124 LocEngAdapter* adapter = loc_eng_data.adapter; 2125 if(adapter->mSupportsPositionInjection) 2126 { 2127 adapter->sendMsg(new LocEngInjectLocation(adapter, latitude, longitude, 2128 accuracy)); 2129 } 2130 2131 EXIT_LOG(%d, 0); 2132 return 0; 2133 } 2134 2135 2136 /*=========================================================================== 2137 FUNCTION loc_eng_delete_aiding_data 2138 2139 DESCRIPTION 2140 This is used by Java native function to delete the aiding data. The function 2141 updates the global variable for the aiding data to be deleted. If the GPS 2142 engine is off, the aiding data will be deleted. Otherwise, the actual action 2143 will happen when gps engine is turned off. 2144 2145 DEPENDENCIES 2146 Assumes the aiding data type specified in GpsAidingData matches with 2147 LOC API specification. 2148 2149 RETURN VALUE 2150 None 2151 2152 SIDE EFFECTS 2153 N/A 2154 2155 ===========================================================================*/ 2156 void loc_eng_delete_aiding_data(loc_eng_data_s_type &loc_eng_data, GpsAidingData f) 2157 { 2158 ENTRY_LOG_CALLFLOW(); 2159 INIT_CHECK(loc_eng_data.adapter, return); 2160 2161 loc_eng_data.adapter->sendMsg(new LocEngDelAidData(&loc_eng_data, f)); 2162 2163 EXIT_LOG(%s, VOID_RET); 2164 } 2165 2166 /*=========================================================================== 2167 2168 FUNCTION loc_inform_gps_state 2169 2170 DESCRIPTION 2171 Informs the GPS Provider about the GPS status 2172 2173 DEPENDENCIES 2174 None 2175 2176 RETURN VALUE 2177 None 2178 2179 SIDE EFFECTS 2180 N/A 2181 2182 ===========================================================================*/ 2183 static void loc_inform_gps_status(loc_eng_data_s_type &loc_eng_data, GpsStatusValue status) 2184 { 2185 ENTRY_LOG(); 2186 2187 if (loc_eng_data.status_cb) 2188 { 2189 GpsStatus gs = { sizeof(gs),status }; 2190 CALLBACK_LOG_CALLFLOW("status_cb", %s, 2191 loc_get_gps_status_name(gs.status)); 2192 loc_eng_data.status_cb(&gs); 2193 } 2194 2195 EXIT_LOG(%s, VOID_RET); 2196 } 2197 2198 static int loc_eng_get_zpp_handler(loc_eng_data_s_type &loc_eng_data) 2199 { 2200 ENTRY_LOG(); 2201 int ret_val = LOC_API_ADAPTER_ERR_SUCCESS; 2202 UlpLocation location; 2203 LocPosTechMask tech_mask = LOC_POS_TECH_MASK_DEFAULT; 2204 GpsLocationExtended locationExtended; 2205 memset(&locationExtended, 0, sizeof (GpsLocationExtended)); 2206 locationExtended.size = sizeof(locationExtended); 2207 2208 ret_val = loc_eng_data.adapter->getZpp(location.gpsLocation, tech_mask); 2209 //Mark the location source as from ZPP 2210 location.gpsLocation.flags |= LOCATION_HAS_SOURCE_INFO; 2211 location.position_source = ULP_LOCATION_IS_FROM_ZPP; 2212 2213 loc_eng_data.adapter->getUlpProxy()->reportPosition(location, 2214 locationExtended, 2215 NULL, 2216 LOC_SESS_SUCCESS, 2217 tech_mask); 2218 2219 EXIT_LOG(%d, ret_val); 2220 return ret_val; 2221 } 2222 2223 /* 2224 Callback function passed to Data Services State Machine 2225 This becomes part of the state machine's servicer and 2226 is used to send requests to the data services client 2227 */ 2228 static int dataCallCb(void *cb_data) 2229 { 2230 LOC_LOGD("Enter dataCallCb\n"); 2231 int ret=0; 2232 if(cb_data != NULL) { 2233 dsCbData *cbData = (dsCbData *)cb_data; 2234 LocEngAdapter *locAdapter = (LocEngAdapter *)cbData->mAdapter; 2235 if(cbData->action == GPS_REQUEST_AGPS_DATA_CONN) { 2236 LOC_LOGD("dataCallCb GPS_REQUEST_AGPS_DATA_CONN\n"); 2237 ret = locAdapter->openAndStartDataCall(); 2238 } 2239 else if(cbData->action == GPS_RELEASE_AGPS_DATA_CONN) { 2240 LOC_LOGD("dataCallCb GPS_RELEASE_AGPS_DATA_CONN\n"); 2241 locAdapter->stopDataCall(); 2242 } 2243 } 2244 else { 2245 LOC_LOGE("NULL argument received. Failing.\n"); 2246 ret = -1; 2247 goto err; 2248 } 2249 2250 err: 2251 LOC_LOGD("Exit dataCallCb ret = %d\n", ret); 2252 return ret; 2253 } 2254 2255 /*=========================================================================== 2256 FUNCTION loc_eng_agps_reinit 2257 2258 DESCRIPTION 2259 2nd half of loc_eng_agps_init(), singled out for modem restart to use. 2260 2261 DEPENDENCIES 2262 NONE 2263 2264 RETURN VALUE 2265 0 2266 2267 SIDE EFFECTS 2268 N/A 2269 2270 ===========================================================================*/ 2271 static void loc_eng_agps_reinit(loc_eng_data_s_type &loc_eng_data) 2272 { 2273 ENTRY_LOG(); 2274 2275 // Set server addresses which came before init 2276 if (loc_eng_data.supl_host_set) 2277 { 2278 loc_eng_set_server(loc_eng_data, LOC_AGPS_SUPL_SERVER, 2279 loc_eng_data.supl_host_buf, 2280 loc_eng_data.supl_port_buf); 2281 } 2282 2283 if (loc_eng_data.c2k_host_set) 2284 { 2285 loc_eng_set_server(loc_eng_data, LOC_AGPS_CDMA_PDE_SERVER, 2286 loc_eng_data.c2k_host_buf, 2287 loc_eng_data.c2k_port_buf); 2288 } 2289 EXIT_LOG(%s, VOID_RET); 2290 } 2291 /*=========================================================================== 2292 FUNCTION loc_eng_agps_init 2293 2294 DESCRIPTION 2295 Initialize the AGps interface. 2296 2297 DEPENDENCIES 2298 NONE 2299 2300 RETURN VALUE 2301 0 2302 2303 SIDE EFFECTS 2304 N/A 2305 2306 ===========================================================================*/ 2307 void loc_eng_agps_init(loc_eng_data_s_type &loc_eng_data, AGpsExtCallbacks* callbacks) 2308 { 2309 ENTRY_LOG_CALLFLOW(); 2310 INIT_CHECK(loc_eng_data.adapter, return); 2311 STATE_CHECK((NULL == loc_eng_data.agps_status_cb), 2312 "agps instance already initialized", 2313 return); 2314 if (callbacks == NULL) { 2315 LOC_LOGE("loc_eng_agps_init: bad parameters cb %p", callbacks); 2316 EXIT_LOG(%s, VOID_RET); 2317 return; 2318 } 2319 LocEngAdapter* adapter = loc_eng_data.adapter; 2320 loc_eng_data.agps_status_cb = callbacks->status_cb; 2321 2322 loc_eng_data.internet_nif = new AgpsStateMachine(servicerTypeAgps, 2323 (void *)loc_eng_data.agps_status_cb, 2324 AGPS_TYPE_WWAN_ANY, 2325 false); 2326 loc_eng_data.wifi_nif = new AgpsStateMachine(servicerTypeAgps, 2327 (void *)loc_eng_data.agps_status_cb, 2328 AGPS_TYPE_WIFI, 2329 true); 2330 2331 if ((gps_conf.CAPABILITIES & GPS_CAPABILITY_MSA) || 2332 (gps_conf.CAPABILITIES & GPS_CAPABILITY_MSB)) { 2333 loc_eng_data.agnss_nif = new AgpsStateMachine(servicerTypeAgps, 2334 (void *)loc_eng_data.agps_status_cb, 2335 AGPS_TYPE_SUPL, 2336 false); 2337 2338 if (adapter->mSupportsAgpsRequests) { 2339 if(gps_conf.USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL) { 2340 loc_eng_data.adapter->sendMsg(new LocEngDataClientInit(&loc_eng_data)); 2341 } 2342 loc_eng_dmn_conn_loc_api_server_launch(callbacks->create_thread_cb, 2343 NULL, NULL, &loc_eng_data); 2344 } 2345 loc_eng_agps_reinit(loc_eng_data); 2346 } 2347 2348 EXIT_LOG(%s, VOID_RET); 2349 } 2350 2351 static void deleteAidingData(loc_eng_data_s_type &logEng) { 2352 if (logEng.engine_status != GPS_STATUS_ENGINE_ON && 2353 logEng.aiding_data_for_deletion != 0) { 2354 logEng.adapter->deleteAidingData(logEng.aiding_data_for_deletion); 2355 logEng.aiding_data_for_deletion = 0; 2356 } 2357 } 2358 2359 static AgpsStateMachine* 2360 getAgpsStateMachine(loc_eng_data_s_type &locEng, AGpsExtType agpsType) { 2361 AgpsStateMachine* stateMachine; 2362 switch (agpsType) { 2363 case AGPS_TYPE_WIFI: { 2364 stateMachine = locEng.wifi_nif; 2365 break; 2366 } 2367 case AGPS_TYPE_INVALID: 2368 case AGPS_TYPE_SUPL: { 2369 stateMachine = locEng.agnss_nif; 2370 break; 2371 } 2372 case AGPS_TYPE_SUPL_ES: { 2373 locEng.ds_nif ? 2374 stateMachine = locEng.ds_nif: 2375 stateMachine = locEng.agnss_nif; 2376 break; 2377 } 2378 default: 2379 stateMachine = locEng.internet_nif; 2380 } 2381 return stateMachine; 2382 } 2383 2384 /*=========================================================================== 2385 FUNCTION loc_eng_agps_open 2386 2387 DESCRIPTION 2388 This function is called when on-demand data connection opening is successful. 2389 It should inform engine about the data open result. 2390 2391 DEPENDENCIES 2392 NONE 2393 2394 RETURN VALUE 2395 0 2396 2397 SIDE EFFECTS 2398 N/A 2399 2400 ===========================================================================*/ 2401 int loc_eng_agps_open(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType, 2402 const char* apn, AGpsBearerType bearerType) 2403 { 2404 ENTRY_LOG_CALLFLOW(); 2405 INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb, 2406 return -1); 2407 2408 if (apn == NULL) 2409 { 2410 LOC_LOGE("APN Name NULL\n"); 2411 return 0; 2412 } 2413 2414 LOC_LOGD("loc_eng_agps_open APN name = [%s]", apn); 2415 2416 int apn_len = smaller_of(strlen (apn), MAX_APN_LEN); 2417 AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType); 2418 2419 loc_eng_data.adapter->sendMsg( 2420 new LocEngAtlOpenSuccess(sm, apn, apn_len, bearerType)); 2421 2422 EXIT_LOG(%d, 0); 2423 return 0; 2424 } 2425 2426 /*=========================================================================== 2427 FUNCTION loc_eng_agps_closed 2428 2429 DESCRIPTION 2430 This function is called when on-demand data connection closing is done. 2431 It should inform engine about the data close result. 2432 2433 DEPENDENCIES 2434 NONE 2435 2436 RETURN VALUE 2437 0 2438 2439 SIDE EFFECTS 2440 N/A 2441 2442 ===========================================================================*/ 2443 int loc_eng_agps_closed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType) 2444 { 2445 ENTRY_LOG_CALLFLOW(); 2446 INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb, 2447 return -1); 2448 2449 AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType); 2450 loc_eng_data.adapter->sendMsg(new LocEngAtlClosed(sm)); 2451 2452 EXIT_LOG(%d, 0); 2453 return 0; 2454 } 2455 2456 /*=========================================================================== 2457 FUNCTION loc_eng_agps_open_failed 2458 2459 DESCRIPTION 2460 This function is called when on-demand data connection opening has failed. 2461 It should inform engine about the data open result. 2462 2463 DEPENDENCIES 2464 NONE 2465 2466 RETURN VALUE 2467 0 2468 2469 SIDE EFFECTS 2470 N/A 2471 2472 ===========================================================================*/ 2473 int loc_eng_agps_open_failed(loc_eng_data_s_type &loc_eng_data, AGpsExtType agpsType) 2474 { 2475 ENTRY_LOG_CALLFLOW(); 2476 INIT_CHECK(loc_eng_data.adapter && loc_eng_data.agps_status_cb, 2477 return -1); 2478 2479 AgpsStateMachine* sm = getAgpsStateMachine(loc_eng_data, agpsType); 2480 loc_eng_data.adapter->sendMsg(new LocEngAtlOpenFailed(sm)); 2481 2482 EXIT_LOG(%d, 0); 2483 return 0; 2484 } 2485 2486 /*=========================================================================== 2487 2488 FUNCTION resolve_in_addr 2489 2490 DESCRIPTION 2491 Translates a hostname to in_addr struct 2492 2493 DEPENDENCIES 2494 n/a 2495 2496 RETURN VALUE 2497 TRUE if successful 2498 2499 SIDE EFFECTS 2500 n/a 2501 2502 ===========================================================================*/ 2503 static boolean resolve_in_addr(const char *host_addr, struct in_addr *in_addr_ptr) 2504 { 2505 ENTRY_LOG(); 2506 boolean ret_val = TRUE; 2507 2508 struct hostent *hp; 2509 hp = gethostbyname(host_addr); 2510 if (hp != NULL) /* DNS OK */ 2511 { 2512 memcpy(in_addr_ptr, hp->h_addr_list[0], hp->h_length); 2513 } 2514 else 2515 { 2516 /* Try IP representation */ 2517 if (inet_aton(host_addr, in_addr_ptr) == 0) 2518 { 2519 /* IP not valid */ 2520 LOC_LOGE("DNS query on '%s' failed\n", host_addr); 2521 ret_val = FALSE; 2522 } 2523 } 2524 2525 EXIT_LOG(%s, loc_logger_boolStr[ret_val!=0]); 2526 return ret_val; 2527 } 2528 2529 /*=========================================================================== 2530 FUNCTION loc_eng_set_server 2531 2532 DESCRIPTION 2533 This is used to set the default AGPS server. Server address is obtained 2534 from gps.conf. 2535 2536 DEPENDENCIES 2537 NONE 2538 2539 RETURN VALUE 2540 0 2541 2542 SIDE EFFECTS 2543 N/A 2544 2545 ===========================================================================*/ 2546 static int loc_eng_set_server(loc_eng_data_s_type &loc_eng_data, 2547 LocServerType type, const char* hostname, int port) 2548 { 2549 ENTRY_LOG(); 2550 int ret = 0; 2551 LocEngAdapter* adapter = loc_eng_data.adapter; 2552 2553 if (LOC_AGPS_SUPL_SERVER == type) { 2554 char url[MAX_URL_LEN]; 2555 unsigned int len = 0; 2556 const char nohost[] = "NONE"; 2557 if (hostname == NULL || 2558 strncasecmp(nohost, hostname, sizeof(nohost)) == 0) { 2559 url[0] = NULL; 2560 } else { 2561 len = snprintf(url, sizeof(url), "%s:%u", hostname, (unsigned) port); 2562 } 2563 2564 if (sizeof(url) > len) { 2565 adapter->sendMsg(new LocEngSetServerUrl(adapter, url, len)); 2566 } 2567 } else if (LOC_AGPS_CDMA_PDE_SERVER == type || 2568 LOC_AGPS_CUSTOM_PDE_SERVER == type || 2569 LOC_AGPS_MPC_SERVER == type) { 2570 struct in_addr addr; 2571 if (!resolve_in_addr(hostname, &addr)) 2572 { 2573 LOC_LOGE("loc_eng_set_server, hostname %s cannot be resolved.\n", hostname); 2574 ret = -2; 2575 } else { 2576 unsigned int ip = htonl(addr.s_addr); 2577 adapter->sendMsg(new LocEngSetServerIpv4(adapter, ip, port, type)); 2578 } 2579 } else { 2580 LOC_LOGE("loc_eng_set_server, type %d cannot be resolved.\n", type); 2581 } 2582 2583 EXIT_LOG(%d, ret); 2584 return ret; 2585 } 2586 2587 /*=========================================================================== 2588 FUNCTION loc_eng_set_server_proxy 2589 2590 DESCRIPTION 2591 If loc_eng_set_server is called before loc_eng_init, it doesn't work. This 2592 proxy buffers server settings and calls loc_eng_set_server when the client is 2593 open. 2594 2595 DEPENDENCIES 2596 NONE 2597 2598 RETURN VALUE 2599 0 2600 2601 SIDE EFFECTS 2602 N/A 2603 2604 ===========================================================================*/ 2605 int loc_eng_set_server_proxy(loc_eng_data_s_type &loc_eng_data, 2606 LocServerType type, 2607 const char* hostname, int port) 2608 { 2609 ENTRY_LOG_CALLFLOW(); 2610 int ret_val = 0; 2611 2612 LOC_LOGV("save the address, type: %d, hostname: %s, port: %d", 2613 (int) type, hostname, port); 2614 switch (type) 2615 { 2616 case LOC_AGPS_SUPL_SERVER: 2617 strlcpy(loc_eng_data.supl_host_buf, hostname, 2618 sizeof(loc_eng_data.supl_host_buf)); 2619 loc_eng_data.supl_port_buf = port; 2620 loc_eng_data.supl_host_set = 1; 2621 break; 2622 case LOC_AGPS_CDMA_PDE_SERVER: 2623 strlcpy(loc_eng_data.c2k_host_buf, hostname, 2624 sizeof(loc_eng_data.c2k_host_buf)); 2625 loc_eng_data.c2k_port_buf = port; 2626 loc_eng_data.c2k_host_set = 1; 2627 break; 2628 default: 2629 LOC_LOGE("loc_eng_set_server_proxy, unknown server type = %d", (int) type); 2630 } 2631 2632 if (NULL != loc_eng_data.adapter) 2633 { 2634 ret_val = loc_eng_set_server(loc_eng_data, type, hostname, port); 2635 } 2636 2637 EXIT_LOG(%d, ret_val); 2638 return ret_val; 2639 } 2640 2641 /*=========================================================================== 2642 FUNCTION loc_eng_agps_ril_update_network_availability 2643 2644 DESCRIPTION 2645 Sets data call allow vs disallow flag to modem 2646 This is the only member of sLocEngAGpsRilInterface implemented. 2647 2648 DEPENDENCIES 2649 None 2650 2651 RETURN VALUE 2652 0: success 2653 2654 SIDE EFFECTS 2655 N/A 2656 2657 ===========================================================================*/ 2658 void loc_eng_agps_ril_update_network_availability(loc_eng_data_s_type &loc_eng_data, 2659 int available, const char* apn) 2660 { 2661 ENTRY_LOG_CALLFLOW(); 2662 2663 //This is to store the status of data availability over the network. 2664 //If GPS is not enabled, the INIT_CHECK will fail and the modem will 2665 //not be updated with the network's availability. Since the data status 2666 //can change before GPS is enabled the, storing the status will enable 2667 //us to inform the modem after GPS is enabled 2668 agpsStatus = available; 2669 2670 INIT_CHECK(loc_eng_data.adapter, return); 2671 if (apn != NULL) 2672 { 2673 LOC_LOGD("loc_eng_agps_ril_update_network_availability: APN Name = [%s]\n", apn); 2674 int apn_len = smaller_of(strlen (apn), MAX_APN_LEN); 2675 LocEngAdapter* adapter = loc_eng_data.adapter; 2676 adapter->sendMsg(new LocEngEnableData(adapter, apn, apn_len, available)); 2677 } 2678 EXIT_LOG(%s, VOID_RET); 2679 } 2680 2681 int loc_eng_agps_install_certificates(loc_eng_data_s_type &loc_eng_data, 2682 const DerEncodedCertificate* certificates, 2683 size_t numberOfCerts) 2684 { 2685 ENTRY_LOG_CALLFLOW(); 2686 int ret_val = AGPS_CERTIFICATE_OPERATION_SUCCESS; 2687 2688 uint32_t slotBitMask = gps_conf.AGPS_CERT_WRITABLE_MASK; 2689 uint32_t slotCount = 0; 2690 for (uint32_t slotBitMaskCounter=slotBitMask; slotBitMaskCounter; slotCount++) { 2691 slotBitMaskCounter &= slotBitMaskCounter - 1; 2692 } 2693 LOC_LOGD("SlotBitMask=%u SlotCount=%u NumberOfCerts=%u", 2694 slotBitMask, slotCount, numberOfCerts); 2695 2696 LocEngAdapter* adapter = loc_eng_data.adapter; 2697 2698 if (numberOfCerts == 0) { 2699 LOC_LOGE("No certs to install, since numberOfCerts is zero"); 2700 ret_val = AGPS_CERTIFICATE_OPERATION_SUCCESS; 2701 } else if (!adapter) { 2702 LOC_LOGE("adapter is null!"); 2703 ret_val = AGPS_CERTIFICATE_ERROR_GENERIC; 2704 } else if (slotCount < numberOfCerts) { 2705 LOC_LOGE("Not enough cert slots (%u) to install %u certs!", 2706 slotCount, numberOfCerts); 2707 ret_val = AGPS_CERTIFICATE_ERROR_TOO_MANY_CERTIFICATES; 2708 } else { 2709 for (int i=0; i < numberOfCerts; ++i) 2710 { 2711 if (certificates[i].length > AGPS_CERTIFICATE_MAX_LENGTH) { 2712 LOC_LOGE("cert#(%u) length of %u is too big! greater than %u", 2713 certificates[i].length, AGPS_CERTIFICATE_MAX_LENGTH); 2714 ret_val = AGPS_CERTIFICATE_ERROR_GENERIC; 2715 break; 2716 } 2717 } 2718 2719 if (ret_val == AGPS_CERTIFICATE_OPERATION_SUCCESS) { 2720 adapter->sendMsg(new LocEngInstallAGpsCert(adapter, 2721 certificates, 2722 numberOfCerts, 2723 slotBitMask)); 2724 } 2725 } 2726 2727 EXIT_LOG(%d, ret_val); 2728 return ret_val; 2729 } 2730 2731 void loc_eng_configuration_update (loc_eng_data_s_type &loc_eng_data, 2732 const char* config_data, int32_t length) 2733 { 2734 ENTRY_LOG_CALLFLOW(); 2735 2736 if (config_data && length > 0) { 2737 loc_gps_cfg_s_type gps_conf_tmp = gps_conf; 2738 UTIL_UPDATE_CONF(config_data, length, gps_conf_table); 2739 LocEngAdapter* adapter = loc_eng_data.adapter; 2740 2741 // it is possible that HAL is not init'ed at this time 2742 if (adapter) { 2743 if (gps_conf_tmp.SUPL_VER != gps_conf.SUPL_VER) { 2744 adapter->sendMsg(new LocEngSuplVer(adapter, gps_conf.SUPL_VER)); 2745 } 2746 if (gps_conf_tmp.LPP_PROFILE != gps_conf.LPP_PROFILE) { 2747 adapter->sendMsg(new LocEngLppConfig(adapter, gps_conf.LPP_PROFILE)); 2748 } 2749 if (gps_conf_tmp.A_GLONASS_POS_PROTOCOL_SELECT != gps_conf.A_GLONASS_POS_PROTOCOL_SELECT) { 2750 adapter->sendMsg(new LocEngAGlonassProtocol(adapter, 2751 gps_conf.A_GLONASS_POS_PROTOCOL_SELECT)); 2752 } 2753 if (gps_conf_tmp.SUPL_MODE != gps_conf.SUPL_MODE) { 2754 adapter->sendMsg(new LocEngSuplMode(adapter->getUlpProxy())); 2755 } 2756 } 2757 2758 gps_conf_tmp.SUPL_VER = gps_conf.SUPL_VER; 2759 gps_conf_tmp.LPP_PROFILE = gps_conf.LPP_PROFILE; 2760 gps_conf_tmp.A_GLONASS_POS_PROTOCOL_SELECT = gps_conf.A_GLONASS_POS_PROTOCOL_SELECT; 2761 gps_conf_tmp.GPS_LOCK = gps_conf.GPS_LOCK; 2762 gps_conf = gps_conf_tmp; 2763 } 2764 2765 EXIT_LOG(%s, VOID_RET); 2766 } 2767 2768 /*=========================================================================== 2769 FUNCTION loc_eng_report_status 2770 2771 DESCRIPTION 2772 Reports GPS engine state to Java layer. 2773 2774 DEPENDENCIES 2775 N/A 2776 2777 RETURN VALUE 2778 N/A 2779 2780 SIDE EFFECTS 2781 N/A 2782 2783 ===========================================================================*/ 2784 static void loc_eng_report_status (loc_eng_data_s_type &loc_eng_data, GpsStatusValue status) 2785 { 2786 ENTRY_LOG(); 2787 // Switch from WAIT to MUTE, for "engine on" or "session begin" event 2788 if (status == GPS_STATUS_SESSION_BEGIN || status == GPS_STATUS_ENGINE_ON) 2789 { 2790 if (loc_eng_data.mute_session_state == LOC_MUTE_SESS_WAIT) 2791 { 2792 LOC_LOGD("loc_eng_report_status: mute_session_state changed from WAIT to IN SESSION"); 2793 loc_eng_data.mute_session_state = LOC_MUTE_SESS_IN_SESSION; 2794 } 2795 } 2796 2797 // Switch off MUTE session 2798 if (loc_eng_data.mute_session_state == LOC_MUTE_SESS_IN_SESSION && 2799 (status == GPS_STATUS_SESSION_END || status == GPS_STATUS_ENGINE_OFF)) 2800 { 2801 LOC_LOGD("loc_eng_report_status: mute_session_state changed from IN SESSION to NONE"); 2802 loc_eng_data.mute_session_state = LOC_MUTE_SESS_NONE; 2803 } 2804 2805 // Session End is not reported during Android navigating state 2806 boolean navigating = loc_eng_data.adapter->isInSession(); 2807 if (status != GPS_STATUS_NONE && 2808 !(status == GPS_STATUS_SESSION_END && navigating) && 2809 !(status == GPS_STATUS_SESSION_BEGIN && !navigating)) 2810 { 2811 if (loc_eng_data.mute_session_state != LOC_MUTE_SESS_IN_SESSION) 2812 { 2813 // Inform GpsLocationProvider about mNavigating status 2814 loc_inform_gps_status(loc_eng_data, status); 2815 } 2816 else { 2817 LOC_LOGD("loc_eng_report_status: muting the status report."); 2818 } 2819 } 2820 2821 // Only keeps ENGINE ON/OFF in engine_status 2822 if (status == GPS_STATUS_ENGINE_ON || status == GPS_STATUS_ENGINE_OFF) 2823 { 2824 loc_eng_data.engine_status = status; 2825 } 2826 2827 // Only keeps SESSION BEGIN/END in fix_session_status 2828 if (status == GPS_STATUS_SESSION_BEGIN || status == GPS_STATUS_SESSION_END) 2829 { 2830 loc_eng_data.fix_session_status = status; 2831 } 2832 EXIT_LOG(%s, VOID_RET); 2833 } 2834 2835 /*=========================================================================== 2836 FUNCTION loc_eng_handle_engine_down 2837 loc_eng_handle_engine_up 2838 2839 DESCRIPTION 2840 Calls this function when it is detected that modem restart is happening. 2841 Either we detected the modem is down or received modem up event. 2842 This must be called from the deferred thread to avoid race condition. 2843 2844 DEPENDENCIES 2845 None 2846 2847 RETURN VALUE 2848 None 2849 2850 SIDE EFFECTS 2851 N/A 2852 2853 ===========================================================================*/ 2854 void loc_eng_handle_engine_down(loc_eng_data_s_type &loc_eng_data) 2855 { 2856 ENTRY_LOG(); 2857 loc_eng_ni_reset_on_engine_restart(loc_eng_data); 2858 loc_eng_report_status(loc_eng_data, GPS_STATUS_ENGINE_OFF); 2859 EXIT_LOG(%s, VOID_RET); 2860 } 2861 2862 void loc_eng_handle_engine_up(loc_eng_data_s_type &loc_eng_data) 2863 { 2864 ENTRY_LOG(); 2865 loc_eng_reinit(loc_eng_data); 2866 2867 loc_eng_data.adapter->requestPowerVote(); 2868 2869 if (loc_eng_data.agps_status_cb != NULL) { 2870 if (loc_eng_data.agnss_nif) 2871 loc_eng_data.agnss_nif->dropAllSubscribers(); 2872 if (loc_eng_data.internet_nif) 2873 loc_eng_data.internet_nif->dropAllSubscribers(); 2874 2875 loc_eng_agps_reinit(loc_eng_data); 2876 } 2877 2878 // modem is back up. If we crashed in the middle of navigating, we restart. 2879 if (loc_eng_data.adapter->isInSession()) { 2880 // This sets the copy in adapter to modem 2881 loc_eng_data.adapter->setInSession(false); 2882 loc_eng_data.adapter->sendMsg(new LocEngStartFix(loc_eng_data.adapter)); 2883 } 2884 EXIT_LOG(%s, VOID_RET); 2885 } 2886 2887 #ifdef USE_GLIB 2888 /*=========================================================================== 2889 FUNCTION set_sched_policy 2890 2891 DESCRIPTION 2892 Local copy of this function which bypasses android set_sched_policy 2893 2894 DEPENDENCIES 2895 None 2896 2897 RETURN VALUE 2898 0 2899 2900 SIDE EFFECTS 2901 N/A 2902 2903 ===========================================================================*/ 2904 static int set_sched_policy(int tid, SchedPolicy policy) 2905 { 2906 return 0; 2907 } 2908 #endif /* USE_GLIB */ 2909 2910 /*=========================================================================== 2911 FUNCTION resolve_config_file_path 2912 2913 DESCRIPTION 2914 resolve the given config file path into a vaild full path considering that 2915 it could be located in vendor partition. 2916 2917 DEPENDENCIES 2918 None 2919 2920 RETURN VALUE 2921 None 2922 2923 SIDE EFFECTS 2924 N/A 2925 2926 ===========================================================================*/ 2927 static void resolve_config_file_path(const char* conf_file_name, 2928 char* resolved_file_path) { 2929 FILE *file; 2930 if (conf_file_name[0] == '/') { 2931 sprintf(resolved_file_path, "/vendor%s", conf_file_name); 2932 } else { 2933 sprintf(resolved_file_path, "/vendor/%s", conf_file_name); 2934 } 2935 if ((file = fopen(resolved_file_path, "r")) != NULL) { 2936 fclose(file); 2937 return; 2938 } 2939 strcpy(resolved_file_path, conf_file_name); 2940 } 2941 2942 /*=========================================================================== 2943 FUNCTION loc_eng_read_config 2944 2945 DESCRIPTION 2946 Initiates the reading of the gps config file stored in /etc dir 2947 2948 DEPENDENCIES 2949 None 2950 2951 RETURN VALUE 2952 0: success 2953 2954 SIDE EFFECTS 2955 N/A 2956 2957 ===========================================================================*/ 2958 int loc_eng_read_config(void) 2959 { 2960 ENTRY_LOG_CALLFLOW(); 2961 if(configAlreadyRead == false) 2962 { 2963 // Initialize our defaults before reading of configuration file overwrites them. 2964 loc_default_parameters(); 2965 // We only want to parse the conf file once. This is a good place to ensure that. 2966 // In fact one day the conf file should go into context. 2967 char conf_file_name[256]; 2968 resolve_config_file_path(GPS_CONF_FILE, conf_file_name); 2969 UTIL_READ_CONF(conf_file_name, gps_conf_table); 2970 resolve_config_file_path(SAP_CONF_FILE, conf_file_name); 2971 UTIL_READ_CONF(conf_file_name, sap_conf_table); 2972 configAlreadyRead = true; 2973 } else { 2974 LOC_LOGV("GPS Config file has already been read\n"); 2975 } 2976 2977 EXIT_LOG(%d, 0); 2978 return 0; 2979 } 2980 2981 /*=========================================================================== 2982 FUNCTION loc_eng_gps_measurement_init 2983 2984 DESCRIPTION 2985 Initialize gps measurement module. 2986 2987 DEPENDENCIES 2988 N/A 2989 2990 RETURN VALUE 2991 0: success 2992 2993 SIDE EFFECTS 2994 N/A 2995 2996 ===========================================================================*/ 2997 int loc_eng_gps_measurement_init(loc_eng_data_s_type &loc_eng_data, 2998 GpsMeasurementCallbacks* callbacks) 2999 { 3000 ENTRY_LOG_CALLFLOW(); 3001 3002 STATE_CHECK((NULL == loc_eng_data.gnss_measurement_cb), 3003 "gnss measurement already initialized", 3004 return GPS_MEASUREMENT_ERROR_ALREADY_INIT); 3005 STATE_CHECK((callbacks != NULL), 3006 "callbacks can not be NULL", 3007 return GPS_MEASUREMENT_ERROR_GENERIC); 3008 STATE_CHECK(loc_eng_data.adapter, 3009 "GpsInterface must be initialized first", 3010 return GPS_MEASUREMENT_ERROR_GENERIC); 3011 3012 // updated the mask 3013 LOC_API_ADAPTER_EVENT_MASK_T event = LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; 3014 loc_eng_data.adapter->sendMsg(new LocEngUpdateRegistrationMask( 3015 &loc_eng_data, 3016 event, 3017 LOC_REGISTRATION_MASK_ENABLED)); 3018 // set up the callback 3019 loc_eng_data.gnss_measurement_cb = callbacks->gnss_measurement_callback; 3020 LOC_LOGD ("%s, event masks updated successfully", __func__); 3021 3022 return GPS_MEASUREMENT_OPERATION_SUCCESS; 3023 } 3024 3025 /*=========================================================================== 3026 FUNCTION loc_eng_gps_measurement_close 3027 3028 DESCRIPTION 3029 Close gps measurement module. 3030 3031 DEPENDENCIES 3032 N/A 3033 3034 RETURN VALUE 3035 N/A 3036 3037 SIDE EFFECTS 3038 N/A 3039 3040 ===========================================================================*/ 3041 void loc_eng_gps_measurement_close(loc_eng_data_s_type &loc_eng_data) 3042 { 3043 ENTRY_LOG_CALLFLOW(); 3044 3045 INIT_CHECK(loc_eng_data.adapter, return); 3046 3047 // updated the mask 3048 LOC_API_ADAPTER_EVENT_MASK_T event = LOC_API_ADAPTER_BIT_GNSS_MEASUREMENT; 3049 loc_eng_data.adapter->sendMsg(new LocEngUpdateRegistrationMask( 3050 &loc_eng_data, 3051 event, 3052 LOC_REGISTRATION_MASK_DISABLED)); 3053 // set up the callback 3054 loc_eng_data.gnss_measurement_cb = NULL; 3055 EXIT_LOG(%d, 0); 3056 } 3057