SystemStatus.h 36 KB

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