From cae04fad37391e6574582ce3905fbeee4d6f7bc9 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 22 Dec 2021 16:36:04 -0600 Subject: [PATCH] Update VCP display --- scwx-qt/source/scwx/qt/main/main_window.cpp | 30 +++++++++++++++++ scwx-qt/source/scwx/qt/map/map_widget.cpp | 13 ++++++++ scwx-qt/source/scwx/qt/map/map_widget.hpp | 1 + .../scwx/qt/view/level2_product_view.cpp | 11 ++++++- .../scwx/qt/view/level2_product_view.hpp | 1 + .../scwx/qt/view/radar_product_view.hpp | 1 + wxdata/include/scwx/common/vcp.hpp | 13 ++++++++ .../scwx/wsr88d/rda/digital_radar_data.hpp | 5 +-- wxdata/source/scwx/common/vcp.cpp | 32 +++++++++++++++++++ .../scwx/wsr88d/rda/digital_radar_data.cpp | 5 +++ wxdata/wxdata.cmake | 6 ++-- 11 files changed, 113 insertions(+), 5 deletions(-) create mode 100644 wxdata/include/scwx/common/vcp.hpp create mode 100644 wxdata/source/scwx/common/vcp.cpp diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 62fca928..cd7eecf3 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -50,6 +51,7 @@ public: void UpdateRadarProductSelection(common::RadarProductGroup group, const std::string& product); void UpdateRadarProductSettings(); + void UpdateVcp(); MainWindow* mainWindow_; QMapboxGLSettings settings_; @@ -76,6 +78,10 @@ MainWindow::MainWindow(QWidget* parent) : { ui->setupUi(this); + ui->vcpLabel->setVisible(false); + ui->vcpValueLabel->setVisible(false); + ui->vcpDescriptionLabel->setVisible(false); + p->ConfigureMapLayout(); // Add Level 2 Products @@ -243,6 +249,7 @@ void MainWindowImpl::ConfigureMapLayout() { if (maps_[mapIndex] == activeMap_) { + UpdateVcp(); UpdateRadarProductSettings(); } }, @@ -270,6 +277,7 @@ void MainWindowImpl::HandleFocusChange(QWidget* focused) UpdateRadarProductSelection(mapWidget->GetRadarProductGroup(), mapWidget->GetRadarProductName()); UpdateRadarProductSettings(); + UpdateVcp(); } } @@ -415,6 +423,28 @@ void MainWindowImpl::UpdateRadarProductSettings() UpdateElevationSelection(currentElevation); } +void MainWindowImpl::UpdateVcp() +{ + uint16_t vcp = activeMap_->GetVcp(); + + if (vcp != 0) + { + mainWindow_->ui->vcpLabel->setVisible(true); + mainWindow_->ui->vcpValueLabel->setVisible(true); + mainWindow_->ui->vcpDescriptionLabel->setVisible(true); + + mainWindow_->ui->vcpValueLabel->setText(QString::number(vcp)); + mainWindow_->ui->vcpDescriptionLabel->setText( + tr(common::GetVcpDescription(vcp).c_str())); + } + else + { + mainWindow_->ui->vcpLabel->setVisible(false); + mainWindow_->ui->vcpValueLabel->setVisible(false); + mainWindow_->ui->vcpDescriptionLabel->setVisible(false); + } +} + } // namespace main } // namespace qt } // namespace scwx diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index c7d577e0..5d27d97f 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -163,6 +163,19 @@ std::string MapWidget::GetRadarProductName() const } } +uint16_t MapWidget::GetVcp() const +{ + + if (p->context_->radarProductView_ != nullptr) + { + return p->context_->radarProductView_->vcp(); + } + else + { + return 0; + } +} + void MapWidget::SelectElevation(float elevation) { if (p->context_->radarProductView_ != nullptr) diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index 8b300c35..6ed7a19a 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -35,6 +35,7 @@ public: std::vector GetElevationCuts() const; common::RadarProductGroup GetRadarProductGroup() const; std::string GetRadarProductName() const; + uint16_t GetVcp() const; void SelectElevation(float elevation); void SelectRadarProduct(common::Level2Product 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 dbef9c0e..7c608491 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -54,6 +54,7 @@ public: elevationCut_ {}, elevationCuts_ {}, range_ {}, + vcp_ {}, sweepTime_ {}, colorTable_ {}, colorTableLut_ {}, @@ -94,6 +95,7 @@ public: float elevationCut_; std::vector elevationCuts_; float range_; + uint16_t vcp_; std::chrono::system_clock::time_point sweepTime_; @@ -173,6 +175,11 @@ std::chrono::system_clock::time_point Level2ProductView::sweep_time() const return p->sweepTime_; } +uint16_t Level2ProductView::vcp() const +{ + return p->vcp_; +} + const std::vector& Level2ProductView::vertices() const { return p->vertices_; @@ -305,7 +312,8 @@ void Level2ProductView::UpdateColorTable() std::for_each(std::execution::par_unseq, dataRange.begin(), dataRange.end(), - [&](uint16_t i) { + [&](uint16_t i) + { if (i == RANGE_FOLDED) { lut[i - *dataRange.begin()] = p->colorTable_->rf_color(); @@ -378,6 +386,7 @@ void Level2ProductView::ComputeSweep() momentData0->data_moment_range_sample_interval() * (gates - 0.5f); p->sweepTime_ = util::TimePoint(radarData0->modified_julian_date(), radarData0->collection_time()); + p->vcp_ = volumeData0->volume_coverage_pattern_number(); // Calculate vertices timer.start(); 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 f8758ff3..b7f65f87 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.hpp @@ -35,6 +35,7 @@ public: float elevation() const override; float range() const override; std::chrono::system_clock::time_point sweep_time() const override; + uint16_t vcp() const override; const std::vector& vertices() const override; void LoadColorTable(std::shared_ptr colorTable) override; 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 cc53e688..20bb0df6 100644 --- a/scwx-qt/source/scwx/qt/view/radar_product_view.hpp +++ b/scwx-qt/source/scwx/qt/view/radar_product_view.hpp @@ -32,6 +32,7 @@ public: 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 const std::vector& vertices() const = 0; void Initialize(); diff --git a/wxdata/include/scwx/common/vcp.hpp b/wxdata/include/scwx/common/vcp.hpp new file mode 100644 index 00000000..9d95c7aa --- /dev/null +++ b/wxdata/include/scwx/common/vcp.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace scwx +{ +namespace common +{ + +std::string GetVcpDescription(uint16_t vcp); + +} // namespace common +} // namespace scwx diff --git a/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp b/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp index 459ff185..4975fd2f 100644 --- a/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp +++ b/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp @@ -155,8 +155,9 @@ public: VolumeDataBlock(VolumeDataBlock&&) noexcept; VolumeDataBlock& operator=(VolumeDataBlock&&) noexcept; - float latitude() const; - float longitude() const; + float latitude() const; + float longitude() const; + uint16_t volume_coverage_pattern_number() const; static std::shared_ptr Create(const std::string& dataBlockType, diff --git a/wxdata/source/scwx/common/vcp.cpp b/wxdata/source/scwx/common/vcp.cpp new file mode 100644 index 00000000..71779a3e --- /dev/null +++ b/wxdata/source/scwx/common/vcp.cpp @@ -0,0 +1,32 @@ +#include + +#include + +namespace scwx +{ +namespace common +{ + +static const std::string CLEAR_AIR_MODE = "Clear Air Mode"; +static const std::string PRECIPITATION_MODE = "Precipitation Mode"; + +std::string GetVcpDescription(uint16_t vcp) +{ + switch (vcp) + { + case 31: + case 32: + case 35: return CLEAR_AIR_MODE; + + case 12: + case 112: + case 121: + case 212: + case 215: return PRECIPITATION_MODE; + + default: return "?"; + } +} + +} // namespace common +} // namespace scwx diff --git a/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp b/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp index c96fe87a..111596d2 100644 --- a/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp +++ b/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp @@ -285,6 +285,11 @@ float VolumeDataBlock::longitude() const return p->longitude_; } +uint16_t VolumeDataBlock::volume_coverage_pattern_number() const +{ + return p->volumeCoveragePatternNumber_; +} + std::shared_ptr VolumeDataBlock::Create(const std::string& dataBlockType, const std::string& dataName, diff --git a/wxdata/wxdata.cmake b/wxdata/wxdata.cmake index 5ccbc097..2d9e421c 100644 --- a/wxdata/wxdata.cmake +++ b/wxdata/wxdata.cmake @@ -6,9 +6,11 @@ set(HDR_COMMON include/scwx/common/characters.hpp include/scwx/common/color_table.hpp include/scwx/common/constants.hpp include/scwx/common/products.hpp - include/scwx/common/types.hpp) + include/scwx/common/types.hpp + include/scwx/common/vcp.hpp) set(SRC_COMMON source/scwx/common/color_table.cpp - source/scwx/common/products.cpp) + source/scwx/common/products.cpp + source/scwx/common/vcp.cpp) set(HDR_UTIL include/scwx/util/iterator.hpp include/scwx/util/rangebuf.hpp include/scwx/util/streams.hpp