1 /* Copyright (c) 2017-2020, 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 #ifndef __SYSTEM_STATUS__ 30 #define __SYSTEM_STATUS__ 31 32 #include <stdint.h> 33 #include <sys/time.h> 34 #include <vector> 35 #include <algorithm> 36 #include <iterator> 37 #include <loc_pla.h> 38 #include <log_util.h> 39 #include <MsgTask.h> 40 #include <IDataItemCore.h> 41 #include <IOsObserver.h> 42 #include <DataItemConcreteTypesBase.h> 43 #include <SystemStatusOsObserver.h> 44 45 #include <gps_extended_c.h> 46 47 #define GPS_MIN (1) //1-32 48 #define SBAS_MIN (33) 49 #define GLO_MIN (65) //65-88 50 #define QZSS_MIN (193) //193-197 51 #define BDS_MIN (201) //201-237 52 #define GAL_MIN (301) //301-336 53 #define NAVIC_MIN (401) //401-414 54 55 #define GPS_NUM (32) 56 #define SBAS_NUM (32) 57 #define GLO_NUM (24) 58 #define QZSS_NUM (5) 59 #define BDS_NUM (37) 60 #define GAL_NUM (36) 61 #define NAVIC_NUM (14) 62 #define SV_ALL_NUM_MIN (GPS_NUM + GLO_NUM + QZSS_NUM + BDS_NUM + GAL_NUM) //=134 63 #define SV_ALL_NUM (SV_ALL_NUM_MIN + NAVIC_NUM) //=148 64 65 namespace loc_core 66 { 67 68 /****************************************************************************** 69 SystemStatus report data structure 70 ******************************************************************************/ 71 class SystemStatusItemBase 72 { 73 public: 74 timespec mUtcTime; 75 timespec mUtcReported; 76 static const uint32_t maxItem = 5; 77 SystemStatusItemBase()78 SystemStatusItemBase() { 79 timeval tv; 80 gettimeofday(&tv, NULL); 81 mUtcTime.tv_sec = tv.tv_sec; 82 mUtcTime.tv_nsec = tv.tv_usec*1000ULL; 83 mUtcReported = mUtcTime; 84 }; ~SystemStatusItemBase()85 virtual ~SystemStatusItemBase() {}; collate(SystemStatusItemBase &)86 inline virtual SystemStatusItemBase& collate(SystemStatusItemBase&) { 87 return *this; 88 } dump(void)89 virtual void dump(void) {}; ignore()90 inline virtual bool ignore() { return false; }; 91 }; 92 93 class SystemStatusLocation : public SystemStatusItemBase 94 { 95 public: 96 bool mValid; 97 UlpLocation mLocation; 98 GpsLocationExtended mLocationEx; SystemStatusLocation()99 inline SystemStatusLocation() : 100 mValid(false) {} SystemStatusLocation(const UlpLocation & location,const GpsLocationExtended & locationEx)101 inline SystemStatusLocation(const UlpLocation& location, 102 const GpsLocationExtended& locationEx) : 103 mValid(true), 104 mLocation(location), 105 mLocationEx(locationEx) {} 106 bool equals(const SystemStatusLocation& peer); 107 void dump(void) override; 108 }; 109 110 class SystemStatusPQWM1; 111 class SystemStatusTimeAndClock : public SystemStatusItemBase 112 { 113 public: 114 uint16_t mGpsWeek; 115 uint32_t mGpsTowMs; 116 uint8_t mTimeValid; 117 uint8_t mTimeSource; 118 int32_t mTimeUnc; 119 int32_t mClockFreqBias; 120 int32_t mClockFreqBiasUnc; 121 int32_t mLeapSeconds; 122 int32_t mLeapSecUnc; 123 uint64_t mTimeUncNs; SystemStatusTimeAndClock()124 inline SystemStatusTimeAndClock() : 125 mGpsWeek(0), 126 mGpsTowMs(0), 127 mTimeValid(0), 128 mTimeSource(0), 129 mTimeUnc(0), 130 mClockFreqBias(0), 131 mClockFreqBiasUnc(0), 132 mLeapSeconds(0), 133 mLeapSecUnc(0), 134 mTimeUncNs(0ULL) {} 135 inline SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea); 136 bool equals(const SystemStatusTimeAndClock& peer); 137 void dump(void) override; 138 }; 139 140 class SystemStatusXoState : public SystemStatusItemBase 141 { 142 public: 143 uint8_t mXoState; SystemStatusXoState()144 inline SystemStatusXoState() : 145 mXoState(0) {} 146 inline SystemStatusXoState(const SystemStatusPQWM1& nmea); 147 bool equals(const SystemStatusXoState& peer); 148 void dump(void) override; 149 }; 150 151 class SystemStatusRfAndParams : public SystemStatusItemBase 152 { 153 public: 154 int32_t mPgaGain; 155 uint32_t mGpsBpAmpI; 156 uint32_t mGpsBpAmpQ; 157 uint32_t mAdcI; 158 uint32_t mAdcQ; 159 uint32_t mJammerGps; 160 uint32_t mJammerGlo; 161 uint32_t mJammerBds; 162 uint32_t mJammerGal; 163 double mAgcGps; 164 double mAgcGlo; 165 double mAgcBds; 166 double mAgcGal; 167 uint32_t mGloBpAmpI; 168 uint32_t mGloBpAmpQ; 169 uint32_t mBdsBpAmpI; 170 uint32_t mBdsBpAmpQ; 171 uint32_t mGalBpAmpI; 172 uint32_t mGalBpAmpQ; SystemStatusRfAndParams()173 inline SystemStatusRfAndParams() : 174 mPgaGain(0), 175 mGpsBpAmpI(0), 176 mGpsBpAmpQ(0), 177 mAdcI(0), 178 mAdcQ(0), 179 mJammerGps(0), 180 mJammerGlo(0), 181 mJammerBds(0), 182 mJammerGal(0), 183 mAgcGps(0), 184 mAgcGlo(0), 185 mAgcBds(0), 186 mAgcGal(0), 187 mGloBpAmpI(0), 188 mGloBpAmpQ(0), 189 mBdsBpAmpI(0), 190 mBdsBpAmpQ(0), 191 mGalBpAmpI(0), 192 mGalBpAmpQ(0) {} 193 inline SystemStatusRfAndParams(const SystemStatusPQWM1& nmea); 194 bool equals(const SystemStatusRfAndParams& peer); 195 void dump(void) override; 196 }; 197 198 class SystemStatusErrRecovery : public SystemStatusItemBase 199 { 200 public: 201 uint32_t mRecErrorRecovery; SystemStatusErrRecovery()202 inline SystemStatusErrRecovery() : 203 mRecErrorRecovery(0) {}; 204 inline SystemStatusErrRecovery(const SystemStatusPQWM1& nmea); 205 bool equals(const SystemStatusErrRecovery& peer); ignore()206 inline bool ignore() override { return 0 == mRecErrorRecovery; }; 207 void dump(void) override; 208 }; 209 210 class SystemStatusPQWP1; 211 class SystemStatusInjectedPosition : public SystemStatusItemBase 212 { 213 public: 214 uint8_t mEpiValidity; 215 float mEpiLat; 216 float mEpiLon; 217 float mEpiAlt; 218 float mEpiHepe; 219 float mEpiAltUnc; 220 uint8_t mEpiSrc; SystemStatusInjectedPosition()221 inline SystemStatusInjectedPosition() : 222 mEpiValidity(0), 223 mEpiLat(0), 224 mEpiLon(0), 225 mEpiAlt(0), 226 mEpiHepe(0), 227 mEpiAltUnc(0), 228 mEpiSrc(0) {} 229 inline SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea); 230 bool equals(const SystemStatusInjectedPosition& peer); 231 void dump(void) override; 232 }; 233 234 class SystemStatusPQWP2; 235 class SystemStatusBestPosition : public SystemStatusItemBase 236 { 237 public: 238 bool mValid; 239 float mBestLat; 240 float mBestLon; 241 float mBestAlt; 242 float mBestHepe; 243 float mBestAltUnc; SystemStatusBestPosition()244 inline SystemStatusBestPosition() : 245 mValid(false), 246 mBestLat(0), 247 mBestLon(0), 248 mBestAlt(0), 249 mBestHepe(0), 250 mBestAltUnc(0) {} 251 inline SystemStatusBestPosition(const SystemStatusPQWP2& nmea); 252 bool equals(const SystemStatusBestPosition& peer); 253 void dump(void) override; 254 }; 255 256 class SystemStatusPQWP3; 257 class SystemStatusXtra : public SystemStatusItemBase 258 { 259 public: 260 uint8_t mXtraValidMask; 261 uint32_t mGpsXtraAge; 262 uint32_t mGloXtraAge; 263 uint32_t mBdsXtraAge; 264 uint32_t mGalXtraAge; 265 uint32_t mQzssXtraAge; 266 uint32_t mNavicXtraAge; 267 uint32_t mGpsXtraValid; 268 uint32_t mGloXtraValid; 269 uint64_t mBdsXtraValid; 270 uint64_t mGalXtraValid; 271 uint8_t mQzssXtraValid; 272 uint32_t mNavicXtraValid; SystemStatusXtra()273 inline SystemStatusXtra() : 274 mXtraValidMask(0), 275 mGpsXtraAge(0), 276 mGloXtraAge(0), 277 mBdsXtraAge(0), 278 mGalXtraAge(0), 279 mQzssXtraAge(0), 280 mNavicXtraAge(0), 281 mGpsXtraValid(0), 282 mGloXtraValid(0), 283 mBdsXtraValid(0ULL), 284 mGalXtraValid(0ULL), 285 mQzssXtraValid(0), 286 mNavicXtraValid(0) {} 287 inline SystemStatusXtra(const SystemStatusPQWP3& nmea); 288 bool equals(const SystemStatusXtra& peer); 289 void dump(void) override; 290 }; 291 292 class SystemStatusPQWP4; 293 class SystemStatusEphemeris : public SystemStatusItemBase 294 { 295 public: 296 uint32_t mGpsEpheValid; 297 uint32_t mGloEpheValid; 298 uint64_t mBdsEpheValid; 299 uint64_t mGalEpheValid; 300 uint8_t mQzssEpheValid; SystemStatusEphemeris()301 inline SystemStatusEphemeris() : 302 mGpsEpheValid(0), 303 mGloEpheValid(0), 304 mBdsEpheValid(0ULL), 305 mGalEpheValid(0ULL), 306 mQzssEpheValid(0) {} 307 inline SystemStatusEphemeris(const SystemStatusPQWP4& nmea); 308 bool equals(const SystemStatusEphemeris& peer); 309 void dump(void) override; 310 }; 311 312 class SystemStatusPQWP5; 313 class SystemStatusSvHealth : public SystemStatusItemBase 314 { 315 public: 316 uint32_t mGpsUnknownMask; 317 uint32_t mGloUnknownMask; 318 uint64_t mBdsUnknownMask; 319 uint64_t mGalUnknownMask; 320 uint8_t mQzssUnknownMask; 321 uint32_t mNavicUnknownMask; 322 uint32_t mGpsGoodMask; 323 uint32_t mGloGoodMask; 324 uint64_t mBdsGoodMask; 325 uint64_t mGalGoodMask; 326 uint8_t mQzssGoodMask; 327 uint32_t mNavicGoodMask; 328 uint32_t mGpsBadMask; 329 uint32_t mGloBadMask; 330 uint64_t mBdsBadMask; 331 uint64_t mGalBadMask; 332 uint8_t mQzssBadMask; 333 uint32_t mNavicBadMask; SystemStatusSvHealth()334 inline SystemStatusSvHealth() : 335 mGpsUnknownMask(0), 336 mGloUnknownMask(0), 337 mBdsUnknownMask(0ULL), 338 mGalUnknownMask(0ULL), 339 mQzssUnknownMask(0), 340 mNavicUnknownMask(0), 341 mGpsGoodMask(0), 342 mGloGoodMask(0), 343 mBdsGoodMask(0ULL), 344 mGalGoodMask(0ULL), 345 mQzssGoodMask(0), 346 mNavicGoodMask(0), 347 mGpsBadMask(0), 348 mGloBadMask(0), 349 mBdsBadMask(0ULL), 350 mGalBadMask(0ULL), 351 mQzssBadMask(0), 352 mNavicBadMask(0) {} 353 inline SystemStatusSvHealth(const SystemStatusPQWP5& nmea); 354 bool equals(const SystemStatusSvHealth& peer); 355 void dump(void) override; 356 }; 357 358 class SystemStatusPQWP6; 359 class SystemStatusPdr : public SystemStatusItemBase 360 { 361 public: 362 uint32_t mFixInfoMask; SystemStatusPdr()363 inline SystemStatusPdr() : 364 mFixInfoMask(0) {} 365 inline SystemStatusPdr(const SystemStatusPQWP6& nmea); 366 bool equals(const SystemStatusPdr& peer); 367 void dump(void) override; 368 }; 369 370 class SystemStatusPQWP7; 371 struct SystemStatusNav 372 { 373 GnssEphemerisType mType; 374 GnssEphemerisSource mSource; 375 int32_t mAgeSec; 376 }; 377 378 class SystemStatusNavData : public SystemStatusItemBase 379 { 380 public: 381 SystemStatusNav mNav[SV_ALL_NUM]; SystemStatusNavData()382 inline SystemStatusNavData() { 383 for (uint32_t i=0; i<SV_ALL_NUM; i++) { 384 mNav[i].mType = GNSS_EPH_TYPE_UNKNOWN; 385 mNav[i].mSource = GNSS_EPH_SOURCE_UNKNOWN; 386 mNav[i].mAgeSec = 0; 387 } 388 } 389 inline SystemStatusNavData(const SystemStatusPQWP7& nmea); 390 bool equals(const SystemStatusNavData& peer); 391 void dump(void) override; 392 }; 393 394 class SystemStatusPQWS1; 395 class SystemStatusPositionFailure : public SystemStatusItemBase 396 { 397 public: 398 uint32_t mFixInfoMask; 399 uint32_t mHepeLimit; SystemStatusPositionFailure()400 inline SystemStatusPositionFailure() : 401 mFixInfoMask(0), 402 mHepeLimit(0) {} 403 inline SystemStatusPositionFailure(const SystemStatusPQWS1& nmea); 404 bool equals(const SystemStatusPositionFailure& peer); 405 void dump(void) override; 406 }; 407 408 /****************************************************************************** 409 SystemStatus report data structure - from DataItem observer 410 ******************************************************************************/ 411 class SystemStatusAirplaneMode : public SystemStatusItemBase, 412 public AirplaneModeDataItemBase 413 { 414 public: 415 inline SystemStatusAirplaneMode(bool mode=false) : 416 AirplaneModeDataItemBase(mode) {} SystemStatusAirplaneMode(const AirplaneModeDataItemBase & itemBase)417 inline SystemStatusAirplaneMode(const AirplaneModeDataItemBase& itemBase) : 418 AirplaneModeDataItemBase(itemBase) {} equals(const SystemStatusAirplaneMode & peer)419 inline bool equals(const SystemStatusAirplaneMode& peer) { 420 return (mMode == peer.mMode); 421 } 422 }; 423 424 class SystemStatusENH : public SystemStatusItemBase, 425 public ENHDataItemBase 426 { 427 public: 428 inline SystemStatusENH(bool enabled=false) : 429 ENHDataItemBase(enabled) {} SystemStatusENH(const ENHDataItemBase & itemBase)430 inline SystemStatusENH(const ENHDataItemBase& itemBase) : 431 ENHDataItemBase(itemBase) {} equals(const SystemStatusENH & peer)432 inline bool equals(const SystemStatusENH& peer) { 433 return (mEnabled == peer.mEnabled); 434 } 435 }; 436 437 class SystemStatusGpsState : public SystemStatusItemBase, 438 public GPSStateDataItemBase 439 { 440 public: 441 inline SystemStatusGpsState(bool enabled=false) : 442 GPSStateDataItemBase(enabled) {} SystemStatusGpsState(const GPSStateDataItemBase & itemBase)443 inline SystemStatusGpsState(const GPSStateDataItemBase& itemBase) : 444 GPSStateDataItemBase(itemBase) {} equals(const SystemStatusGpsState & peer)445 inline bool equals(const SystemStatusGpsState& peer) { 446 return (mEnabled == peer.mEnabled); 447 } dump(void)448 inline void dump(void) override { 449 LOC_LOGD("GpsState: state=%u", mEnabled); 450 } 451 }; 452 453 class SystemStatusNLPStatus : public SystemStatusItemBase, 454 public NLPStatusDataItemBase 455 { 456 public: 457 inline SystemStatusNLPStatus(bool enabled=false) : 458 NLPStatusDataItemBase(enabled) {} SystemStatusNLPStatus(const NLPStatusDataItemBase & itemBase)459 inline SystemStatusNLPStatus(const NLPStatusDataItemBase& itemBase) : 460 NLPStatusDataItemBase(itemBase) {} equals(const SystemStatusNLPStatus & peer)461 inline bool equals(const SystemStatusNLPStatus& peer) { 462 return (mEnabled == peer.mEnabled); 463 } 464 }; 465 466 class SystemStatusWifiHardwareState : public SystemStatusItemBase, 467 public WifiHardwareStateDataItemBase 468 { 469 public: 470 inline SystemStatusWifiHardwareState(bool enabled=false) : 471 WifiHardwareStateDataItemBase(enabled) {} SystemStatusWifiHardwareState(const WifiHardwareStateDataItemBase & itemBase)472 inline SystemStatusWifiHardwareState(const WifiHardwareStateDataItemBase& itemBase) : 473 WifiHardwareStateDataItemBase(itemBase) {} equals(const SystemStatusWifiHardwareState & peer)474 inline bool equals(const SystemStatusWifiHardwareState& peer) { 475 return (mEnabled == peer.mEnabled); 476 } 477 }; 478 479 class SystemStatusNetworkInfo : public SystemStatusItemBase, 480 public NetworkInfoDataItemBase 481 { 482 NetworkInfoDataItemBase* mSrcObjPtr; 483 public: 484 inline SystemStatusNetworkInfo( 485 int32_t type = 0, 486 std::string typeName = "", 487 string subTypeName = "", 488 bool connected = false, 489 bool roaming = false, 490 uint64_t networkHandle = NETWORK_HANDLE_UNKNOWN, 491 string apn = "") : 492 NetworkInfoDataItemBase( 493 (NetworkType)type, 494 type, 495 typeName, 496 subTypeName, 497 connected && (!roaming), 498 connected, 499 roaming, 500 networkHandle, apn), 501 mSrcObjPtr(nullptr) {} SystemStatusNetworkInfo(const NetworkInfoDataItemBase & itemBase)502 inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) : 503 NetworkInfoDataItemBase(itemBase), 504 mSrcObjPtr((NetworkInfoDataItemBase*)&itemBase) { 505 mType = (int32_t)itemBase.getType(); 506 } equals(const SystemStatusNetworkInfo & peer)507 inline bool equals(const SystemStatusNetworkInfo& peer) { 508 bool rtv = (peer.mConnected == mConnected); 509 for (uint8_t i = 0; rtv && i < MAX_NETWORK_HANDLES; ++i) { 510 rtv &= (mAllNetworkHandles[i] == peer.mAllNetworkHandles[i]); 511 } 512 return peer.mApn.compare(mApn); 513 } collate(SystemStatusItemBase & curInfo)514 inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) { 515 uint64_t allTypes = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mAllTypes; 516 string& apn = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mApn; 517 // Replace current with cached table for now and then update 518 memcpy(mAllNetworkHandles, 519 (static_cast<SystemStatusNetworkInfo&>(curInfo)).getNetworkHandle(), 520 sizeof(mAllNetworkHandles)); 521 LOC_LOGd("NetworkInfo: allTypes=%" PRIx64 " mType=%x mConnected=%u mNetworkHandle=%" PRIx64 , allTypes, mType, mConnected, mNetworkHandle); 522 // Update the apn for non-mobile type connections. 523 if (TYPE_MOBILE != mType && apn.compare("") != 0) { 524 mApn = apn; 525 } 526 if (mConnected) { 527 mAllTypes |= allTypes; 528 for (uint8_t i = 0; i < MAX_NETWORK_HANDLES; ++i) { 529 LOC_LOGd("NetworkInfo: mNetworkHandle[%u]: networkHandle %" PRIx64 ", networkType %x", i, mAllNetworkHandles[i].networkHandle, 530 mAllNetworkHandles[i].networkType); 531 if (mNetworkHandle == mAllNetworkHandles[i].networkHandle) { 532 LOC_LOGD("collate duplicate detected, not updating"); 533 break; 534 } 535 if (NETWORK_HANDLE_UNKNOWN == mAllNetworkHandles[i].networkHandle) { 536 mAllNetworkHandles[i].networkHandle = mNetworkHandle; 537 mAllNetworkHandles[i].networkType = (loc_core::NetworkType) mType; 538 break; 539 } 540 } 541 } else if (0 != mAllTypes) { 542 uint8_t deletedIndex = MAX_NETWORK_HANDLES; 543 uint8_t lastValidIndex = 0; 544 uint8_t typeCount = 0; 545 for (; lastValidIndex < MAX_NETWORK_HANDLES && 546 NETWORK_HANDLE_UNKNOWN != mAllNetworkHandles[lastValidIndex].networkHandle; 547 ++lastValidIndex) { 548 // Maintain count for number of network handles still 549 // connected for given type 550 if (mType == (int32_t)mAllNetworkHandles[lastValidIndex].networkType) { 551 if (mNetworkHandle == mAllNetworkHandles[lastValidIndex].networkHandle) { 552 deletedIndex = lastValidIndex; 553 } else { 554 typeCount++; 555 } 556 } 557 558 } 559 if (lastValidIndex > 0) { 560 --lastValidIndex; 561 } 562 563 if (MAX_NETWORK_HANDLES != deletedIndex) { 564 LOC_LOGd("deletedIndex:%u, lastValidIndex:%u, typeCount:%u", 565 deletedIndex, lastValidIndex, typeCount); 566 mAllNetworkHandles[deletedIndex] = mAllNetworkHandles[lastValidIndex]; 567 mAllNetworkHandles[lastValidIndex].networkHandle = NETWORK_HANDLE_UNKNOWN; 568 mAllNetworkHandles[lastValidIndex].networkType = TYPE_UNKNOWN; 569 } 570 571 // If no more handles of given type, set bitmask 572 if (0 == typeCount) { 573 mAllTypes = (allTypes & (~mAllTypes)); 574 LOC_LOGD("mAllTypes:%" PRIx64, mAllTypes); 575 } 576 } // else (mConnected == false && mAllTypes == 0) 577 // we keep mAllTypes as 0, which means no more connections. 578 579 if (nullptr != mSrcObjPtr) { 580 // this is critical, changing mAllTypes of the original obj 581 mSrcObjPtr->mAllTypes = mAllTypes; 582 memcpy(mSrcObjPtr->mAllNetworkHandles, 583 mAllNetworkHandles, 584 sizeof(mSrcObjPtr->mAllNetworkHandles)); 585 } 586 return *this; 587 } dump(void)588 inline void dump(void) override { 589 LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x mApn=%s", 590 mAllTypes, mConnected, mType, mApn.c_str()); 591 } 592 }; 593 594 class SystemStatusServiceInfo : public SystemStatusItemBase, 595 public RilServiceInfoDataItemBase 596 { 597 public: SystemStatusServiceInfo()598 inline SystemStatusServiceInfo() : 599 RilServiceInfoDataItemBase() {} SystemStatusServiceInfo(const RilServiceInfoDataItemBase & itemBase)600 inline SystemStatusServiceInfo(const RilServiceInfoDataItemBase& itemBase) : 601 RilServiceInfoDataItemBase(itemBase) {} equals(const SystemStatusServiceInfo & peer)602 inline bool equals(const SystemStatusServiceInfo& peer) { 603 return static_cast<const RilServiceInfoDataItemBase&>(peer) == 604 static_cast<const RilServiceInfoDataItemBase&>(*this); 605 } 606 }; 607 608 class SystemStatusRilCellInfo : public SystemStatusItemBase, 609 public RilCellInfoDataItemBase 610 { 611 public: SystemStatusRilCellInfo()612 inline SystemStatusRilCellInfo() : 613 RilCellInfoDataItemBase() {} SystemStatusRilCellInfo(const RilCellInfoDataItemBase & itemBase)614 inline SystemStatusRilCellInfo(const RilCellInfoDataItemBase& itemBase) : 615 RilCellInfoDataItemBase(itemBase) {} equals(const SystemStatusRilCellInfo & peer)616 inline bool equals(const SystemStatusRilCellInfo& peer) { 617 return static_cast<const RilCellInfoDataItemBase&>(peer) == 618 static_cast<const RilCellInfoDataItemBase&>(*this); 619 } 620 }; 621 622 class SystemStatusServiceStatus : public SystemStatusItemBase, 623 public ServiceStatusDataItemBase 624 { 625 public: 626 inline SystemStatusServiceStatus(int32_t mServiceState=0) : 627 ServiceStatusDataItemBase(mServiceState) {} SystemStatusServiceStatus(const ServiceStatusDataItemBase & itemBase)628 inline SystemStatusServiceStatus(const ServiceStatusDataItemBase& itemBase) : 629 ServiceStatusDataItemBase(itemBase) {} equals(const SystemStatusServiceStatus & peer)630 inline bool equals(const SystemStatusServiceStatus& peer) { 631 return (mServiceState == peer.mServiceState); 632 } 633 }; 634 635 class SystemStatusModel : public SystemStatusItemBase, 636 public ModelDataItemBase 637 { 638 public: 639 inline SystemStatusModel(string name="") : 640 ModelDataItemBase(name) {} SystemStatusModel(const ModelDataItemBase & itemBase)641 inline SystemStatusModel(const ModelDataItemBase& itemBase) : 642 ModelDataItemBase(itemBase) {} equals(const SystemStatusModel & peer)643 inline bool equals(const SystemStatusModel& peer) { 644 return (mModel == peer.mModel); 645 } 646 }; 647 648 class SystemStatusManufacturer : public SystemStatusItemBase, 649 public ManufacturerDataItemBase 650 { 651 public: 652 inline SystemStatusManufacturer(string name="") : 653 ManufacturerDataItemBase(name) {} SystemStatusManufacturer(const ManufacturerDataItemBase & itemBase)654 inline SystemStatusManufacturer(const ManufacturerDataItemBase& itemBase) : 655 ManufacturerDataItemBase(itemBase) {} equals(const SystemStatusManufacturer & peer)656 inline bool equals(const SystemStatusManufacturer& peer) { 657 return (mManufacturer == peer.mManufacturer); 658 } 659 }; 660 661 class SystemStatusAssistedGps : public SystemStatusItemBase, 662 public AssistedGpsDataItemBase 663 { 664 public: 665 inline SystemStatusAssistedGps(bool enabled=false) : 666 AssistedGpsDataItemBase(enabled) {} SystemStatusAssistedGps(const AssistedGpsDataItemBase & itemBase)667 inline SystemStatusAssistedGps(const AssistedGpsDataItemBase& itemBase) : 668 AssistedGpsDataItemBase(itemBase) {} equals(const SystemStatusAssistedGps & peer)669 inline bool equals(const SystemStatusAssistedGps& peer) { 670 return (mEnabled == peer.mEnabled); 671 } 672 }; 673 674 class SystemStatusScreenState : public SystemStatusItemBase, 675 public ScreenStateDataItemBase 676 { 677 public: 678 inline SystemStatusScreenState(bool state=false) : 679 ScreenStateDataItemBase(state) {} SystemStatusScreenState(const ScreenStateDataItemBase & itemBase)680 inline SystemStatusScreenState(const ScreenStateDataItemBase& itemBase) : 681 ScreenStateDataItemBase(itemBase) {} equals(const SystemStatusScreenState & peer)682 inline bool equals(const SystemStatusScreenState& peer) { 683 return (mState == peer.mState); 684 } 685 }; 686 687 class SystemStatusPowerConnectState : public SystemStatusItemBase, 688 public PowerConnectStateDataItemBase 689 { 690 public: 691 inline SystemStatusPowerConnectState(bool state=false) : 692 PowerConnectStateDataItemBase(state) {} SystemStatusPowerConnectState(const PowerConnectStateDataItemBase & itemBase)693 inline SystemStatusPowerConnectState(const PowerConnectStateDataItemBase& itemBase) : 694 PowerConnectStateDataItemBase(itemBase) {} equals(const SystemStatusPowerConnectState & peer)695 inline bool equals(const SystemStatusPowerConnectState& peer) { 696 return (mState == peer.mState); 697 } 698 }; 699 700 class SystemStatusTimeZoneChange : public SystemStatusItemBase, 701 public TimeZoneChangeDataItemBase 702 { 703 public: 704 inline SystemStatusTimeZoneChange( 705 int64_t currTimeMillis=0ULL, int32_t rawOffset=0, int32_t dstOffset=0) : 706 TimeZoneChangeDataItemBase(currTimeMillis, rawOffset, dstOffset) {} SystemStatusTimeZoneChange(const TimeZoneChangeDataItemBase & itemBase)707 inline SystemStatusTimeZoneChange(const TimeZoneChangeDataItemBase& itemBase) : 708 TimeZoneChangeDataItemBase(itemBase) {} equals(const SystemStatusTimeZoneChange & peer)709 inline bool equals(const SystemStatusTimeZoneChange& peer) { 710 return ((mCurrTimeMillis == peer.mCurrTimeMillis) && 711 (mRawOffsetTZ == peer.mRawOffsetTZ) && 712 (mDstOffsetTZ == peer.mDstOffsetTZ)); 713 } 714 }; 715 716 class SystemStatusTimeChange : public SystemStatusItemBase, 717 public TimeChangeDataItemBase 718 { 719 public: 720 inline SystemStatusTimeChange( 721 int64_t currTimeMillis=0ULL, int32_t rawOffset=0, int32_t dstOffset=0) : 722 TimeChangeDataItemBase(currTimeMillis, rawOffset, dstOffset) {} SystemStatusTimeChange(const TimeChangeDataItemBase & itemBase)723 inline SystemStatusTimeChange(const TimeChangeDataItemBase& itemBase) : 724 TimeChangeDataItemBase(itemBase) {} equals(const SystemStatusTimeChange & peer)725 inline bool equals(const SystemStatusTimeChange& peer) { 726 return ((mCurrTimeMillis == peer.mCurrTimeMillis) && 727 (mRawOffsetTZ == peer.mRawOffsetTZ) && 728 (mDstOffsetTZ == peer.mDstOffsetTZ)); 729 } 730 }; 731 732 class SystemStatusWifiSupplicantStatus : public SystemStatusItemBase, 733 public WifiSupplicantStatusDataItemBase 734 { 735 public: SystemStatusWifiSupplicantStatus()736 inline SystemStatusWifiSupplicantStatus() : 737 WifiSupplicantStatusDataItemBase() {} SystemStatusWifiSupplicantStatus(const WifiSupplicantStatusDataItemBase & itemBase)738 inline SystemStatusWifiSupplicantStatus(const WifiSupplicantStatusDataItemBase& itemBase) : 739 WifiSupplicantStatusDataItemBase(itemBase) {} equals(const SystemStatusWifiSupplicantStatus & peer)740 inline bool equals(const SystemStatusWifiSupplicantStatus& peer) { 741 return ((mState == peer.mState) && 742 (mApMacAddressValid == peer.mApMacAddressValid) && 743 (mWifiApSsidValid == peer.mWifiApSsidValid) && 744 (mWifiApSsid == peer.mWifiApSsid)); 745 } 746 }; 747 748 class SystemStatusShutdownState : public SystemStatusItemBase, 749 public ShutdownStateDataItemBase 750 { 751 public: 752 inline SystemStatusShutdownState(bool state=false) : 753 ShutdownStateDataItemBase(state) {} SystemStatusShutdownState(const ShutdownStateDataItemBase & itemBase)754 inline SystemStatusShutdownState(const ShutdownStateDataItemBase& itemBase) : 755 ShutdownStateDataItemBase(itemBase) {} equals(const SystemStatusShutdownState & peer)756 inline bool equals(const SystemStatusShutdownState& peer) { 757 return (mState == peer.mState); 758 } 759 }; 760 761 class SystemStatusTac : public SystemStatusItemBase, 762 public TacDataItemBase 763 { 764 public: 765 inline SystemStatusTac(std::string value="") : 766 TacDataItemBase(value) {} SystemStatusTac(const TacDataItemBase & itemBase)767 inline SystemStatusTac(const TacDataItemBase& itemBase) : 768 TacDataItemBase(itemBase) {} equals(const SystemStatusTac & peer)769 inline bool equals(const SystemStatusTac& peer) { 770 return (mValue == peer.mValue); 771 } dump(void)772 inline void dump(void) override { 773 LOC_LOGD("Tac: value=%s", mValue.c_str()); 774 } 775 }; 776 777 class SystemStatusMccMnc : public SystemStatusItemBase, 778 public MccmncDataItemBase 779 { 780 public: 781 inline SystemStatusMccMnc(std::string value="") : 782 MccmncDataItemBase(value) {} SystemStatusMccMnc(const MccmncDataItemBase & itemBase)783 inline SystemStatusMccMnc(const MccmncDataItemBase& itemBase) : 784 MccmncDataItemBase(itemBase) {} equals(const SystemStatusMccMnc & peer)785 inline bool equals(const SystemStatusMccMnc& peer) { 786 return (mValue == peer.mValue); 787 } dump(void)788 inline void dump(void) override { 789 LOC_LOGD("TacMccMnc value=%s", mValue.c_str()); 790 } 791 }; 792 793 class SystemStatusBtDeviceScanDetail : public SystemStatusItemBase, 794 public BtDeviceScanDetailsDataItemBase 795 { 796 public: SystemStatusBtDeviceScanDetail()797 inline SystemStatusBtDeviceScanDetail() : 798 BtDeviceScanDetailsDataItemBase() {} SystemStatusBtDeviceScanDetail(const BtDeviceScanDetailsDataItemBase & itemBase)799 inline SystemStatusBtDeviceScanDetail(const BtDeviceScanDetailsDataItemBase& itemBase) : 800 BtDeviceScanDetailsDataItemBase(itemBase) {} equals(const SystemStatusBtDeviceScanDetail & peer)801 inline bool equals(const SystemStatusBtDeviceScanDetail& peer) { 802 return ((mApSrnRssi == peer.mApSrnRssi) && 803 (0 == memcmp(mApSrnMacAddress, peer.mApSrnMacAddress, sizeof(mApSrnMacAddress))) && 804 (mApSrnTimestamp == peer.mApSrnTimestamp) && 805 (mRequestTimestamp == peer.mRequestTimestamp) && 806 (mReceiveTimestamp == peer.mReceiveTimestamp)); 807 } 808 }; 809 810 class SystemStatusBtleDeviceScanDetail : public SystemStatusItemBase, 811 public BtLeDeviceScanDetailsDataItemBase 812 { 813 public: SystemStatusBtleDeviceScanDetail()814 inline SystemStatusBtleDeviceScanDetail() : 815 BtLeDeviceScanDetailsDataItemBase() {} SystemStatusBtleDeviceScanDetail(const BtLeDeviceScanDetailsDataItemBase & itemBase)816 inline SystemStatusBtleDeviceScanDetail(const BtLeDeviceScanDetailsDataItemBase& itemBase) : 817 BtLeDeviceScanDetailsDataItemBase(itemBase) {} equals(const SystemStatusBtleDeviceScanDetail & peer)818 inline bool equals(const SystemStatusBtleDeviceScanDetail& peer) { 819 return ((mApSrnRssi == peer.mApSrnRssi) && 820 (0 == memcmp(mApSrnMacAddress, peer.mApSrnMacAddress, sizeof(mApSrnMacAddress))) && 821 (mApSrnTimestamp == peer.mApSrnTimestamp) && 822 (mRequestTimestamp == peer.mRequestTimestamp) && 823 (mReceiveTimestamp == peer.mReceiveTimestamp)); 824 } 825 }; 826 827 /****************************************************************************** 828 SystemStatusReports 829 ******************************************************************************/ 830 class SystemStatusReports 831 { 832 public: 833 // from QMI_LOC indication 834 std::vector<SystemStatusLocation> mLocation; 835 836 // from ME debug NMEA 837 std::vector<SystemStatusTimeAndClock> mTimeAndClock; 838 std::vector<SystemStatusXoState> mXoState; 839 std::vector<SystemStatusRfAndParams> mRfAndParams; 840 std::vector<SystemStatusErrRecovery> mErrRecovery; 841 842 // from PE debug NMEA 843 std::vector<SystemStatusInjectedPosition> mInjectedPosition; 844 std::vector<SystemStatusBestPosition> mBestPosition; 845 std::vector<SystemStatusXtra> mXtra; 846 std::vector<SystemStatusEphemeris> mEphemeris; 847 std::vector<SystemStatusSvHealth> mSvHealth; 848 std::vector<SystemStatusPdr> mPdr; 849 std::vector<SystemStatusNavData> mNavData; 850 851 // from SM debug NMEA 852 std::vector<SystemStatusPositionFailure> mPositionFailure; 853 854 // from dataitems observer 855 std::vector<SystemStatusAirplaneMode> mAirplaneMode; 856 std::vector<SystemStatusENH> mENH; 857 std::vector<SystemStatusGpsState> mGPSState; 858 std::vector<SystemStatusNLPStatus> mNLPStatus; 859 std::vector<SystemStatusWifiHardwareState> mWifiHardwareState; 860 std::vector<SystemStatusNetworkInfo> mNetworkInfo; 861 std::vector<SystemStatusServiceInfo> mRilServiceInfo; 862 std::vector<SystemStatusRilCellInfo> mRilCellInfo; 863 std::vector<SystemStatusServiceStatus> mServiceStatus; 864 std::vector<SystemStatusModel> mModel; 865 std::vector<SystemStatusManufacturer> mManufacturer; 866 std::vector<SystemStatusAssistedGps> mAssistedGps; 867 std::vector<SystemStatusScreenState> mScreenState; 868 std::vector<SystemStatusPowerConnectState> mPowerConnectState; 869 std::vector<SystemStatusTimeZoneChange> mTimeZoneChange; 870 std::vector<SystemStatusTimeChange> mTimeChange; 871 std::vector<SystemStatusWifiSupplicantStatus> mWifiSupplicantStatus; 872 std::vector<SystemStatusShutdownState> mShutdownState; 873 std::vector<SystemStatusTac> mTac; 874 std::vector<SystemStatusMccMnc> mMccMnc; 875 std::vector<SystemStatusBtDeviceScanDetail> mBtDeviceScanDetail; 876 std::vector<SystemStatusBtleDeviceScanDetail> mBtLeDeviceScanDetail; 877 }; 878 879 /****************************************************************************** 880 SystemStatus 881 ******************************************************************************/ 882 class SystemStatus 883 { 884 private: 885 static SystemStatus *mInstance; 886 SystemStatusOsObserver mSysStatusObsvr; 887 // ctor 888 SystemStatus(const MsgTask* msgTask); 889 // dtor ~SystemStatus()890 inline ~SystemStatus() {} 891 892 // Data members 893 static pthread_mutex_t mMutexSystemStatus; 894 SystemStatusReports mCache; 895 896 template <typename TYPE_REPORT, typename TYPE_ITEM> 897 bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s); 898 899 // set default dataitem derived item in report cache 900 template <typename TYPE_REPORT, typename TYPE_ITEM> 901 void setDefaultIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s); 902 903 template <typename TYPE_REPORT, typename TYPE_ITEM> 904 void getIteminReport(TYPE_REPORT& reportout, const TYPE_ITEM& c) const; 905 906 public: 907 // Static methods 908 static SystemStatus* getInstance(const MsgTask* msgTask); 909 static void destroyInstance(); 910 IOsObserver* getOsObserver(); 911 912 // Helpers 913 bool eventPosition(const UlpLocation& location,const GpsLocationExtended& locationEx); 914 bool eventDataItemNotify(IDataItemCore* dataitem); 915 bool setNmeaString(const char *data, uint32_t len); 916 bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const; 917 bool setDefaultGnssEngineStates(void); 918 bool eventConnectionStatus(bool connected, int8_t type, 919 bool roaming, NetworkHandle networkHandle, string& apn); 920 bool updatePowerConnectState(bool charging); 921 void resetNetworkInfo(); 922 }; 923 924 } // namespace loc_core 925 926 #endif //__SYSTEM_STATUS__ 927 928