From b493a8d0135f658adb5642a233cccb73d8d656d0 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 18 Feb 2024 23:11:24 -0600 Subject: [PATCH] Don't display stale storm tracking information --- .../scwx/qt/view/overlay_product_view.cpp | 58 +++++++++++++++++-- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/scwx-qt/source/scwx/qt/view/overlay_product_view.cpp b/scwx-qt/source/scwx/qt/view/overlay_product_view.cpp index 1e0085b4..1bfb0f44 100644 --- a/scwx-qt/source/scwx/qt/view/overlay_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/overlay_product_view.cpp @@ -142,24 +142,70 @@ void OverlayProductView::Impl::LoadProduct( self_, [=, this](std::shared_ptr request) { + using namespace std::chrono_literals; + // Select loaded record const auto& record = request->radar_product_record(); // Validate record if (record != nullptr) { - // Store loaded record - std::unique_lock lock {recordMutex_}; - - auto it = recordMap_.find(product); - if (it == recordMap_.cend() || it->second != record) + auto productTime = record->time(); + auto level3File = record->level3_file(); + if (level3File != nullptr) { - recordMap_.insert_or_assign(product, record); + const auto& header = level3File->message()->header(); + productTime = + util::TimePoint(header.date_of_message(), + header.time_of_message() * 1000); + } + // If the record is from the last 30 minutes + if (productTime + 30min >= time || + productTime + 30min >= std::chrono::system_clock::now()) + { + // Store loaded record + std::unique_lock lock {recordMutex_}; + + auto it = recordMap_.find(product); + if (it == recordMap_.cend() || it->second != record) + { + recordMap_.insert_or_assign(product, record); + + lock.unlock(); + + Q_EMIT self_->ProductUpdated(product); + } + } + else + { + // If product is more than 30 minutes old, discard + std::unique_lock lock {recordMutex_}; + std::size_t elementsRemoved = recordMap_.erase(product); lock.unlock(); + if (elementsRemoved > 0) + { + Q_EMIT self_->ProductUpdated(product); + } + + logger_->trace("Discarding stale data: {}", + util::TimeString(productTime)); + } + } + else + { + // If the product doesn't exist, erase the stale product + std::unique_lock lock {recordMutex_}; + std::size_t elementsRemoved = recordMap_.erase(product); + lock.unlock(); + + if (elementsRemoved > 0) + { Q_EMIT self_->ProductUpdated(product); } + + logger_->trace("Removing stale product"); } }); }