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 #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) :
AirplaneModeDataItemBase(mode)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) :
ENHDataItemBase(enabled)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) :
GPSStateDataItemBase(enabled)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) :
NLPStatusDataItemBase(enabled)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) :
WifiHardwareStateDataItemBase(enabled)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 rtv && !peer.mApn.compare(mApn);
513     }
collate(SystemStatusItemBase & curInfo)514     inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) {
515         LOC_LOGv("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x mApn=%s",
516                  mAllTypes, mConnected, mType, mApn.c_str());
517         uint64_t allTypes = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mAllTypes;
518         string& apn = (static_cast<SystemStatusNetworkInfo&>(curInfo)).mApn;
519         // Replace current with cached table for now and then update
520         memcpy(mAllNetworkHandles,
521                (static_cast<SystemStatusNetworkInfo&>(curInfo)).getNetworkHandle(),
522                sizeof(mAllNetworkHandles));
523 
524         // Update the apn for non-mobile type connections.
525         if (TYPE_MOBILE != mType && apn.compare("") != 0) {
526             mApn = apn;
527         }
528         if (mConnected) {
529             mAllTypes |= allTypes;
530             for (uint8_t i = 0; i < MAX_NETWORK_HANDLES; ++i) {
531             LOC_LOGd("NetworkInfo: mNetworkHandle[%u]: networkHandle %" PRIx64 ",  networkType %x", i, mAllNetworkHandles[i].networkHandle,
532                     mAllNetworkHandles[i].networkType);
533                 if (mNetworkHandle == mAllNetworkHandles[i].networkHandle) {
534                     LOC_LOGD("collate duplicate detected, not updating");
535                     break;
536                 }
537                 if (NETWORK_HANDLE_UNKNOWN == mAllNetworkHandles[i].networkHandle) {
538                     mAllNetworkHandles[i].networkHandle = mNetworkHandle;
539                     mAllNetworkHandles[i].networkType = (loc_core::NetworkType) mType;
540                     break;
541                 }
542             }
543         } else if (0 != mAllTypes) {
544             uint8_t deletedIndex = MAX_NETWORK_HANDLES;
545             uint8_t lastValidIndex = 0;
546             uint8_t typeCount = 0;
547             for (; lastValidIndex < MAX_NETWORK_HANDLES &&
548                      NETWORK_HANDLE_UNKNOWN != mAllNetworkHandles[lastValidIndex].networkHandle;
549                  ++lastValidIndex) {
550                 // Maintain count for number of network handles still
551                 // connected for given type
552                 if (mType == (int32_t)mAllNetworkHandles[lastValidIndex].networkType) {
553                     if (mNetworkHandle == mAllNetworkHandles[lastValidIndex].networkHandle) {
554                         deletedIndex = lastValidIndex;
555                     } else {
556                         typeCount++;
557                     }
558                 }
559 
560             }
561             if (lastValidIndex > 0) {
562                 --lastValidIndex;
563             }
564 
565             if (MAX_NETWORK_HANDLES != deletedIndex) {
566                 LOC_LOGd("deletedIndex:%u, lastValidIndex:%u, typeCount:%u",
567                         deletedIndex, lastValidIndex, typeCount);
568                 mAllNetworkHandles[deletedIndex] = mAllNetworkHandles[lastValidIndex];
569                 mAllNetworkHandles[lastValidIndex].networkHandle = NETWORK_HANDLE_UNKNOWN;
570                 mAllNetworkHandles[lastValidIndex].networkType = TYPE_UNKNOWN;
571             }
572 
573             // If no more handles of given type, set bitmask
574             if (0 == typeCount) {
575                 mAllTypes = (allTypes & (~mAllTypes));
576                 LOC_LOGD("mAllTypes:%" PRIx64, mAllTypes);
577             }
578         } // else (mConnected == false && mAllTypes == 0)
579           // we keep mAllTypes as 0, which means no more connections.
580 
581         if (nullptr != mSrcObjPtr) {
582             // this is critical, changing mAllTypes of the original obj
583             mSrcObjPtr->mAllTypes = mAllTypes;
584             memcpy(mSrcObjPtr->mAllNetworkHandles,
585                    mAllNetworkHandles,
586                    sizeof(mSrcObjPtr->mAllNetworkHandles));
587         }
588         return *this;
589     }
dump(void)590     inline void dump(void) override {
591         LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x mApn=%s",
592                  mAllTypes, mConnected, mType, mApn.c_str());
593     }
594 };
595 
596 class SystemStatusServiceInfo : public SystemStatusItemBase,
597         public RilServiceInfoDataItemBase
598 {
599 public:
SystemStatusServiceInfo()600     inline SystemStatusServiceInfo() :
601             RilServiceInfoDataItemBase() {}
SystemStatusServiceInfo(const RilServiceInfoDataItemBase & itemBase)602     inline SystemStatusServiceInfo(const RilServiceInfoDataItemBase& itemBase) :
603             RilServiceInfoDataItemBase(itemBase) {}
equals(const SystemStatusServiceInfo & peer)604     inline bool equals(const SystemStatusServiceInfo& peer) {
605         return static_cast<const RilServiceInfoDataItemBase&>(peer) ==
606                 static_cast<const RilServiceInfoDataItemBase&>(*this);
607     }
608 };
609 
610 class SystemStatusRilCellInfo : public SystemStatusItemBase,
611         public RilCellInfoDataItemBase
612 {
613 public:
SystemStatusRilCellInfo()614     inline SystemStatusRilCellInfo() :
615             RilCellInfoDataItemBase() {}
SystemStatusRilCellInfo(const RilCellInfoDataItemBase & itemBase)616     inline SystemStatusRilCellInfo(const RilCellInfoDataItemBase& itemBase) :
617             RilCellInfoDataItemBase(itemBase) {}
equals(const SystemStatusRilCellInfo & peer)618     inline bool equals(const SystemStatusRilCellInfo& peer) {
619         return static_cast<const RilCellInfoDataItemBase&>(peer) ==
620                 static_cast<const RilCellInfoDataItemBase&>(*this);
621     }
622 };
623 
624 class SystemStatusServiceStatus : public SystemStatusItemBase,
625         public ServiceStatusDataItemBase
626 {
627 public:
628     inline SystemStatusServiceStatus(int32_t mServiceState=0) :
ServiceStatusDataItemBase(mServiceState)629             ServiceStatusDataItemBase(mServiceState) {}
SystemStatusServiceStatus(const ServiceStatusDataItemBase & itemBase)630     inline SystemStatusServiceStatus(const ServiceStatusDataItemBase& itemBase) :
631             ServiceStatusDataItemBase(itemBase) {}
equals(const SystemStatusServiceStatus & peer)632     inline bool equals(const SystemStatusServiceStatus& peer) {
633         return (mServiceState == peer.mServiceState);
634     }
635 };
636 
637 class SystemStatusModel : public SystemStatusItemBase,
638         public ModelDataItemBase
639 {
640 public:
641     inline SystemStatusModel(string name="") :
ModelDataItemBase(name)642             ModelDataItemBase(name) {}
SystemStatusModel(const ModelDataItemBase & itemBase)643     inline SystemStatusModel(const ModelDataItemBase& itemBase) :
644             ModelDataItemBase(itemBase) {}
equals(const SystemStatusModel & peer)645     inline bool equals(const SystemStatusModel& peer) {
646         return (mModel == peer.mModel);
647         }
648 };
649 
650 class SystemStatusManufacturer : public SystemStatusItemBase,
651         public ManufacturerDataItemBase
652 {
653 public:
654     inline SystemStatusManufacturer(string name="") :
ManufacturerDataItemBase(name)655             ManufacturerDataItemBase(name) {}
SystemStatusManufacturer(const ManufacturerDataItemBase & itemBase)656     inline SystemStatusManufacturer(const ManufacturerDataItemBase& itemBase) :
657             ManufacturerDataItemBase(itemBase) {}
equals(const SystemStatusManufacturer & peer)658     inline bool equals(const SystemStatusManufacturer& peer) {
659         return (mManufacturer == peer.mManufacturer);
660     }
661 };
662 
663 class SystemStatusAssistedGps : public SystemStatusItemBase,
664         public AssistedGpsDataItemBase
665 {
666 public:
667     inline SystemStatusAssistedGps(bool enabled=false) :
AssistedGpsDataItemBase(enabled)668             AssistedGpsDataItemBase(enabled) {}
SystemStatusAssistedGps(const AssistedGpsDataItemBase & itemBase)669     inline SystemStatusAssistedGps(const AssistedGpsDataItemBase& itemBase) :
670             AssistedGpsDataItemBase(itemBase) {}
equals(const SystemStatusAssistedGps & peer)671     inline bool equals(const SystemStatusAssistedGps& peer) {
672         return (mEnabled == peer.mEnabled);
673     }
674 };
675 
676 class SystemStatusScreenState : public SystemStatusItemBase,
677         public ScreenStateDataItemBase
678 {
679 public:
680     inline SystemStatusScreenState(bool state=false) :
ScreenStateDataItemBase(state)681             ScreenStateDataItemBase(state) {}
SystemStatusScreenState(const ScreenStateDataItemBase & itemBase)682     inline SystemStatusScreenState(const ScreenStateDataItemBase& itemBase) :
683             ScreenStateDataItemBase(itemBase) {}
equals(const SystemStatusScreenState & peer)684     inline bool equals(const SystemStatusScreenState& peer) {
685         return (mState == peer.mState);
686     }
687 };
688 
689 class SystemStatusPowerConnectState : public SystemStatusItemBase,
690         public PowerConnectStateDataItemBase
691 {
692 public:
693     inline SystemStatusPowerConnectState(bool state=false) :
PowerConnectStateDataItemBase(state)694             PowerConnectStateDataItemBase(state) {}
SystemStatusPowerConnectState(const PowerConnectStateDataItemBase & itemBase)695     inline SystemStatusPowerConnectState(const PowerConnectStateDataItemBase& itemBase) :
696             PowerConnectStateDataItemBase(itemBase) {}
equals(const SystemStatusPowerConnectState & peer)697     inline bool equals(const SystemStatusPowerConnectState& peer) {
698         return (mState == peer.mState);
699     }
700 };
701 
702 class SystemStatusTimeZoneChange : public SystemStatusItemBase,
703         public TimeZoneChangeDataItemBase
704 {
705 public:
706     inline SystemStatusTimeZoneChange(
707             int64_t currTimeMillis=0ULL, int32_t rawOffset=0, int32_t dstOffset=0) :
TimeZoneChangeDataItemBase(currTimeMillis,rawOffset,dstOffset)708             TimeZoneChangeDataItemBase(currTimeMillis, rawOffset, dstOffset) {}
SystemStatusTimeZoneChange(const TimeZoneChangeDataItemBase & itemBase)709     inline SystemStatusTimeZoneChange(const TimeZoneChangeDataItemBase& itemBase) :
710             TimeZoneChangeDataItemBase(itemBase) {}
equals(const SystemStatusTimeZoneChange & peer)711     inline bool equals(const SystemStatusTimeZoneChange& peer) {
712         return ((mCurrTimeMillis == peer.mCurrTimeMillis) &&
713                 (mRawOffsetTZ == peer.mRawOffsetTZ) &&
714                 (mDstOffsetTZ == peer.mDstOffsetTZ));
715     }
716 };
717 
718 class SystemStatusTimeChange : public SystemStatusItemBase,
719         public TimeChangeDataItemBase
720 {
721 public:
722     inline SystemStatusTimeChange(
723             int64_t currTimeMillis=0ULL, int32_t rawOffset=0, int32_t dstOffset=0) :
TimeChangeDataItemBase(currTimeMillis,rawOffset,dstOffset)724             TimeChangeDataItemBase(currTimeMillis, rawOffset, dstOffset) {}
SystemStatusTimeChange(const TimeChangeDataItemBase & itemBase)725     inline SystemStatusTimeChange(const TimeChangeDataItemBase& itemBase) :
726             TimeChangeDataItemBase(itemBase) {}
equals(const SystemStatusTimeChange & peer)727     inline bool equals(const SystemStatusTimeChange& peer) {
728         return ((mCurrTimeMillis == peer.mCurrTimeMillis) &&
729                 (mRawOffsetTZ == peer.mRawOffsetTZ) &&
730                 (mDstOffsetTZ == peer.mDstOffsetTZ));
731     }
732 };
733 
734 class SystemStatusWifiSupplicantStatus : public SystemStatusItemBase,
735         public WifiSupplicantStatusDataItemBase
736 {
737 public:
SystemStatusWifiSupplicantStatus()738     inline SystemStatusWifiSupplicantStatus() :
739             WifiSupplicantStatusDataItemBase() {}
SystemStatusWifiSupplicantStatus(const WifiSupplicantStatusDataItemBase & itemBase)740     inline SystemStatusWifiSupplicantStatus(const WifiSupplicantStatusDataItemBase& itemBase) :
741             WifiSupplicantStatusDataItemBase(itemBase) {}
equals(const SystemStatusWifiSupplicantStatus & peer)742     inline bool equals(const SystemStatusWifiSupplicantStatus& peer) {
743         return ((mState == peer.mState) &&
744                 (mApMacAddressValid == peer.mApMacAddressValid) &&
745                 (mWifiApSsidValid == peer.mWifiApSsidValid) &&
746                 (mWifiApSsid == peer.mWifiApSsid));
747         }
748 };
749 
750 class SystemStatusShutdownState : public SystemStatusItemBase,
751         public ShutdownStateDataItemBase
752 {
753 public:
754     inline SystemStatusShutdownState(bool state=false) :
ShutdownStateDataItemBase(state)755             ShutdownStateDataItemBase(state) {}
SystemStatusShutdownState(const ShutdownStateDataItemBase & itemBase)756     inline SystemStatusShutdownState(const ShutdownStateDataItemBase& itemBase) :
757             ShutdownStateDataItemBase(itemBase) {}
equals(const SystemStatusShutdownState & peer)758     inline bool equals(const SystemStatusShutdownState& peer) {
759         return (mState == peer.mState);
760     }
761 };
762 
763 class SystemStatusTac : public SystemStatusItemBase,
764         public TacDataItemBase
765 {
766 public:
767     inline SystemStatusTac(std::string value="") :
TacDataItemBase(value)768             TacDataItemBase(value) {}
SystemStatusTac(const TacDataItemBase & itemBase)769     inline SystemStatusTac(const TacDataItemBase& itemBase) :
770             TacDataItemBase(itemBase) {}
equals(const SystemStatusTac & peer)771     inline bool equals(const SystemStatusTac& peer) {
772         return (mValue == peer.mValue);
773     }
dump(void)774     inline void dump(void) override {
775         LOC_LOGD("Tac: value=%s", mValue.c_str());
776     }
777 };
778 
779 class SystemStatusMccMnc : public SystemStatusItemBase,
780         public MccmncDataItemBase
781 {
782 public:
783     inline SystemStatusMccMnc(std::string value="") :
MccmncDataItemBase(value)784             MccmncDataItemBase(value) {}
SystemStatusMccMnc(const MccmncDataItemBase & itemBase)785     inline SystemStatusMccMnc(const MccmncDataItemBase& itemBase) :
786             MccmncDataItemBase(itemBase) {}
equals(const SystemStatusMccMnc & peer)787     inline bool equals(const SystemStatusMccMnc& peer) {
788         return (mValue == peer.mValue);
789     }
dump(void)790     inline void dump(void) override {
791         LOC_LOGD("TacMccMnc value=%s", mValue.c_str());
792     }
793 };
794 
795 class SystemStatusBtDeviceScanDetail : public SystemStatusItemBase,
796         public BtDeviceScanDetailsDataItemBase
797 {
798 public:
SystemStatusBtDeviceScanDetail()799     inline SystemStatusBtDeviceScanDetail() :
800             BtDeviceScanDetailsDataItemBase() {}
SystemStatusBtDeviceScanDetail(const BtDeviceScanDetailsDataItemBase & itemBase)801     inline SystemStatusBtDeviceScanDetail(const BtDeviceScanDetailsDataItemBase& itemBase) :
802             BtDeviceScanDetailsDataItemBase(itemBase) {}
equals(const SystemStatusBtDeviceScanDetail & peer)803     inline bool equals(const SystemStatusBtDeviceScanDetail& peer) {
804         return ((mApSrnRssi == peer.mApSrnRssi) &&
805                 (0 == memcmp(mApSrnMacAddress, peer.mApSrnMacAddress, sizeof(mApSrnMacAddress))) &&
806                 (mApSrnTimestamp == peer.mApSrnTimestamp) &&
807                 (mRequestTimestamp == peer.mRequestTimestamp) &&
808                 (mReceiveTimestamp == peer.mReceiveTimestamp));
809     }
810 };
811 
812 class SystemStatusBtleDeviceScanDetail : public SystemStatusItemBase,
813         public BtLeDeviceScanDetailsDataItemBase
814 {
815 public:
SystemStatusBtleDeviceScanDetail()816     inline SystemStatusBtleDeviceScanDetail() :
817             BtLeDeviceScanDetailsDataItemBase() {}
SystemStatusBtleDeviceScanDetail(const BtLeDeviceScanDetailsDataItemBase & itemBase)818     inline SystemStatusBtleDeviceScanDetail(const BtLeDeviceScanDetailsDataItemBase& itemBase) :
819             BtLeDeviceScanDetailsDataItemBase(itemBase) {}
equals(const SystemStatusBtleDeviceScanDetail & peer)820     inline bool equals(const SystemStatusBtleDeviceScanDetail& peer) {
821         return ((mApSrnRssi == peer.mApSrnRssi) &&
822                 (0 == memcmp(mApSrnMacAddress, peer.mApSrnMacAddress, sizeof(mApSrnMacAddress))) &&
823                 (mApSrnTimestamp == peer.mApSrnTimestamp) &&
824                 (mRequestTimestamp == peer.mRequestTimestamp) &&
825                 (mReceiveTimestamp == peer.mReceiveTimestamp));
826     }
827 };
828 
829 /******************************************************************************
830  SystemStatusReports
831 ******************************************************************************/
832 class SystemStatusReports
833 {
834 public:
835     // from QMI_LOC indication
836     std::vector<SystemStatusLocation>         mLocation;
837 
838     // from ME debug NMEA
839     std::vector<SystemStatusTimeAndClock>     mTimeAndClock;
840     std::vector<SystemStatusXoState>          mXoState;
841     std::vector<SystemStatusRfAndParams>      mRfAndParams;
842     std::vector<SystemStatusErrRecovery>      mErrRecovery;
843 
844     // from PE debug NMEA
845     std::vector<SystemStatusInjectedPosition> mInjectedPosition;
846     std::vector<SystemStatusBestPosition>     mBestPosition;
847     std::vector<SystemStatusXtra>             mXtra;
848     std::vector<SystemStatusEphemeris>        mEphemeris;
849     std::vector<SystemStatusSvHealth>         mSvHealth;
850     std::vector<SystemStatusPdr>              mPdr;
851     std::vector<SystemStatusNavData>          mNavData;
852 
853     // from SM debug NMEA
854     std::vector<SystemStatusPositionFailure>  mPositionFailure;
855 
856     // from dataitems observer
857     std::vector<SystemStatusAirplaneMode>     mAirplaneMode;
858     std::vector<SystemStatusENH>              mENH;
859     std::vector<SystemStatusGpsState>         mGPSState;
860     std::vector<SystemStatusNLPStatus>        mNLPStatus;
861     std::vector<SystemStatusWifiHardwareState> mWifiHardwareState;
862     std::vector<SystemStatusNetworkInfo>      mNetworkInfo;
863     std::vector<SystemStatusServiceInfo>      mRilServiceInfo;
864     std::vector<SystemStatusRilCellInfo>      mRilCellInfo;
865     std::vector<SystemStatusServiceStatus>    mServiceStatus;
866     std::vector<SystemStatusModel>            mModel;
867     std::vector<SystemStatusManufacturer>     mManufacturer;
868     std::vector<SystemStatusAssistedGps>      mAssistedGps;
869     std::vector<SystemStatusScreenState>      mScreenState;
870     std::vector<SystemStatusPowerConnectState> mPowerConnectState;
871     std::vector<SystemStatusTimeZoneChange>   mTimeZoneChange;
872     std::vector<SystemStatusTimeChange>       mTimeChange;
873     std::vector<SystemStatusWifiSupplicantStatus> mWifiSupplicantStatus;
874     std::vector<SystemStatusShutdownState>    mShutdownState;
875     std::vector<SystemStatusTac>              mTac;
876     std::vector<SystemStatusMccMnc>           mMccMnc;
877     std::vector<SystemStatusBtDeviceScanDetail> mBtDeviceScanDetail;
878     std::vector<SystemStatusBtleDeviceScanDetail> mBtLeDeviceScanDetail;
879 };
880 
881 /******************************************************************************
882  SystemStatus
883 ******************************************************************************/
884 class SystemStatus
885 {
886 private:
887     static SystemStatus                       *mInstance;
888     SystemStatusOsObserver                    mSysStatusObsvr;
889     // ctor
890     SystemStatus(const MsgTask* msgTask);
891     // dtor
~SystemStatus()892     inline ~SystemStatus() {}
893 
894     // Data members
895     static pthread_mutex_t                    mMutexSystemStatus;
896     SystemStatusReports mCache;
897 
898     template <typename TYPE_REPORT, typename TYPE_ITEM>
899     bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s);
900 
901     // set default dataitem derived item in report cache
902     template <typename TYPE_REPORT, typename TYPE_ITEM>
903     void setDefaultIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s);
904 
905     template <typename TYPE_REPORT, typename TYPE_ITEM>
906     void getIteminReport(TYPE_REPORT& reportout, const TYPE_ITEM& c) const;
907 
908 public:
909     // Static methods
910     static SystemStatus* getInstance(const MsgTask* msgTask);
911     static void destroyInstance();
912     IOsObserver* getOsObserver();
913 
914     // Helpers
915     bool eventPosition(const UlpLocation& location,const GpsLocationExtended& locationEx);
916     bool eventDataItemNotify(IDataItemCore* dataitem);
917     bool setNmeaString(const char *data, uint32_t len);
918     bool getReport(SystemStatusReports& reports, bool isLatestonly = false) const;
919     bool setDefaultGnssEngineStates(void);
920     bool eventConnectionStatus(bool connected, int8_t type,
921                                bool roaming, NetworkHandle networkHandle, string& apn);
922     bool updatePowerConnectState(bool charging);
923     void resetNetworkInfo();
924 };
925 
926 } // namespace loc_core
927 
928 #endif //__SYSTEM_STATUS__
929 
930