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