mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 17:30:05 +00:00 
			
		
		
		
	Add year to Text Event Key
This commit is contained in:
		
							parent
							
								
									34fc6d584f
								
							
						
					
					
						commit
						228ec191f6
					
				
					 3 changed files with 56 additions and 8 deletions
				
			
		|  | @ -275,6 +275,8 @@ void TextEventManager::SelectTime( | |||
| void TextEventManager::Impl::HandleMessage( | ||||
|    const std::shared_ptr<awips::TextProductMessage>& message) | ||||
| { | ||||
|    using namespace std::chrono_literals; | ||||
| 
 | ||||
|    auto segments = message->segments(); | ||||
| 
 | ||||
|    // If there are no segments, skip this message
 | ||||
|  | @ -295,15 +297,35 @@ void TextEventManager::Impl::HandleMessage( | |||
|       } | ||||
|    } | ||||
| 
 | ||||
|    // Determine year
 | ||||
|    std::chrono::year_month_day wmoDate = std::chrono::floor<std::chrono::days>( | ||||
|       message->wmo_header()->GetDateTime()); | ||||
|    std::chrono::year wmoYear = wmoDate.year(); | ||||
| 
 | ||||
|    std::unique_lock lock(textEventMutex_); | ||||
| 
 | ||||
|    // Find a matching event in the event map
 | ||||
|    auto&               vtecString = segments[0]->header_->vtecString_; | ||||
|    types::TextEventKey key {vtecString[0].pVtec_}; | ||||
|    types::TextEventKey key {vtecString[0].pVtec_, wmoYear}; | ||||
|    size_t              messageIndex = 0; | ||||
|    auto                it           = textEventMap_.find(key); | ||||
|    bool                updated      = false; | ||||
| 
 | ||||
|    if ( | ||||
|       // If there was no matching event
 | ||||
|       it == textEventMap_.cend() && | ||||
|       // The event is not new
 | ||||
|       vtecString[0].pVtec_.action() != awips::PVtec::Action::New && | ||||
|       // The message was on January 1
 | ||||
|       wmoDate.month() == std::chrono::January && wmoDate.day() == 1d && | ||||
|       // This is at least the 10th ETN of the year
 | ||||
|       vtecString[0].pVtec_.event_tracking_number() > 10) | ||||
|    { | ||||
|       // Attempt to find a matching event from last year
 | ||||
|       key = {vtecString[0].pVtec_, wmoYear - std::chrono::years {1}}; | ||||
|       it  = textEventMap_.find(key); | ||||
|    } | ||||
| 
 | ||||
|    if (it == textEventMap_.cend()) | ||||
|    { | ||||
|       // If there was no matching event, add the message to a new event
 | ||||
|  |  | |||
|  | @ -14,26 +14,29 @@ static const std::string logPrefix_ = "scwx::qt::types::text_event_key"; | |||
| 
 | ||||
| std::string TextEventKey::ToFullString() const | ||||
| { | ||||
|    return fmt::format("{} {} {} {:04}", | ||||
|    return fmt::format("{} {} {} {:04} ({:04})", | ||||
|                       officeId_, | ||||
|                       awips::GetPhenomenonText(phenomenon_), | ||||
|                       awips::GetSignificanceText(significance_), | ||||
|                       etn_); | ||||
|                       etn_, | ||||
|                       static_cast<int>(year_)); | ||||
| } | ||||
| 
 | ||||
| std::string TextEventKey::ToString() const | ||||
| { | ||||
|    return fmt::format("{}.{}.{}.{:04}", | ||||
|    return fmt::format("{}.{}.{}.{:04}.{:04}", | ||||
|                       officeId_, | ||||
|                       awips::GetPhenomenonCode(phenomenon_), | ||||
|                       awips::GetSignificanceCode(significance_), | ||||
|                       etn_); | ||||
|                       etn_, | ||||
|                       static_cast<int>(year_)); | ||||
| } | ||||
| 
 | ||||
| bool TextEventKey::operator==(const TextEventKey& o) const | ||||
| { | ||||
|    return (officeId_ == o.officeId_ && phenomenon_ == o.phenomenon_ && | ||||
|            significance_ == o.significance_ && etn_ == o.etn_); | ||||
|            significance_ == o.significance_ && etn_ == o.etn_ && | ||||
|            year_ == o.year_); | ||||
| } | ||||
| 
 | ||||
| size_t TextEventHash<TextEventKey>::operator()(const TextEventKey& x) const | ||||
|  | @ -43,6 +46,7 @@ size_t TextEventHash<TextEventKey>::operator()(const TextEventKey& x) const | |||
|    boost::hash_combine(seed, x.phenomenon_); | ||||
|    boost::hash_combine(seed, x.significance_); | ||||
|    boost::hash_combine(seed, x.etn_); | ||||
|    boost::hash_combine(seed, static_cast<int>(x.year_)); | ||||
|    return seed; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <scwx/awips/pvtec.hpp> | ||||
| #include <scwx/awips/wmo_header.hpp> | ||||
| 
 | ||||
| namespace scwx | ||||
| { | ||||
|  | @ -12,12 +13,32 @@ namespace types | |||
| struct TextEventKey | ||||
| { | ||||
|    TextEventKey() : TextEventKey(awips::PVtec {}) {} | ||||
|    TextEventKey(const awips::PVtec& pvtec) : | ||||
|    TextEventKey(const awips::PVtec& pvtec, std::chrono::year yearHint = {}) : | ||||
|        officeId_ {pvtec.office_id()}, | ||||
|        phenomenon_ {pvtec.phenomenon()}, | ||||
|        significance_ {pvtec.significance()}, | ||||
|        etn_ {pvtec.event_tracking_number()} | ||||
|    { | ||||
|       using namespace std::chrono_literals; | ||||
| 
 | ||||
|       std::chrono::year_month_day ymd = | ||||
|          std::chrono::floor<std::chrono::days>(pvtec.event_begin()); | ||||
|       if (ymd.year() > 1970y) | ||||
|       { | ||||
|          // Prefer the year from the event begin
 | ||||
|          year_ = ymd.year(); | ||||
|       } | ||||
|       else if (yearHint > 1970y) | ||||
|       { | ||||
|          // Otherwise, use the year hint
 | ||||
|          year_ = yearHint; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          // If there was no year hint, use the event end
 | ||||
|          ymd   = std::chrono::floor<std::chrono::days>(pvtec.event_end()); | ||||
|          year_ = ymd.year(); | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
|    std::string ToFullString() const; | ||||
|  | @ -27,7 +48,8 @@ struct TextEventKey | |||
|    std::string         officeId_; | ||||
|    awips::Phenomenon   phenomenon_; | ||||
|    awips::Significance significance_; | ||||
|    int16_t             etn_; | ||||
|    std::int16_t        etn_; | ||||
|    std::chrono::year   year_; | ||||
| }; | ||||
| 
 | ||||
| template<class Key> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat