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