mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 08:50:05 +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("?"); | ||||
|    } | ||||
| 
 | ||||
|    placefileManager_->SetRadarSite(radarSite); | ||||
| } | ||||
| 
 | ||||
| void MainWindowImpl::UpdateVcp() | ||||
|  |  | |||
|  | @ -24,15 +24,36 @@ namespace manager | |||
| static const std::string logPrefix_ = "scwx::qt::manager::placefile_manager"; | ||||
| static const auto        logger_    = scwx::util::Logger::Create(logPrefix_); | ||||
| 
 | ||||
| class PlacefileRecord : public QObject | ||||
| class PlacefileManager::Impl | ||||
| { | ||||
|    Q_OBJECT | ||||
| 
 | ||||
| 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, | ||||
|                             bool                           enabled = true) : | ||||
|        name_ {name}, placefile_ {placefile}, enabled_ {enabled} | ||||
|        p {impl}, name_ {name}, placefile_ {placefile}, enabled_ {enabled} | ||||
|    { | ||||
|    } | ||||
|    ~PlacefileRecord() | ||||
|  | @ -45,6 +66,8 @@ public: | |||
|    void UpdateAsync(); | ||||
|    void UpdatePlacefile(std::shared_ptr<gr::Placefile> placefile); | ||||
| 
 | ||||
|    Impl* p; | ||||
| 
 | ||||
|    std::string                    name_; | ||||
|    std::shared_ptr<gr::Placefile> placefile_; | ||||
|    bool                           enabled_; | ||||
|  | @ -58,26 +81,6 @@ signals: | |||
|                 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() = default; | ||||
| 
 | ||||
|  | @ -126,11 +129,19 @@ void PlacefileManager::set_placefile_enabled(const std::string& name, | |||
|    auto it = p->placefileRecordMap_.find(name); | ||||
|    if (it != p->placefileRecordMap_.cend()) | ||||
|    { | ||||
|       it->second->enabled_ = enabled; | ||||
|       auto record      = it->second; | ||||
|       record->enabled_ = enabled; | ||||
| 
 | ||||
|       lock.unlock(); | ||||
| 
 | ||||
|       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( | ||||
|    std::shared_ptr<PlacefileRecord> record) | ||||
| void PlacefileManager::SetRadarSite( | ||||
|    std::shared_ptr<config::RadarSite> radarSite) | ||||
| { | ||||
|    QObject::connect( | ||||
|       record.get(), | ||||
|       &PlacefileRecord::Updated, | ||||
|       self_, | ||||
|       [this](const std::string& name, std::shared_ptr<gr::Placefile> placefile) | ||||
|    if (p->radarSite_ == radarSite || radarSite == nullptr) | ||||
|    { | ||||
|          PlacefileRecord* sender = | ||||
|             static_cast<PlacefileRecord*>(self_->sender()); | ||||
| 
 | ||||
|          // Check the name matches, in case the name updated
 | ||||
|          if (sender->name_ == name) | ||||
|          { | ||||
|             // Update the placefile
 | ||||
|             sender->placefile_ = placefile; | ||||
| 
 | ||||
|             // Notify slots of the placefile update
 | ||||
|             Q_EMIT self_->PlacefileUpdated(name); | ||||
|       // No action needed
 | ||||
|       return; | ||||
|    } | ||||
| 
 | ||||
|    logger_->debug("SetRadarSite: {}", radarSite->id()); | ||||
| 
 | ||||
|    p->radarSite_ = radarSite; | ||||
| 
 | ||||
|    // Update all enabled records
 | ||||
|    std::shared_lock lock(p->placefileRecordLock_); | ||||
|    for (auto& record : p->placefileRecords_) | ||||
|    { | ||||
|       if (record->enabled_) | ||||
|       { | ||||
|          record->UpdateAsync(); | ||||
|       } | ||||
|    } | ||||
|       }); | ||||
| } | ||||
| 
 | ||||
| std::vector<std::shared_ptr<gr::Placefile>> | ||||
|  | @ -240,10 +251,10 @@ void PlacefileManager::AddUrl(const std::string& urlString) | |||
|    logger_->info("AddUrl: {}", normalizedUrl); | ||||
| 
 | ||||
|    // Add an empty placefile record for the new URL
 | ||||
|    auto& record = p->placefileRecords_.emplace_back( | ||||
|       std::make_shared<PlacefileRecord>(normalizedUrl, nullptr, false)); | ||||
|    auto& record = | ||||
|       p->placefileRecords_.emplace_back(std::make_shared<Impl::PlacefileRecord>( | ||||
|          p.get(), normalizedUrl, nullptr, false)); | ||||
|    p->placefileRecordMap_.insert_or_assign(normalizedUrl, record); | ||||
|    p->ConnectRecordSignals(record); | ||||
| 
 | ||||
|    lock.unlock(); | ||||
| 
 | ||||
|  | @ -290,9 +301,9 @@ void PlacefileManager::LoadFile(const std::string& filename) | |||
|          { | ||||
|             // If this is a new placefile, add it
 | ||||
|             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->ConnectRecordSignals(record); | ||||
| 
 | ||||
|             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.
 | ||||
|    const std::string name {name_}; | ||||
|  | @ -323,9 +334,17 @@ void PlacefileRecord::Update() | |||
|          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 { | ||||
|          {"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
 | ||||
|       if (url.hasQuery()) | ||||
|  | @ -377,7 +396,15 @@ void PlacefileRecord::Update() | |||
| 
 | ||||
|    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
 | ||||
|  | @ -385,12 +412,13 @@ void PlacefileRecord::Update() | |||
|    // cause issues?
 | ||||
| } | ||||
| 
 | ||||
| void PlacefileRecord::UpdateAsync() | ||||
| void PlacefileManager::Impl::PlacefileRecord::UpdateAsync() | ||||
| { | ||||
|    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
 | ||||
|    placefile_ = placefile; | ||||
|  | @ -438,5 +466,3 @@ std::string PlacefileManager::Impl::NormalizeUrl(const std::string& urlString) | |||
| } // namespace manager
 | ||||
| } // namespace qt
 | ||||
| } // namespace scwx
 | ||||
| 
 | ||||
| #include "placefile_manager.moc" | ||||
|  |  | |||
|  | @ -1,6 +1,7 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <scwx/gr/placefile.hpp> | ||||
| #include <scwx/qt/config/radar_site.hpp> | ||||
| 
 | ||||
| #include <QObject> | ||||
| 
 | ||||
|  | @ -27,6 +28,8 @@ public: | |||
|    void set_placefile_thresholded(const std::string& name, bool thresholded); | ||||
|    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 | ||||
|     * | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat