diff --git a/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp b/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp index 3bf72966..196353d9 100644 --- a/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp +++ b/wxdata/include/scwx/wsr88d/rda/digital_radar_data.hpp @@ -23,6 +23,22 @@ public: DigitalRadarData(DigitalRadarData&&) noexcept; DigitalRadarData& operator=(DigitalRadarData&&) noexcept; + const std::string& radar_identifier() const; + uint32_t collection_time() const; + uint16_t modified_julian_date() const; + uint16_t azimuth_number() const; + float azimuth_angle() const; + uint8_t compression_indicator() const; + uint16_t radial_length() const; + uint8_t azimuth_resolution_spacing() const; + uint8_t radial_status() const; + uint8_t elevation_number() const; + uint8_t cut_sector_number() const; + float elevation_angle() const; + uint8_t radial_spot_blanking_status() const; + uint8_t azimuth_indexing_mode() const; + uint16_t data_block_count() const; + bool Parse(std::istream& is); static std::unique_ptr Create(MessageHeader&& header, diff --git a/wxdata/include/scwx/wsr88d/rda/message.hpp b/wxdata/include/scwx/wsr88d/rda/message.hpp index aef7cdb4..cf23fb83 100644 --- a/wxdata/include/scwx/wsr88d/rda/message.hpp +++ b/wxdata/include/scwx/wsr88d/rda/message.hpp @@ -105,6 +105,15 @@ public: }); } + static void SwapVector(std::vector& v) + { + std::transform(std::execution::par_unseq, + v.begin(), + v.end(), + v.begin(), + [](uint16_t u) { return ntohs(u); }); + } + private: std::unique_ptr p; }; diff --git a/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp b/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp index 6ddd425b..1f755c9d 100644 --- a/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp +++ b/wxdata/source/scwx/wsr88d/rda/digital_radar_data.cpp @@ -78,6 +78,9 @@ struct MomentDataBlock : DataBlock float scale_; float offset_; + std::vector momentGates8_; + std::vector momentGates16_; + static std::unique_ptr Create(const std::string& dataBlockType, const std::string& dataName, @@ -107,7 +110,33 @@ struct MomentDataBlock : DataBlock p->scale_ = Message::SwapFloat(p->scale_); p->offset_ = Message::SwapFloat(p->offset_); - // TODO: Moment gates + if (p->numberOfDataMomentGates_ >= 0 && + p->numberOfDataMomentGates_ <= 1840) + { + if (p->dataWordSize_ == 8) + { + p->momentGates8_.resize(p->numberOfDataMomentGates_); + is.read(p->momentGates8_.data(), p->numberOfDataMomentGates_); + } + else if (p->dataWordSize_ == 16) + { + p->momentGates16_.resize(p->numberOfDataMomentGates_); + is.read(reinterpret_cast(p->momentGates16_.data()), + p->numberOfDataMomentGates_ * 2); + Message::SwapVector(p->momentGates16_); + } + else + { + BOOST_LOG_TRIVIAL(warning) + << logPrefix_ << "Invalid data word size: " << p->dataWordSize_; + } + } + else + { + BOOST_LOG_TRIVIAL(warning) + << logPrefix_ << "Invalid number of data moment gates: " + << p->numberOfDataMomentGates_; + } return p; } @@ -360,6 +389,81 @@ DigitalRadarData::DigitalRadarData(DigitalRadarData&&) noexcept = default; DigitalRadarData& DigitalRadarData::operator=(DigitalRadarData&&) noexcept = default; +const std::string& DigitalRadarData::radar_identifier() const +{ + return p->radarIdentifier_; +} + +uint32_t DigitalRadarData::collection_time() const +{ + return p->collectionTime_; +} + +uint16_t DigitalRadarData::modified_julian_date() const +{ + return p->modifiedJulianDate_; +} + +uint16_t DigitalRadarData::azimuth_number() const +{ + return p->azimuthNumber_; +} + +float DigitalRadarData::azimuth_angle() const +{ + return p->azimuthAngle_; +} + +uint8_t DigitalRadarData::compression_indicator() const +{ + return p->compressionIndicator_; +} + +uint16_t DigitalRadarData::radial_length() const +{ + return p->radialLength_; +} + +uint8_t DigitalRadarData::azimuth_resolution_spacing() const +{ + return p->azimuthResolutionSpacing_; +} + +uint8_t DigitalRadarData::radial_status() const +{ + return p->radialStatus_; +} + +uint8_t DigitalRadarData::elevation_number() const +{ + return p->elevationNumber_; +} + +uint8_t DigitalRadarData::cut_sector_number() const +{ + return p->cutSectorNumber_; +} + +float DigitalRadarData::elevation_angle() const +{ + return p->elevationAngle_; +} + +uint8_t DigitalRadarData::radial_spot_blanking_status() const +{ + return p->radialSpotBlankingStatus_; +} + +uint8_t DigitalRadarData::azimuth_indexing_mode() const +{ + return p->azimuthIndexingMode_; +} + +uint16_t DigitalRadarData::data_block_count() const +{ + return p->dataBlockCount_; +} + bool DigitalRadarData::Parse(std::istream& is) { BOOST_LOG_TRIVIAL(debug)