From 5b53be1d9e037a197cdc56b65c73543c63051df1 Mon Sep 17 00:00:00 2001 From: Katz Yamada Date: Tue, 2 Oct 2018 16:10:03 -0700 Subject: [PATCH] perf: Reduce NMEA traffic over client IPC Improve hal daemon performance by reducing number of NMEA callbacks on IPC. Position and sv NMEA sentences, generated during one TBF will be concatenated by hal and sent over one IPC, then client lib disassemble it into multiple sentences. Change-Id: I522e293d7e26fb8a25edb6ed931c4d69186223e8 CRs-Fixed: 2299008 --- android/1.0/location_api/GnssAPIClient.cpp | 21 ++++++++++++++------- android/1.1/location_api/GnssAPIClient.cpp | 21 ++++++++++++++------- gnss/GnssAdapter.cpp | 11 +++++++++-- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/android/1.0/location_api/GnssAPIClient.cpp b/android/1.0/location_api/GnssAPIClient.cpp index 9edba93d..d04939e3 100644 --- a/android/1.0/location_api/GnssAPIClient.cpp +++ b/android/1.0/location_api/GnssAPIClient.cpp @@ -469,13 +469,20 @@ void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification) mMutex.unlock(); if (gnssCbIface != nullptr) { - android::hardware::hidl_string nmeaString; - nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length); - auto r = gnssCbIface->gnssNmeaCb( - static_cast(gnssNmeaNotification.timestamp), nmeaString); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, - gnssNmeaNotification.nmea, gnssNmeaNotification.length, r.description().c_str()); + const std::string s(gnssNmeaNotification.nmea); + std::stringstream ss(s); + std::string each; + while(std::getline(ss, each, '\n')) { + each += '\n'; + android::hardware::hidl_string nmeaString; + nmeaString.setToExternal(each.c_str(), each.length()); + auto r = gnssCbIface->gnssNmeaCb( + static_cast(gnssNmeaNotification.timestamp), nmeaString); + if (!r.isOk()) { + LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, + gnssNmeaNotification.nmea, gnssNmeaNotification.length, + r.description().c_str()); + } } } } diff --git a/android/1.1/location_api/GnssAPIClient.cpp b/android/1.1/location_api/GnssAPIClient.cpp index cec51451..fcef4592 100644 --- a/android/1.1/location_api/GnssAPIClient.cpp +++ b/android/1.1/location_api/GnssAPIClient.cpp @@ -469,13 +469,20 @@ void GnssAPIClient::onGnssNmeaCb(GnssNmeaNotification gnssNmeaNotification) mMutex.unlock(); if (gnssCbIface != nullptr) { - android::hardware::hidl_string nmeaString; - nmeaString.setToExternal(gnssNmeaNotification.nmea, gnssNmeaNotification.length); - auto r = gnssCbIface->gnssNmeaCb( - static_cast(gnssNmeaNotification.timestamp), nmeaString); - if (!r.isOk()) { - LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, - gnssNmeaNotification.nmea, gnssNmeaNotification.length, r.description().c_str()); + const std::string s(gnssNmeaNotification.nmea); + std::stringstream ss(s); + std::string each; + while(std::getline(ss, each, '\n')) { + each += '\n'; + android::hardware::hidl_string nmeaString; + nmeaString.setToExternal(each.c_str(), each.length()); + auto r = gnssCbIface->gnssNmeaCb( + static_cast(gnssNmeaNotification.timestamp), nmeaString); + if (!r.isOk()) { + LOC_LOGE("%s] Error from gnssNmeaCb nmea=%s length=%zu description=%s", __func__, + gnssNmeaNotification.nmea, gnssNmeaNotification.length, + r.description().c_str()); + } } } } diff --git a/gnss/GnssAdapter.cpp b/gnss/GnssAdapter.cpp index 32e0833a..3d3c990d 100644 --- a/gnss/GnssAdapter.cpp +++ b/gnss/GnssAdapter.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -2976,9 +2977,12 @@ GnssAdapter::reportPosition(const UlpLocation& ulpLocation, uint8_t generate_nmea = (reported && status != LOC_SESS_FAILURE && !blank_fix); std::vector nmeaArraystr; loc_nmea_generate_pos(ulpLocation, locationExtended, generate_nmea, nmeaArraystr); + stringstream ss; for (auto sentence : nmeaArraystr) { - reportNmea(sentence.c_str(), sentence.length()); + ss << sentence; } + string s = ss.str(); + reportNmea(s.c_str(), s.length()); } } @@ -3069,9 +3073,12 @@ GnssAdapter::reportSv(GnssSvNotification& svNotify) if (NMEA_PROVIDER_AP == ContextBase::mGps_conf.NMEA_PROVIDER && !mTrackingSessions.empty()) { std::vector nmeaArraystr; loc_nmea_generate_sv(svNotify, nmeaArraystr); + stringstream ss; for (auto sentence : nmeaArraystr) { - reportNmea(sentence.c_str(), sentence.length()); + ss << sentence; } + string s = ss.str(); + reportNmea(s.c_str(), s.length()); } mGnssSvIdUsedInPosAvail = false;