aboutsummaryrefslogtreecommitdiff
path: root/gps/gnss/XtraSystemStatusObserver.cpp
diff options
context:
space:
mode:
authordianlujitao <dianlujitao@lineageos.org>2018-01-20 10:25:47 +0800
committerDavide Garberi <dade.garberi@gmail.com>2018-01-27 23:40:16 +0100
commit596fd461f0a603c861ca9df4076f24a66e732cb5 (patch)
tree6eaf2d1255b13d5dcc14e938eed2f1321d4ba309 /gps/gnss/XtraSystemStatusObserver.cpp
parent18fc14ac0a3a0e622d679e7a6f708b4e468e1cfb (diff)
msm8996: gps: Squashed update to LA.UM.6.5.r1-05300-8x96.0
Change-Id: I76b39dd5329a050d44f126c684edb44b0184f0fc Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
Diffstat (limited to 'gps/gnss/XtraSystemStatusObserver.cpp')
-rw-r--r--gps/gnss/XtraSystemStatusObserver.cpp121
1 files changed, 114 insertions, 7 deletions
diff --git a/gps/gnss/XtraSystemStatusObserver.cpp b/gps/gnss/XtraSystemStatusObserver.cpp
index 58a8522..ce08f64 100644
--- a/gps/gnss/XtraSystemStatusObserver.cpp
+++ b/gps/gnss/XtraSystemStatusObserver.cpp
@@ -45,40 +45,55 @@
#include <sstream>
#include <XtraSystemStatusObserver.h>
#include <LocAdapterBase.h>
+#include <DataItemId.h>
+#include <DataItemsFactoryProxy.h>
-using namespace std;
using namespace loc_core;
#define XTRA_HAL_SOCKET_NAME "/data/vendor/location/xtra/socket_hal_xtra"
bool XtraSystemStatusObserver::updateLockStatus(uint32_t lock) {
- std::stringstream ss;
+ stringstream ss;
ss << "gpslock";
ss << " " << lock;
ss << "\n"; // append seperator
return ( sendEvent(ss) );
}
-bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, uint8_t type) {
- std::stringstream ss;
+bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, uint32_t type) {
+ stringstream ss;
ss << "connection";
ss << " " << (connected ? "1" : "0");
ss << " " << (int)type;
ss << "\n"; // append seperator
return ( sendEvent(ss) );
}
+bool XtraSystemStatusObserver::updateTac(const string& tac) {
+ stringstream ss;
+ ss << "tac";
+ ss << " " << tac.c_str();
+ ss << "\n"; // append seperator
+ return ( sendEvent(ss) );
+}
+
+bool XtraSystemStatusObserver::updateMccMnc(const string& mccmnc) {
+ stringstream ss;
+ ss << "mncmcc";
+ ss << " " << mccmnc.c_str();
+ ss << "\n"; // append seperator
+ return ( sendEvent(ss) );
+}
-bool XtraSystemStatusObserver::sendEvent(std::stringstream& event) {
+bool XtraSystemStatusObserver::sendEvent(const stringstream& event) {
int socketFd = createSocket();
if (socketFd < 0) {
LOC_LOGe("XTRA unreachable. sending failed.");
return false;
}
- const std::string& data = event.str();
+ const string& data = event.str();
int remain = data.length();
ssize_t sent = 0;
-
while (remain > 0 &&
(sent = ::send(socketFd, data.c_str() + (data.length() - remain),
remain, MSG_NOSIGNAL)) > 0) {
@@ -125,3 +140,95 @@ void XtraSystemStatusObserver::closeSocket(const int socketFd) {
}
}
}
+
+void XtraSystemStatusObserver::subscribe(bool yes)
+{
+ // Subscription data list
+ list<DataItemId> subItemIdList;
+ subItemIdList.push_back(NETWORKINFO_DATA_ITEM_ID);
+ subItemIdList.push_back(MCCMNC_DATA_ITEM_ID);
+
+ if (yes) {
+ mSystemStatusObsrvr->subscribe(subItemIdList, this);
+
+ list<DataItemId> reqItemIdList;
+ reqItemIdList.push_back(TAC_DATA_ITEM_ID);
+
+ mSystemStatusObsrvr->requestData(reqItemIdList, this);
+
+ } else {
+ mSystemStatusObsrvr->unsubscribe(subItemIdList, this);
+ }
+}
+
+// IDataItemObserver overrides
+void XtraSystemStatusObserver::getName(string& name)
+{
+ name = "XtraSystemStatusObserver";
+}
+
+void XtraSystemStatusObserver::notify(const list<IDataItemCore*>& dlist)
+{
+ struct handleOsObserverUpdateMsg : public LocMsg {
+ XtraSystemStatusObserver* mXtraSysStatObj;
+ list <IDataItemCore*> mDataItemList;
+
+ inline handleOsObserverUpdateMsg(XtraSystemStatusObserver* xtraSysStatObs,
+ const list<IDataItemCore*>& dataItemList) :
+ mXtraSysStatObj(xtraSysStatObs) {
+ for (auto eachItem : dataItemList) {
+ IDataItemCore* dataitem = DataItemsFactoryProxy::createNewDataItem(
+ eachItem->getId());
+ if (NULL == dataitem) {
+ break;
+ }
+ // Copy the contents of the data item
+ dataitem->copy(eachItem);
+
+ mDataItemList.push_back(dataitem);
+ }
+ }
+
+ inline ~handleOsObserverUpdateMsg() {
+ for (auto each : mDataItemList) {
+ delete each;
+ }
+ }
+
+ inline void proc() const {
+ for (auto each : mDataItemList) {
+ switch (each->getId())
+ {
+ case NETWORKINFO_DATA_ITEM_ID:
+ {
+ SystemStatusNetworkInfo* networkInfo =
+ reinterpret_cast<SystemStatusNetworkInfo*>(each);
+ mXtraSysStatObj->updateConnectionStatus(networkInfo->mConnected,
+ networkInfo->mType);
+ }
+ break;
+
+ case TAC_DATA_ITEM_ID:
+ {
+ SystemStatusTac* tac = reinterpret_cast<SystemStatusTac*>(each);
+ mXtraSysStatObj->updateTac(tac->mValue);
+ }
+ break;
+
+ case MCCMNC_DATA_ITEM_ID:
+ {
+ SystemStatusMccMnc* mccmnc = reinterpret_cast<SystemStatusMccMnc*>(each);
+ mXtraSysStatObj->updateMccMnc(mccmnc->mValue);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ };
+ mMsgTask->sendMsg(new (nothrow) handleOsObserverUpdateMsg(this, dlist));
+}
+
+