mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 14:20: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(DigitalRadarData&&) noexcept;
|
||||||
DigitalRadarData& operator=(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);
|
bool Parse(std::istream& is);
|
||||||
|
|
||||||
static std::unique_ptr<DigitalRadarData> Create(MessageHeader&& header,
|
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:
|
private:
|
||||||
std::unique_ptr<MessageImpl> p;
|
std::unique_ptr<MessageImpl> p;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,9 @@ struct MomentDataBlock : DataBlock
|
||||||
float scale_;
|
float scale_;
|
||||||
float offset_;
|
float offset_;
|
||||||
|
|
||||||
|
std::vector<char> momentGates8_;
|
||||||
|
std::vector<uint16_t> momentGates16_;
|
||||||
|
|
||||||
static std::unique_ptr<MomentDataBlock>
|
static std::unique_ptr<MomentDataBlock>
|
||||||
Create(const std::string& dataBlockType,
|
Create(const std::string& dataBlockType,
|
||||||
const std::string& dataName,
|
const std::string& dataName,
|
||||||
|
|
@ -107,7 +110,33 @@ struct MomentDataBlock : DataBlock
|
||||||
p->scale_ = Message::SwapFloat(p->scale_);
|
p->scale_ = Message::SwapFloat(p->scale_);
|
||||||
p->offset_ = Message::SwapFloat(p->offset_);
|
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;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
@ -360,6 +389,81 @@ DigitalRadarData::DigitalRadarData(DigitalRadarData&&) noexcept = default;
|
||||||
DigitalRadarData&
|
DigitalRadarData&
|
||||||
DigitalRadarData::operator=(DigitalRadarData&&) noexcept = default;
|
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)
|
bool DigitalRadarData::Parse(std::istream& is)
|
||||||
{
|
{
|
||||||
BOOST_LOG_TRIVIAL(debug)
|
BOOST_LOG_TRIVIAL(debug)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue