From 835e8d8f0d00687aadee5c9cdd7b05a6b360ebfb Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Tue, 23 Jan 2024 00:22:56 -0600 Subject: [PATCH] Process and index Digital Radar Data --- .../wsr88d/rda/digital_radar_data_generic.hpp | 2 +- .../scwx/wsr88d/rda/generic_radar_data.hpp | 2 + wxdata/source/scwx/wsr88d/ar2v_file.cpp | 42 ++++++++++++------- .../wsr88d/rda/digital_radar_data_generic.cpp | 2 +- 4 files changed, 31 insertions(+), 17 deletions(-) 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 ba246eee..42ee713a 100644 --- a/wxdata/include/scwx/wsr88d/rda/digital_radar_data_generic.hpp +++ b/wxdata/include/scwx/wsr88d/rda/digital_radar_data_generic.hpp @@ -36,7 +36,7 @@ public: std::uint16_t radial_length() const; std::uint8_t azimuth_resolution_spacing() const; std::uint8_t radial_status() const; - std::uint8_t elevation_number() const; + std::uint16_t elevation_number() const; std::uint8_t cut_sector_number() const; units::degrees elevation_angle() const; std::uint8_t radial_spot_blanking_status() const; diff --git a/wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp b/wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp index 532cbe02..085f7849 100644 --- a/wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp +++ b/wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp @@ -53,6 +53,8 @@ public: virtual std::uint32_t collection_time() const = 0; virtual std::uint16_t modified_julian_date() const = 0; virtual units::degrees azimuth_angle() const = 0; + virtual std::uint16_t azimuth_number() const = 0; + virtual std::uint16_t elevation_number() const = 0; virtual std::uint16_t volume_coverage_pattern_number() const = 0; virtual std::shared_ptr diff --git a/wxdata/source/scwx/wsr88d/ar2v_file.cpp b/wxdata/source/scwx/wsr88d/ar2v_file.cpp index c78aa2d3..2179b835 100644 --- a/wxdata/source/scwx/wsr88d/ar2v_file.cpp +++ b/wxdata/source/scwx/wsr88d/ar2v_file.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include #include #include @@ -59,8 +59,7 @@ public: void IndexFile(); void ParseLDMRecords(); void ParseLDMRecord(std::istream& is); - void ProcessRadarData( - const std::shared_ptr& message); + void ProcessRadarData(const std::shared_ptr& message); std::string tapeFilename_; std::string extensionNumber_; @@ -391,9 +390,10 @@ void Ar2vFileImpl::HandleMessage(std::shared_ptr& message) std::static_pointer_cast(message); break; + case static_cast(rda::MessageId::DigitalRadarData): case static_cast(rda::MessageId::DigitalRadarDataGeneric): ProcessRadarData( - std::static_pointer_cast(message)); + std::static_pointer_cast(message)); break; default: @@ -402,7 +402,7 @@ void Ar2vFileImpl::HandleMessage(std::shared_ptr& message) } void Ar2vFileImpl::ProcessRadarData( - const std::shared_ptr& message) + const std::shared_ptr& message) { std::uint16_t azimuthIndex = message->azimuth_number() - 1; std::uint16_t elevationIndex = message->elevation_number() - 1; @@ -419,18 +419,10 @@ void Ar2vFileImpl::IndexFile() { logger_->debug("Indexing file"); - if (vcpData_ == nullptr) - { - logger_->warn("Cannot index file without VCP data"); - return; - } - for (auto& elevationCut : radarData_) { - std::uint16_t elevationAngle = - vcpData_->elevation_angle_raw(elevationCut.first); - rda::WaveformType waveformType = - vcpData_->waveform_type(elevationCut.first); + std::uint16_t elevationAngle {}; + rda::WaveformType waveformType = rda::WaveformType::Unknown; std::shared_ptr& radial0 = (*elevationCut.second)[0]; @@ -441,6 +433,26 @@ void Ar2vFileImpl::IndexFile() continue; } + std::shared_ptr digitalRadarData0 = nullptr; + + if (vcpData_ != nullptr) + { + elevationAngle = vcpData_->elevation_angle_raw(elevationCut.first); + waveformType = vcpData_->waveform_type(elevationCut.first); + } + else if ((digitalRadarData0 = + std::dynamic_pointer_cast( + (*elevationCut.second)[0])) != nullptr) + { + elevationAngle = digitalRadarData0->elevation_angle_raw(); + } + else + { + // Return here, because we should only have a single message type + logger_->warn("Cannot index file without VCP data"); + return; + } + for (rda::DataBlockType dataBlockType : rda::MomentDataBlockTypeIterator()) { 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 a5f128f1..94492a8e 100644 --- a/wxdata/source/scwx/wsr88d/rda/digital_radar_data_generic.cpp +++ b/wxdata/source/scwx/wsr88d/rda/digital_radar_data_generic.cpp @@ -556,7 +556,7 @@ std::uint8_t DigitalRadarDataGeneric::radial_status() const return p->radialStatus_; } -std::uint8_t DigitalRadarDataGeneric::elevation_number() const +std::uint16_t DigitalRadarDataGeneric::elevation_number() const { return p->elevationNumber_; }