diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 8308be9b..30e3b699 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -967,7 +967,8 @@ void MainWindowImpl::ConnectMapSignals() mapWidget, &map::MapWidget::IncomingLevel2ElevationChanged, this, - [this](float) { level2SettingsWidget_->UpdateSettings(activeMap_); }, + [this](std::optional) + { level2SettingsWidget_->UpdateSettings(activeMap_); }, Qt::QueuedConnection); } } 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 39501b29..1814905d 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -272,8 +272,7 @@ public: common::Level3ProductCategoryMap availableCategoryMap_ {}; std::shared_mutex availableCategoryMutex_ {}; - float incomingLevel2Elevation_ { - provider::AwsLevel2ChunksDataProvider::INVALID_ELEVATION}; + std::optional incomingLevel2Elevation_ {}; std::unordered_map, @@ -454,7 +453,7 @@ float RadarProductManager::gate_size() const return (is_tdwr()) ? 150.0f : 250.0f; } -float RadarProductManager::incoming_level_2_elevation() const +std::optional RadarProductManager::incoming_level_2_elevation() const { return p->incomingLevel2Elevation_; } @@ -1552,7 +1551,7 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, scwx::util::TimePoint(radarData0->modified_julian_date(), radarData0->collection_time())); - const float incomingElevation = + const std::optional incomingElevation = std::dynamic_pointer_cast( p->level2ChunksProviderManager_->provider_) ->GetCurrentElevation(); @@ -1597,14 +1596,11 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType, elevationCuts = std::move(recordElevationCuts); foundTime = collectionTime; - if (p->incomingLevel2Elevation_ != - provider::AwsLevel2ChunksDataProvider::INVALID_ELEVATION) + if (!p->incomingLevel2Elevation_.has_value()) { - p->incomingLevel2Elevation_ = provider:: - AwsLevel2ChunksDataProvider::INVALID_ELEVATION; + p->incomingLevel2Elevation_ = {}; Q_EMIT IncomingLevel2ElevationChanged( - provider::AwsLevel2ChunksDataProvider:: - INVALID_ELEVATION); + p->incomingLevel2Elevation_); } } } 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 6efd125d..c0a49dff 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -45,9 +45,9 @@ public: coordinates(common::RadialSize radialSize, bool smoothingEnabled) const; [[nodiscard]] const scwx::util::time_zone* default_time_zone() const; [[nodiscard]] float gate_size() const; - [[nodiscard]] float incoming_level_2_elevation() const; - [[nodiscard]] bool is_tdwr() const; - [[nodiscard]] std::string radar_id() const; + [[nodiscard]] std::optional incoming_level_2_elevation() const; + [[nodiscard]] bool is_tdwr() const; + [[nodiscard]] std::string radar_id() const; [[nodiscard]] std::shared_ptr radar_site() const; void Initialize(); @@ -149,7 +149,7 @@ signals: void NewDataAvailable(common::RadarProductGroup group, const std::string& product, std::chrono::system_clock::time_point latestTime); - void IncomingLevel2ElevationChanged(float incomingElevation); + void IncomingLevel2ElevationChanged(std::optional incomingElevation); private: std::unique_ptr p; diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 845e0a51..ad808626 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -656,7 +656,7 @@ std::vector MapWidget::GetElevationCuts() const } } -float MapWidget::GetIncomingLevel2Elevation() const +std::optional MapWidget::GetIncomingLevel2Elevation() const { return p->radarProductManager_->incoming_level_2_elevation(); } @@ -1804,7 +1804,7 @@ void MapWidgetImpl::RadarProductManagerConnect() connect(radarProductManager_.get(), &manager::RadarProductManager::IncomingLevel2ElevationChanged, this, - [this](float incomingElevation) + [this](std::optional incomingElevation) { Q_EMIT widget_->IncomingLevel2ElevationChanged( incomingElevation); diff --git a/scwx-qt/source/scwx/qt/map/map_widget.hpp b/scwx-qt/source/scwx/qt/map/map_widget.hpp index 5cc2e0a1..d474cd2e 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.hpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.hpp @@ -45,7 +45,7 @@ public: GetAvailableLevel3Categories(); [[nodiscard]] std::optional GetElevation() const; [[nodiscard]] std::vector GetElevationCuts() const; - [[nodiscard]] float GetIncomingLevel2Elevation() const; + [[nodiscard]] std::optional GetIncomingLevel2Elevation() const; [[nodiscard]] std::vector GetLevel3Products(); [[nodiscard]] std::string GetMapStyle() const; [[nodiscard]] common::RadarProductGroup GetRadarProductGroup() const; @@ -185,7 +185,7 @@ signals: void RadarSweepUpdated(); void RadarSweepNotUpdated(types::NoUpdateReason reason); void WidgetPainted(); - void IncomingLevel2ElevationChanged(float incomingElevation); + void IncomingLevel2ElevationChanged(std::optional incomingElevation); }; } // namespace map diff --git a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp index 582cf64b..3d530733 100644 --- a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp +++ b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.cpp @@ -242,11 +242,19 @@ void Level2SettingsWidget::UpdateElevationSelection(float elevation) p->currentElevationButton_ = newElevationButton; } -void Level2SettingsWidget::UpdateIncomingElevation(float incomingElevation) +void Level2SettingsWidget::UpdateIncomingElevation( + std::optional incomingElevation) { - p->incomingElevationLabel_->setText( - "Incoming Elevation: " + QString::number(incomingElevation, 'f', 1) + - common::Characters::DEGREE); + if (incomingElevation.has_value()) + { + p->incomingElevationLabel_->setText( + "Incoming Elevation: " + QString::number(*incomingElevation, 'f', 1) + + common::Characters::DEGREE); + } + else + { + p->incomingElevationLabel_->setText("Incoming Elevation: None"); + } } void Level2SettingsWidget::UpdateSettings(map::MapWidget* activeMap) @@ -254,8 +262,9 @@ void Level2SettingsWidget::UpdateSettings(map::MapWidget* activeMap) std::optional currentElevationOption = activeMap->GetElevation(); const float currentElevation = currentElevationOption.has_value() ? *currentElevationOption : 0.0f; - const std::vector elevationCuts = activeMap->GetElevationCuts(); - const float incomingElevation = activeMap->GetIncomingLevel2Elevation(); + const std::vector elevationCuts = activeMap->GetElevationCuts(); + const std::optional incomingElevation = + activeMap->GetIncomingLevel2Elevation(); if (p->elevationCuts_ != elevationCuts) { diff --git a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.hpp b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.hpp index 796b1ade..32f788bb 100644 --- a/scwx-qt/source/scwx/qt/ui/level2_settings_widget.hpp +++ b/scwx-qt/source/scwx/qt/ui/level2_settings_widget.hpp @@ -2,6 +2,8 @@ #include +#include + namespace scwx { namespace qt @@ -23,7 +25,7 @@ public: void showEvent(QShowEvent* event) override; void UpdateElevationSelection(float elevation); - void UpdateIncomingElevation(float incomingElevation); + void UpdateIncomingElevation(std::optional incomingElevation); void UpdateSettings(map::MapWidget* activeMap); signals: diff --git a/wxdata/include/scwx/provider/aws_level2_chunks_data_provider.hpp b/wxdata/include/scwx/provider/aws_level2_chunks_data_provider.hpp index 052f639b..976f0663 100644 --- a/wxdata/include/scwx/provider/aws_level2_chunks_data_provider.hpp +++ b/wxdata/include/scwx/provider/aws_level2_chunks_data_provider.hpp @@ -2,6 +2,8 @@ #include +#include + namespace Aws::S3 { class S3Client; @@ -16,7 +18,6 @@ namespace scwx::provider class AwsLevel2ChunksDataProvider : public NexradDataProvider { public: - constexpr static const float INVALID_ELEVATION = -90.0; explicit AwsLevel2ChunksDataProvider(const std::string& radarSite); explicit AwsLevel2ChunksDataProvider(const std::string& radarSite, const std::string& bucketName, @@ -58,7 +59,7 @@ public: void RequestAvailableProducts() override; std::vector GetAvailableProducts() override; - float GetCurrentElevation(); + std::optional GetCurrentElevation(); private: class Impl; diff --git a/wxdata/source/scwx/provider/aws_level2_chunks_data_provider.cpp b/wxdata/source/scwx/provider/aws_level2_chunks_data_provider.cpp index 228426c2..ddac82e5 100644 --- a/wxdata/source/scwx/provider/aws_level2_chunks_data_provider.cpp +++ b/wxdata/source/scwx/provider/aws_level2_chunks_data_provider.cpp @@ -699,12 +699,12 @@ AwsLevel2ChunksDataProvider::AwsLevel2ChunksDataProvider( AwsLevel2ChunksDataProvider& AwsLevel2ChunksDataProvider::operator=( AwsLevel2ChunksDataProvider&&) noexcept = default; -float AwsLevel2ChunksDataProvider::GetCurrentElevation() +std::optional AwsLevel2ChunksDataProvider::GetCurrentElevation() { if (!p->currentScan_.valid_ || p->currentScan_.nexradFile_ == nullptr) { // Does not have any scan elevation. -90 is beyond what is possible - return INVALID_ELEVATION; + return {}; } auto vcpData = p->currentScan_.nexradFile_->vcp_data(); @@ -712,7 +712,7 @@ float AwsLevel2ChunksDataProvider::GetCurrentElevation() if (radarData.size() == 0) { // Does not have any scan elevation. -90 is beyond what is possible - return INVALID_ELEVATION; + return {}; } const auto& lastElevation = radarData.crbegin(); @@ -729,7 +729,7 @@ float AwsLevel2ChunksDataProvider::GetCurrentElevation() return digitalRadarData0->elevation_angle().value(); } - return INVALID_ELEVATION; + return {}; } } // namespace scwx::provider