From 93ae58424cbd5ecac3039d442f60b74f7c615007 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Mon, 19 Jun 2023 00:16:51 -0500 Subject: [PATCH] Populate level 3 product times prior to loading, don't require an exact time match - Consistent with level 2, will allow choosing of the correct level 3 product if an exact time isn't given - Fixes step begin/end when not all products have the same volume times - Expected to help when switching radar sites, and attempting to save selected time from previous site --- .../scwx/qt/manager/radar_product_manager.cpp | 77 ++++++++++++++----- 1 file changed, 56 insertions(+), 21 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 f387f807..9c5e3991 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -206,6 +206,14 @@ public: std::mutex& loadDataMutex, std::shared_ptr request); void PopulateLevel2ProductTimes(std::chrono::system_clock::time_point time); + void PopulateLevel3ProductTimes(const std::string& product, + std::chrono::system_clock::time_point time); + + static void + PopulateProductTimes(std::shared_ptr providerManager, + RadarProductRecordMap& productRecordMap, + std::shared_mutex& productRecordMutex, + std::chrono::system_clock::time_point time); static void LoadNexradFile(CreateNexradFileFunction load, @@ -969,6 +977,35 @@ void RadarProductManagerImpl::LoadNexradFile( void RadarProductManagerImpl::PopulateLevel2ProductTimes( std::chrono::system_clock::time_point time) +{ + PopulateProductTimes(level2ProviderManager_, + level2ProductRecords_, + level2ProductRecordMutex_, + time); +} + +void RadarProductManagerImpl::PopulateLevel3ProductTimes( + const std::string& product, std::chrono::system_clock::time_point time) +{ + // Get provider manager + auto level3ProviderManager = GetLevel3ProviderManager(product); + + // Get product records + std::unique_lock level3ProductRecordLock {level3ProductRecordMutex_}; + auto& level3ProductRecords = level3ProductRecordsMap_[product]; + level3ProductRecordLock.unlock(); + + PopulateProductTimes(level3ProviderManager, + level3ProductRecords, + level3ProductRecordMutex_, + time); +} + +void RadarProductManagerImpl::PopulateProductTimes( + std::shared_ptr providerManager, + RadarProductRecordMap& productRecordMap, + std::shared_mutex& productRecordMutex, + std::chrono::system_clock::time_point time) { const auto today = std::chrono::floor(time); const auto yesterday = today - std::chrono::days {1}; @@ -982,7 +1019,7 @@ void RadarProductManagerImpl::PopulateLevel2ProductTimes( std::for_each(std::execution::par_unseq, dates.begin(), dates.end(), - [&, this](const auto& date) + [&](const auto& date) { // Don't query for a time point in the future if (date > std::chrono::system_clock::now()) @@ -992,8 +1029,7 @@ void RadarProductManagerImpl::PopulateLevel2ProductTimes( // Query the provider for volume time points auto timePoints = - level2ProviderManager_->provider_->GetTimePointsByDate( - date); + providerManager->provider_->GetTimePointsByDate(date); // Lock the merged volume time list std::unique_lock volumeTimesLock {volumeTimesMutex}; @@ -1004,20 +1040,19 @@ void RadarProductManagerImpl::PopulateLevel2ProductTimes( std::inserter(volumeTimes, volumeTimes.end())); }); - // Lock the level 2 product record map - std::unique_lock lock {level2ProductRecordMutex_}; + // Lock the product record map + std::unique_lock lock {productRecordMutex}; // Merge volume times into map - std::transform( - volumeTimes.cbegin(), - volumeTimes.cend(), - std::inserter(level2ProductRecords_, level2ProductRecords_.begin()), - [](const std::chrono::system_clock::time_point& time) - { - return std::pair>( - time, std::weak_ptr {}); - }); + std::transform(volumeTimes.cbegin(), + volumeTimes.cend(), + std::inserter(productRecordMap, productRecordMap.begin()), + [](const std::chrono::system_clock::time_point& time) + { + return std::pair>( + time, std::weak_ptr {}); + }); } std::tuple, @@ -1085,6 +1120,9 @@ RadarProductManagerImpl::GetLevel3ProductRecord( RadarProductRecordMap::const_pointer recordPtr {nullptr}; std::chrono::system_clock::time_point recordTime {time}; + // Ensure Level 3 product records are updated + PopulateLevel3ProductTimes(product, time); + std::unique_lock lock {level3ProductRecordMutex_}; auto it = level3ProductRecordsMap_.find(product); @@ -1108,12 +1146,9 @@ RadarProductManagerImpl::GetLevel3ProductRecord( if (recordPtr != nullptr) { - if (time == std::chrono::system_clock::time_point {} || - time == recordPtr->first) - { - recordTime = recordPtr->first; - record = recordPtr->second.lock(); - } + // Don't check for an exact time match for level 3 products + recordTime = recordPtr->first; + record = recordPtr->second.lock(); } if (recordPtr != nullptr && record == nullptr &&