Add additional alert display columns

- State, counties, start and end time
This commit is contained in:
Dan Paulat 2022-10-14 23:41:25 -05:00
parent 8fe7d5da6e
commit fdd981899f
8 changed files with 126 additions and 15 deletions

View file

@ -355,6 +355,9 @@
<property name="placeholderText">
<string>Filter</string>
</property>
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>

View file

@ -86,14 +86,24 @@ void TextEventManager::Impl::HandleMessage(
{
auto segments = message->segments();
// If there are no segments, if the first segment has no header, or if there
// is no VTEC string, skip this message
if (segments.empty() || !segments[0]->header_.has_value() ||
segments[0]->header_->vtecString_.empty())
// If there are no segments, skip this message
if (segments.empty())
{
return;
}
for (auto& segment : segments)
{
// If a segment has no header, or if there is no VTEC string, skip this
// message. A segmented message corresponding to a text event should have
// this information.
if (!segment->header_.has_value() ||
segment->header_->vtecString_.empty())
{
return;
}
}
std::unique_lock lock(textEventMutex_);
// Find a matching event in the event map

View file

@ -1,7 +1,10 @@
#include <scwx/qt/model/alert_model.hpp>
#include <scwx/qt/manager/text_event_manager.hpp>
#include <scwx/qt/types/qt_types.hpp>
#include <scwx/common/geographic.hpp>
#include <scwx/util/logger.hpp>
#include <scwx/util/strings.hpp>
#include <scwx/util/time.hpp>
#include <format>
@ -36,6 +39,11 @@ public:
explicit AlertModelImpl();
~AlertModelImpl() = default;
static std::string GetCounties(const types::TextEventKey& key);
static std::string GetState(const types::TextEventKey& key);
static std::string GetStartTime(const types::TextEventKey& key);
static std::string GetEndTime(const types::TextEventKey& key);
QList<types::TextEventKey> textEventKeys_;
GeographicLib::Geodesic geodesic_;
@ -85,13 +93,16 @@ QVariant AlertModel::data(const QModelIndex& index, int role) const
return QString::fromStdString(
awips::GetSignificanceText(textEventKey.significance_));
case kColumnState:
return QString::fromStdString("?");
return QString::fromStdString(AlertModelImpl::GetState(textEventKey));
case kColumnCounties:
return QString::fromStdString("?");
return QString::fromStdString(
AlertModelImpl::GetCounties(textEventKey));
case kColumnStartTime:
return QString::fromStdString("?");
return QString::fromStdString(
AlertModelImpl::GetStartTime(textEventKey));
case kColumnEndTime:
return QString::fromStdString("?");
return QString::fromStdString(
AlertModelImpl::GetEndTime(textEventKey));
case kColumnDistance:
if (role == Qt::DisplayRole)
{
@ -158,11 +169,7 @@ AlertModel::headerData(int section, Qt::Orientation orientation, int role) const
void AlertModel::HandleAlert(const types::TextEventKey& alertKey)
{
logger_->trace("Handle alert: {}, {}, {}, {}",
alertKey.etn_,
alertKey.officeId_,
awips::GetPhenomenonText(alertKey.phenomenon_),
awips::GetSignificanceText(alertKey.significance_));
logger_->trace("Handle alert: {}", alertKey.ToString());
double distanceInMeters;
@ -190,7 +197,7 @@ void AlertModel::HandleAlert(const types::TextEventKey& alertKey)
0.0, // TODO: textEvent->longitude(),
distanceInMeters);
const int row = 0; // TODO
const int row = p->textEventKeys_.indexOf(alertKey);
QModelIndex topLeft = createIndex(row, kFirstColumn);
QModelIndex bottomRight = createIndex(row, kLastColumn);
@ -232,6 +239,43 @@ AlertModelImpl::AlertModelImpl() :
{
}
std::string AlertModelImpl::GetCounties(const types::TextEventKey& key)
{
auto messageList = manager::TextEventManager::Instance().message_list(key);
auto& lastMessage = messageList.back();
size_t segmentCount = lastMessage->segment_count();
auto lastSegment = lastMessage->segment(segmentCount - 1);
return util::ToString(lastSegment->header_->ugc_.fips_ids());
}
std::string AlertModelImpl::GetState(const types::TextEventKey& key)
{
auto messageList = manager::TextEventManager::Instance().message_list(key);
auto& lastMessage = messageList.back();
size_t segmentCount = lastMessage->segment_count();
auto lastSegment = lastMessage->segment(segmentCount - 1);
return util::ToString(lastSegment->header_->ugc_.states());
}
std::string AlertModelImpl::GetStartTime(const types::TextEventKey& key)
{
auto messageList = manager::TextEventManager::Instance().message_list(key);
auto& firstMessage = messageList.front();
auto firstSegment = firstMessage->segment(0);
return util::TimeString(
firstSegment->header_->vtecString_[0].pVtec_.event_begin());
}
std::string AlertModelImpl::GetEndTime(const types::TextEventKey& key)
{
auto messageList = manager::TextEventManager::Instance().message_list(key);
auto& lastMessage = messageList.back();
size_t segmentCount = lastMessage->segment_count();
auto lastSegment = lastMessage->segment(segmentCount - 1);
return util::TimeString(
lastSegment->header_->vtecString_[0].pVtec_.event_end());
}
} // namespace model
} // namespace qt
} // namespace scwx

View file

@ -1,5 +1,7 @@
#include <scwx/qt/types/text_event_key.hpp>
#include <format>
#include <boost/container_hash/hash.hpp>
namespace scwx
@ -11,6 +13,15 @@ namespace types
static const std::string logPrefix_ = "scwx::qt::types::text_event_key";
std::string TextEventKey::ToString() const
{
return std::format("{}, {}, {}, {}",
officeId_,
awips::GetPhenomenonText(phenomenon_),
awips::GetSignificanceText(significance_),
etn_);
}
bool TextEventKey::operator==(const TextEventKey& o) const
{
return (officeId_ == o.officeId_ && phenomenon_ == o.phenomenon_ &&

View file

@ -19,6 +19,7 @@ struct TextEventKey
{
}
std::string ToString() const;
bool operator==(const TextEventKey& o) const;
std::string officeId_;

View file

@ -0,0 +1,14 @@
#pragma once
#include <string>
#include <vector>
namespace scwx
{
namespace util
{
std::string ToString(const std::vector<std::string>& v);
} // namespace util
} // namespace scwx

View file

@ -0,0 +1,26 @@
#include <scwx/util/strings.hpp>
namespace scwx
{
namespace util
{
std::string ToString(const std::vector<std::string>& v)
{
std::string value {};
for (const std::string& s : v)
{
if (!value.empty())
{
value += ", ";
}
value += s;
}
return value;
}
} // namespace util
} // namespace scwx

View file

@ -58,6 +58,7 @@ set(HDR_UTIL include/scwx/util/environment.hpp
include/scwx/util/map.hpp
include/scwx/util/rangebuf.hpp
include/scwx/util/streams.hpp
include/scwx/util/strings.hpp
include/scwx/util/threads.hpp
include/scwx/util/time.hpp
include/scwx/util/vectorbuf.hpp)
@ -67,6 +68,7 @@ set(SRC_UTIL source/scwx/util/environment.cpp
source/scwx/util/logger.cpp
source/scwx/util/rangebuf.cpp
source/scwx/util/streams.cpp
source/scwx/util/strings.cpp
source/scwx/util/time.cpp
source/scwx/util/threads.cpp
source/scwx/util/vectorbuf.cpp)