mirror of
https://github.com/ciphervance/supercell-wx.git
synced 2025-11-01 03:40:04 +00:00
Load placefiles according to the current radar site
This commit is contained in:
parent
6f44d9f4e0
commit
751cafbfe7
3 changed files with 90 additions and 59 deletions
|
|
@ -1136,6 +1136,8 @@ void MainWindowImpl::UpdateRadarSite()
|
||||||
|
|
||||||
timelineManager_->SetRadarSite("?");
|
timelineManager_->SetRadarSite("?");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
placefileManager_->SetRadarSite(radarSite);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindowImpl::UpdateVcp()
|
void MainWindowImpl::UpdateVcp()
|
||||||
|
|
|
||||||
|
|
@ -24,15 +24,36 @@ namespace manager
|
||||||
static const std::string logPrefix_ = "scwx::qt::manager::placefile_manager";
|
static const std::string logPrefix_ = "scwx::qt::manager::placefile_manager";
|
||||||
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
|
||||||
|
|
||||||
class PlacefileRecord : public QObject
|
class PlacefileManager::Impl
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit PlacefileRecord(const std::string& name,
|
class PlacefileRecord;
|
||||||
|
|
||||||
|
explicit Impl(PlacefileManager* self) : self_ {self} {}
|
||||||
|
~Impl() {}
|
||||||
|
|
||||||
|
static std::string NormalizeUrl(const std::string& urlString);
|
||||||
|
|
||||||
|
boost::asio::thread_pool threadPool_ {1u};
|
||||||
|
|
||||||
|
PlacefileManager* self_;
|
||||||
|
|
||||||
|
std::shared_ptr<config::RadarSite> radarSite_ {};
|
||||||
|
|
||||||
|
std::vector<std::shared_ptr<PlacefileRecord>> placefileRecords_ {};
|
||||||
|
std::unordered_map<std::string, std::shared_ptr<PlacefileRecord>>
|
||||||
|
placefileRecordMap_ {};
|
||||||
|
std::shared_mutex placefileRecordLock_ {};
|
||||||
|
};
|
||||||
|
|
||||||
|
class PlacefileManager::Impl::PlacefileRecord
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit PlacefileRecord(Impl* impl,
|
||||||
|
const std::string& name,
|
||||||
std::shared_ptr<gr::Placefile> placefile,
|
std::shared_ptr<gr::Placefile> placefile,
|
||||||
bool enabled = true) :
|
bool enabled = true) :
|
||||||
name_ {name}, placefile_ {placefile}, enabled_ {enabled}
|
p {impl}, name_ {name}, placefile_ {placefile}, enabled_ {enabled}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
~PlacefileRecord()
|
~PlacefileRecord()
|
||||||
|
|
@ -45,6 +66,8 @@ public:
|
||||||
void UpdateAsync();
|
void UpdateAsync();
|
||||||
void UpdatePlacefile(std::shared_ptr<gr::Placefile> placefile);
|
void UpdatePlacefile(std::shared_ptr<gr::Placefile> placefile);
|
||||||
|
|
||||||
|
Impl* p;
|
||||||
|
|
||||||
std::string name_;
|
std::string name_;
|
||||||
std::shared_ptr<gr::Placefile> placefile_;
|
std::shared_ptr<gr::Placefile> placefile_;
|
||||||
bool enabled_;
|
bool enabled_;
|
||||||
|
|
@ -58,26 +81,6 @@ signals:
|
||||||
std::shared_ptr<gr::Placefile> placefile);
|
std::shared_ptr<gr::Placefile> placefile);
|
||||||
};
|
};
|
||||||
|
|
||||||
class PlacefileManager::Impl
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
explicit Impl(PlacefileManager* self) : self_ {self} {}
|
|
||||||
~Impl() {}
|
|
||||||
|
|
||||||
static std::string NormalizeUrl(const std::string& urlString);
|
|
||||||
|
|
||||||
void ConnectRecordSignals(std::shared_ptr<PlacefileRecord> record);
|
|
||||||
|
|
||||||
boost::asio::thread_pool threadPool_ {1u};
|
|
||||||
|
|
||||||
PlacefileManager* self_;
|
|
||||||
|
|
||||||
std::vector<std::shared_ptr<PlacefileRecord>> placefileRecords_ {};
|
|
||||||
std::unordered_map<std::string, std::shared_ptr<PlacefileRecord>>
|
|
||||||
placefileRecordMap_ {};
|
|
||||||
std::shared_mutex placefileRecordLock_ {};
|
|
||||||
};
|
|
||||||
|
|
||||||
PlacefileManager::PlacefileManager() : p(std::make_unique<Impl>(this)) {}
|
PlacefileManager::PlacefileManager() : p(std::make_unique<Impl>(this)) {}
|
||||||
PlacefileManager::~PlacefileManager() = default;
|
PlacefileManager::~PlacefileManager() = default;
|
||||||
|
|
||||||
|
|
@ -126,11 +129,19 @@ void PlacefileManager::set_placefile_enabled(const std::string& name,
|
||||||
auto it = p->placefileRecordMap_.find(name);
|
auto it = p->placefileRecordMap_.find(name);
|
||||||
if (it != p->placefileRecordMap_.cend())
|
if (it != p->placefileRecordMap_.cend())
|
||||||
{
|
{
|
||||||
it->second->enabled_ = enabled;
|
auto record = it->second;
|
||||||
|
record->enabled_ = enabled;
|
||||||
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
Q_EMIT PlacefileEnabled(name, enabled);
|
Q_EMIT PlacefileEnabled(name, enabled);
|
||||||
|
|
||||||
|
// Update the placefile
|
||||||
|
// TODO: Only update if it's out of date, or if the radar site has changed
|
||||||
|
if (enabled)
|
||||||
|
{
|
||||||
|
it->second->UpdateAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -177,28 +188,28 @@ void PlacefileManager::set_placefile_url(const std::string& name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacefileManager::Impl::ConnectRecordSignals(
|
void PlacefileManager::SetRadarSite(
|
||||||
std::shared_ptr<PlacefileRecord> record)
|
std::shared_ptr<config::RadarSite> radarSite)
|
||||||
{
|
{
|
||||||
QObject::connect(
|
if (p->radarSite_ == radarSite || radarSite == nullptr)
|
||||||
record.get(),
|
|
||||||
&PlacefileRecord::Updated,
|
|
||||||
self_,
|
|
||||||
[this](const std::string& name, std::shared_ptr<gr::Placefile> placefile)
|
|
||||||
{
|
{
|
||||||
PlacefileRecord* sender =
|
// No action needed
|
||||||
static_cast<PlacefileRecord*>(self_->sender());
|
return;
|
||||||
|
}
|
||||||
// Check the name matches, in case the name updated
|
|
||||||
if (sender->name_ == name)
|
logger_->debug("SetRadarSite: {}", radarSite->id());
|
||||||
{
|
|
||||||
// Update the placefile
|
p->radarSite_ = radarSite;
|
||||||
sender->placefile_ = placefile;
|
|
||||||
|
// Update all enabled records
|
||||||
// Notify slots of the placefile update
|
std::shared_lock lock(p->placefileRecordLock_);
|
||||||
Q_EMIT self_->PlacefileUpdated(name);
|
for (auto& record : p->placefileRecords_)
|
||||||
|
{
|
||||||
|
if (record->enabled_)
|
||||||
|
{
|
||||||
|
record->UpdateAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::shared_ptr<gr::Placefile>>
|
std::vector<std::shared_ptr<gr::Placefile>>
|
||||||
|
|
@ -240,10 +251,10 @@ void PlacefileManager::AddUrl(const std::string& urlString)
|
||||||
logger_->info("AddUrl: {}", normalizedUrl);
|
logger_->info("AddUrl: {}", normalizedUrl);
|
||||||
|
|
||||||
// Add an empty placefile record for the new URL
|
// Add an empty placefile record for the new URL
|
||||||
auto& record = p->placefileRecords_.emplace_back(
|
auto& record =
|
||||||
std::make_shared<PlacefileRecord>(normalizedUrl, nullptr, false));
|
p->placefileRecords_.emplace_back(std::make_shared<Impl::PlacefileRecord>(
|
||||||
|
p.get(), normalizedUrl, nullptr, false));
|
||||||
p->placefileRecordMap_.insert_or_assign(normalizedUrl, record);
|
p->placefileRecordMap_.insert_or_assign(normalizedUrl, record);
|
||||||
p->ConnectRecordSignals(record);
|
|
||||||
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
|
|
@ -290,9 +301,9 @@ void PlacefileManager::LoadFile(const std::string& filename)
|
||||||
{
|
{
|
||||||
// If this is a new placefile, add it
|
// If this is a new placefile, add it
|
||||||
auto& record = p->placefileRecords_.emplace_back(
|
auto& record = p->placefileRecords_.emplace_back(
|
||||||
std::make_shared<PlacefileRecord>(placefileName, placefile));
|
std::make_shared<Impl::PlacefileRecord>(
|
||||||
|
p.get(), placefileName, placefile));
|
||||||
p->placefileRecordMap_.insert_or_assign(placefileName, record);
|
p->placefileRecordMap_.insert_or_assign(placefileName, record);
|
||||||
p->ConnectRecordSignals(record);
|
|
||||||
|
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
|
|
||||||
|
|
@ -302,7 +313,7 @@ void PlacefileManager::LoadFile(const std::string& filename)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacefileRecord::Update()
|
void PlacefileManager::Impl::PlacefileRecord::Update()
|
||||||
{
|
{
|
||||||
// Make a copy of name in the event it changes.
|
// Make a copy of name in the event it changes.
|
||||||
const std::string name {name_};
|
const std::string name {name_};
|
||||||
|
|
@ -323,9 +334,17 @@ void PlacefileRecord::Update()
|
||||||
decodedUrl.erase(queryPos);
|
decodedUrl.erase(queryPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Update hard coded parameters
|
if (p->radarSite_ == nullptr)
|
||||||
|
{
|
||||||
|
// Wait to process until a radar site is selected
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Specify parameters
|
||||||
auto parameters = cpr::Parameters {
|
auto parameters = cpr::Parameters {
|
||||||
{"version", "1.2"}, {"lat", "38.699"}, {"lon", "-90.683"}};
|
{"version", "1.2"}, // Placefile Version Supported
|
||||||
|
{"lat", fmt::format("{:0.3f}", p->radarSite_->latitude())},
|
||||||
|
{"lon", fmt::format("{:0.3f}", p->radarSite_->longitude())}};
|
||||||
|
|
||||||
// Iterate through each query parameter in the URL
|
// Iterate through each query parameter in the URL
|
||||||
if (url.hasQuery())
|
if (url.hasQuery())
|
||||||
|
|
@ -377,7 +396,15 @@ void PlacefileRecord::Update()
|
||||||
|
|
||||||
if (updatedPlacefile != nullptr)
|
if (updatedPlacefile != nullptr)
|
||||||
{
|
{
|
||||||
Q_EMIT Updated(name, updatedPlacefile);
|
// Check the name matches, in case the name updated
|
||||||
|
if (name_ == name)
|
||||||
|
{
|
||||||
|
// Update the placefile
|
||||||
|
placefile_ = updatedPlacefile;
|
||||||
|
|
||||||
|
// Notify slots of the placefile update
|
||||||
|
Q_EMIT p->self_->PlacefileUpdated(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Update refresh timer
|
// TODO: Update refresh timer
|
||||||
|
|
@ -385,12 +412,13 @@ void PlacefileRecord::Update()
|
||||||
// cause issues?
|
// cause issues?
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacefileRecord::UpdateAsync()
|
void PlacefileManager::Impl::PlacefileRecord::UpdateAsync()
|
||||||
{
|
{
|
||||||
boost::asio::post(threadPool_, [this]() { Update(); });
|
boost::asio::post(threadPool_, [this]() { Update(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlacefileRecord::UpdatePlacefile(std::shared_ptr<gr::Placefile> placefile)
|
void PlacefileManager::Impl::PlacefileRecord::UpdatePlacefile(
|
||||||
|
std::shared_ptr<gr::Placefile> placefile)
|
||||||
{
|
{
|
||||||
// Update placefile
|
// Update placefile
|
||||||
placefile_ = placefile;
|
placefile_ = placefile;
|
||||||
|
|
@ -438,5 +466,3 @@ std::string PlacefileManager::Impl::NormalizeUrl(const std::string& urlString)
|
||||||
} // namespace manager
|
} // namespace manager
|
||||||
} // namespace qt
|
} // namespace qt
|
||||||
} // namespace scwx
|
} // namespace scwx
|
||||||
|
|
||||||
#include "placefile_manager.moc"
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <scwx/gr/placefile.hpp>
|
#include <scwx/gr/placefile.hpp>
|
||||||
|
#include <scwx/qt/config/radar_site.hpp>
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
|
|
@ -27,6 +28,8 @@ public:
|
||||||
void set_placefile_thresholded(const std::string& name, bool thresholded);
|
void set_placefile_thresholded(const std::string& name, bool thresholded);
|
||||||
void set_placefile_url(const std::string& name, const std::string& newUrl);
|
void set_placefile_url(const std::string& name, const std::string& newUrl);
|
||||||
|
|
||||||
|
void SetRadarSite(std::shared_ptr<config::RadarSite> radarSite);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets a list of active placefiles
|
* @brief Gets a list of active placefiles
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue