From 533f43e690fd5faef877ba572ef4702f74a18c7b Mon Sep 17 00:00:00 2001 From: Kevin Tang Date: Mon, 9 Apr 2018 14:32:28 -0700 Subject: [PATCH] Fixed a number of issues with NetworkInfoDataItemBase There are a couple of issues. NetworkInfoDataItemBase objects might be from OsAgent or GnssLocationProvider. The two sources actually have mTypes defined differently. In addtion, when there are different types of connections such as wifi / mobile, getting connected / disconnected independently, clients need to be all notified correctly. Right now, if mConnected hasn't changed, no updates are send. For exmple, if mobile is connected, later wifi gets connected too, clients won't know. SystemStatus is also updated to get updated / colated informtion. In the above example, SystemStatus's top record would record as both mobile and wifi are connected. Change-Id: I1825902247fe1d4e6363f5e24a75be7e984d0dc4 CRs-Fixed: 2221114 --- core/SystemStatus.cpp | 113 +++++++++----------- core/SystemStatus.h | 43 +++++--- core/data-items/DataItemConcreteTypesBase.h | 32 +++--- gnss/XtraSystemStatusObserver.cpp | 26 +---- gnss/XtraSystemStatusObserver.h | 10 +- 5 files changed, 107 insertions(+), 117 deletions(-) diff --git a/core/SystemStatus.cpp b/core/SystemStatus.cpp index e12d9f32..5d5c4b08 100644 --- a/core/SystemStatus.cpp +++ b/core/SystemStatus.cpp @@ -1250,8 +1250,7 @@ IOsObserver* SystemStatus::getOsObserver() } SystemStatus::SystemStatus(const MsgTask* msgTask) : - mSysStatusObsvr(this, msgTask), - mConnected(false) + mSysStatusObsvr(this, msgTask) { int result = 0; ENTRY_LOG (); @@ -1301,17 +1300,10 @@ SystemStatus::SystemStatus(const MsgTask* msgTask) : /****************************************************************************** SystemStatus - storing dataitems ******************************************************************************/ -template -bool SystemStatus::setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s) -{ - TYPE_SYSTEMSTATUS_ITEM sout(s); - return setIteminReport(report, sout); -} - template -bool SystemStatus::setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s) +bool SystemStatus::setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s) { - if (!report.empty() && report.back().equals(s)) { + if (!report.empty() && report.back().equals(static_cast(s.collate(report.back())))) { // there is no change - just update reported timestamp report.back().mUtcReported = s.mUtcReported; return false; @@ -1449,94 +1441,92 @@ bool SystemStatus::eventDataItemNotify(IDataItemCore* dataitem) switch(dataitem->getId()) { case AIRPLANEMODE_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mAirplaneMode, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mAirplaneMode, + SystemStatusAirplaneMode(*(static_cast(dataitem)))); break; case ENH_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mENH, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mENH, + SystemStatusENH(*(static_cast(dataitem)))); break; case GPSSTATE_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mGPSState, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mGPSState, + SystemStatusGpsState(*(static_cast(dataitem)))); break; case NLPSTATUS_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mNLPStatus, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mNLPStatus, + SystemStatusNLPStatus(*(static_cast(dataitem)))); break; case WIFIHARDWARESTATE_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mWifiHardwareState, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mWifiHardwareState, + SystemStatusWifiHardwareState(*(static_cast(dataitem)))); break; case NETWORKINFO_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mNetworkInfo, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mNetworkInfo, + SystemStatusNetworkInfo(*(static_cast(dataitem)))); break; case RILSERVICEINFO_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mRilServiceInfo, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mRilServiceInfo, + SystemStatusServiceInfo(*(static_cast(dataitem)))); break; case RILCELLINFO_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mRilCellInfo, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mRilCellInfo, + SystemStatusRilCellInfo(*(static_cast(dataitem)))); break; case SERVICESTATUS_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mServiceStatus, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mServiceStatus, + SystemStatusServiceStatus(*(static_cast(dataitem)))); break; case MODEL_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mModel, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mModel, + SystemStatusModel(*(static_cast(dataitem)))); break; case MANUFACTURER_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mManufacturer, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mManufacturer, + SystemStatusManufacturer(*(static_cast(dataitem)))); break; case ASSISTED_GPS_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mAssistedGps, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mAssistedGps, + SystemStatusAssistedGps(*(static_cast(dataitem)))); break; case SCREEN_STATE_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mScreenState, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mScreenState, + SystemStatusScreenState(*(static_cast(dataitem)))); break; case POWER_CONNECTED_STATE_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mPowerConnectState, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mPowerConnectState, + SystemStatusPowerConnectState(*(static_cast(dataitem)))); break; case TIMEZONE_CHANGE_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mTimeZoneChange, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mTimeZoneChange, + SystemStatusTimeZoneChange(*(static_cast(dataitem)))); break; case TIME_CHANGE_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mTimeChange, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mTimeChange, + SystemStatusTimeChange(*(static_cast(dataitem)))); break; case WIFI_SUPPLICANT_STATUS_DATA_ITEM_ID: - ret = setItemBaseinReport( - mCache.mWifiSupplicantStatus, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mWifiSupplicantStatus, + SystemStatusWifiSupplicantStatus(*(static_cast(dataitem)))); break; case SHUTDOWN_STATE_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mShutdownState, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mShutdownState, + SystemStatusShutdownState(*(static_cast(dataitem)))); break; case TAC_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mTac, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mTac, + SystemStatusTac(*(static_cast(dataitem)))); break; case MCCMNC_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mMccMnc, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mMccMnc, + SystemStatusMccMnc(*(static_cast(dataitem)))); break; case BTLE_SCAN_DATA_ITEM_ID: - ret = setItemBaseinReport(mCache.mBtDeviceScanDetail, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mBtDeviceScanDetail, + SystemStatusBtDeviceScanDetail(*(static_cast(dataitem)))); break; case BT_SCAN_DATA_ITEM_ID: - ret = setItemBaseinReport( - mCache.mBtLeDeviceScanDetail, - *(static_cast(dataitem))); + ret = setIteminReport(mCache.mBtLeDeviceScanDetail, + SystemStatusBtleDeviceScanDetail(*(static_cast(dataitem)))); break; default: break; @@ -1689,13 +1679,10 @@ bool SystemStatus::setDefaultGnssEngineStates(void) ******************************************************************************/ bool SystemStatus::eventConnectionStatus(bool connected, int8_t type) { - if (connected != mConnected) { - mConnected = connected; + // send networkinof dataitem to systemstatus observer clients + SystemStatusNetworkInfo s(type, "", "", false, connected, false); + mSysStatusObsvr.notify({&s}); - // send networkinof dataitem to systemstatus observer clients - SystemStatusNetworkInfo s(type, "", "", false, connected, false); - mSysStatusObsvr.notify({&s}); - } return true; } diff --git a/core/SystemStatus.h b/core/SystemStatus.h index 9500264d..1c3adc84 100644 --- a/core/SystemStatus.h +++ b/core/SystemStatus.h @@ -77,8 +77,11 @@ public: mUtcTime.tv_nsec = tv.tv_nsec; mUtcReported = mUtcTime; }; - virtual ~SystemStatusItemBase() { }; - virtual void dump(void) { }; + virtual ~SystemStatusItemBase() {}; + inline virtual SystemStatusItemBase& collate(SystemStatusItemBase&) { + return *this; + } + virtual void dump(void) {}; }; class SystemStatusLocation : public SystemStatusItemBase @@ -93,7 +96,7 @@ public: const GpsLocationExtended& locationEx) : mValid(true), mLocation(location), - mLocationEx(locationEx) { } + mLocationEx(locationEx) {} bool equals(const SystemStatusLocation& peer); void dump(void); }; @@ -457,6 +460,7 @@ public: class SystemStatusNetworkInfo : public SystemStatusItemBase, public NetworkInfoDataItemBase { + NetworkInfoDataItemBase* mSrcObjPtr; public: inline SystemStatusNetworkInfo( int32_t type=0, @@ -466,18 +470,21 @@ public: bool connected=false, bool roaming=false) : NetworkInfoDataItemBase( + (NetworkType)type, type, typeName, subTypeName, available, connected, - roaming) {} + roaming), + mSrcObjPtr(nullptr) {} inline SystemStatusNetworkInfo(const NetworkInfoDataItemBase& itemBase) : - NetworkInfoDataItemBase(itemBase) { + NetworkInfoDataItemBase(itemBase), + mSrcObjPtr((NetworkInfoDataItemBase*)&itemBase) { mType = itemBase.getType(); } inline bool equals(const SystemStatusNetworkInfo& peer) { - if ((mType == peer.mType) && + if ((mAllTypes == peer.mAllTypes) && (mTypeName == peer.mTypeName) && (mSubTypeName == peer.mSubTypeName) && (mAvailable == peer.mAvailable) && @@ -487,8 +494,24 @@ public: } return false; } + inline virtual SystemStatusItemBase& collate(SystemStatusItemBase& curInfo) { + uint64_t allTypes = (static_cast(curInfo)).mAllTypes; + if (mConnected) { + mAllTypes |= allTypes; + } else if (0 != mAllTypes) { + mAllTypes = (allTypes & (~mAllTypes)); + } // else (mConnected == false && mAllTypes == 0) + // we keep mAllTypes as 0, which means no more connections. + + if (nullptr != mSrcObjPtr) { + // this is critical, changing mAllTypes of the original obj + mSrcObjPtr->mAllTypes = mAllTypes; + } + return *this; + } inline void dump(void) override { - LOC_LOGD("NetworkInfo: type=%u connected=%u", mType, mConnected); + LOC_LOGD("NetworkInfo: mAllTypes=%" PRIx64 " connected=%u mType=%x", + mAllTypes, mConnected, mType); } }; @@ -783,13 +806,9 @@ private: // Data members static pthread_mutex_t mMutexSystemStatus; SystemStatusReports mCache; - bool mConnected; - - template - bool setItemBaseinReport(TYPE_REPORT& report, const TYPE_ITEMBASE& s); template - bool setIteminReport(TYPE_REPORT& report, const TYPE_ITEM& s); + bool setIteminReport(TYPE_REPORT& report, TYPE_ITEM&& s); // set default dataitem derived item in report cache template diff --git a/core/data-items/DataItemConcreteTypesBase.h b/core/data-items/DataItemConcreteTypesBase.h index fd744088..065366d3 100644 --- a/core/data-items/DataItemConcreteTypesBase.h +++ b/core/data-items/DataItemConcreteTypesBase.h @@ -221,9 +221,23 @@ protected: class NetworkInfoDataItemBase : public IDataItemCore { public: + enum NetworkType { + TYPE_MOBILE, + TYPE_WIFI, + TYPE_ETHERNET, + TYPE_BLUETOOTH, + TYPE_MMS, + TYPE_SUPL, + TYPE_DUN, + TYPE_HIPRI, + TYPE_WIMAX, + TYPE_UNKNOWN, + }; NetworkInfoDataItemBase( - int32_t type, string typeName, string subTypeName, + NetworkType initialType, int32_t type, string typeName, string subTypeName, bool available, bool connected, bool roaming ): + mAllTypes((initialType >= TYPE_UNKNOWN || initialType < TYPE_MOBILE) ? + 0 : (1<& dlist) { NetworkInfoDataItemBase* networkInfo = static_cast(each); - mXtraSysStatObj->updateConnectionStatus(networkInfo->mConnected, - networkInfo->mType); + mXtraSysStatObj->updateConnections(networkInfo->getAllTypes()); } break; diff --git a/gnss/XtraSystemStatusObserver.h b/gnss/XtraSystemStatusObserver.h index 31d80834..af0789b6 100644 --- a/gnss/XtraSystemStatusObserver.h +++ b/gnss/XtraSystemStatusObserver.h @@ -33,22 +33,20 @@ #include #include #include -#include using namespace std; using loc_core::IOsObserver; using loc_core::IDataItemObserver; using loc_core::IDataItemCore; using loc_util::LocIpc; -using CONNECTIONS = set; class XtraSystemStatusObserver : public IDataItemObserver, public LocIpc{ public : // constructor & destructor inline XtraSystemStatusObserver(IOsObserver* sysStatObs, const MsgTask* msgTask): mSystemStatusObsrvr(sysStatObs), mMsgTask(msgTask), - mGpsLock(-1), mXtraThrottle(true), mReqStatusReceived(false), - mIsConnectivityStatusKnown (false), mDelayLocTimer(*this) { + mGpsLock(-1), mConnections(0), mXtraThrottle(true), mReqStatusReceived(false), + mDelayLocTimer(*this), mIsConnectivityStatusKnown (false) { subscribe(true); startListeningNonBlocking(LOC_IPC_HAL); mDelayLocTimer.start(100 /*.1 sec*/, false); @@ -63,7 +61,7 @@ public : virtual void notify(const list& dlist); bool updateLockStatus(uint32_t lock); - bool updateConnectionStatus(bool connected, int32_t type); + bool updateConnections(uint64_t allConnections); bool updateTac(const string& tac); bool updateMccMnc(const string& mccmnc); bool updateXtraThrottle(const bool enabled); @@ -77,7 +75,7 @@ private: IOsObserver* mSystemStatusObsrvr; const MsgTask* mMsgTask; int32_t mGpsLock; - CONNECTIONS mConnections; + uint64_t mConnections; string mTac; string mMccmnc; bool mXtraThrottle;