mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 07:00:05 +00:00
Digital radar data moment gates and accessors
This commit is contained in:
parent
d648c1db08
commit
ded87eb937
3 changed files with 130 additions and 1 deletions
|
|
@ -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<DigitalRadarData> Create(MessageHeader&& header,
|
||||
|
|
|
|||
|
|
@ -105,6 +105,15 @@ public:
|
|||
});
|
||||
}
|
||||
|
||||
static void SwapVector(std::vector<uint16_t>& v)
|
||||
{
|
||||
std::transform(std::execution::par_unseq,
|
||||
v.begin(),
|
||||
v.end(),
|
||||
v.begin(),
|
||||
[](uint16_t u) { return ntohs(u); });
|
||||
}
|
||||
|
||||
private:
|
||||
std::unique_ptr<MessageImpl> p;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -78,6 +78,9 @@ struct MomentDataBlock : DataBlock
|
|||
float scale_;
|
||||
float offset_;
|
||||
|
||||
std::vector<char> momentGates8_;
|
||||
std::vector<uint16_t> momentGates16_;
|
||||
|
||||
static std::unique_ptr<MomentDataBlock>
|
||||
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<char*>(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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue