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 c0a21821..90023412 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -883,7 +883,17 @@ RadarProductManagerImpl::GetLevel2ProductRecord( if (record == nullptr) { // Product is expired, reload it - self_->LoadLevel2Data(recordPtr->first, nullptr); + std::shared_ptr request = + std::make_shared(); + + QObject::connect( + request.get(), + &request::NexradFileRequest::RequestComplete, + self_, + [this](std::shared_ptr request) + { emit self_->DataReloaded(request->radar_product_record()); }); + + self_->LoadLevel2Data(recordPtr->first, request); } } @@ -924,7 +934,17 @@ RadarProductManagerImpl::GetLevel3ProductRecord( if (record == nullptr) { // Product is expired, reload it - self_->LoadLevel3Data(product, recordPtr->first, nullptr); + std::shared_ptr request = + std::make_shared(); + + QObject::connect( + request.get(), + &request::NexradFileRequest::RequestComplete, + self_, + [this](std::shared_ptr request) + { emit self_->DataReloaded(request->radar_product_record()); }); + + self_->LoadLevel3Data(product, recordPtr->first, request); } } 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 66984ed1..d0592e33 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -97,6 +97,7 @@ public: void UpdateAvailableProducts(); signals: + void DataReloaded(std::shared_ptr record); void Level3ProductsChanged(); void NewDataAvailable(common::RadarProductGroup group, const std::string& 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 73b3346a..e9237ff0 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -44,7 +44,6 @@ public: explicit Level2ProductViewImpl(common::Level2Product product) : product_ {product}, selectedElevation_ {0.0f}, - selectedTime_ {}, elevationScan_ {nullptr}, momentDataBlock0_ {nullptr}, latitude_ {}, @@ -72,8 +71,7 @@ public: common::Level2Product product_; wsr88d::rda::DataBlockType dataBlockType_; - float selectedElevation_; - std::chrono::system_clock::time_point selectedTime_; + float selectedElevation_; std::shared_ptr elevationScan_; std::shared_ptr momentDataBlock0_; @@ -108,6 +106,20 @@ Level2ProductView::Level2ProductView( RadarProductView(radarProductManager), p(std::make_unique(product)) { + connect(radarProductManager.get(), + &manager::RadarProductManager::DataReloaded, + this, + [this](std::shared_ptr record) + { + if (record->radar_product_group() == + common::RadarProductGroup::Level2 && + record->time() == selected_time()) + { + // If the data associated with the currently selected time is + // reloaded, update the view + Update(); + } + }); } Level2ProductView::~Level2ProductView() = default; @@ -243,11 +255,6 @@ void Level2ProductView::SelectProduct(const std::string& productName) p->SetProduct(productName); } -void Level2ProductView::SelectTime(std::chrono::system_clock::time_point time) -{ - p->selectedTime_ = time; -} - void Level2ProductViewImpl::SetProduct(const std::string& productName) { SetProduct(common::GetLevel2Product(productName)); @@ -378,7 +385,7 @@ void Level2ProductView::ComputeSweep() std::shared_ptr radarData; std::tie(radarData, p->elevationCut_, p->elevationCuts_) = radarProductManager->GetLevel2Data( - p->dataBlockType_, p->selectedElevation_, p->selectedTime_); + p->dataBlockType_, p->selectedElevation_, selected_time()); if (radarData == nullptr || radarData == p->elevationScan_) { return; 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 8043a0ab..387f79d2 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp @@ -28,25 +28,26 @@ public: ~Level2ProductView(); const std::vector& color_table() const override; - uint16_t color_table_min() const override; - uint16_t color_table_max() const override; + std::uint16_t color_table_min() const override; + std::uint16_t color_table_max() const override; float elevation() const override; float range() const override; std::chrono::system_clock::time_point sweep_time() const override; - uint16_t vcp() const override; + std::uint16_t vcp() const override; const std::vector& vertices() const override; void LoadColorTable(std::shared_ptr colorTable) override; void SelectElevation(float elevation) override; void SelectProduct(const std::string& productName) override; - void SelectTime(std::chrono::system_clock::time_point time) override; void Update() override; common::RadarProductGroup GetRadarProductGroup() const override; std::string GetRadarProductName() const override; std::vector GetElevationCuts() const override; - std::tuple GetMomentData() const override; - std::tuple GetCfpMomentData() const override; + std::tuple + GetMomentData() const override; + std::tuple + GetCfpMomentData() const override; static std::shared_ptr Create(common::Level2Product product, 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 13b172e4..228e85c2 100644 --- a/scwx-qt/source/scwx/qt/view/level3_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_product_view.cpp @@ -59,6 +59,21 @@ Level3ProductView::Level3ProductView( RadarProductView(radarProductManager), p(std::make_unique(product)) { + connect(radarProductManager.get(), + &manager::RadarProductManager::DataReloaded, + this, + [this](std::shared_ptr record) + { + if (record->radar_product_group() == + common::RadarProductGroup::Level3 && + record->radar_product() == p->product_ && + record->time() == selected_time()) + { + // If the data associated with the currently selected time is + // reloaded, update the view + Update(); + } + }); } Level3ProductView::~Level3ProductView() = default; 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 267d8678..8b622701 100644 --- a/scwx-qt/source/scwx/qt/view/level3_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_product_view.hpp @@ -28,8 +28,8 @@ public: virtual ~Level3ProductView(); const std::vector& color_table() const override; - uint16_t color_table_min() const override; - uint16_t color_table_max() const override; + std::uint16_t color_table_min() const override; + std::uint16_t color_table_max() const override; void LoadColorTable(std::shared_ptr colorTable) override; void Update() 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 1731ab3d..a5c3da55 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.cpp @@ -27,25 +27,18 @@ class Level3RadialViewImpl { public: explicit Level3RadialViewImpl() : - selectedTime_ {}, - latitude_ {}, - longitude_ {}, - range_ {}, - vcp_ {}, - sweepTime_ {} + latitude_ {}, longitude_ {}, range_ {}, vcp_ {}, sweepTime_ {} { } ~Level3RadialViewImpl() = default; - std::chrono::system_clock::time_point selectedTime_; + std::vector vertices_; + std::vector dataMoments8_; - std::vector vertices_; - std::vector dataMoments8_; - - float latitude_; - float longitude_; - float range_; - uint16_t vcp_; + float latitude_; + float longitude_; + float range_; + std::uint16_t vcp_; std::chrono::system_clock::time_point sweepTime_; }; @@ -92,11 +85,6 @@ std::tuple Level3RadialView::GetMomentData() const return std::tie(data, dataSize, componentSize); } -void Level3RadialView::SelectTime(std::chrono::system_clock::time_point time) -{ - p->selectedTime_ = time; -} - void Level3RadialView::ComputeSweep() { logger_->debug("ComputeSweep()"); @@ -111,7 +99,7 @@ void Level3RadialView::ComputeSweep() // Retrieve message from Radar Product Manager std::shared_ptr message = radarProductManager->GetLevel3Data(GetRadarProductName(), - p->selectedTime_); + selected_time()); if (message == nullptr) { logger_->debug("Level 3 data not found"); 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 ce034df2..a971941e 100644 --- a/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_radial_view.hpp @@ -27,12 +27,11 @@ public: float range() const override; std::chrono::system_clock::time_point sweep_time() const override; - uint16_t vcp() const override; + std::uint16_t vcp() const override; const std::vector& vertices() const override; - void SelectTime(std::chrono::system_clock::time_point time) override; - - std::tuple GetMomentData() const override; + std::tuple + GetMomentData() const override; static std::shared_ptr Create(const std::string& product, 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 84c896ae..f403fe3d 100644 --- a/scwx-qt/source/scwx/qt/view/level3_raster_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level3_raster_view.cpp @@ -27,18 +27,11 @@ class Level3RasterViewImpl { public: explicit Level3RasterViewImpl() : - selectedTime_ {}, - latitude_ {}, - longitude_ {}, - range_ {}, - vcp_ {}, - sweepTime_ {} + latitude_ {}, longitude_ {}, range_ {}, vcp_ {}, sweepTime_ {} { } ~Level3RasterViewImpl() = default; - std::chrono::system_clock::time_point selectedTime_; - std::vector vertices_; std::vector dataMoments8_; @@ -92,11 +85,6 @@ std::tuple Level3RasterView::GetMomentData() const return std::tie(data, dataSize, componentSize); } -void Level3RasterView::SelectTime(std::chrono::system_clock::time_point time) -{ - p->selectedTime_ = time; -} - void Level3RasterView::ComputeSweep() { logger_->debug("ComputeSweep()"); @@ -111,7 +99,7 @@ void Level3RasterView::ComputeSweep() // Retrieve message from Radar Product Manager std::shared_ptr message = radarProductManager->GetLevel3Data(GetRadarProductName(), - p->selectedTime_); + selected_time()); 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 a3f0a973..6b852f32 100644 --- a/scwx-qt/source/scwx/qt/view/level3_raster_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level3_raster_view.hpp @@ -27,12 +27,11 @@ public: float range() const override; std::chrono::system_clock::time_point sweep_time() const override; - uint16_t vcp() const override; + std::uint16_t vcp() const override; const std::vector& vertices() const override; - void SelectTime(std::chrono::system_clock::time_point time) override; - - std::tuple GetMomentData() const override; + std::tuple + GetMomentData() const override; static std::shared_ptr Create(const std::string& product, 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 8412ba3a..acde16c8 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.cpp @@ -16,12 +16,12 @@ static const std::string logPrefix_ = "scwx::qt::view::radar_product_view"; static const auto logger_ = scwx::util::Logger::Create(logPrefix_); // Default color table should be transparent to prevent flicker -static const std::vector DEFAULT_COLOR_TABLE = { +static const std::vector kDefaultColorTable_ = { boost::gil::rgba8_pixel_t(0, 128, 0, 0), boost::gil::rgba8_pixel_t(255, 192, 0, 0), boost::gil::rgba8_pixel_t(255, 0, 0, 0)}; -static const uint16_t DEFAULT_COLOR_TABLE_MIN = 2u; -static const uint16_t DEFAULT_COLOR_TABLE_MAX = 255u; +static const std::uint16_t kDefaultColorTableMin_ = 2u; +static const std::uint16_t kDefaultColorTableMax_ = 255u; class RadarProductViewImpl { @@ -30,6 +30,7 @@ public: std::shared_ptr radarProductManager) : initialized_ {false}, sweepMutex_ {}, + selectedTime_ {}, radarProductManager_ {radarProductManager} { } @@ -38,6 +39,8 @@ public: bool initialized_; std::mutex sweepMutex_; + std::chrono::system_clock::time_point selectedTime_; + std::shared_ptr radarProductManager_; }; @@ -49,17 +52,17 @@ RadarProductView::~RadarProductView() = default; const std::vector& RadarProductView::color_table() const { - return DEFAULT_COLOR_TABLE; + return kDefaultColorTable_; } -uint16_t RadarProductView::color_table_min() const +std::uint16_t RadarProductView::color_table_min() const { - return DEFAULT_COLOR_TABLE_MIN; + return kDefaultColorTableMin_; } -uint16_t RadarProductView::color_table_max() const +std::uint16_t RadarProductView::color_table_max() const { - return DEFAULT_COLOR_TABLE_MAX; + return kDefaultColorTableMax_; } float RadarProductView::elevation() const @@ -78,6 +81,11 @@ float RadarProductView::range() const return 0.0f; } +std::chrono::system_clock::time_point RadarProductView::selected_time() const +{ + return p->selectedTime_; +} + std::chrono::system_clock::time_point RadarProductView::sweep_time() const { return {}; @@ -103,6 +111,11 @@ void RadarProductView::Initialize() void RadarProductView::SelectElevation(float /*elevation*/) {} +void RadarProductView::SelectTime(std::chrono::system_clock::time_point time) +{ + p->selectedTime_ = time; +} + bool RadarProductView::IsInitialized() const { return p->initialized_; @@ -113,12 +126,12 @@ std::vector RadarProductView::GetElevationCuts() const return {}; } -std::tuple +std::tuple RadarProductView::GetCfpMomentData() const { const void* data = nullptr; - size_t dataSize = 0; - size_t componentSize = 0; + std::size_t dataSize = 0; + std::size_t componentSize = 0; return std::tie(data, dataSize, componentSize); } 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 51b3334c..9ffde284 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp @@ -30,15 +30,16 @@ public: virtual ~RadarProductView(); virtual const std::vector& color_table() const; - virtual uint16_t color_table_min() const; - virtual uint16_t color_table_max() const; + virtual std::uint16_t color_table_min() const; + virtual std::uint16_t color_table_max() const; virtual float elevation() const; virtual float range() const; virtual std::chrono::system_clock::time_point sweep_time() const; - virtual uint16_t vcp() const = 0; + virtual std::uint16_t vcp() const = 0; virtual const std::vector& vertices() const = 0; std::shared_ptr radar_product_manager() const; + std::chrono::system_clock::time_point selected_time() const; std::mutex& sweep_mutex(); void set_radar_product_manager( @@ -48,17 +49,19 @@ public: virtual void LoadColorTable(std::shared_ptr colorTable) = 0; virtual void SelectElevation(float elevation); - virtual void SelectProduct(const std::string& productName) = 0; - virtual void SelectTime(std::chrono::system_clock::time_point time) = 0; - virtual void Update() = 0; + virtual void SelectProduct(const std::string& productName) = 0; + void SelectTime(std::chrono::system_clock::time_point time); + virtual void Update() = 0; bool IsInitialized() const; virtual common::RadarProductGroup GetRadarProductGroup() const = 0; virtual std::string GetRadarProductName() const = 0; virtual std::vector GetElevationCuts() const; - virtual std::tuple GetMomentData() const = 0; - virtual std::tuple GetCfpMomentData() const; + virtual std::tuple + GetMomentData() const = 0; + virtual std::tuple + GetCfpMomentData() const; protected: virtual void UpdateColorTable() = 0;