mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-10-30 20:50:06 +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