From d32f3784050f7f6c3c27607cc049ec66c97ef4b1 Mon Sep 17 00:00:00 2001 From: Zhanghao Date: Tue, 21 Mar 2023 05:41:55 +0000 Subject: [PATCH] GnssStatus for GnssMeasurement-only VTS test Update VTS test case: GnssStatus should be reported when only measurement is registered. Test: atest VtsHalGnssTargetTest Bug: 274653052 Change-Id: I53c741d2cee7a4c36ad0a2744ccb8b3e917b7996 --- .../android/hardware/gnss/IGnssCallback.aidl | 9 ++++--- gnss/aidl/default/Gnss.cpp | 1 + gnss/aidl/default/Gnss.h | 2 +- .../aidl/default/GnssMeasurementInterface.cpp | 8 +++++++ gnss/aidl/default/GnssMeasurementInterface.h | 4 ++++ gnss/aidl/vts/GnssCallbackAidl.cpp | 2 ++ gnss/aidl/vts/GnssCallbackAidl.h | 3 +++ gnss/aidl/vts/gnss_hal_test.cpp | 24 +++++++++++++++++++ gnss/aidl/vts/gnss_hal_test.h | 2 ++ gnss/aidl/vts/gnss_hal_test_cases.cpp | 18 +++++++++++--- 10 files changed, 66 insertions(+), 7 deletions(-) diff --git a/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl b/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl index ee21011a6d..0200625105 100644 --- a/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl +++ b/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl @@ -214,9 +214,12 @@ interface IGnssCallback { /** * Callback for the HAL to pass a vector of GnssSvInfo back to the client. * - * If GnssMeasurement is registered, the SvStatus report interval is the same as the measurement - * interval, i.e., the interval the measurement engine runs at. If GnssMeasurement is not - * registered, the SvStatus interval is the same as the location interval. + * If only GnssMeasurement is registered, the SvStatus reporting interval must be + * the same as the measurement interval, i.e., the interval the measurement + * engine runs at. If only location is registered, the SvStatus interval must + * be the same as the location interval. If both GnssMeasurement and location + * are registered, then the SvStatus interval is the same as the lesser interval + * between the two. * * @param svInfo SV status information from HAL. */ diff --git a/gnss/aidl/default/Gnss.cpp b/gnss/aidl/default/Gnss.cpp index ec86d2ee01..f1b9cbfd3f 100644 --- a/gnss/aidl/default/Gnss.cpp +++ b/gnss/aidl/default/Gnss.cpp @@ -325,6 +325,7 @@ ScopedAStatus Gnss::getExtensionGnssMeasurement( ALOGD("getExtensionGnssMeasurement"); if (mGnssMeasurementInterface == nullptr) { mGnssMeasurementInterface = SharedRefBase::make(); + mGnssMeasurementInterface->setGnssInterface(static_cast>(this)); } *iGnssMeasurement = mGnssMeasurementInterface; return ScopedAStatus::ok(); diff --git a/gnss/aidl/default/Gnss.h b/gnss/aidl/default/Gnss.h index df10fc856b..00540cd62b 100644 --- a/gnss/aidl/default/Gnss.h +++ b/gnss/aidl/default/Gnss.h @@ -84,13 +84,13 @@ class Gnss : public BnGnss { IMeasurementCorrectionsInterface>* iMeasurementCorrections) override; + void reportSvStatus() const; std::shared_ptr mGnssConfiguration; std::shared_ptr mGnssPowerIndication; std::shared_ptr mGnssMeasurementInterface; private: void reportLocation(const GnssLocation&) const; - void reportSvStatus() const; void reportSvStatus(const std::vector& svInfoList) const; std::vector filterBlocklistedSatellites( std::vector gnssSvInfoList) const; diff --git a/gnss/aidl/default/GnssMeasurementInterface.cpp b/gnss/aidl/default/GnssMeasurementInterface.cpp index 90056ce617..aab9e038d0 100644 --- a/gnss/aidl/default/GnssMeasurementInterface.cpp +++ b/gnss/aidl/default/GnssMeasurementInterface.cpp @@ -20,6 +20,7 @@ #include #include #include "DeviceFileReader.h" +#include "Gnss.h" #include "GnssRawMeasurementParser.h" #include "GnssReplayUtils.h" #include "Utils.h" @@ -126,6 +127,9 @@ void GnssMeasurementInterface::start(const bool enableCorrVecOutputs, auto measurement = Utils::getMockMeasurement(enableCorrVecOutputs, enableFullTracking); this->reportMeasurement(measurement); + if (!mLocationEnabled) { + mGnss->reportSvStatus(); + } } intervalMs = (mLocationEnabled) ? std::min(mLocationIntervalMs, mIntervalMs) : mIntervalMs; @@ -164,6 +168,10 @@ void GnssMeasurementInterface::setLocationEnabled(const bool enabled) { mLocationEnabled = enabled; } +void GnssMeasurementInterface::setGnssInterface(const std::shared_ptr& gnss) { + mGnss = gnss; +} + void GnssMeasurementInterface::waitForStoppingThreads() { for (auto& future : mFutures) { ALOGD("Stopping previous thread."); diff --git a/gnss/aidl/default/GnssMeasurementInterface.h b/gnss/aidl/default/GnssMeasurementInterface.h index d2737e5206..926a4e759b 100644 --- a/gnss/aidl/default/GnssMeasurementInterface.h +++ b/gnss/aidl/default/GnssMeasurementInterface.h @@ -25,6 +25,7 @@ #include "Utils.h" namespace aidl::android::hardware::gnss { +class Gnss; struct GnssMeasurementInterface : public BnGnssMeasurementInterface { public: @@ -39,6 +40,7 @@ struct GnssMeasurementInterface : public BnGnssMeasurementInterface { const Options& options) override; void setLocationInterval(const int intervalMs); void setLocationEnabled(const bool enabled); + void setGnssInterface(const std::shared_ptr& gnss); private: void start(const bool enableCorrVecOutputs, const bool enableFullTracking); @@ -59,6 +61,8 @@ struct GnssMeasurementInterface : public BnGnssMeasurementInterface { // Synchronization lock for sCallback mutable std::mutex mMutex; + + std::shared_ptr mGnss; }; } // namespace aidl::android::hardware::gnss diff --git a/gnss/aidl/vts/GnssCallbackAidl.cpp b/gnss/aidl/vts/GnssCallbackAidl.cpp index d3be41437a..2e34921006 100644 --- a/gnss/aidl/vts/GnssCallbackAidl.cpp +++ b/gnss/aidl/vts/GnssCallbackAidl.cpp @@ -18,6 +18,7 @@ #include "GnssCallbackAidl.h" #include +#include using android::binder::Status; using android::hardware::gnss::GnssLocation; @@ -53,6 +54,7 @@ Status GnssCallbackAidl::gnssStatusCb(const GnssStatusValue /* status */) { Status GnssCallbackAidl::gnssSvStatusCb(const std::vector& svInfoList) { ALOGI("gnssSvStatusCb. Size = %d", (int)svInfoList.size()); sv_info_list_cbq_.store(svInfoList); + sv_info_list_timestamps_millis_cbq_.store(::android::elapsedRealtime()); return Status::ok(); } diff --git a/gnss/aidl/vts/GnssCallbackAidl.h b/gnss/aidl/vts/GnssCallbackAidl.h index 06526d3d2d..82a0df4814 100644 --- a/gnss/aidl/vts/GnssCallbackAidl.h +++ b/gnss/aidl/vts/GnssCallbackAidl.h @@ -29,6 +29,7 @@ class GnssCallbackAidl : public android::hardware::gnss::BnGnssCallback { info_cbq_("system_info"), location_cbq_("location"), sv_info_list_cbq_("sv_info"), + sv_info_list_timestamps_millis_cbq_("sv_info_timestamps"), nmea_cbq_("nmea"){}; ~GnssCallbackAidl(){}; @@ -64,6 +65,8 @@ class GnssCallbackAidl : public android::hardware::gnss::BnGnssCallback { android::hardware::gnss::common::GnssCallbackEventQueue< std::vector> sv_info_list_cbq_; + android::hardware::gnss::common::GnssCallbackEventQueue + sv_info_list_timestamps_millis_cbq_; android::hardware::gnss::common::GnssCallbackEventQueue> nmea_cbq_; }; \ No newline at end of file diff --git a/gnss/aidl/vts/gnss_hal_test.cpp b/gnss/aidl/vts/gnss_hal_test.cpp index fb9af527c5..4f5e6a0b6b 100644 --- a/gnss/aidl/vts/gnss_hal_test.cpp +++ b/gnss/aidl/vts/gnss_hal_test.cpp @@ -478,6 +478,30 @@ void GnssHalTest::collectMeasurementIntervals(const sp& deltasMs) { + aidl_gnss_cb_->sv_info_list_timestamps_millis_cbq_.reset(); + aidl_gnss_cb_->sv_info_list_cbq_.reset(); + + auto status = aidl_gnss_hal_->startSvStatus(); + EXPECT_TRUE(status.isOk()); + ASSERT_TRUE(aidl_gnss_cb_->sv_info_list_timestamps_millis_cbq_.size() == + aidl_gnss_cb_->sv_info_list_cbq_.size()); + long lastElapsedRealtimeMillis = 0; + for (int i = 0; i < numMeasurementEvents; i++) { + long timeStamp; + ASSERT_TRUE(aidl_gnss_cb_->sv_info_list_timestamps_millis_cbq_.retrieve(timeStamp, + timeoutSeconds)); + if (lastElapsedRealtimeMillis != 0) { + deltasMs.push_back(timeStamp - lastElapsedRealtimeMillis); + } + lastElapsedRealtimeMillis = timeStamp; + } + status = aidl_gnss_hal_->stopSvStatus(); + EXPECT_TRUE(status.isOk()); +} + void GnssHalTest::checkGnssDataFields(const sp& callback, const int numMeasurementEvents, const int timeoutSeconds, const bool isFullTracking) { diff --git a/gnss/aidl/vts/gnss_hal_test.h b/gnss/aidl/vts/gnss_hal_test.h index 470294ca31..88d01c1769 100644 --- a/gnss/aidl/vts/gnss_hal_test.h +++ b/gnss/aidl/vts/gnss_hal_test.h @@ -101,6 +101,8 @@ class GnssHalTest : public android::hardware::gnss::common::GnssHalTestTemplate< void collectMeasurementIntervals(const sp& callback, const int numMeasurementEvents, const int timeoutSeconds, std::vector& deltaMs); + void collectSvInfoListTimestamps(const int numMeasurementEvents, const int timeoutSeconds, + std::vector& deltasMs); void checkGnssDataFields(const sp& callback, const int numMeasurementEvents, const int timeoutSeconds, const bool isFullTracking); diff --git a/gnss/aidl/vts/gnss_hal_test_cases.cpp b/gnss/aidl/vts/gnss_hal_test_cases.cpp index 96dece473a..17d65f581b 100644 --- a/gnss/aidl/vts/gnss_hal_test_cases.cpp +++ b/gnss/aidl/vts/gnss_hal_test_cases.cpp @@ -1407,6 +1407,7 @@ TEST_P(GnssHalTest, TestStopSvStatusAndNmea) { * TestGnssMeasurementIntervals_WithoutLocation: * 1. Start measurement at intervals * 2. Verify measurement are received at expected intervals + * 3. Verify status are reported at expected intervals */ TEST_P(GnssHalTest, TestGnssMeasurementIntervals_WithoutLocation) { if (aidl_gnss_hal_->getInterfaceVersion() <= 1) { @@ -1426,13 +1427,24 @@ TEST_P(GnssHalTest, TestGnssMeasurementIntervals_WithoutLocation) { auto callback = sp::make(); startMeasurementWithInterval(intervals[i], iGnssMeasurement, callback); - std::vector deltas; - collectMeasurementIntervals(callback, numEvents[i], /* timeoutSeconds= */ 10, deltas); + std::vector measurementDeltas; + std::vector svInfoListTimestampsDeltas; + collectMeasurementIntervals(callback, numEvents[i], /* timeoutSeconds= */ 10, + measurementDeltas); + if (aidl_gnss_hal_->getInterfaceVersion() >= 3) { + collectSvInfoListTimestamps(numEvents[i], /* timeoutSeconds= */ 10, + svInfoListTimestampsDeltas); + } status = iGnssMeasurement->close(); ASSERT_TRUE(status.isOk()); - assertMeanAndStdev(intervals[i], deltas); + assertMeanAndStdev(intervals[i], measurementDeltas); + + if (aidl_gnss_hal_->getInterfaceVersion() >= 3) { + assertMeanAndStdev(intervals[i], svInfoListTimestampsDeltas); + EXPECT_TRUE(aidl_gnss_cb_->sv_info_list_cbq_.size() > 0); + } } }