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 02411f3e..65ebe214 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -67,12 +67,15 @@ class RadarProductManagerImpl public: struct ProviderManager { - explicit ProviderManager(common::RadarProductGroup group) : - ProviderManager(group, "???") + explicit ProviderManager(const std::string& radarId, + common::RadarProductGroup group) : + ProviderManager(radarId, group, "???") { } - explicit ProviderManager(common::RadarProductGroup group, + explicit ProviderManager(const std::string& radarId, + common::RadarProductGroup group, const std::string& product) : + radarId_ {radarId}, group_ {group}, product_ {product}, refreshEnabled_ {false}, @@ -87,6 +90,7 @@ public: void Disable(); + const std::string radarId_; const common::RadarProductGroup group_; const std::string product_; bool refreshEnabled_; @@ -108,8 +112,8 @@ public: level3ProductRecordsMap_ {}, level2ProductRecordMutex_ {}, level3ProductRecordMutex_ {}, - level2ProviderManager_ { - std::make_shared(common::RadarProductGroup::Level2)}, + level2ProviderManager_ {std::make_shared( + radarId_, common::RadarProductGroup::Level2)}, level3ProviderManagerMap_ {}, level3ProviderManagerMutex_ {}, initializeMutex_ {}, @@ -173,9 +177,9 @@ public: std::shared_ptr request, std::mutex& mutex); - std::string radarId_; - bool initialized_; - bool level3ProductsInitialized_; + const std::string radarId_; + bool initialized_; + bool level3ProductsInitialized_; std::shared_ptr radarSite_; @@ -215,12 +219,15 @@ std::string RadarProductManagerImpl::ProviderManager::name() const if (group_ == common::RadarProductGroup::Level3) { - name = std::format( - "{}, {}", common::GetRadarProductGroupName(group_), product_); + name = std::format("{}, {}, {}", + radarId_, + common::GetRadarProductGroupName(group_), + product_); } else { - name = common::GetRadarProductGroupName(group_); + name = std::format( + "{}, {}", radarId_, common::GetRadarProductGroupName(group_)); } return name; @@ -380,7 +387,7 @@ RadarProductManagerImpl::GetLevel3ProviderManager(const std::string& product) std::forward_as_tuple(product), std::forward_as_tuple( std::make_shared( - common::RadarProductGroup::Level3, product))); + radarId_, common::RadarProductGroup::Level3, product))); level3ProviderManagerMap_.at(product)->provider_ = provider::NexradDataProviderFactory::CreateLevel3DataProvider(radarId_, product); 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 4e37c30a..73b3346a 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -41,11 +41,8 @@ static const std::unordered_map radarProductManager) : + explicit Level2ProductViewImpl(common::Level2Product product) : product_ {product}, - radarProductManager_ {radarProductManager}, selectedElevation_ {0.0f}, selectedTime_ {}, elevationScan_ {nullptr}, @@ -72,9 +69,8 @@ public: void SetProduct(const std::string& productName); void SetProduct(common::Level2Product product); - common::Level2Product product_; - wsr88d::rda::DataBlockType dataBlockType_; - std::shared_ptr radarProductManager_; + common::Level2Product product_; + wsr88d::rda::DataBlockType dataBlockType_; float selectedElevation_; std::chrono::system_clock::time_point selectedTime_; @@ -109,7 +105,8 @@ public: Level2ProductView::Level2ProductView( common::Level2Product product, std::shared_ptr radarProductManager) : - p(std::make_unique(product, radarProductManager)) + RadarProductView(radarProductManager), + p(std::make_unique(product)) { } Level2ProductView::~Level2ProductView() = default; @@ -375,9 +372,12 @@ void Level2ProductView::ComputeSweep() std::scoped_lock sweepLock(sweep_mutex()); + std::shared_ptr radarProductManager = + radar_product_manager(); + std::shared_ptr radarData; std::tie(radarData, p->elevationCut_, p->elevationCuts_) = - p->radarProductManager_->GetLevel2Data( + radarProductManager->GetLevel2Data( p->dataBlockType_, p->selectedElevation_, p->selectedTime_); if (radarData == nullptr || radarData == p->elevationScan_) { @@ -390,7 +390,7 @@ void Level2ProductView::ComputeSweep() common::RadialSize::_0_5Degree : common::RadialSize::_1Degree; const std::vector& coordinates = - p->radarProductManager_->coordinates(radialSize); + radarProductManager->coordinates(radialSize); auto radarData0 = (*radarData)[0]; auto momentData0 = radarData0->moment_data_block(p->dataBlockType_); @@ -492,7 +492,7 @@ void Level2ProductView::ComputeSweep() // Compute gate size (number of base 250m gates per bin) const uint16_t gateSizeMeters = - static_cast(p->radarProductManager_->gate_size()); + static_cast(radarProductManager->gate_size()); const uint16_t gateSize = std::max(1, dataMomentInterval / gateSizeMeters); diff --git a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp index 13e03449..8043a0ab 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp @@ -2,7 +2,6 @@ #include #include -#include #include #include diff --git a/scwx-qt/source/scwx/qt/view/level3_product_view.cpp b/scwx-qt/source/scwx/qt/view/level3_product_view.cpp index e3acbcef..13b172e4 100644 --- a/scwx-qt/source/scwx/qt/view/level3_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_product_view.cpp @@ -53,7 +53,10 @@ public: float savedOffset_; }; -Level3ProductView::Level3ProductView(const std::string& product) : +Level3ProductView::Level3ProductView( + const std::string& product, + std::shared_ptr radarProductManager) : + RadarProductView(radarProductManager), p(std::make_unique(product)) { } diff --git a/scwx-qt/source/scwx/qt/view/level3_product_view.hpp b/scwx-qt/source/scwx/qt/view/level3_product_view.hpp index e7066ac5..267d8678 100644 --- a/scwx-qt/source/scwx/qt/view/level3_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_product_view.hpp @@ -22,7 +22,9 @@ class Level3ProductView : public RadarProductView Q_OBJECT public: - explicit Level3ProductView(const std::string& product); + explicit Level3ProductView( + const std::string& product, + std::shared_ptr radarProductManager); virtual ~Level3ProductView(); const std::vector& color_table() const override; 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 b0a056b7..1731ab3d 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp @@ -26,9 +26,7 @@ static constexpr uint32_t VALUES_PER_VERTEX = 2u; class Level3RadialViewImpl { public: - explicit Level3RadialViewImpl( - std::shared_ptr radarProductManager) : - radarProductManager_ {radarProductManager}, + explicit Level3RadialViewImpl() : selectedTime_ {}, latitude_ {}, longitude_ {}, @@ -39,8 +37,6 @@ public: } ~Level3RadialViewImpl() = default; - std::shared_ptr radarProductManager_; - std::chrono::system_clock::time_point selectedTime_; std::vector vertices_; @@ -57,8 +53,8 @@ public: Level3RadialView::Level3RadialView( const std::string& product, std::shared_ptr radarProductManager) : - Level3ProductView(product), - p(std::make_unique(radarProductManager)) + Level3ProductView(product, radarProductManager), + p(std::make_unique()) { } Level3RadialView::~Level3RadialView() = default; @@ -109,10 +105,13 @@ void Level3RadialView::ComputeSweep() std::scoped_lock sweepLock(sweep_mutex()); + std::shared_ptr radarProductManager = + radar_product_manager(); + // Retrieve message from Radar Product Manager std::shared_ptr message = - p->radarProductManager_->GetLevel3Data(GetRadarProductName(), - p->selectedTime_); + radarProductManager->GetLevel3Data(GetRadarProductName(), + p->selectedTime_); if (message == nullptr) { logger_->debug("Level 3 data not found"); @@ -218,7 +217,7 @@ void Level3RadialView::ComputeSweep() common::RadialSize::_0_5Degree : common::RadialSize::_1Degree; const std::vector& coordinates = - p->radarProductManager_->coordinates(radialSize); + radarProductManager->coordinates(radialSize); // There should be a positive number of range bins in radial data const uint16_t gates = radialData->number_of_range_bins(); @@ -270,7 +269,7 @@ void Level3RadialView::ComputeSweep() const uint16_t gateSize = std::max( 1, dataMomentInterval / - static_cast(p->radarProductManager_->gate_size())); + static_cast(radarProductManager->gate_size())); // Compute gate range [startGate, endGate) const uint16_t startGate = 0; diff --git a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp index 39c58c9e..ce034df2 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include 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 77c11f9d..d606a581 100644 --- a/scwx-qt/source/scwx/qt/view/level3_raster_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_raster_view.cpp @@ -26,9 +26,7 @@ static constexpr uint32_t VALUES_PER_VERTEX = 2u; class Level3RasterViewImpl { public: - explicit Level3RasterViewImpl( - std::shared_ptr radarProductManager) : - radarProductManager_ {radarProductManager}, + explicit Level3RasterViewImpl() : selectedTime_ {}, latitude_ {}, longitude_ {}, @@ -39,8 +37,6 @@ public: } ~Level3RasterViewImpl() = default; - std::shared_ptr radarProductManager_; - std::chrono::system_clock::time_point selectedTime_; std::vector vertices_; @@ -57,8 +53,8 @@ public: Level3RasterView::Level3RasterView( const std::string& product, std::shared_ptr radarProductManager) : - Level3ProductView(product), - p(std::make_unique(radarProductManager)) + Level3ProductView(product, radarProductManager), + p(std::make_unique()) { } Level3RasterView::~Level3RasterView() = default; @@ -109,10 +105,13 @@ void Level3RasterView::ComputeSweep() std::scoped_lock sweepLock(sweep_mutex()); + std::shared_ptr radarProductManager = + radar_product_manager(); + // Retrieve message from Radar Product Manager std::shared_ptr message = - p->radarProductManager_->GetLevel3Data(GetRadarProductName(), - p->selectedTime_); + radarProductManager->GetLevel3Data(GetRadarProductName(), + p->selectedTime_); if (message == nullptr) { logger_->debug("Level 3 data not found"); diff --git a/scwx-qt/source/scwx/qt/view/level3_raster_view.hpp b/scwx-qt/source/scwx/qt/view/level3_raster_view.hpp index e7f384a7..a3f0a973 100644 --- a/scwx-qt/source/scwx/qt/view/level3_raster_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_raster_view.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp index d63be643..8412ba3a 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp @@ -26,15 +26,24 @@ static const uint16_t DEFAULT_COLOR_TABLE_MAX = 255u; class RadarProductViewImpl { public: - explicit RadarProductViewImpl() : initialized_ {false}, sweepMutex_ {} {} + explicit RadarProductViewImpl( + std::shared_ptr radarProductManager) : + initialized_ {false}, + sweepMutex_ {}, + radarProductManager_ {radarProductManager} + { + } ~RadarProductViewImpl() = default; bool initialized_; std::mutex sweepMutex_; + + std::shared_ptr radarProductManager_; }; -RadarProductView::RadarProductView() : - p(std::make_unique()) {}; +RadarProductView::RadarProductView( + std::shared_ptr radarProductManager) : + p(std::make_unique(radarProductManager)) {}; RadarProductView::~RadarProductView() = default; const std::vector& @@ -58,6 +67,12 @@ float RadarProductView::elevation() const return 0.0f; } +std::shared_ptr +RadarProductView::radar_product_manager() const +{ + return p->radarProductManager_; +} + float RadarProductView::range() const { return 0.0f; @@ -73,6 +88,12 @@ std::mutex& RadarProductView::sweep_mutex() return p->sweepMutex_; } +void RadarProductView::set_radar_product_manager( + std::shared_ptr radarProductManager) +{ + p->radarProductManager_ = radarProductManager; +} + void RadarProductView::Initialize() { ComputeSweep(); diff --git a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp index 849a4097..51b3334c 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -24,7 +25,8 @@ class RadarProductView : public QObject Q_OBJECT public: - explicit RadarProductView(); + explicit RadarProductView( + std::shared_ptr radarProductManager); virtual ~RadarProductView(); virtual const std::vector& color_table() const; @@ -36,7 +38,11 @@ public: virtual uint16_t vcp() const = 0; virtual const std::vector& vertices() const = 0; - std::mutex& sweep_mutex(); + std::shared_ptr radar_product_manager() const; + std::mutex& sweep_mutex(); + + void set_radar_product_manager( + std::shared_ptr radarProductManager); void Initialize(); virtual void