From 4485b915c1a460dc2ae5d66095b1cf09f321d14c Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Mon, 22 Nov 2021 14:58:48 -0600 Subject: [PATCH] Use a single radar product manager across multiple maps --- .../scwx/qt/manager/radar_product_manager.cpp | 55 +++++++++++++++++-- .../scwx/qt/manager/radar_product_manager.hpp | 5 +- scwx-qt/source/scwx/qt/map/map_widget.cpp | 4 +- 3 files changed, 54 insertions(+), 10 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 f89c29ae..334b47ac 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -30,25 +31,34 @@ static constexpr uint32_t NUM_COORIDNATES_0_5_DEGREE = static constexpr uint32_t NUM_COORIDNATES_1_DEGREE = NUM_RADIAL_GATES_1_DEGREE * 2; -// TODO: Configure this in settings for radar loop -static constexpr size_t MAX_LEVEL2_FILES = 6; +// TODO: Find a way to garbage collect this +static std::unordered_map> + instanceMap_; class RadarProductManagerImpl { public: - explicit RadarProductManagerImpl() {} + explicit RadarProductManagerImpl(const std::string& radarSite) : + radarSite_ {radarSite}, initialized_ {false} + { + } ~RadarProductManagerImpl() = default; + std::string radarSite_; + bool initialized_; + std::vector coordinates0_5Degree_; std::vector coordinates1Degree_; std::map> level2VolumeScans_; + + std::mutex fileLoadMutex_; }; -RadarProductManager::RadarProductManager() : - p(std::make_unique()) +RadarProductManager::RadarProductManager(const std::string& radarSite) : + p(std::make_unique(radarSite)) { } RadarProductManager::~RadarProductManager() = default; @@ -79,6 +89,11 @@ std::shared_ptr RadarProductManager::level2_data() const void RadarProductManager::Initialize() { + if (p->initialized_) + { + return; + } + BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Initialize()"; boost::timer::cpu_timer timer; @@ -162,6 +177,8 @@ void RadarProductManager::Initialize() BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Coordinates (1 degree) calculated in " << timer.format(6, "%ws"); + + p->initialized_ = true; } void RadarProductManager::LoadLevel2Data(const std::string& filename) @@ -169,6 +186,11 @@ void RadarProductManager::LoadLevel2Data(const std::string& filename) std::shared_ptr ar2vFile = std::make_shared(); + if (!p->initialized_) + { + Initialize(); + } + bool success = ar2vFile->LoadFile(filename); if (!success) { @@ -200,17 +222,38 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, else { scwx::util::async([&]() { + std::lock_guard guard(p->fileLoadMutex_); + + BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Start load"; + QString filename = qgetenv("AR2V_FILE"); - if (!filename.isEmpty()) + if (!filename.isEmpty() && p->level2VolumeScans_.size() == 0) { LoadLevel2Data(filename.toUtf8().constData()); } + + BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "End load"; }); } return std::tie(radarData, elevationCut, elevationCuts); } +std::shared_ptr +RadarProductManager::Instance(const std::string& radarSite) +{ + static std::mutex instanceMutex; + std::lock_guard guard(instanceMutex); + + if (!instanceMap_.contains(radarSite)) + { + instanceMap_[radarSite] = + std::make_shared(radarSite); + } + + return instanceMap_[radarSite]; +} + } // namespace manager } // namespace qt } // namespace scwx 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 ab38abc3..ba16c112 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -22,7 +22,7 @@ class RadarProductManager : public QObject Q_OBJECT public: - explicit RadarProductManager(); + explicit RadarProductManager(const std::string& radarSite); ~RadarProductManager(); const std::vector& coordinates(common::RadialSize radialSize) const; @@ -40,6 +40,9 @@ public: float elevation, std::chrono::system_clock::time_point time = {}); + static std::shared_ptr + Instance(const std::string& radarSite); + signals: void Level2DataLoaded(); diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 43256599..f5d00819 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -53,7 +53,7 @@ public: widget_ {widget}, settings_(settings), map_(), - radarProductManager_ {std::make_shared()}, + radarProductManager_ {manager::RadarProductManager::Instance("KLSX")}, radarProductLayer_ {nullptr}, radarProductView_ {nullptr}, overlayLayer_ {nullptr}, @@ -98,8 +98,6 @@ MapWidget::MapWidget(const QMapboxGLSettings& settings) : p(std::make_unique(this, settings)) { setFocusPolicy(Qt::StrongFocus); - - p->radarProductManager_->Initialize(); } MapWidget::~MapWidget()