From 3625515b8a1c6bfbf9d6407da0185b100ad6250b Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Thu, 11 Nov 2021 23:47:27 -0600 Subject: [PATCH] Load radar data asynchronously --- .../scwx/qt/manager/radar_product_manager.cpp | 28 +++++++++++++++++++ .../scwx/qt/manager/radar_product_manager.hpp | 5 ++++ scwx-qt/source/scwx/qt/map/map_widget.cpp | 18 ++++++++---- .../scwx/qt/view/level2_product_view.cpp | 16 +++++------ wxdata/include/scwx/util/threads.hpp | 16 +++++++++++ wxdata/wxdata.cmake | 1 + 6 files changed, 71 insertions(+), 13 deletions(-) create mode 100644 wxdata/include/scwx/util/threads.hpp 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 c58ef0db..4d393c20 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -182,6 +183,33 @@ void RadarProductManager::LoadLevel2Data(const std::string& filename) emit Level2DataLoaded(); } +std::unordered_map> +RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, + uint8_t elevationIndex, + std::chrono::system_clock::time_point time) +{ + std::unordered_map> + radarData; + + if (p->level2Data_.size() > 0) + { + // TODO: Pull this from the database + radarData = p->level2Data_[0]->radar_data()[elevationIndex]; + } + else + { + scwx::util::async([&]() { + QString filename = qgetenv("AR2V_FILE"); + if (!filename.isEmpty()) + { + LoadLevel2Data(filename.toUtf8().constData()); + } + }); + } + + return radarData; +} + } // 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 85bf0cf2..0afc043a 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -33,6 +33,11 @@ public: void Initialize(); void LoadLevel2Data(const std::string& filename); + std::unordered_map> + GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, + uint8_t elevationIndex, + std::chrono::system_clock::time_point time = {}); + 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 d316a66e..758ae555 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -77,11 +77,6 @@ MapWidget::MapWidget(const QMapboxGLSettings& settings) : setFocusPolicy(Qt::StrongFocus); p->radarProductManager_->Initialize(); - QString ar2vFile = qgetenv("AR2V_FILE"); - if (!ar2vFile.isEmpty()) - { - p->radarProductManager_->LoadLevel2Data(ar2vFile.toUtf8().constData()); - } SelectRadarProduct(common::Level2Product::Reflectivity); } @@ -110,6 +105,19 @@ void MapWidget::SelectRadarProduct(common::Level2Product product) p->radarProductView_->LoadColorTable(colorTable); } + connect( + p->radarProductView_.get(), + &view::RadarProductView::ColorTableUpdated, + this, + [&]() { update(); }, + Qt::QueuedConnection); + connect( + p->radarProductView_.get(), + &view::RadarProductView::SweepComputed, + this, + [&]() { update(); }, + Qt::QueuedConnection); + if (p->map_ != nullptr) { AddLayers(); 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 37e61f8a..a5c3811e 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -236,19 +236,19 @@ void Level2ProductView::ComputeSweep() return; } - std::shared_ptr level2Data = - p->radarProductManager_->level2_data(); - if (level2Data == nullptr) + // TODO: Pick this based on view settings + auto radarData = + p->radarProductManager_->GetLevel2Data(p->dataBlockType_, 0); + if (radarData.size() == 0) { return; } - // TODO: Pick this based on radar data + const common::RadialSize radialSize = (radarData.size() == 720) ? + common::RadialSize::_0_5Degree : + common::RadialSize::_1Degree; const std::vector& coordinates = - p->radarProductManager_->coordinates(common::RadialSize::_0_5Degree); - - // TODO: Pick this based on view settings - auto radarData = level2Data->radar_data()[0]; + p->radarProductManager_->coordinates(radialSize); auto momentData0 = radarData[0]->moment_data_block(p->dataBlockType_); p->momentDataBlock0_ = momentData0; diff --git a/wxdata/include/scwx/util/threads.hpp b/wxdata/include/scwx/util/threads.hpp new file mode 100644 index 00000000..ef0a5cb0 --- /dev/null +++ b/wxdata/include/scwx/util/threads.hpp @@ -0,0 +1,16 @@ +#include + +namespace scwx +{ +namespace util +{ + +template +void async(F&& f) +{ + auto future = std::make_shared>(); + *future = std::async(std::launch::async, [future, f]() { f(); }); +} + +} // namespace util +} // namespace scwx diff --git a/wxdata/wxdata.cmake b/wxdata/wxdata.cmake index a02ec4bc..521d5fe6 100644 --- a/wxdata/wxdata.cmake +++ b/wxdata/wxdata.cmake @@ -11,6 +11,7 @@ set(SRC_COMMON source/scwx/common/color_table.cpp set(HDR_UTIL include/scwx/util/iterator.hpp include/scwx/util/rangebuf.hpp include/scwx/util/streams.hpp + include/scwx/util/threads.hpp include/scwx/util/vectorbuf.hpp) set(SRC_UTIL source/scwx/util/rangebuf.cpp source/scwx/util/streams.cpp