From 5058e3493c1bf1353ee294fae9e4c62d7390e1cc Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Mon, 22 Jan 2024 21:37:33 -0600 Subject: [PATCH] Add scaled values for ranges and angles in Digital Radar Data --- .../scwx/wsr88d/rda/digital_radar_data.hpp | 59 +++++++++++-------- .../scwx/wsr88d/rda/digital_radar_data.cpp | 51 ++++++++++++++-- 2 files changed, 79 insertions(+), 31 deletions(-) diff --git a/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp b/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp index 42acb84b..200cfbe9 100644 --- a/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp +++ b/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp @@ -2,6 +2,9 @@ #include +#include +#include + namespace scwx { namespace wsr88d @@ -21,31 +24,37 @@ public: DigitalRadarData(DigitalRadarData&&) noexcept; DigitalRadarData& operator=(DigitalRadarData&&) noexcept; - std::uint32_t collection_time() const; - std::uint16_t modified_julian_date() const; - std::uint16_t unambiguous_range() const; - std::uint16_t azimuth_angle() const; - std::uint16_t azimuth_number() const; - std::uint16_t radial_status() const; - std::uint16_t elevation_angle() const; - std::uint16_t elevation_number() const; - std::uint16_t surveillance_range() const; - std::uint16_t doppler_range() const; - std::uint16_t surveillance_range_sample_interval() const; - std::uint16_t doppler_range_sample_interval() const; - std::uint16_t number_of_surveillance_bins() const; - std::uint16_t number_of_doppler_bins() const; - std::uint16_t cut_sector_number() const; - float calibration_constant() const; - std::uint16_t surveillance_pointer() const; - std::uint16_t velocity_pointer() const; - std::uint16_t spectral_width_pointer() const; - std::uint16_t doppler_velocity_resolution() const; - std::uint16_t volume_coverage_pattern_number() const; - std::uint16_t nyquist_velocity() const; - std::uint16_t atmos() const; - std::uint16_t tover() const; - std::uint16_t radial_spot_blanking_status() const; + std::uint32_t collection_time() const; + std::uint16_t modified_julian_date() const; + std::uint16_t unambiguous_range() const; + std::uint16_t azimuth_angle_raw() const; + units::degrees azimuth_angle() const; + std::uint16_t azimuth_number() const; + std::uint16_t radial_status() const; + std::uint16_t elevation_angle_raw() const; + units::degrees elevation_angle() const; + std::uint16_t elevation_number() const; + std::uint16_t surveillance_range_raw() const; + units::kilometers surveillance_range() const; + std::uint16_t doppler_range_raw() const; + units::kilometers doppler_range() const; + std::uint16_t surveillance_range_sample_interval_raw() const; + units::kilometers surveillance_range_sample_interval() const; + std::uint16_t doppler_range_sample_interval_raw() const; + units::kilometers doppler_range_sample_interval() const; + std::uint16_t number_of_surveillance_bins() const; + std::uint16_t number_of_doppler_bins() const; + std::uint16_t cut_sector_number() const; + float calibration_constant() const; + std::uint16_t surveillance_pointer() const; + std::uint16_t velocity_pointer() const; + std::uint16_t spectral_width_pointer() const; + std::uint16_t doppler_velocity_resolution() const; + std::uint16_t volume_coverage_pattern_number() const; + std::uint16_t nyquist_velocity() const; + std::uint16_t atmos() const; + std::uint16_t tover() const; + std::uint16_t radial_spot_blanking_status() const; bool Parse(std::istream& is); diff --git a/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp b/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp index f894458e..b84c6aff 100644 --- a/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp +++ b/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp @@ -11,6 +11,12 @@ namespace rda static const std::string logPrefix_ = "scwx::wsr88d::rda::digital_radar_data"; static const auto logger_ = util::Logger::Create(logPrefix_); +// Table III-A Angle Data Format +constexpr float kAngleDataScale = 0.0054931640625f; + +// Table III-B Range Format +constexpr float kRangeScale = 0.001f; + class DigitalRadarData::Impl { public: @@ -73,11 +79,16 @@ std::uint16_t DigitalRadarData::unambiguous_range() const return p->unambiguousRange_; } -std::uint16_t DigitalRadarData::azimuth_angle() const +std::uint16_t DigitalRadarData::azimuth_angle_raw() const { return p->azimuthAngle_; } +units::degrees DigitalRadarData::azimuth_angle() const +{ + return units::degrees {p->azimuthAngle_ * kAngleDataScale}; +} + std::uint16_t DigitalRadarData::azimuth_number() const { return p->azimuthNumber_; @@ -88,36 +99,64 @@ std::uint16_t DigitalRadarData::radial_status() const return p->radialStatus_; } -std::uint16_t DigitalRadarData::elevation_angle() const +std::uint16_t DigitalRadarData::elevation_angle_raw() const { return p->elevationAngle_; } +units::degrees DigitalRadarData::elevation_angle() const +{ + return units::degrees {p->elevationAngle_ * kAngleDataScale}; +} + std::uint16_t DigitalRadarData::elevation_number() const { return p->elevationNumber_; } -std::uint16_t DigitalRadarData::surveillance_range() const +std::uint16_t DigitalRadarData::surveillance_range_raw() const { return p->surveillanceRange_; } -std::uint16_t DigitalRadarData::doppler_range() const +units::kilometers DigitalRadarData::surveillance_range() const +{ + return units::kilometers {p->surveillanceRange_ * kRangeScale}; +} + +std::uint16_t DigitalRadarData::doppler_range_raw() const { return p->dopplerRange_; } -std::uint16_t DigitalRadarData::surveillance_range_sample_interval() const +units::kilometers DigitalRadarData::doppler_range() const +{ + return units::kilometers {p->dopplerRange_ * kRangeScale}; +} + +std::uint16_t DigitalRadarData::surveillance_range_sample_interval_raw() const { return p->surveillanceRangeSampleInterval_; } -std::uint16_t DigitalRadarData::doppler_range_sample_interval() const +units::kilometers +DigitalRadarData::surveillance_range_sample_interval() const +{ + return units::kilometers {p->surveillanceRangeSampleInterval_ * + kRangeScale}; +} + +std::uint16_t DigitalRadarData::doppler_range_sample_interval_raw() const { return p->dopplerRangeSampleInterval_; } +units::kilometers DigitalRadarData::doppler_range_sample_interval() const +{ + return units::kilometers {p->dopplerRangeSampleInterval_ * + kRangeScale}; +} + std::uint16_t DigitalRadarData::number_of_surveillance_bins() const { return p->numberOfSurveillanceBins_;