diff options
author | Yu-Han Yang <yuhany@google.com> | 2022-01-21 13:03:32 -0800 |
---|---|---|
committer | Yu-Han Yang <yuhany@google.com> | 2022-01-28 18:59:13 -0800 |
commit | 69f0f8bae08637abf248ecb200de0a0d610d38a2 (patch) | |
tree | 02fa30caca5cdaf20184a663ea96355dc014f1d1 | |
parent | d9657d01b0fdb51f116f84430f901c727d7601dc (diff) |
Add register/unregister methods for SvStatus and NMEA
(hardware/interfaces)
Bug: 213375506
Test: atest VtsHalGnssTargetTest
Change-Id: I7468336b5e1759f4ce90a42fbfd19e3bb17baaa9
-rw-r--r-- | gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl | 4 | ||||
-rw-r--r-- | gnss/aidl/android/hardware/gnss/IGnss.aidl | 21 | ||||
-rw-r--r-- | gnss/aidl/android/hardware/gnss/IGnssCallback.aidl | 4 | ||||
-rw-r--r-- | gnss/aidl/default/Gnss.cpp | 36 | ||||
-rw-r--r-- | gnss/aidl/default/Gnss.h | 8 | ||||
-rw-r--r-- | gnss/aidl/vts/gnss_hal_test.cpp | 10 |
6 files changed, 74 insertions, 9 deletions
diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl index affef2bf9b..56574344a8 100644 --- a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl +++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/IGnss.aidl @@ -56,6 +56,10 @@ interface IGnss { void setPositionMode(in android.hardware.gnss.IGnss.PositionModeOptions options); android.hardware.gnss.IGnssAntennaInfo getExtensionGnssAntennaInfo(); @nullable android.hardware.gnss.measurement_corrections.IMeasurementCorrectionsInterface getExtensionMeasurementCorrections(); + void startSvStatus(); + void stopSvStatus(); + void startNmea(); + void stopNmea(); const int ERROR_INVALID_ARGUMENT = 1; const int ERROR_ALREADY_INIT = 2; const int ERROR_GENERIC = 3; diff --git a/gnss/aidl/android/hardware/gnss/IGnss.aidl b/gnss/aidl/android/hardware/gnss/IGnss.aidl index 79950adad3..12fdbb4b7b 100644 --- a/gnss/aidl/android/hardware/gnss/IGnss.aidl +++ b/gnss/aidl/android/hardware/gnss/IGnss.aidl @@ -320,4 +320,25 @@ interface IGnss { * @return Handle to the IMeasurementCorrectionsInterface. */ @nullable IMeasurementCorrectionsInterface getExtensionMeasurementCorrections(); + + /** + * Starts a SvStatus output stream using the IGnssCallback gnssSvStatusCb(). + */ + void startSvStatus(); + + /** + * Stops the SvStatus output stream. + */ + void stopSvStatus(); + + /** + * Starts an NMEA (National Marine Electronics Association) output stream using the + * IGnssCallback gnssNmeaCb(). + */ + void startNmea(); + + /** + * Stops the NMEA output stream. + */ + void stopNmea(); } diff --git a/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl b/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl index a74d097ad6..866606fcf7 100644 --- a/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl +++ b/gnss/aidl/android/hardware/gnss/IGnssCallback.aidl @@ -202,6 +202,10 @@ 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. + * * @param svInfo SV status information from HAL. */ void gnssSvStatusCb(in GnssSvInfo[] svInfoList); diff --git a/gnss/aidl/default/Gnss.cpp b/gnss/aidl/default/Gnss.cpp index eb17bbfed3..af1dd5c538 100644 --- a/gnss/aidl/default/Gnss.cpp +++ b/gnss/aidl/default/Gnss.cpp @@ -87,15 +87,13 @@ ScopedAStatus Gnss::start() { mIsActive = true; this->reportGnssStatusValue(IGnssCallback::GnssStatusValue::SESSION_BEGIN); mThread = std::thread([this]() { - auto svStatus = filterBlocklistedSatellites(Utils::getMockSvInfoList()); - this->reportSvStatus(svStatus); + this->reportSvStatus(); if (!mFirstFixReceived) { std::this_thread::sleep_for(std::chrono::milliseconds(TTFF_MILLIS)); mFirstFixReceived = true; } while (mIsActive == true) { - auto svStatus = filterBlocklistedSatellites(Utils::getMockSvInfoList()); - this->reportSvStatus(svStatus); + this->reportSvStatus(); auto currentLocation = getLocationFromHW(); mGnssPowerIndication->notePowerConsumption(); @@ -124,6 +122,13 @@ void Gnss::reportLocation(const GnssLocation& location) const { return; } +void Gnss::reportSvStatus() const { + if (mIsSvStatusActive) { + auto svStatus = filterBlocklistedSatellites(Utils::getMockSvInfoList()); + reportSvStatus(svStatus); + } +} + void Gnss::reportSvStatus(const std::vector<GnssSvInfo>& svInfoList) const { std::unique_lock<std::mutex> lock(mMutex); if (sGnssCallback == nullptr) { @@ -136,7 +141,8 @@ void Gnss::reportSvStatus(const std::vector<GnssSvInfo>& svInfoList) const { } } -std::vector<GnssSvInfo> Gnss::filterBlocklistedSatellites(std::vector<GnssSvInfo> gnssSvInfoList) { +std::vector<GnssSvInfo> Gnss::filterBlocklistedSatellites( + std::vector<GnssSvInfo> gnssSvInfoList) const { ALOGD("filterBlocklistedSatellites"); for (uint32_t i = 0; i < gnssSvInfoList.size(); i++) { if (mGnssConfiguration->isBlocklisted(gnssSvInfoList[i])) { @@ -168,6 +174,26 @@ ScopedAStatus Gnss::stop() { return ScopedAStatus::ok(); } +ScopedAStatus Gnss::startSvStatus() { + ALOGD("startSvStatus"); + mIsSvStatusActive = true; + return ScopedAStatus::ok(); +} + +ScopedAStatus Gnss::stopSvStatus() { + ALOGD("stopSvStatus"); + mIsSvStatusActive = false; + return ScopedAStatus::ok(); +} +ScopedAStatus Gnss::startNmea() { + ALOGD("startNmea"); + return ScopedAStatus::ok(); +} +ScopedAStatus Gnss::stopNmea() { + ALOGD("stopNmea"); + return ScopedAStatus::ok(); +} + ScopedAStatus Gnss::close() { ALOGD("close"); sGnssCallback = nullptr; diff --git a/gnss/aidl/default/Gnss.h b/gnss/aidl/default/Gnss.h index b50a1aeb7a..1489b4b5e2 100644 --- a/gnss/aidl/default/Gnss.h +++ b/gnss/aidl/default/Gnss.h @@ -51,6 +51,10 @@ class Gnss : public BnGnss { ndk::ScopedAStatus injectBestLocation(const GnssLocation& location) override; ndk::ScopedAStatus deleteAidingData(GnssAidingData aidingDataFlags) override; ndk::ScopedAStatus setPositionMode(const PositionModeOptions& options) override; + ndk::ScopedAStatus startSvStatus() override; + ndk::ScopedAStatus stopSvStatus() override; + ndk::ScopedAStatus startNmea() override; + ndk::ScopedAStatus stopNmea() override; ndk::ScopedAStatus getExtensionPsds(std::shared_ptr<IGnssPsds>* iGnssPsds) override; ndk::ScopedAStatus getExtensionGnssConfiguration( @@ -83,9 +87,10 @@ class Gnss : public BnGnss { private: void reportLocation(const GnssLocation&) const; + void reportSvStatus() const; void reportSvStatus(const std::vector<IGnssCallback::GnssSvInfo>& svInfoList) const; std::vector<IGnssCallback::GnssSvInfo> filterBlocklistedSatellites( - std::vector<IGnssCallback::GnssSvInfo> gnssSvInfoList); + std::vector<IGnssCallback::GnssSvInfo> gnssSvInfoList) const; void reportGnssStatusValue(const IGnssCallback::GnssStatusValue gnssStatusValue) const; std::unique_ptr<GnssLocation> getLocationFromHW(); @@ -93,6 +98,7 @@ class Gnss : public BnGnss { std::atomic<long> mMinIntervalMs; std::atomic<bool> mIsActive; + std::atomic<bool> mIsSvStatusActive; std::atomic<bool> mFirstFixReceived; std::thread mThread; diff --git a/gnss/aidl/vts/gnss_hal_test.cpp b/gnss/aidl/vts/gnss_hal_test.cpp index 4828f19f7d..c1128ba28d 100644 --- a/gnss/aidl/vts/gnss_hal_test.cpp +++ b/gnss/aidl/vts/gnss_hal_test.cpp @@ -100,9 +100,11 @@ bool GnssHalTest::StartAndCheckFirstLocation(const int min_interval_msec, } SetPositionMode(min_interval_msec, low_power_mode); - auto result = aidl_gnss_hal_->start(); + auto status = aidl_gnss_hal_->start(); + EXPECT_TRUE(status.isOk()); - EXPECT_TRUE(result.isOk()); + status = aidl_gnss_hal_->startSvStatus(); + EXPECT_TRUE(status.isOk()); /* * GnssLocationProvider support of AGPS SUPL & XtraDownloader is not available in VTS, @@ -129,8 +131,10 @@ void GnssHalTest::StopAndClearLocations() { // Invoke the super method. return GnssHalTestTemplate<IGnss_V2_1>::StopAndClearLocations(); } + auto status = aidl_gnss_hal_->stopSvStatus(); + EXPECT_TRUE(status.isOk()); - auto status = aidl_gnss_hal_->stop(); + status = aidl_gnss_hal_->stop(); EXPECT_TRUE(status.isOk()); /* |