From 803dfdd4558c12d78f38a672cf90769b6683720b Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Thu, 4 Jul 2024 10:18:06 -0500 Subject: [PATCH] Adding event begin and event end functions for segments --- .../scwx/awips/text_product_message.hpp | 5 +++ .../scwx/awips/text_product_message.cpp | 32 +++++++++++++++---- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/wxdata/include/scwx/awips/text_product_message.hpp b/wxdata/include/scwx/awips/text_product_message.hpp index a83f7b82..d402cfd5 100644 --- a/wxdata/include/scwx/awips/text_product_message.hpp +++ b/wxdata/include/scwx/awips/text_product_message.hpp @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -57,6 +58,7 @@ struct SegmentHeader struct Segment { + std::shared_ptr wmoHeader_ {}; std::optional header_ {}; std::vector productContent_ {}; std::optional codedLocation_ {}; @@ -73,6 +75,9 @@ struct Segment Segment(Segment&&) noexcept = default; Segment& operator=(Segment&&) noexcept = default; + + std::chrono::system_clock::time_point event_begin() const; + std::chrono::system_clock::time_point event_end() const; }; class TextProductMessageImpl; diff --git a/wxdata/source/scwx/awips/text_product_message.cpp b/wxdata/source/scwx/awips/text_product_message.cpp index 541c6806..5128aee8 100644 --- a/wxdata/source/scwx/awips/text_product_message.cpp +++ b/wxdata/source/scwx/awips/text_product_message.cpp @@ -104,16 +104,14 @@ std::shared_ptr TextProductMessage::segment(size_t s) const return p->segments_[s]; } -std::chrono::system_clock::time_point -TextProductMessage::segment_event_begin(std::size_t s) const +std::chrono::system_clock::time_point Segment::event_begin() const { std::chrono::system_clock::time_point eventBegin {}; - auto& header = segment(s)->header_; - if (header.has_value() && !header->vtecString_.empty()) + if (header_.has_value() && !header_->vtecString_.empty()) { // Determine event begin from P-VTEC string - eventBegin = header->vtecString_[0].pVtec_.event_begin(); + eventBegin = header_->vtecString_[0].pVtec_.event_begin(); // If event begin is 000000T0000Z if (eventBegin == std::chrono::system_clock::time_point {}) @@ -122,13 +120,13 @@ TextProductMessage::segment_event_begin(std::size_t s) const // Determine event end from P-VTEC string system_clock::time_point eventEnd = - header->vtecString_[0].pVtec_.event_end(); + header_->vtecString_[0].pVtec_.event_end(); auto endDays = floor(eventEnd); year_month_day endDate {endDays}; // Determine WMO date/time - std::string wmoDateTime = wmo_header()->date_time(); + std::string wmoDateTime = wmoHeader_->date_time(); bool wmoDateTimeValid = false; unsigned int dayOfMonth = 0; @@ -189,6 +187,25 @@ TextProductMessage::segment_event_begin(std::size_t s) const return eventBegin; } +std::chrono::system_clock::time_point Segment::event_end() const +{ + std::chrono::system_clock::time_point eventEnd {}; + + if (header_.has_value() && !header_->vtecString_.empty()) + { + // Determine event begin from P-VTEC string + eventEnd = header_->vtecString_[0].pVtec_.event_end(); + } + + return eventEnd; +} + +std::chrono::system_clock::time_point +TextProductMessage::segment_event_begin(std::size_t s) const +{ + return segment(s)->event_begin(); +} + size_t TextProductMessage::data_size() const { return 0; @@ -211,6 +228,7 @@ bool TextProductMessage::Parse(std::istream& is) } std::shared_ptr segment = std::make_shared(); + segment->wmoHeader_ = p->wmoHeader_; if (i == 0) {