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 51751609..0e98111f 100644 --- a/scwx-qt/source/scwx/qt/view/level2_product_view.cpp +++ b/scwx-qt/source/scwx/qt/view/level2_product_view.cpp @@ -90,7 +90,7 @@ public: float selectedElevation_; std::shared_ptr elevationScan_; - std::shared_ptr + std::shared_ptr momentDataBlock0_; std::vector coordinates_ {}; @@ -469,15 +469,15 @@ void Level2ProductView::ComputeSweep() const uint32_t gates = momentData0->number_of_data_moment_gates(); - auto volumeData0 = radarData0->volume_data_block(); - p->latitude_ = volumeData0->latitude(); - p->longitude_ = volumeData0->longitude(); + auto radarSite = radarProductManager->radar_site(); + p->latitude_ = radarSite->latitude(); + p->longitude_ = radarSite->longitude(); p->range_ = momentData0->data_moment_range() + momentData0->data_moment_range_sample_interval() * (gates - 0.5f); p->sweepTime_ = scwx::util::TimePoint(radarData0->modified_julian_date(), radarData0->collection_time()); - p->vcp_ = volumeData0->volume_coverage_pattern_number(); + p->vcp_ = radarData0->volume_coverage_pattern_number(); // Calculate vertices timer.start(); diff --git a/wxdata/include/scwx/wsr88d/ar2v_file.hpp b/wxdata/include/scwx/wsr88d/ar2v_file.hpp index 87628fd6..0df24765 100644 --- a/wxdata/include/scwx/wsr88d/ar2v_file.hpp +++ b/wxdata/include/scwx/wsr88d/ar2v_file.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include 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 e86e6534..ba246eee 100644 --- a/wxdata/include/scwx/wsr88d/rda/digital_radar_data_generic.hpp +++ b/wxdata/include/scwx/wsr88d/rda/digital_radar_data_generic.hpp @@ -1,10 +1,6 @@ #pragma once -#include -#include - -#include -#include +#include namespace scwx { @@ -13,30 +9,7 @@ namespace wsr88d namespace rda { -enum class DataBlockType -{ - Volume, - Elevation, - Radial, - MomentRef, - MomentVel, - MomentSw, - MomentZdr, - MomentPhi, - MomentRho, - MomentCfp, - Unknown -}; -typedef util:: - Iterator - MomentDataBlockTypeIterator; - -class DigitalRadarDataGeneric; - -typedef std::map> - ElevationScan; - -class DigitalRadarDataGeneric : public Level2Message +class DigitalRadarDataGeneric : public GenericRadarData { public: class DataBlock; @@ -69,11 +42,13 @@ public: std::uint8_t radial_spot_blanking_status() const; std::uint8_t azimuth_indexing_mode() const; std::uint16_t data_block_count() const; + std::uint16_t volume_coverage_pattern_number() const; std::shared_ptr elevation_data_block() const; std::shared_ptr radial_data_block() const; std::shared_ptr volume_data_block() const; - std::shared_ptr moment_data_block(DataBlockType type) const; + std::shared_ptr + moment_data_block(DataBlockType type) const; bool Parse(std::istream& is); @@ -128,7 +103,9 @@ private: bool Parse(std::istream& is); }; -class DigitalRadarDataGeneric::MomentDataBlock : public DataBlock +class DigitalRadarDataGeneric::MomentDataBlock : + public DataBlock, + public GenericRadarData::MomentDataBlock { public: explicit MomentDataBlock(const std::string& dataBlockType, diff --git a/wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp b/wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp new file mode 100644 index 00000000..532cbe02 --- /dev/null +++ b/wxdata/include/scwx/wsr88d/rda/generic_radar_data.hpp @@ -0,0 +1,97 @@ +#pragma once + +#include +#include + +#include +#include + +namespace scwx +{ +namespace wsr88d +{ +namespace rda +{ + +enum class DataBlockType +{ + Volume, + Elevation, + Radial, + MomentRef, + MomentVel, + MomentSw, + MomentZdr, + MomentPhi, + MomentRho, + MomentCfp, + Unknown +}; +typedef util:: + Iterator + MomentDataBlockTypeIterator; + +class GenericRadarData; + +typedef std::map> + ElevationScan; + +class GenericRadarData : public Level2Message +{ +public: + class MomentDataBlock; + + explicit GenericRadarData(); + virtual ~GenericRadarData(); + + GenericRadarData(const GenericRadarData&) = delete; + GenericRadarData& operator=(const GenericRadarData&) = delete; + + GenericRadarData(GenericRadarData&&) noexcept; + GenericRadarData& operator=(GenericRadarData&&) noexcept; + + 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 volume_coverage_pattern_number() const = 0; + + virtual std::shared_ptr + moment_data_block(DataBlockType type) const = 0; + +private: + class Impl; + std::unique_ptr p; +}; + +class GenericRadarData::MomentDataBlock +{ +public: + explicit MomentDataBlock(); + virtual ~MomentDataBlock(); + + MomentDataBlock(const MomentDataBlock&) = delete; + MomentDataBlock& operator=(const MomentDataBlock&) = delete; + + MomentDataBlock(MomentDataBlock&&) noexcept; + MomentDataBlock& operator=(MomentDataBlock&&) noexcept; + + virtual std::uint16_t number_of_data_moment_gates() const = 0; + virtual units::kilometers data_moment_range() const = 0; + virtual std::uint16_t data_moment_range_raw() const = 0; + virtual units::kilometers + data_moment_range_sample_interval() const = 0; + virtual std::uint16_t data_moment_range_sample_interval_raw() const = 0; + virtual std::int16_t snr_threshold_raw() const = 0; + virtual std::uint8_t data_word_size() const = 0; + virtual float scale() const = 0; + virtual float offset() const = 0; + virtual const void* data_moments() const = 0; + +private: + class Impl; + std::unique_ptr p; +}; + +} // namespace rda +} // namespace wsr88d +} // namespace scwx diff --git a/wxdata/source/scwx/wsr88d/ar2v_file.cpp b/wxdata/source/scwx/wsr88d/ar2v_file.cpp index 23c76e03..c78aa2d3 100644 --- a/wxdata/source/scwx/wsr88d/ar2v_file.cpp +++ b/wxdata/source/scwx/wsr88d/ar2v_file.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -109,7 +110,7 @@ std::chrono::system_clock::time_point Ar2vFile::end_time() const if (p->radarData_.size() > 0) { - std::shared_ptr lastRadial = + std::shared_ptr lastRadial = p->radarData_.crbegin()->second->crbegin()->second; endTime = util::TimePoint(lastRadial->modified_julian_date(), @@ -431,7 +432,7 @@ void Ar2vFileImpl::IndexFile() rda::WaveformType waveformType = vcpData_->waveform_type(elevationCut.first); - std::shared_ptr& radial0 = + std::shared_ptr& radial0 = (*elevationCut.second)[0]; if (radial0 == nullptr) 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 ca27b181..a5f128f1 100644 --- a/wxdata/source/scwx/wsr88d/rda/digital_radar_data_generic.cpp +++ b/wxdata/source/scwx/wsr88d/rda/digital_radar_data_generic.cpp @@ -501,7 +501,7 @@ public: }; DigitalRadarDataGeneric::DigitalRadarDataGeneric() : - Level2Message(), p(std::make_unique()) + GenericRadarData(), p(std::make_unique()) { } DigitalRadarDataGeneric::~DigitalRadarDataGeneric() = default; @@ -586,6 +586,18 @@ std::uint16_t DigitalRadarDataGeneric::data_block_count() const return p->dataBlockCount_; } +std::uint16_t DigitalRadarDataGeneric::volume_coverage_pattern_number() const +{ + std::uint16_t vcpNumber = 0; + + if (p->volumeDataBlock_ != nullptr) + { + vcpNumber = p->volumeDataBlock_->volume_coverage_pattern_number(); + } + + return vcpNumber; +} + std::shared_ptr DigitalRadarDataGeneric::elevation_data_block() const { @@ -604,7 +616,7 @@ DigitalRadarDataGeneric::volume_data_block() const return p->volumeDataBlock_; } -std::shared_ptr +std::shared_ptr DigitalRadarDataGeneric::moment_data_block(DataBlockType type) const { std::shared_ptr momentDataBlock = nullptr; diff --git a/wxdata/source/scwx/wsr88d/rda/generic_radar_data.cpp b/wxdata/source/scwx/wsr88d/rda/generic_radar_data.cpp new file mode 100644 index 00000000..1ca7e237 --- /dev/null +++ b/wxdata/source/scwx/wsr88d/rda/generic_radar_data.cpp @@ -0,0 +1,61 @@ +#include +#include + +namespace scwx +{ +namespace wsr88d +{ +namespace rda +{ + +static const std::string logPrefix_ = "scwx::wsr88d::rda::generic_radar_data"; + +static const std::unordered_map strToDataBlock_ { + {"VOL", DataBlockType::Volume}, + {"ELV", DataBlockType::Elevation}, + {"RAD", DataBlockType::Radial}, + {"REF", DataBlockType::MomentRef}, + {"VEL", DataBlockType::MomentVel}, + {"SW ", DataBlockType::MomentSw}, + {"ZDR", DataBlockType::MomentZdr}, + {"PHI", DataBlockType::MomentPhi}, + {"RHO", DataBlockType::MomentRho}, + {"CFP", DataBlockType::MomentCfp}}; + +class GenericRadarData::MomentDataBlock::Impl +{ +public: + explicit Impl() {} +}; + +GenericRadarData::MomentDataBlock::MomentDataBlock() : + p(std::make_unique()) +{ +} +GenericRadarData::MomentDataBlock::~MomentDataBlock() = default; + +GenericRadarData::MomentDataBlock::MomentDataBlock(MomentDataBlock&&) noexcept = + default; +GenericRadarData::MomentDataBlock& GenericRadarData::MomentDataBlock::operator=( + MomentDataBlock&&) noexcept = default; + +class GenericRadarData::Impl +{ +public: + explicit Impl() {}; + ~Impl() = default; +}; + +GenericRadarData::GenericRadarData() : + Level2Message(), p(std::make_unique()) +{ +} +GenericRadarData::~GenericRadarData() = default; + +GenericRadarData::GenericRadarData(GenericRadarData&&) noexcept = default; +GenericRadarData& +GenericRadarData::operator=(GenericRadarData&&) noexcept = default; + +} // namespace rda +} // namespace wsr88d +} // namespace scwx diff --git a/wxdata/wxdata.cmake b/wxdata/wxdata.cmake index 047ff40d..0652d898 100644 --- a/wxdata/wxdata.cmake +++ b/wxdata/wxdata.cmake @@ -104,6 +104,7 @@ set(HDR_WSR88D_RDA include/scwx/wsr88d/rda/clutter_filter_bypass_map.hpp include/scwx/wsr88d/rda/clutter_filter_map.hpp include/scwx/wsr88d/rda/digital_radar_data.hpp include/scwx/wsr88d/rda/digital_radar_data_generic.hpp + include/scwx/wsr88d/rda/generic_radar_data.hpp include/scwx/wsr88d/rda/level2_message.hpp include/scwx/wsr88d/rda/level2_message_factory.hpp include/scwx/wsr88d/rda/level2_message_header.hpp @@ -116,6 +117,7 @@ set(SRC_WSR88D_RDA source/scwx/wsr88d/rda/clutter_filter_bypass_map.cpp source/scwx/wsr88d/rda/clutter_filter_map.cpp source/scwx/wsr88d/rda/digital_radar_data.cpp source/scwx/wsr88d/rda/digital_radar_data_generic.cpp + source/scwx/wsr88d/rda/generic_radar_data.cpp source/scwx/wsr88d/rda/level2_message.cpp source/scwx/wsr88d/rda/level2_message_factory.cpp source/scwx/wsr88d/rda/level2_message_header.cpp