diff options
author | Yu-Han Yang <yuhany@google.com> | 2022-04-27 09:57:01 -0700 |
---|---|---|
committer | Yu-Han Yang <yuhany@google.com> | 2022-05-11 20:28:03 +0000 |
commit | 19a32b627098fdec92cee2eeb41dffdc4921fb93 (patch) | |
tree | 39c0bb066b5aede7b0b6c060c701d1a7731faa91 /gnss/aidl/default/GnssNavigationMessageInterface.cpp | |
parent | dd890b58457734d44e4e2af87fb1343d2348689e (diff) |
Add VTS tests for measurementInterval, stopSvStatus, and stopNmea
Bug: 206670536
Test: atest VtsHalGnssTargetTest
Change-Id: Id597c772fbe63789cb394b2aa14faeb755196f64
Diffstat (limited to 'gnss/aidl/default/GnssNavigationMessageInterface.cpp')
-rw-r--r-- | gnss/aidl/default/GnssNavigationMessageInterface.cpp | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/gnss/aidl/default/GnssNavigationMessageInterface.cpp b/gnss/aidl/default/GnssNavigationMessageInterface.cpp index 4bc859d35f..75b962452a 100644 --- a/gnss/aidl/default/GnssNavigationMessageInterface.cpp +++ b/gnss/aidl/default/GnssNavigationMessageInterface.cpp @@ -32,7 +32,7 @@ std::shared_ptr<IGnssNavigationMessageCallback> GnssNavigationMessageInterface:: GnssNavigationMessageInterface::GnssNavigationMessageInterface() : mMinIntervalMillis(1000) {} GnssNavigationMessageInterface::~GnssNavigationMessageInterface() { - stop(); + waitForStoppingThreads(); } ndk::ScopedAStatus GnssNavigationMessageInterface::setCallback( @@ -46,7 +46,9 @@ ndk::ScopedAStatus GnssNavigationMessageInterface::setCallback( ndk::ScopedAStatus GnssNavigationMessageInterface::close() { ALOGD("close"); - stop(); + if (mIsActive) { + stop(); + } std::unique_lock<std::mutex> lock(mMutex); sCallback = nullptr; return ndk::ScopedAStatus::ok(); @@ -54,9 +56,20 @@ ndk::ScopedAStatus GnssNavigationMessageInterface::close() { void GnssNavigationMessageInterface::start() { ALOGD("start"); + + if (mIsActive) { + ALOGD("restarting since nav msg has started"); + stop(); + } + // Wait for stopping previous thread. + waitForStoppingThreads(); + mIsActive = true; mThread = std::thread([this]() { - while (mIsActive == true) { + do { + if (!mIsActive) { + break; + } GnssNavigationMessage message = { .svid = 19, .type = GnssNavigationMessageType::GPS_L1CA, @@ -66,15 +79,18 @@ void GnssNavigationMessageInterface::start() { .data = std::vector<uint8_t>(40, 0xF9), }; this->reportMessage(message); - std::this_thread::sleep_for(std::chrono::milliseconds(mMinIntervalMillis)); - } + } while (mIsActive && + mThreadBlocker.wait_for(std::chrono::milliseconds(mMinIntervalMillis))); }); - mThread.detach(); } void GnssNavigationMessageInterface::stop() { ALOGD("stop"); mIsActive = false; + mThreadBlocker.notify(); + if (mThread.joinable()) { + mFutures.push_back(std::async(std::launch::async, [this] { mThread.join(); })); + } } void GnssNavigationMessageInterface::reportMessage(const GnssNavigationMessage& message) { @@ -91,4 +107,13 @@ void GnssNavigationMessageInterface::reportMessage(const GnssNavigationMessage& callbackCopy->gnssNavigationMessageCb(message); } +void GnssNavigationMessageInterface::waitForStoppingThreads() { + for (auto& future : mFutures) { + ALOGD("Stopping previous thread."); + future.wait(); + ALOGD("Done stopping thread."); + } + mFutures.clear(); +} + } // namespace aidl::android::hardware::gnss |