diff --git a/wxdata/include/scwx/wsr88d/level3_file.hpp b/wxdata/include/scwx/wsr88d/level3_file.hpp index ad4bda06..3d730a49 100644 --- a/wxdata/include/scwx/wsr88d/level3_file.hpp +++ b/wxdata/include/scwx/wsr88d/level3_file.hpp @@ -1,5 +1,8 @@ #pragma once +#include +#include + #include #include @@ -22,6 +25,9 @@ public: Level3File(Level3File&&) noexcept; Level3File& operator=(Level3File&&) noexcept; + std::shared_ptr message_header() const; + std::shared_ptr product_symbology_block() const; + bool LoadFile(const std::string& filename); bool LoadData(std::istream& is); diff --git a/wxdata/include/scwx/wsr88d/rpg/product_symbology_block.hpp b/wxdata/include/scwx/wsr88d/rpg/product_symbology_block.hpp index 14527720..93aa3629 100644 --- a/wxdata/include/scwx/wsr88d/rpg/product_symbology_block.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/product_symbology_block.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -26,7 +27,10 @@ public: ProductSymbologyBlock(ProductSymbologyBlock&&) noexcept; ProductSymbologyBlock& operator=(ProductSymbologyBlock&&) noexcept; - int16_t block_divider() const; + int16_t block_divider() const; + uint16_t number_of_layers() const; + + const std::vector>& packet_list(uint16_t i) const; size_t data_size() const override; diff --git a/wxdata/source/scwx/wsr88d/level3_file.cpp b/wxdata/source/scwx/wsr88d/level3_file.cpp index 512636dd..1bd68596 100644 --- a/wxdata/source/scwx/wsr88d/level3_file.cpp +++ b/wxdata/source/scwx/wsr88d/level3_file.cpp @@ -39,17 +39,14 @@ public: bool LoadFileData(std::istream& is); bool LoadBlocks(std::istream& is); - rpg::WmoHeader wmoHeader_; - std::shared_ptr ccbHeader_; - std::shared_ptr innerHeader_; - rpg::Level3MessageHeader messageHeader_; - rpg::ProductDescriptionBlock descriptionBlock_; - - std::shared_ptr symbologyBlock_; - std::shared_ptr graphicBlock_; - std::shared_ptr tabularBlock_; - - size_t numRecords_; + std::shared_ptr wmoHeader_; + std::shared_ptr ccbHeader_; + std::shared_ptr innerHeader_; + std::shared_ptr messageHeader_; + std::shared_ptr descriptionBlock_; + std::shared_ptr symbologyBlock_; + std::shared_ptr graphicBlock_; + std::shared_ptr tabularBlock_; }; Level3File::Level3File() : p(std::make_unique()) {} @@ -58,6 +55,17 @@ Level3File::~Level3File() = default; Level3File::Level3File(Level3File&&) noexcept = default; Level3File& Level3File::operator=(Level3File&&) noexcept = default; +std::shared_ptr Level3File::message_header() const +{ + return p->messageHeader_; +} + +std::shared_ptr +Level3File::product_symbology_block() const +{ + return p->symbologyBlock_; +} + bool Level3File::LoadFile(const std::string& filename) { BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "LoadFile(" << filename << ")"; @@ -83,18 +91,20 @@ bool Level3File::LoadData(std::istream& is) { BOOST_LOG_TRIVIAL(debug) << logPrefix_ << "Loading Data"; - bool dataValid = p->wmoHeader_.Parse(is); + p->wmoHeader_ = std::make_shared(); + + bool dataValid = p->wmoHeader_->Parse(is); if (dataValid) { BOOST_LOG_TRIVIAL(debug) - << logPrefix_ << "Data Type: " << p->wmoHeader_.data_type(); + << logPrefix_ << "Data Type: " << p->wmoHeader_->data_type(); BOOST_LOG_TRIVIAL(debug) - << logPrefix_ << "ICAO: " << p->wmoHeader_.icao(); + << logPrefix_ << "ICAO: " << p->wmoHeader_->icao(); BOOST_LOG_TRIVIAL(debug) - << logPrefix_ << "Date/Time: " << p->wmoHeader_.date_time(); + << logPrefix_ << "Date/Time: " << p->wmoHeader_->date_time(); BOOST_LOG_TRIVIAL(debug) - << logPrefix_ << "Category: " << p->wmoHeader_.product_category(); + << logPrefix_ << "Category: " << p->wmoHeader_->product_category(); // If the header is compressed if (is.peek() == 0x78) @@ -182,21 +192,25 @@ bool Level3FileImpl::DecompressFile(std::istream& is, std::stringstream& ss) bool Level3FileImpl::LoadFileData(std::istream& is) { - bool dataValid = messageHeader_.Parse(is); + messageHeader_ = std::make_shared(); + + bool dataValid = messageHeader_->Parse(is); if (dataValid) { BOOST_LOG_TRIVIAL(debug) - << logPrefix_ << "Code: " << messageHeader_.message_code(); + << logPrefix_ << "Code: " << messageHeader_->message_code(); - dataValid = descriptionBlock_.Parse(is); + descriptionBlock_ = std::make_shared(); + + dataValid = descriptionBlock_->Parse(is); } if (dataValid) { - if (descriptionBlock_.IsCompressionEnabled()) + if (descriptionBlock_->IsCompressionEnabled()) { - size_t messageLength = messageHeader_.length_of_message(); + size_t messageLength = messageHeader_->length_of_message(); size_t prefixLength = rpg::Level3MessageHeader::SIZE + rpg::ProductDescriptionBlock::SIZE; size_t recordSize = @@ -249,9 +263,9 @@ bool Level3FileImpl::LoadBlocks(std::istream& is) rpg::Level3MessageHeader::SIZE + rpg::ProductDescriptionBlock::SIZE; const size_t offsetToSymbology = - descriptionBlock_.offset_to_symbology() * 2u; - const size_t offsetToGraphic = descriptionBlock_.offset_to_graphic() * 2u; - const size_t offsetToTabular = descriptionBlock_.offset_to_tabular() * 2u; + descriptionBlock_->offset_to_symbology() * 2u; + const size_t offsetToGraphic = descriptionBlock_->offset_to_graphic() * 2u; + const size_t offsetToTabular = descriptionBlock_->offset_to_tabular() * 2u; if (offsetToSymbology >= offsetBase) { diff --git a/wxdata/source/scwx/wsr88d/rpg/product_symbology_block.cpp b/wxdata/source/scwx/wsr88d/rpg/product_symbology_block.cpp index c2af7ee5..aa9f10e6 100644 --- a/wxdata/source/scwx/wsr88d/rpg/product_symbology_block.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/product_symbology_block.cpp @@ -53,6 +53,17 @@ int16_t ProductSymbologyBlock::block_divider() const return p->blockDivider_; } +uint16_t ProductSymbologyBlock::number_of_layers() const +{ + return p->numberOfLayers_; +} + +const std::vector>& +ProductSymbologyBlock::packet_list(uint16_t i) const +{ + return p->layerList_[i]; +} + size_t ProductSymbologyBlock::data_size() const { return p->lengthOfBlock_;