diff options
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 |