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