Add scaled values for ranges and angles in Digital Radar Data

This commit is contained in:
Dan Paulat 2024-01-22 21:37:33 -06:00
parent 807d98d7ef
commit 5058e3493c
2 changed files with 79 additions and 31 deletions

View file

@ -2,6 +2,9 @@
#include <scwx/wsr88d/rda/level2_message.hpp> #include <scwx/wsr88d/rda/level2_message.hpp>
#include <units/angle.h>
#include <units/length.h>
namespace scwx namespace scwx
{ {
namespace wsr88d namespace wsr88d
@ -21,31 +24,37 @@ public:
DigitalRadarData(DigitalRadarData&&) noexcept; DigitalRadarData(DigitalRadarData&&) noexcept;
DigitalRadarData& operator=(DigitalRadarData&&) noexcept; DigitalRadarData& operator=(DigitalRadarData&&) noexcept;
std::uint32_t collection_time() const; std::uint32_t collection_time() const;
std::uint16_t modified_julian_date() const; std::uint16_t modified_julian_date() const;
std::uint16_t unambiguous_range() const; std::uint16_t unambiguous_range() const;
std::uint16_t azimuth_angle() const; std::uint16_t azimuth_angle_raw() const;
std::uint16_t azimuth_number() const; units::degrees<float> azimuth_angle() const;
std::uint16_t radial_status() const; std::uint16_t azimuth_number() const;
std::uint16_t elevation_angle() const; std::uint16_t radial_status() const;
std::uint16_t elevation_number() const; std::uint16_t elevation_angle_raw() const;
std::uint16_t surveillance_range() const; units::degrees<float> elevation_angle() const;
std::uint16_t doppler_range() const; std::uint16_t elevation_number() const;
std::uint16_t surveillance_range_sample_interval() const; std::uint16_t surveillance_range_raw() const;
std::uint16_t doppler_range_sample_interval() const; units::kilometers<float> surveillance_range() const;
std::uint16_t number_of_surveillance_bins() const; std::uint16_t doppler_range_raw() const;
std::uint16_t number_of_doppler_bins() const; units::kilometers<float> doppler_range() const;
std::uint16_t cut_sector_number() const; std::uint16_t surveillance_range_sample_interval_raw() const;
float calibration_constant() const; units::kilometers<float> surveillance_range_sample_interval() const;
std::uint16_t surveillance_pointer() const; std::uint16_t doppler_range_sample_interval_raw() const;
std::uint16_t velocity_pointer() const; units::kilometers<float> doppler_range_sample_interval() const;
std::uint16_t spectral_width_pointer() const; std::uint16_t number_of_surveillance_bins() const;
std::uint16_t doppler_velocity_resolution() const; std::uint16_t number_of_doppler_bins() const;
std::uint16_t volume_coverage_pattern_number() const; std::uint16_t cut_sector_number() const;
std::uint16_t nyquist_velocity() const; float calibration_constant() const;
std::uint16_t atmos() const; std::uint16_t surveillance_pointer() const;
std::uint16_t tover() const; std::uint16_t velocity_pointer() const;
std::uint16_t radial_spot_blanking_status() 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); bool Parse(std::istream& is);

View file

@ -11,6 +11,12 @@ namespace rda
static const std::string logPrefix_ = "scwx::wsr88d::rda::digital_radar_data"; static const std::string logPrefix_ = "scwx::wsr88d::rda::digital_radar_data";
static const auto logger_ = util::Logger::Create(logPrefix_); 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 class DigitalRadarData::Impl
{ {
public: public:
@ -73,11 +79,16 @@ std::uint16_t DigitalRadarData::unambiguous_range() const
return p->unambiguousRange_; return p->unambiguousRange_;
} }
std::uint16_t DigitalRadarData::azimuth_angle() const std::uint16_t DigitalRadarData::azimuth_angle_raw() const
{ {
return p->azimuthAngle_; return p->azimuthAngle_;
} }
units::degrees<float> DigitalRadarData::azimuth_angle() const
{
return units::degrees<float> {p->azimuthAngle_ * kAngleDataScale};
}
std::uint16_t DigitalRadarData::azimuth_number() const std::uint16_t DigitalRadarData::azimuth_number() const
{ {
return p->azimuthNumber_; return p->azimuthNumber_;
@ -88,36 +99,64 @@ std::uint16_t DigitalRadarData::radial_status() const
return p->radialStatus_; return p->radialStatus_;
} }
std::uint16_t DigitalRadarData::elevation_angle() const std::uint16_t DigitalRadarData::elevation_angle_raw() const
{ {
return p->elevationAngle_; return p->elevationAngle_;
} }
units::degrees<float> DigitalRadarData::elevation_angle() const
{
return units::degrees<float> {p->elevationAngle_ * kAngleDataScale};
}
std::uint16_t DigitalRadarData::elevation_number() const std::uint16_t DigitalRadarData::elevation_number() const
{ {
return p->elevationNumber_; return p->elevationNumber_;
} }
std::uint16_t DigitalRadarData::surveillance_range() const std::uint16_t DigitalRadarData::surveillance_range_raw() const
{ {
return p->surveillanceRange_; return p->surveillanceRange_;
} }
std::uint16_t DigitalRadarData::doppler_range() const units::kilometers<float> DigitalRadarData::surveillance_range() const
{
return units::kilometers<float> {p->surveillanceRange_ * kRangeScale};
}
std::uint16_t DigitalRadarData::doppler_range_raw() const
{ {
return p->dopplerRange_; return p->dopplerRange_;
} }
std::uint16_t DigitalRadarData::surveillance_range_sample_interval() const units::kilometers<float> DigitalRadarData::doppler_range() const
{
return units::kilometers<float> {p->dopplerRange_ * kRangeScale};
}
std::uint16_t DigitalRadarData::surveillance_range_sample_interval_raw() const
{ {
return p->surveillanceRangeSampleInterval_; return p->surveillanceRangeSampleInterval_;
} }
std::uint16_t DigitalRadarData::doppler_range_sample_interval() const units::kilometers<float>
DigitalRadarData::surveillance_range_sample_interval() const
{
return units::kilometers<float> {p->surveillanceRangeSampleInterval_ *
kRangeScale};
}
std::uint16_t DigitalRadarData::doppler_range_sample_interval_raw() const
{ {
return p->dopplerRangeSampleInterval_; return p->dopplerRangeSampleInterval_;
} }
units::kilometers<float> DigitalRadarData::doppler_range_sample_interval() const
{
return units::kilometers<float> {p->dopplerRangeSampleInterval_ *
kRangeScale};
}
std::uint16_t DigitalRadarData::number_of_surveillance_bins() const std::uint16_t DigitalRadarData::number_of_surveillance_bins() const
{ {
return p->numberOfSurveillanceBins_; return p->numberOfSurveillanceBins_;