diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnssCallback.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnssCallback.aidl index fd07a6e562..0247182207 100644 --- a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnssCallback.aidl +++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnssCallback.aidl @@ -61,6 +61,7 @@ interface IGnssCallback { const int CAPABILITY_CORRELATION_VECTOR = 4096; const int CAPABILITY_SATELLITE_PVT = 8192; const int CAPABILITY_MEASUREMENT_CORRECTIONS_FOR_DRIVING = 16384; + const int CAPABILITY_ACCUMULATED_DELTA_RANGE = 32768; @Backing(type="int") @VintfStability enum GnssStatusValue { NONE = 0, diff --git a/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl b/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl index 2b2592bf63..ff9feeacbd 100644 --- a/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl +++ b/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl @@ -82,6 +82,9 @@ interface IGnssCallback { /** Capability bit mask indicating that GNSS supports measurement corrections for driving */ const int CAPABILITY_MEASUREMENT_CORRECTIONS_FOR_DRIVING = 1 << 14; + /** Capability bit mask indicating that GNSS supports accumulated delta range */ + const int CAPABILITY_ACCUMULATED_DELTA_RANGE = 1 << 15; + /** * Callback to inform framework of the GNSS HAL implementation's capabilities. * diff --git a/gnss/aidl/default/Gnss.cpp b/gnss/aidl/default/Gnss.cpp index 23d799919b..ec86d2ee01 100644 --- a/gnss/aidl/default/Gnss.cpp +++ b/gnss/aidl/default/Gnss.cpp @@ -60,7 +60,8 @@ ScopedAStatus Gnss::setCallback(const std::shared_ptr& callback) IGnssCallback::CAPABILITY_SATELLITE_BLOCKLIST | IGnssCallback::CAPABILITY_SATELLITE_PVT | IGnssCallback::CAPABILITY_CORRELATION_VECTOR | - IGnssCallback::CAPABILITY_ANTENNA_INFO); + IGnssCallback::CAPABILITY_ANTENNA_INFO | + IGnssCallback::CAPABILITY_ACCUMULATED_DELTA_RANGE); auto status = sGnssCallback->gnssSetCapabilitiesCb(capabilities); if (!status.isOk()) { ALOGE("%s: Unable to invoke callback.gnssSetCapabilitiesCb", __func__); diff --git a/gnss/aidl/vts/gnss_hal_test_cases.cpp b/gnss/aidl/vts/gnss_hal_test_cases.cpp index 31cef150e3..c1a177a250 100644 --- a/gnss/aidl/vts/gnss_hal_test_cases.cpp +++ b/gnss/aidl/vts/gnss_hal_test_cases.cpp @@ -1505,10 +1505,11 @@ TEST_P(GnssHalTest, TestGnssMeasurementIntervals_LocationOnAfterMeasurement) { } /* - * TestGnssMeasurementSetCallback - * 1. Start measurement with 20s interval. Expect the first measurement received in 10s. + * TestGnssMeasurementSetCallback: + * This test ensures setCallback() can be called consecutively without close(). + * 1. Start measurement with 20s interval and wait for 1 measurement. * 2. Start measurement with 1s interval and wait for 5 measurements. - * 3. Verify the received measurement intervals have expected mean and stddev. + * Verify the measurements were received at 1Hz. */ TEST_P(GnssHalTest, TestGnssMeasurementSetCallback) { if (aidl_gnss_hal_->getInterfaceVersion() <= 2) { @@ -1581,3 +1582,57 @@ TEST_P(GnssHalTest, TestGnssMeasurementIsFullTracking) { status = iGnssMeasurement->close(); ASSERT_TRUE(status.isOk()); } + +/* + * TestAccumulatedDeltaRange: + * 1. Gets the GnssMeasurementExtension and verifies that it returns a non-null extension. + * 2. Start measurement with 1s interval and wait for up to 15 measurements. + * 3. Verify at least one measurement has a valid AccumulatedDeltaRange state. + */ +TEST_P(GnssHalTest, TestAccumulatedDeltaRange) { + if (aidl_gnss_hal_->getInterfaceVersion() <= 2) { + return; + } + if ((aidl_gnss_cb_->last_capabilities_ & IGnssCallback::CAPABILITY_ACCUMULATED_DELTA_RANGE) == + 0) { + return; + } + + ALOGD("TestAccumulatedDeltaRange"); + + auto callback = sp::make(); + sp iGnssMeasurement; + auto status = aidl_gnss_hal_->getExtensionGnssMeasurement(&iGnssMeasurement); + + IGnssMeasurementInterface::Options options; + options.intervalMs = 1000; + options.enableFullTracking = true; + status = iGnssMeasurement->setCallbackWithOptions(callback, options); + + ASSERT_TRUE(status.isOk()); + ASSERT_TRUE(iGnssMeasurement != nullptr); + + bool accumulatedDeltaRangeFound = false; + const int kNumMeasurementEvents = 15; + + // setCallback at 1s interval and wait for 15 measurements + for (int i = 0; i < kNumMeasurementEvents; i++) { + GnssData lastGnssData; + ASSERT_TRUE(callback->gnss_data_cbq_.retrieve(lastGnssData, 10)); + EXPECT_EQ(callback->gnss_data_cbq_.calledCount(), i + 1); + ASSERT_TRUE(lastGnssData.measurements.size() > 0); + + // Validity check GnssData fields + checkGnssMeasurementClockFields(lastGnssData); + for (const auto& measurement : lastGnssData.measurements) { + if ((measurement.accumulatedDeltaRangeState & measurement.ADR_STATE_VALID) > 0) { + accumulatedDeltaRangeFound = true; + break; + } + } + if (accumulatedDeltaRangeFound) break; + } + ASSERT_TRUE(accumulatedDeltaRangeFound); + status = iGnssMeasurement->close(); + ASSERT_TRUE(status.isOk()); +} \ No newline at end of file diff --git a/gnss/common/utils/default/Utils.cpp b/gnss/common/utils/default/Utils.cpp index ad351f82c9..2aed29bb5a 100644 --- a/gnss/common/utils/default/Utils.cpp +++ b/gnss/common/utils/default/Utils.cpp @@ -170,7 +170,7 @@ GnssData Utils::getMockMeasurement(const bool enableCorrVecOutputs, const bool e .agcLevelDb = 2.3, .pseudorangeRateMps = -484.13739013671875, .pseudorangeRateUncertaintyMps = 1.0379999876022339, - .accumulatedDeltaRangeState = GnssMeasurement::ADR_STATE_UNKNOWN, + .accumulatedDeltaRangeState = GnssMeasurement::ADR_STATE_VALID, .accumulatedDeltaRangeM = 1.52, .accumulatedDeltaRangeUncertaintyM = 2.43, .multipathIndicator = aidl::android::hardware::gnss::GnssMultipathIndicator::UNKNOWN,