diff --git a/android/AGnssRil.cpp b/android/AGnssRil.cpp index ec3dd761..bd4bb373 100644 --- a/android/AGnssRil.cpp +++ b/android/AGnssRil.cpp @@ -37,7 +37,6 @@ namespace gnss { namespace V1_0 { namespace implementation { -static bool sendConnectionEvent(const bool connected, const uint8_t type); AGnssRil::AGnssRil(Gnss* gnss) : mGnss(gnss) { ENTRY_LOG_CALLFLOW(); @@ -51,75 +50,12 @@ Return AGnssRil::updateNetworkState(bool connected, NetworkType type, bool ENTRY_LOG_CALLFLOW(); // for XTRA - sendConnectionEvent(connected, (uint8_t)type); - + if (nullptr != mGnss && ( nullptr != mGnss->getGnssInterface() )) { + mGnss->getGnssInterface()->updateConnectionStatus(connected, (uint8_t)type); + } return true; } -// for XTRA -static inline int createSocket() { - int socketFd = -1; - - if ((socketFd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { - LOC_LOGe("create socket error. reason:%s", strerror(errno)); - - } else { - const char* socketPath = "/data/vendor/location/xtra/socket_hal_xtra"; - struct sockaddr_un addr = { .sun_family = AF_UNIX }; - snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socketPath); - - if (::connect(socketFd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { - LOC_LOGe("cannot connect to XTRA. reason:%s", strerror(errno)); - if (::close(socketFd)) { - LOC_LOGe("close socket error. reason:%s", strerror(errno)); - } - socketFd = -1; - } - } - - return socketFd; -} - -static inline void closeSocket(const int socketFd) { - if (socketFd >= 0) { - if(::close(socketFd)) { - LOC_LOGe("close socket error. reason:%s", strerror(errno)); - } - } -} - -static inline bool sendConnectionEvent(const bool connected, const uint8_t type) { - int socketFd = createSocket(); - if (socketFd < 0) { - LOC_LOGe("XTRA unreachable. sending failed."); - return false; - } - - std::stringstream ss; - ss << "connection"; - ss << " " << (connected ? "1" : "0"); - ss << " " << (int)type; - ss << "\n"; // append seperator - - const std::string& data = ss.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) { - remain -= sent; - } - - if (sent < 0) { - LOC_LOGe("sending error. reason:%s", strerror(errno)); - } - - closeSocket(socketFd); - - return (remain == 0); -} - } // namespace implementation } // namespace V1_0 } // namespace gnss diff --git a/gnss/Android.mk b/gnss/Android.mk index fe898627..4d738bd3 100644 --- a/gnss/Android.mk +++ b/gnss/Android.mk @@ -21,7 +21,8 @@ LOCAL_SHARED_LIBRARIES := \ LOCAL_SRC_FILES += \ location_gnss.cpp \ GnssAdapter.cpp \ - Agps.cpp + Agps.cpp \ + XtraSystemStatusObserver.cpp LOCAL_CFLAGS += \ -fno-short-enums \ diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 6c9e212b..99991fc2 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -1791,6 +1791,8 @@ GnssAdapter::enableCommand(LocationTechnologyType techType) mContext.modemPowerVote(true); mAdapter.setPowerVoteId(mSessionId); mApi.setGpsLock(GNSS_CONFIG_GPS_LOCK_NONE); + mAdapter.mXtraObserver.updateLockStatus( + mAdapter.convertGpsLock(GNSS_CONFIG_GPS_LOCK_NONE)); } mAdapter.reportResponse(err, mSessionId); } @@ -1833,6 +1835,8 @@ GnssAdapter::disableCommand(uint32_t id) mContext.modemPowerVote(false); mAdapter.setPowerVoteId(0); mApi.setGpsLock(mAdapter.convertGpsLock(ContextBase::mGps_conf.GPS_LOCK)); + mAdapter.mXtraObserver.updateLockStatus( + mAdapter.convertGpsLock(ContextBase::mGps_conf.GPS_LOCK)); } mAdapter.reportResponse(err, mSessionId); } diff --git a/gnss/GnssAdapter.h b/gnss/GnssAdapter.h index 1282a6ea..46ba34fd 100644 --- a/gnss/GnssAdapter.h +++ b/gnss/GnssAdapter.h @@ -35,6 +35,7 @@ #include #include #include +#include #define MAX_URL_LEN 256 #define NMEA_SENTENCE_MAX_LENGTH 200 @@ -105,6 +106,7 @@ class GnssAdapter : public LocAdapterBase { // This must be initialized via initAgps() AgpsManager mAgpsManager; AgpsCbInfo mAgpsCbInfo; + XtraSystemStatusObserver mXtraObserver; /* === SystemStatus ===================================================================== */ SystemStatus* mSystemStatus; @@ -275,6 +277,10 @@ public: void injectLocationCommand(double latitude, double longitude, float accuracy); void injectTimeCommand(int64_t time, int64_t timeReference, int32_t uncertainty); + inline void updateConnectionStatusCommand(bool connected, uint8_t type) { + mXtraObserver.updateConnectionStatus(connected, type); + } + }; #endif //GNSS_ADAPTER_H diff --git a/gnss/XtraSystemStatusObserver.cpp b/gnss/XtraSystemStatusObserver.cpp new file mode 100644 index 00000000..58a8522d --- /dev/null +++ b/gnss/XtraSystemStatusObserver.cpp @@ -0,0 +1,127 @@ +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#define LOG_TAG "LocSvc_XtraSystemStatusObs" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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; + ss << "gpslock"; + ss << " " << lock; + ss << "\n"; // append seperator + return ( sendEvent(ss) ); +} + +bool XtraSystemStatusObserver::updateConnectionStatus(bool connected, uint8_t type) { + std::stringstream ss; + ss << "connection"; + ss << " " << (connected ? "1" : "0"); + ss << " " << (int)type; + ss << "\n"; // append seperator + return ( sendEvent(ss) ); +} + +bool XtraSystemStatusObserver::sendEvent(std::stringstream& event) { + int socketFd = createSocket(); + if (socketFd < 0) { + LOC_LOGe("XTRA unreachable. sending failed."); + return false; + } + + const std::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) { + remain -= sent; + } + + if (sent < 0) { + LOC_LOGe("sending error. reason:%s", strerror(errno)); + } + + closeSocket(socketFd); + + return (remain == 0); +} + + +int XtraSystemStatusObserver::createSocket() { + int socketFd = -1; + + if ((socketFd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + LOC_LOGe("create socket error. reason:%s", strerror(errno)); + + } else { + const char* socketPath = XTRA_HAL_SOCKET_NAME ; + struct sockaddr_un addr = { .sun_family = AF_UNIX }; + snprintf(addr.sun_path, sizeof(addr.sun_path), "%s", socketPath); + + if (::connect(socketFd, (struct sockaddr*)&addr, sizeof(addr)) < 0) { + LOC_LOGe("cannot connect to XTRA. reason:%s", strerror(errno)); + if (::close(socketFd)) { + LOC_LOGe("close socket error. reason:%s", strerror(errno)); + } + socketFd = -1; + } + } + + return socketFd; +} + +void XtraSystemStatusObserver::closeSocket(const int socketFd) { + if (socketFd >= 0) { + if(::close(socketFd)) { + LOC_LOGe("close socket error. reason:%s", strerror(errno)); + } + } +} diff --git a/gnss/XtraSystemStatusObserver.h b/gnss/XtraSystemStatusObserver.h new file mode 100644 index 00000000..e49f17b7 --- /dev/null +++ b/gnss/XtraSystemStatusObserver.h @@ -0,0 +1,54 @@ +/* Copyright (c) 2017, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation, nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ +#ifndef XTRA_SYSTEM_STATUS_OBS_H +#define XTRA_SYSTEM_STATUS_OBS_H + +#include + + +class XtraSystemStatusObserver { +public : + // constructor & destructor + XtraSystemStatusObserver() { + } + + virtual ~XtraSystemStatusObserver() { + } + + bool updateLockStatus(uint32_t lock); + bool updateConnectionStatus(bool connected, uint8_t type); + +private: + int createSocket(); + void closeSocket(const int32_t socketFd); + bool sendEvent(std::stringstream& event); + +}; + +#endif diff --git a/gnss/location_gnss.cpp b/gnss/location_gnss.cpp index 0cd8e8d2..a99d8efb 100644 --- a/gnss/location_gnss.cpp +++ b/gnss/location_gnss.cpp @@ -59,6 +59,7 @@ static void agpsDataConnOpen(AGpsExtType agpsType, const char* apnName, int apnL static void agpsDataConnClosed(AGpsExtType agpsType); static void agpsDataConnFailed(AGpsExtType agpsType); static void getDebugReport(GnssDebugReport& report); +static void updateConnectionStatus(bool connected, uint8_t type); static const GnssInterface gGnssInterface = { sizeof(GnssInterface), @@ -83,6 +84,7 @@ static const GnssInterface gGnssInterface = { agpsDataConnClosed, agpsDataConnFailed, getDebugReport, + updateConnectionStatus, }; #ifndef DEBUG_X86 @@ -248,3 +250,9 @@ static void getDebugReport(GnssDebugReport& report) { gGnssAdapter->getDebugReport(report); } } + +static void updateConnectionStatus(bool connected, uint8_t type) { + if (NULL != gGnssAdapter) { + gGnssAdapter->updateConnectionStatusCommand(connected, type); + } +} \ No newline at end of file diff --git a/location/location_interface.h b/location/location_interface.h index d7948827..9a71fffc 100644 --- a/location/location_interface.h +++ b/location/location_interface.h @@ -55,6 +55,7 @@ struct GnssInterface { void (*agpsDataConnClosed)(short agpsType); void (*agpsDataConnFailed)(short agpsType); void (*getDebugReport)(GnssDebugReport& report); + void (*updateConnectionStatus)(bool connected, uint8_t type); }; struct FlpInterface {