From f1a5d4a744bde6ade2078d74b28f699495f3f693 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Tue, 11 Apr 2023 22:46:11 -0500 Subject: [PATCH] Fix reload of expired (garbage collected) live data --- .../scwx/qt/manager/radar_product_manager.cpp | 22 ++++++++++------- .../scwx/qt/manager/radar_product_manager.hpp | 24 +++++++++++++++++-- .../scwx/qt/view/level2_product_view.cpp | 13 ++++++++-- .../scwx/qt/view/level3_radial_view.cpp | 15 +++++++++--- .../scwx/qt/view/level3_raster_view.cpp | 15 +++++++++--- 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp index 90023412..dcf3b773 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -177,10 +177,10 @@ public: void RefreshData(std::shared_ptr providerManager); std::shared_ptr - GetLevel2ProductRecord(std::chrono::system_clock::time_point time); + GetLevel2ProductRecord(std::chrono::system_clock::time_point& time); std::shared_ptr - GetLevel3ProductRecord(const std::string& product, - std::chrono::system_clock::time_point time); + GetLevel3ProductRecord(const std::string& product, + std::chrono::system_clock::time_point& time); std::shared_ptr StoreRadarProductRecord(std::shared_ptr record); void UpdateRecentRecords(RadarProductRecordList& recentList, @@ -859,7 +859,7 @@ void RadarProductManagerImpl::LoadNexradFile( std::shared_ptr RadarProductManagerImpl::GetLevel2ProductRecord( - std::chrono::system_clock::time_point time) + std::chrono::system_clock::time_point& time) { std::shared_ptr record; RadarProductRecordMap::const_pointer recordPtr {nullptr}; @@ -879,6 +879,7 @@ RadarProductManagerImpl::GetLevel2ProductRecord( if (recordPtr != nullptr) { + time = recordPtr->first; record = recordPtr->second.lock(); if (record == nullptr) { @@ -902,7 +903,7 @@ RadarProductManagerImpl::GetLevel2ProductRecord( std::shared_ptr RadarProductManagerImpl::GetLevel3ProductRecord( - const std::string& product, std::chrono::system_clock::time_point time) + const std::string& product, std::chrono::system_clock::time_point& time) { std::shared_ptr record = nullptr; RadarProductRecordMap::const_pointer recordPtr {nullptr}; @@ -930,6 +931,7 @@ RadarProductManagerImpl::GetLevel3ProductRecord( if (recordPtr != nullptr) { + time = recordPtr->first; record = recordPtr->second.lock(); if (record == nullptr) { @@ -1046,7 +1048,8 @@ void RadarProductManagerImpl::UpdateRecentRecords( std::tuple, float, - std::vector> + std::vector, + std::chrono::system_clock::time_point> RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, float elevation, std::chrono::system_clock::time_point time) @@ -1065,10 +1068,11 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, dataBlockType, elevation, time); } - return std::tie(radarData, elevationCut, elevationCuts); + return std::tie(radarData, elevationCut, elevationCuts, time); } -std::shared_ptr +std::tuple, + std::chrono::system_clock::time_point> RadarProductManager::GetLevel3Data(const std::string& product, std::chrono::system_clock::time_point time) { @@ -1082,7 +1086,7 @@ RadarProductManager::GetLevel3Data(const std::string& product, message = record->level3_file()->message(); } - return message; + return std::tie(message, time); } common::Level3ProductCategoryMap diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp index d0592e33..54a57499 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -63,14 +63,34 @@ public: bool enabled, boost::uuids::uuid uuid = boost::uuids::nil_uuid()); + /** + * @brief Get level 2 radar data for a data block type, elevation, and time. + * + * @param [in] dataBlockType Data block type + * @param [in] elevation Elevation tilt + * @param [in] time Radar product time + * + * @return Level 2 radar data, selected elevation cut, available elevation + * cuts and selected time + */ std::tuple, float, - std::vector> + std::vector, + std::chrono::system_clock::time_point> GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, float elevation, std::chrono::system_clock::time_point time = {}); - std::shared_ptr + /** + * @brief Get level 3 message data for a product and time. + * + * @param [in] product Radar product name + * @param [in] time Radar product time + * + * @return Level 3 message data and selected time + */ + std::tuple, + std::chrono::system_clock::time_point> GetLevel3Data(const std::string& product, std::chrono::system_clock::time_point time = {}); diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp index e9237ff0..1f7de41b 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -383,9 +383,18 @@ void Level2ProductView::ComputeSweep() radar_product_manager(); std::shared_ptr radarData; - std::tie(radarData, p->elevationCut_, p->elevationCuts_) = + std::chrono::system_clock::time_point requestedTime {selected_time()}; + std::chrono::system_clock::time_point foundTime; + std::tie(radarData, p->elevationCut_, p->elevationCuts_, foundTime) = radarProductManager->GetLevel2Data( - p->dataBlockType_, p->selectedElevation_, selected_time()); + p->dataBlockType_, p->selectedElevation_, requestedTime); + + // If a different time was found than what was requested, update it + if (requestedTime != foundTime) + { + SelectTime(foundTime); + } + if (radarData == nullptr || radarData == p->elevationScan_) { return; diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp index a5c3da55..4652c0a2 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp @@ -97,9 +97,18 @@ void Level3RadialView::ComputeSweep() radar_product_manager(); // Retrieve message from Radar Product Manager - std::shared_ptr message = - radarProductManager->GetLevel3Data(GetRadarProductName(), - selected_time()); + std::shared_ptr message; + std::chrono::system_clock::time_point requestedTime {selected_time()}; + std::chrono::system_clock::time_point foundTime; + std::tie(message, foundTime) = + radarProductManager->GetLevel3Data(GetRadarProductName(), requestedTime); + + // If a different time was found than what was requested, update it + if (requestedTime != foundTime) + { + SelectTime(foundTime); + } + if (message == nullptr) { logger_->debug("Level 3 data not found"); diff --git a/scwx-qt/source/scwx/qt/view/level3_raster_view.cpp b/scwx-qt/source/scwx/qt/view/level3_raster_view.cpp index f403fe3d..1c150c70 100644 --- a/scwx-qt/source/scwx/qt/view/level3_raster_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_raster_view.cpp @@ -97,9 +97,18 @@ void Level3RasterView::ComputeSweep() radar_product_manager(); // Retrieve message from Radar Product Manager - std::shared_ptr message = - radarProductManager->GetLevel3Data(GetRadarProductName(), - selected_time()); + std::shared_ptr message; + std::chrono::system_clock::time_point requestedTime {selected_time()}; + std::chrono::system_clock::time_point foundTime; + std::tie(message, foundTime) = + radarProductManager->GetLevel3Data(GetRadarProductName(), requestedTime); + + // If a different time was found than what was requested, update it + if (requestedTime != foundTime) + { + SelectTime(foundTime); + } + if (message == nullptr) { logger_->debug("Level 3 data not found");