added inital radar site based alerts (only default radar site)

This commit is contained in:
AdenKoperczak 2024-07-01 16:18:14 -04:00
parent 2bc971eb94
commit dea53bddb4
7 changed files with 197 additions and 128 deletions

View file

@ -6,6 +6,8 @@
#include <scwx/qt/types/location_types.hpp> #include <scwx/qt/types/location_types.hpp>
#include <scwx/qt/util/geographic_lib.hpp> #include <scwx/qt/util/geographic_lib.hpp>
#include <scwx/util/logger.hpp> #include <scwx/util/logger.hpp>
#include <scwx/qt/config/radar_site.hpp>
#include <scwx/qt/settings/general_settings.hpp>
#include <boost/asio/post.hpp> #include <boost/asio/post.hpp>
#include <boost/asio/thread_pool.hpp> #include <boost/asio/thread_pool.hpp>
@ -85,8 +87,7 @@ common::Coordinate AlertManager::Impl::CurrentCoordinate(
settings::AudioSettings& audioSettings = settings::AudioSettings::Instance(); settings::AudioSettings& audioSettings = settings::AudioSettings::Instance();
common::Coordinate coordinate {}; common::Coordinate coordinate {};
if (locationMethod == types::LocationMethod::Fixed || if (locationMethod == types::LocationMethod::Fixed)
locationMethod == types::LocationMethod::Radius)
{ {
coordinate.latitude_ = audioSettings.alert_latitude().GetValue(); coordinate.latitude_ = audioSettings.alert_latitude().GetValue();
coordinate.longitude_ = audioSettings.alert_longitude().GetValue(); coordinate.longitude_ = audioSettings.alert_longitude().GetValue();
@ -101,6 +102,14 @@ common::Coordinate AlertManager::Impl::CurrentCoordinate(
coordinate.longitude_ = trackedCoordinate.longitude(); coordinate.longitude_ = trackedCoordinate.longitude();
} }
} }
else if (locationMethod == types::LocationMethod::RadarSite)
{
std::string siteId =
settings::GeneralSettings::Instance().default_radar_site().GetValue();
auto radarSite = config::RadarSite::Get(siteId);
coordinate.latitude_ = radarSite->latitude();
coordinate.longitude_ = radarSite->longitude();
}
return coordinate; return coordinate;
} }
@ -119,6 +128,8 @@ void AlertManager::Impl::HandleAlert(const types::TextEventKey& key,
audioSettings.alert_location_method().GetValue()); audioSettings.alert_location_method().GetValue());
common::Coordinate currentCoordinate = CurrentCoordinate(locationMethod); common::Coordinate currentCoordinate = CurrentCoordinate(locationMethod);
std::string alertCounty = audioSettings.alert_county().GetValue(); std::string alertCounty = audioSettings.alert_county().GetValue();
auto alertRadius =
units::length::meters<double>(audioSettings.alert_radius().GetValue());
auto message = textEventManager_->message_list(key).at(messageIndex); auto message = textEventManager_->message_list(key).at(messageIndex);
@ -146,22 +157,16 @@ void AlertManager::Impl::HandleAlert(const types::TextEventKey& key,
bool activeAtLocation = (locationMethod == types::LocationMethod::All); bool activeAtLocation = (locationMethod == types::LocationMethod::All);
if (locationMethod == types::LocationMethod::Fixed || if (locationMethod == types::LocationMethod::Fixed ||
locationMethod == types::LocationMethod::Track) locationMethod == types::LocationMethod::Track ||
locationMethod == types::LocationMethod::RadarSite)
{ {
// Determine if the alert is active at the current coordinte // Determine if the alert is active at the current coordinte
auto alertCoordinates = segment->codedLocation_->coordinates(); auto alertCoordinates = segment->codedLocation_->coordinates();
activeAtLocation = util::GeographicLib::AreaContainsPoint(
alertCoordinates, currentCoordinate);
}
else if (locationMethod == types::LocationMethod::Radius)
{
auto alertCoordinates = segment->codedLocation_->coordinates();
activeAtLocation = util::GeographicLib::AreaInRangeOfPoint( activeAtLocation = util::GeographicLib::AreaInRangeOfPoint(
alertCoordinates, alertCoordinates,
currentCoordinate, currentCoordinate,
units::length::meters<double>(1e6)); alertRadius);
} }
else if (locationMethod == types::LocationMethod::County) else if (locationMethod == types::LocationMethod::County)
{ {

View file

@ -37,12 +37,16 @@ public:
alertLocationMethod_.SetDefault(defaultAlertLocationMethodValue); alertLocationMethod_.SetDefault(defaultAlertLocationMethodValue);
alertLatitude_.SetDefault(0.0); alertLatitude_.SetDefault(0.0);
alertLongitude_.SetDefault(0.0); alertLongitude_.SetDefault(0.0);
alertRadius_.SetDefault(0.0);
ignoreMissingCodecs_.SetDefault(false); ignoreMissingCodecs_.SetDefault(false);
alertLatitude_.SetMinimum(-90.0); alertLatitude_.SetMinimum(-90.0);
alertLatitude_.SetMaximum(90.0); alertLatitude_.SetMaximum(90.0);
alertLongitude_.SetMinimum(-180.0); alertLongitude_.SetMinimum(-180.0);
alertLongitude_.SetMaximum(180.0); alertLongitude_.SetMaximum(180.0);
alertRadius_.SetMinimum(0.0);
alertRadius_.SetMaximum(9999999999);
alertLocationMethod_.SetValidator( alertLocationMethod_.SetValidator(
SCWX_SETTINGS_ENUM_VALIDATOR(types::LocationMethod, SCWX_SETTINGS_ENUM_VALIDATOR(types::LocationMethod,
@ -86,6 +90,7 @@ public:
SettingsVariable<std::string> alertLocationMethod_ {"alert_location_method"}; SettingsVariable<std::string> alertLocationMethod_ {"alert_location_method"};
SettingsVariable<double> alertLatitude_ {"alert_latitude"}; SettingsVariable<double> alertLatitude_ {"alert_latitude"};
SettingsVariable<double> alertLongitude_ {"alert_longitude"}; SettingsVariable<double> alertLongitude_ {"alert_longitude"};
SettingsVariable<double> alertRadius_ {"alert_radius"};
SettingsVariable<std::string> alertCounty_ {"alert_county"}; SettingsVariable<std::string> alertCounty_ {"alert_county"};
SettingsVariable<bool> ignoreMissingCodecs_ {"ignore_missing_codecs"}; SettingsVariable<bool> ignoreMissingCodecs_ {"ignore_missing_codecs"};
@ -101,6 +106,7 @@ AudioSettings::AudioSettings() :
&p->alertLocationMethod_, &p->alertLocationMethod_,
&p->alertLatitude_, &p->alertLatitude_,
&p->alertLongitude_, &p->alertLongitude_,
&p->alertRadius_,
&p->alertCounty_, &p->alertCounty_,
&p->ignoreMissingCodecs_}); &p->ignoreMissingCodecs_});
RegisterVariables(p->variables_); RegisterVariables(p->variables_);
@ -133,6 +139,11 @@ SettingsVariable<double>& AudioSettings::alert_longitude() const
return p->alertLongitude_; return p->alertLongitude_;
} }
SettingsVariable<double>& AudioSettings::alert_radius() const
{
return p->alertRadius_;
}
SettingsVariable<std::string>& AudioSettings::alert_county() const SettingsVariable<std::string>& AudioSettings::alert_county() const
{ {
return p->alertCounty_; return p->alertCounty_;
@ -166,6 +177,7 @@ bool operator==(const AudioSettings& lhs, const AudioSettings& rhs)
lhs.p->alertLocationMethod_ == rhs.p->alertLocationMethod_ && lhs.p->alertLocationMethod_ == rhs.p->alertLocationMethod_ &&
lhs.p->alertLatitude_ == rhs.p->alertLatitude_ && lhs.p->alertLatitude_ == rhs.p->alertLatitude_ &&
lhs.p->alertLongitude_ == rhs.p->alertLongitude_ && lhs.p->alertLongitude_ == rhs.p->alertLongitude_ &&
lhs.p->alertRadius_ == rhs.p->alertRadius_ &&
lhs.p->alertCounty_ == rhs.p->alertCounty_ && lhs.p->alertCounty_ == rhs.p->alertCounty_ &&
lhs.p->alertEnabled_ == rhs.p->alertEnabled_); lhs.p->alertEnabled_ == rhs.p->alertEnabled_);
} }

View file

@ -30,6 +30,7 @@ public:
SettingsVariable<std::string>& alert_location_method() const; SettingsVariable<std::string>& alert_location_method() const;
SettingsVariable<double>& alert_latitude() const; SettingsVariable<double>& alert_latitude() const;
SettingsVariable<double>& alert_longitude() const; SettingsVariable<double>& alert_longitude() const;
SettingsVariable<double>& alert_radius() const;
SettingsVariable<std::string>& alert_county() const; SettingsVariable<std::string>& alert_county() const;
SettingsVariable<bool>& alert_enabled(awips::Phenomenon phenomenon) const; SettingsVariable<bool>& alert_enabled(awips::Phenomenon phenomenon) const;
SettingsVariable<bool>& ignore_missing_codecs() const; SettingsVariable<bool>& ignore_missing_codecs() const;

View file

@ -14,8 +14,8 @@ namespace types
static const std::unordered_map<LocationMethod, std::string> static const std::unordered_map<LocationMethod, std::string>
locationMethodName_ {{LocationMethod::Fixed, "Fixed"}, locationMethodName_ {{LocationMethod::Fixed, "Fixed"},
{LocationMethod::Radius, "Radius"},
{LocationMethod::Track, "Track"}, {LocationMethod::Track, "Track"},
{LocationMethod::RadarSite, "RadarSite"},
{LocationMethod::County, "County"}, {LocationMethod::County, "County"},
{LocationMethod::All, "All"}, {LocationMethod::All, "All"},
{LocationMethod::Unknown, "?"}}; {LocationMethod::Unknown, "?"}};

View file

@ -14,8 +14,8 @@ namespace types
enum class LocationMethod enum class LocationMethod
{ {
Fixed, Fixed,
Radius,
Track, Track,
RadarSite,
County, County,
All, All,
Unknown Unknown

View file

@ -134,6 +134,7 @@ public:
&alertAudioLocationMethod_, &alertAudioLocationMethod_,
&alertAudioLatitude_, &alertAudioLatitude_,
&alertAudioLongitude_, &alertAudioLongitude_,
&alertAudioRadius_,
&alertAudioCounty_, &alertAudioCounty_,
&hoverTextWrap_, &hoverTextWrap_,
&tooltipMethod_, &tooltipMethod_,
@ -252,6 +253,7 @@ public:
settings::SettingsInterface<std::string> alertAudioLocationMethod_ {}; settings::SettingsInterface<std::string> alertAudioLocationMethod_ {};
settings::SettingsInterface<double> alertAudioLatitude_ {}; settings::SettingsInterface<double> alertAudioLatitude_ {};
settings::SettingsInterface<double> alertAudioLongitude_ {}; settings::SettingsInterface<double> alertAudioLongitude_ {};
settings::SettingsInterface<double> alertAudioRadius_ {};
settings::SettingsInterface<std::string> alertAudioCounty_ {}; settings::SettingsInterface<std::string> alertAudioCounty_ {};
std::unordered_map<awips::Phenomenon, settings::SettingsInterface<bool>> std::unordered_map<awips::Phenomenon, settings::SettingsInterface<bool>>
@ -474,6 +476,7 @@ void SettingsDialogImpl::ConnectSignals()
break; break;
case QDialogButtonBox::ButtonRole::ResetRole: // Restore Defaults case QDialogButtonBox::ButtonRole::ResetRole: // Restore Defaults
logger_->info("ButtonRole Reset");
ResetToDefault(); ResetToDefault();
break; break;
@ -900,6 +903,10 @@ void SettingsDialogImpl::SetupAudioTab()
bool coordinateEntryEnabled = bool coordinateEntryEnabled =
locationMethod == types::LocationMethod::Fixed; locationMethod == types::LocationMethod::Fixed;
bool radiusEntryEnable =
locationMethod == types::LocationMethod::Fixed ||
locationMethod == types::LocationMethod::Track ||
locationMethod == types::LocationMethod::RadarSite;
bool countyEntryEnabled = bool countyEntryEnabled =
locationMethod == types::LocationMethod::County; locationMethod == types::LocationMethod::County;
@ -912,6 +919,11 @@ void SettingsDialogImpl::SetupAudioTab()
self_->ui->resetAlertAudioLongitudeButton->setEnabled( self_->ui->resetAlertAudioLongitudeButton->setEnabled(
coordinateEntryEnabled); coordinateEntryEnabled);
self_->ui->alertAudioRadiusSpinBox->setEnabled(
radiusEntryEnable);
self_->ui->resetAlertAudioRadiusButton->setEnabled(
radiusEntryEnable);
self_->ui->alertAudioCountyLineEdit->setEnabled(countyEntryEnabled); self_->ui->alertAudioCountyLineEdit->setEnabled(countyEntryEnabled);
self_->ui->alertAudioCountySelectButton->setEnabled( self_->ui->alertAudioCountySelectButton->setEnabled(
countyEntryEnabled); countyEntryEnabled);
@ -983,6 +995,11 @@ void SettingsDialogImpl::SetupAudioTab()
alertAudioLongitude_.SetResetButton( alertAudioLongitude_.SetResetButton(
self_->ui->resetAlertAudioLongitudeButton); self_->ui->resetAlertAudioLongitudeButton);
alertAudioRadius_.SetSettingsVariable(audioSettings.alert_radius());
alertAudioRadius_.SetEditWidget(self_->ui->alertAudioRadiusSpinBox);
alertAudioRadius_.SetResetButton(
self_->ui->resetAlertAudioRadiusButton);
auto& alertAudioPhenomena = types::GetAlertAudioPhenomena(); auto& alertAudioPhenomena = types::GetAlertAudioPhenomena();
auto alertAudioLayout = auto alertAudioLayout =
static_cast<QGridLayout*>(self_->ui->alertAudioGroupBox->layout()); static_cast<QGridLayout*>(self_->ui->alertAudioGroupBox->layout());

View file

@ -698,6 +698,62 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="alertAudioSoundLineEdit"/>
</item>
<item row="2" column="6">
<widget class="QToolButton" name="resetAlertAudioLatitudeButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="5">
<widget class="QToolButton" name="alertAudioSoundStopButton">
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/stop-solid.svg</normaloff>:/res/icons/font-awesome-6/stop-solid.svg</iconset>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QDoubleSpinBox" name="alertAudioLongitudeSpinBox">
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>-180.000000000000000</double>
</property>
<property name="maximum">
<double>180.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000100000000000</double>
</property>
</widget>
</item>
<item row="5" column="3">
<widget class="QToolButton" name="alertAudioCountySelectButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QToolButton" name="resetAlertAudioSoundButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="1" column="6"> <item row="1" column="6">
<widget class="QToolButton" name="resetAlertAudioLocationMethodButton"> <widget class="QToolButton" name="resetAlertAudioLocationMethodButton">
<property name="text"> <property name="text">
@ -709,6 +765,30 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="4">
<widget class="QToolButton" name="alertAudioSoundTestButton">
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/play-solid.svg</normaloff>:/res/icons/font-awesome-6/play-solid.svg</iconset>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QDoubleSpinBox" name="alertAudioLatitudeSpinBox">
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>-90.000000000000000</double>
</property>
<property name="maximum">
<double>90.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000100000000000</double>
</property>
</widget>
</item>
<item row="3" column="0"> <item row="3" column="0">
<widget class="QLabel" name="label_16"> <widget class="QLabel" name="label_16">
<property name="text"> <property name="text">
@ -716,6 +796,13 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>County</string>
</property>
</widget>
</item>
<item row="0" column="3"> <item row="0" column="3">
<widget class="QToolButton" name="alertAudioSoundSelectButton"> <widget class="QToolButton" name="alertAudioSoundSelectButton">
<property name="text"> <property name="text">
@ -723,6 +810,60 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="alertAudioLocationMethodComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QToolButton" name="resetAlertAudioCountyButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Sound</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QLabel" name="alertAudioCountyLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="alertAudioCountyLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="label_12">
<property name="text"> <property name="text">
@ -741,105 +882,31 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="5">
<widget class="QToolButton" name="alertAudioSoundStopButton">
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/stop-solid.svg</normaloff>:/res/icons/font-awesome-6/stop-solid.svg</iconset>
</property>
</widget>
</item>
<item row="2" column="6">
<widget class="QToolButton" name="resetAlertAudioLatitudeButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="6">
<widget class="QToolButton" name="resetAlertAudioSoundButton">
<property name="text">
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</normaloff>:/res/icons/font-awesome-6/rotate-left-solid.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QToolButton" name="alertAudioSoundTestButton">
<property name="icon">
<iconset resource="../../../../scwx-qt.qrc">
<normaloff>:/res/icons/font-awesome-6/play-solid.svg</normaloff>:/res/icons/font-awesome-6/play-solid.svg</iconset>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_17">
<property name="text">
<string>Sound</string>
</property>
</widget>
</item>
<item row="4" column="0"> <item row="4" column="0">
<widget class="QLabel" name="label_19"> <widget class="QLabel" name="label_28">
<property name="text"> <property name="text">
<string>County</string> <string>Radius</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1" colspan="2"> <item row="4" column="1" colspan="2">
<widget class="QDoubleSpinBox" name="alertAudioLongitudeSpinBox"> <widget class="QDoubleSpinBox" name="alertAudioRadiusSpinBox">
<property name="decimals"> <property name="decimals">
<number>4</number> <number>4</number>
</property> </property>
<property name="minimum"> <property name="minimum">
<double>-180.000000000000000</double> <double>0.000000000000000</double>
</property> </property>
<property name="maximum"> <property name="maximum">
<double>180.000000000000000</double> <double>9999999999999.000000000000000</double>
</property> </property>
<property name="singleStep"> <property name="singleStep">
<double>0.000100000000000</double> <double>0.010000000000000</double>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1" colspan="2">
<widget class="QDoubleSpinBox" name="alertAudioLatitudeSpinBox">
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>-90.000000000000000</double>
</property>
<property name="maximum">
<double>90.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000100000000000</double>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="alertAudioLocationMethodComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="0" column="1" colspan="2">
<widget class="QLineEdit" name="alertAudioSoundLineEdit"/>
</item>
<item row="4" column="6"> <item row="4" column="6">
<widget class="QToolButton" name="resetAlertAudioCountyButton"> <widget class="QToolButton" name="resetAlertAudioRadiusButton">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
@ -849,39 +916,6 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="4" column="3">
<widget class="QToolButton" name="alertAudioCountySelectButton">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QLabel" name="alertAudioCountyLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="alertAudioCountyLineEdit">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>