Add Generic Radar Data as a common base class to message types 1 and 31

This commit is contained in:
Dan Paulat 2024-01-22 23:01:29 -06:00
parent b8b0812ce6
commit 571d0b2ce9
8 changed files with 191 additions and 41 deletions

View file

@ -90,7 +90,7 @@ public:
float selectedElevation_;
std::shared_ptr<wsr88d::rda::ElevationScan> elevationScan_;
std::shared_ptr<wsr88d::rda::DigitalRadarDataGeneric::MomentDataBlock>
std::shared_ptr<wsr88d::rda::GenericRadarData::MomentDataBlock>
momentDataBlock0_;
std::vector<float> 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();

View file

@ -1,7 +1,7 @@
#pragma once
#include <scwx/wsr88d/nexrad_file.hpp>
#include <scwx/wsr88d/rda/digital_radar_data_generic.hpp>
#include <scwx/wsr88d/rda/generic_radar_data.hpp>
#include <scwx/wsr88d/rda/volume_coverage_pattern_data.hpp>
#include <chrono>

View file

@ -1,10 +1,6 @@
#pragma once
#include <scwx/util/iterator.hpp>
#include <scwx/wsr88d/rda/level2_message.hpp>
#include <units/angle.h>
#include <units/length.h>
#include <scwx/wsr88d/rda/generic_radar_data.hpp>
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<DataBlockType, DataBlockType::MomentRef, DataBlockType::MomentCfp>
MomentDataBlockTypeIterator;
class DigitalRadarDataGeneric;
typedef std::map<std::uint16_t, std::shared_ptr<DigitalRadarDataGeneric>>
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<ElevationDataBlock> elevation_data_block() const;
std::shared_ptr<RadialDataBlock> radial_data_block() const;
std::shared_ptr<VolumeDataBlock> volume_data_block() const;
std::shared_ptr<MomentDataBlock> moment_data_block(DataBlockType type) const;
std::shared_ptr<GenericRadarData::MomentDataBlock>
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,

View file

@ -0,0 +1,97 @@
#pragma once
#include <scwx/util/iterator.hpp>
#include <scwx/wsr88d/rda/level2_message.hpp>
#include <units/angle.h>
#include <units/length.h>
namespace scwx
{
namespace wsr88d
{
namespace rda
{
enum class DataBlockType
{
Volume,
Elevation,
Radial,
MomentRef,
MomentVel,
MomentSw,
MomentZdr,
MomentPhi,
MomentRho,
MomentCfp,
Unknown
};
typedef util::
Iterator<DataBlockType, DataBlockType::MomentRef, DataBlockType::MomentCfp>
MomentDataBlockTypeIterator;
class GenericRadarData;
typedef std::map<std::uint16_t, std::shared_ptr<GenericRadarData>>
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<float> azimuth_angle() const = 0;
virtual std::uint16_t volume_coverage_pattern_number() const = 0;
virtual std::shared_ptr<MomentDataBlock>
moment_data_block(DataBlockType type) const = 0;
private:
class Impl;
std::unique_ptr<Impl> 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<float> data_moment_range() const = 0;
virtual std::uint16_t data_moment_range_raw() const = 0;
virtual units::kilometers<float>
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<Impl> p;
};
} // namespace rda
} // namespace wsr88d
} // namespace scwx

View file

@ -1,4 +1,5 @@
#include <scwx/wsr88d/ar2v_file.hpp>
#include <scwx/wsr88d/rda/digital_radar_data_generic.hpp>
#include <scwx/wsr88d/rda/level2_message_factory.hpp>
#include <scwx/wsr88d/rda/rda_types.hpp>
#include <scwx/util/logger.hpp>
@ -109,7 +110,7 @@ std::chrono::system_clock::time_point Ar2vFile::end_time() const
if (p->radarData_.size() > 0)
{
std::shared_ptr<rda::DigitalRadarDataGeneric> lastRadial =
std::shared_ptr<rda::GenericRadarData> 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<rda::DigitalRadarDataGeneric>& radial0 =
std::shared_ptr<rda::GenericRadarData>& radial0 =
(*elevationCut.second)[0];
if (radial0 == nullptr)

View file

@ -501,7 +501,7 @@ public:
};
DigitalRadarDataGeneric::DigitalRadarDataGeneric() :
Level2Message(), p(std::make_unique<Impl>())
GenericRadarData(), p(std::make_unique<Impl>())
{
}
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::ElevationDataBlock>
DigitalRadarDataGeneric::elevation_data_block() const
{
@ -604,7 +616,7 @@ DigitalRadarDataGeneric::volume_data_block() const
return p->volumeDataBlock_;
}
std::shared_ptr<DigitalRadarDataGeneric::MomentDataBlock>
std::shared_ptr<GenericRadarData::MomentDataBlock>
DigitalRadarDataGeneric::moment_data_block(DataBlockType type) const
{
std::shared_ptr<MomentDataBlock> momentDataBlock = nullptr;

View file

@ -0,0 +1,61 @@
#include <scwx/wsr88d/rda/generic_radar_data.hpp>
#include <scwx/util/logger.hpp>
namespace scwx
{
namespace wsr88d
{
namespace rda
{
static const std::string logPrefix_ = "scwx::wsr88d::rda::generic_radar_data";
static const std::unordered_map<std::string, DataBlockType> 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<Impl>())
{
}
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<Impl>())
{
}
GenericRadarData::~GenericRadarData() = default;
GenericRadarData::GenericRadarData(GenericRadarData&&) noexcept = default;
GenericRadarData&
GenericRadarData::operator=(GenericRadarData&&) noexcept = default;
} // namespace rda
} // namespace wsr88d
} // namespace scwx

View file

@ -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