From 3ae001c3b9346f975a5b89ba88fc4482a06e621f Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Wed, 12 Oct 2022 00:12:53 -0500 Subject: [PATCH] Exposing additional data from text products and messages --- .../include/scwx/awips/text_product_file.hpp | 7 +- .../scwx/awips/text_product_message.hpp | 65 ++++++++++++++- .../source/scwx/awips/text_product_file.cpp | 6 ++ .../scwx/awips/text_product_message.cpp | 82 ++++++------------- 4 files changed, 100 insertions(+), 60 deletions(-) diff --git a/wxdata/include/scwx/awips/text_product_file.hpp b/wxdata/include/scwx/awips/text_product_file.hpp index eec4baa2..478a93b4 100644 --- a/wxdata/include/scwx/awips/text_product_file.hpp +++ b/wxdata/include/scwx/awips/text_product_file.hpp @@ -18,14 +18,15 @@ public: explicit TextProductFile(); ~TextProductFile(); - TextProductFile(const TextProductFile&) = delete; + TextProductFile(const TextProductFile&) = delete; TextProductFile& operator=(const TextProductFile&) = delete; TextProductFile(TextProductFile&&) noexcept; TextProductFile& operator=(TextProductFile&&) noexcept; - size_t message_count() const; - std::shared_ptr message(size_t i) const; + size_t message_count() const; + std::vector> messages() const; + std::shared_ptr message(size_t i) const; bool LoadFile(const std::string& filename); bool LoadData(std::istream& is); diff --git a/wxdata/include/scwx/awips/text_product_message.hpp b/wxdata/include/scwx/awips/text_product_message.hpp index bdfe630c..db74304b 100644 --- a/wxdata/include/scwx/awips/text_product_message.hpp +++ b/wxdata/include/scwx/awips/text_product_message.hpp @@ -1,16 +1,72 @@ #pragma once +#include +#include +#include #include #include #include #include +#include namespace scwx { namespace awips { +struct Vtec +{ + PVtec pVtec_; + std::string hVtec_; + + Vtec() : pVtec_ {}, hVtec_ {} {} + + Vtec(const Vtec&) = delete; + Vtec& operator=(const Vtec&) = delete; + + Vtec(Vtec&&) noexcept = default; + Vtec& operator=(Vtec&&) noexcept = default; +}; + +struct SegmentHeader +{ + std::string ugcString_; + std::vector vtecString_; + std::vector ugcNames_; + std::string issuanceDateTime_; + + SegmentHeader() : + ugcString_ {}, vtecString_ {}, ugcNames_ {}, issuanceDateTime_ {} + { + } + + SegmentHeader(const SegmentHeader&) = delete; + SegmentHeader& operator=(const SegmentHeader&) = delete; + + SegmentHeader(SegmentHeader&&) noexcept = default; + SegmentHeader& operator=(SegmentHeader&&) noexcept = default; +}; + +struct Segment +{ + std::optional header_; + std::vector productContent_; + std::optional codedLocation_; + std::optional codedMotion_; + + Segment() : + header_ {}, productContent_ {}, codedLocation_ {}, codedMotion_ {} + { + } + + Segment(const Segment&) = delete; + Segment& operator=(const Segment&) = delete; + + Segment(Segment&&) noexcept = default; + Segment& operator=(Segment&&) noexcept = default; +}; + class TextProductMessageImpl; class TextProductMessage : public Message @@ -19,13 +75,18 @@ public: explicit TextProductMessage(); ~TextProductMessage(); - TextProductMessage(const TextProductMessage&) = delete; + TextProductMessage(const TextProductMessage&) = delete; TextProductMessage& operator=(const TextProductMessage&) = delete; TextProductMessage(TextProductMessage&&) noexcept; TextProductMessage& operator=(TextProductMessage&&) noexcept; - std::shared_ptr wmo_header() const; + std::shared_ptr wmo_header() const; + std::vector mnd_header() const; + std::vector overview_block() const; + size_t segment_count() const; + std::vector> segments() const; + std::shared_ptr segment(size_t s) const; size_t data_size() const; diff --git a/wxdata/source/scwx/awips/text_product_file.cpp b/wxdata/source/scwx/awips/text_product_file.cpp index 1e738ef6..ea99aeda 100644 --- a/wxdata/source/scwx/awips/text_product_file.cpp +++ b/wxdata/source/scwx/awips/text_product_file.cpp @@ -34,6 +34,12 @@ size_t TextProductFile::message_count() const return p->messages_.size(); } +std::vector> +TextProductFile::messages() const +{ + return p->messages_; +} + std::shared_ptr TextProductFile::message(size_t i) const { return p->messages_[i]; diff --git a/wxdata/source/scwx/awips/text_product_message.cpp b/wxdata/source/scwx/awips/text_product_message.cpp index f5753a8a..217a0d96 100644 --- a/wxdata/source/scwx/awips/text_product_message.cpp +++ b/wxdata/source/scwx/awips/text_product_message.cpp @@ -1,7 +1,4 @@ #include -#include -#include -#include #include #include @@ -24,58 +21,6 @@ static const std::string logPrefix_ = "scwx::awips::text_product_message"; // Look for hhmm (xM|UTC) to key the date/time string static const std::regex reDateTimeString {"^[0-9]{3,4} ([AP]M|UTC)"}; -struct Vtec -{ - PVtec pVtec_; - std::string hVtec_; - - Vtec() : pVtec_ {}, hVtec_ {} {} - - Vtec(const Vtec&) = delete; - Vtec& operator=(const Vtec&) = delete; - - Vtec(Vtec&&) noexcept = default; - Vtec& operator=(Vtec&&) noexcept = default; -}; - -struct SegmentHeader -{ - std::string ugcString_; - std::vector vtecString_; - std::vector ugcNames_; - std::string issuanceDateTime_; - - SegmentHeader() : - ugcString_ {}, vtecString_ {}, ugcNames_ {}, issuanceDateTime_ {} - { - } - - SegmentHeader(const SegmentHeader&) = delete; - SegmentHeader& operator=(const SegmentHeader&) = delete; - - SegmentHeader(SegmentHeader&&) noexcept = default; - SegmentHeader& operator=(SegmentHeader&&) noexcept = default; -}; - -struct Segment -{ - std::optional header_; - std::vector productContent_; - std::optional codedLocation_; - std::optional codedMotion_; - - Segment() : - header_ {}, productContent_ {}, codedLocation_ {}, codedMotion_ {} - { - } - - Segment(const Segment&) = delete; - Segment& operator=(const Segment&) = delete; - - Segment(Segment&&) noexcept = default; - Segment& operator=(Segment&&) noexcept = default; -}; - static void ParseCodedInformation(std::shared_ptr segment, const std::string& wfo); static std::vector ParseProductContent(std::istream& is); @@ -113,6 +58,33 @@ std::shared_ptr TextProductMessage::wmo_header() const return p->wmoHeader_; } +std::vector TextProductMessage::mnd_header() const +{ + return p->mndHeader_; +} + +std::vector TextProductMessage::overview_block() const +{ + return p->overviewBlock_; +} + +size_t TextProductMessage::segment_count() const +{ + return p->segments_.size(); +} + +std::vector> TextProductMessage::segments() const +{ + std::vector> segments(p->segments_.cbegin(), + p->segments_.cend()); + return segments; +} + +std::shared_ptr TextProductMessage::segment(size_t s) const +{ + return p->segments_[s]; +} + size_t TextProductMessage::data_size() const { return 0;