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