From 807d98d7ef9a8721a672b5037aaf4d7aa895f7c6 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Mon, 22 Jan 2024 21:36:47 -0600 Subject: [PATCH] Use strong-typed units for angles and ranges in Digital Radar Data Generic Format --- .../scwx/qt/view/level2_product_view.cpp | 30 +++++----- .../wsr88d/rda/digital_radar_data_generic.hpp | 55 ++++++++++--------- .../wsr88d/rda/digital_radar_data_generic.cpp | 17 +++--- 3 files changed, 54 insertions(+), 48 deletions(-) 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 6c89ea6d..ad65d59a 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -98,12 +98,12 @@ public: std::vector dataMoments16_ {}; std::vector cfpMoments_ {}; - float latitude_; - float longitude_; - float elevationCut_; - std::vector elevationCuts_; - float range_; - uint16_t vcp_; + float latitude_; + float longitude_; + float elevationCut_; + std::vector elevationCuts_; + units::kilometers range_; + uint16_t vcp_; std::chrono::system_clock::time_point sweepTime_; @@ -212,7 +212,7 @@ float Level2ProductView::elevation() const float Level2ProductView::range() const { - return p->range_; + return p->range_.value(); } std::chrono::system_clock::time_point Level2ProductView::sweep_time() const @@ -747,7 +747,8 @@ void Level2ProductViewImpl::ComputeCoordinates( radials.end(), [&](std::uint32_t radial) { - const float angle = (*radarData)[radial]->azimuth_angle(); + const units::degrees angle = + (*radarData)[radial]->azimuth_angle(); std::for_each(std::execution::par_unseq, gates.begin(), @@ -765,7 +766,7 @@ void Level2ProductViewImpl::ComputeCoordinates( geodesic.Direct(radarLatitude, radarLongitude, - angle, + angle.value(), range, latitude, longitude); @@ -830,14 +831,15 @@ Level2ProductView::GetBinLevel(const common::Coordinate& coordinate) const radials.end(), [&](std::uint32_t i) { - bool found = false; - const float startAngle = (*radarData)[i]->azimuth_angle(); - const float nextAngle = + bool found = false; + const units::degrees startAngle = + (*radarData)[i]->azimuth_angle(); + const units::degrees nextAngle = (*radarData)[(i + 1) % numRadials]->azimuth_angle(); if (startAngle < nextAngle) { - if (startAngle <= azi1 && azi1 < nextAngle) + if (startAngle.value() <= azi1 && azi1 < nextAngle.value()) { found = true; } @@ -845,7 +847,7 @@ Level2ProductView::GetBinLevel(const common::Coordinate& coordinate) const else { // If the bin crosses 0/360 degrees, special handling is needed - if (startAngle <= azi1 || azi1 < nextAngle) + if (startAngle.value() <= azi1 || azi1 < nextAngle.value()) { found = true; } diff --git a/wxdata/include/scwx/wsr88d/rda/digital_radar_data_generic.hpp b/wxdata/include/scwx/wsr88d/rda/digital_radar_data_generic.hpp index 0e0afdc5..7543ec21 100644 --- a/wxdata/include/scwx/wsr88d/rda/digital_radar_data_generic.hpp +++ b/wxdata/include/scwx/wsr88d/rda/digital_radar_data_generic.hpp @@ -3,6 +3,9 @@ #include #include +#include +#include + namespace scwx { namespace wsr88d @@ -94,17 +97,17 @@ public: MomentDataBlock(MomentDataBlock&&) noexcept; MomentDataBlock& operator=(MomentDataBlock&&) noexcept; - uint16_t number_of_data_moment_gates() const; - float data_moment_range() const; - uint16_t data_moment_range_raw() const; - float data_moment_range_sample_interval() const; - uint16_t data_moment_range_sample_interval_raw() const; - float snr_threshold() const; - int16_t snr_threshold_raw() const; - uint8_t data_word_size() const; - float scale() const; - float offset() const; - const void* data_moments() const; + uint16_t number_of_data_moment_gates() const; + units::kilometers data_moment_range() const; + uint16_t data_moment_range_raw() const; + units::kilometers data_moment_range_sample_interval() const; + uint16_t data_moment_range_sample_interval_raw() const; + float snr_threshold() const; + int16_t snr_threshold_raw() const; + uint8_t data_word_size() const; + float scale() const; + float offset() const; + const void* data_moments() const; static std::shared_ptr Create(const std::string& dataBlockType, @@ -183,21 +186,21 @@ public: DigitalRadarDataGeneric(DigitalRadarDataGeneric&&) noexcept; DigitalRadarDataGeneric& operator=(DigitalRadarDataGeneric&&) noexcept; - std::string radar_identifier() const; - uint32_t collection_time() const; - uint16_t modified_julian_date() const; - uint16_t azimuth_number() const; - float azimuth_angle() const; - uint8_t compression_indicator() const; - uint16_t radial_length() const; - uint8_t azimuth_resolution_spacing() const; - uint8_t radial_status() const; - uint8_t elevation_number() const; - uint8_t cut_sector_number() const; - float elevation_angle() const; - uint8_t radial_spot_blanking_status() const; - uint8_t azimuth_indexing_mode() const; - uint16_t data_block_count() const; + std::string radar_identifier() const; + uint32_t collection_time() const; + uint16_t modified_julian_date() const; + uint16_t azimuth_number() const; + units::degrees azimuth_angle() const; + uint8_t compression_indicator() const; + uint16_t radial_length() const; + uint8_t azimuth_resolution_spacing() const; + uint8_t radial_status() const; + uint8_t elevation_number() const; + uint8_t cut_sector_number() const; + units::degrees elevation_angle() const; + uint8_t radial_spot_blanking_status() const; + uint8_t azimuth_indexing_mode() const; + uint16_t data_block_count() const; std::shared_ptr elevation_data_block() const; std::shared_ptr radial_data_block() const; diff --git a/wxdata/source/scwx/wsr88d/rda/digital_radar_data_generic.cpp b/wxdata/source/scwx/wsr88d/rda/digital_radar_data_generic.cpp index 6335a1e3..f3891abb 100644 --- a/wxdata/source/scwx/wsr88d/rda/digital_radar_data_generic.cpp +++ b/wxdata/source/scwx/wsr88d/rda/digital_radar_data_generic.cpp @@ -94,9 +94,9 @@ uint16_t MomentDataBlock::number_of_data_moment_gates() const return p->numberOfDataMomentGates_; } -float MomentDataBlock::data_moment_range() const +units::kilometers MomentDataBlock::data_moment_range() const { - return p->dataMomentRange_ * 0.001f; + return units::kilometers {p->dataMomentRange_ * 0.001f}; } uint16_t MomentDataBlock::data_moment_range_raw() const @@ -104,9 +104,10 @@ uint16_t MomentDataBlock::data_moment_range_raw() const return p->dataMomentRange_; } -float MomentDataBlock::data_moment_range_sample_interval() const +units::kilometers +MomentDataBlock::data_moment_range_sample_interval() const { - return p->dataMomentRangeSampleInterval_ * 0.001f; + return units::kilometers {p->dataMomentRangeSampleInterval_ * 0.001f}; } uint16_t MomentDataBlock::data_moment_range_sample_interval_raw() const @@ -575,9 +576,9 @@ uint16_t DigitalRadarDataGeneric::azimuth_number() const return p->azimuthNumber_; } -float DigitalRadarDataGeneric::azimuth_angle() const +units::degrees DigitalRadarDataGeneric::azimuth_angle() const { - return p->azimuthAngle_; + return units::degrees {p->azimuthAngle_}; } uint8_t DigitalRadarDataGeneric::compression_indicator() const @@ -610,9 +611,9 @@ uint8_t DigitalRadarDataGeneric::cut_sector_number() const return p->cutSectorNumber_; } -float DigitalRadarDataGeneric::elevation_angle() const +units::degrees DigitalRadarDataGeneric::elevation_angle() const { - return p->elevationAngle_; + return units::degrees {p->elevationAngle_}; } uint8_t DigitalRadarDataGeneric::radial_spot_blanking_status() const