mirror of
				https://github.com/ciphervance/supercell-wx.git
				synced 2025-10-31 07:50:05 +00:00 
			
		
		
		
	Associate product refresh with a uuid
Allows product manager to track which map widgets have enabled which product refreshes
This commit is contained in:
		
							parent
							
								
									5a353a8139
								
							
						
					
					
						commit
						6e10ca88d5
					
				
					 3 changed files with 91 additions and 9 deletions
				
			
		|  | @ -16,6 +16,7 @@ | |||
| 
 | ||||
| #pragma warning(push, 0) | ||||
| #include <boost/asio/steady_timer.hpp> | ||||
| #include <boost/container_hash/hash.hpp> | ||||
| #include <boost/range/irange.hpp> | ||||
| #include <boost/timer/timer.hpp> | ||||
| #include <fmt/chrono.h> | ||||
|  | @ -166,7 +167,8 @@ public: | |||
|    std::shared_ptr<ProviderManager> | ||||
|    GetLevel3ProviderManager(const std::string& product); | ||||
| 
 | ||||
|    void EnableRefresh(std::shared_ptr<ProviderManager> providerManager, | ||||
|    void EnableRefresh(boost::uuids::uuid               uuid, | ||||
|                       std::shared_ptr<ProviderManager> providerManager, | ||||
|                       bool                             enabled); | ||||
|    void RefreshData(std::shared_ptr<ProviderManager> providerManager); | ||||
| 
 | ||||
|  | @ -218,6 +220,12 @@ public: | |||
| 
 | ||||
|    common::Level3ProductCategoryMap availableCategoryMap_; | ||||
|    std::shared_mutex                availableCategoryMutex_; | ||||
| 
 | ||||
|    std::unordered_map<boost::uuids::uuid, | ||||
|                       std::shared_ptr<ProviderManager>, | ||||
|                       boost::hash<boost::uuids::uuid>> | ||||
|               refreshMap_ {}; | ||||
|    std::mutex refreshMapMutex_ {}; | ||||
| }; | ||||
| 
 | ||||
| RadarProductManager::RadarProductManager(const std::string& radarId) : | ||||
|  | @ -248,6 +256,8 @@ std::string ProviderManager::name() const | |||
| 
 | ||||
| void ProviderManager::Disable() | ||||
| { | ||||
|    logger_->debug("Disabling refresh: {}", name()); | ||||
| 
 | ||||
|    std::unique_lock lock(refreshTimerMutex_); | ||||
|    refreshEnabled_ = false; | ||||
|    refreshTimer_.cancel(); | ||||
|  | @ -413,11 +423,12 @@ RadarProductManagerImpl::GetLevel3ProviderManager(const std::string& product) | |||
| 
 | ||||
| void RadarProductManager::EnableRefresh(common::RadarProductGroup group, | ||||
|                                         const std::string&        product, | ||||
|                                         bool                      enabled) | ||||
|                                         bool                      enabled, | ||||
|                                         boost::uuids::uuid        uuid) | ||||
| { | ||||
|    if (group == common::RadarProductGroup::Level2) | ||||
|    { | ||||
|       p->EnableRefresh(p->level2ProviderManager_, enabled); | ||||
|       p->EnableRefresh(uuid, p->level2ProviderManager_, enabled); | ||||
|    } | ||||
|    else | ||||
|    { | ||||
|  | @ -437,16 +448,65 @@ void RadarProductManager::EnableRefresh(common::RadarProductGroup group, | |||
|                           availableProducts.cend(), | ||||
|                           product) != availableProducts.cend()) | ||||
|             { | ||||
|                p->EnableRefresh(providerManager, enabled); | ||||
|                p->EnableRefresh(uuid, providerManager, enabled); | ||||
|             } | ||||
|          }); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
| void RadarProductManagerImpl::EnableRefresh( | ||||
|    std::shared_ptr<ProviderManager> providerManager, bool enabled) | ||||
|    boost::uuids::uuid               uuid, | ||||
|    std::shared_ptr<ProviderManager> providerManager, | ||||
|    bool                             enabled) | ||||
| { | ||||
|    if (providerManager->refreshEnabled_ != enabled) | ||||
|    // Lock the refresh map
 | ||||
|    std::unique_lock lock {refreshMapMutex_}; | ||||
| 
 | ||||
|    auto currentProviderManager = refreshMap_.find(uuid); | ||||
|    if (currentProviderManager != refreshMap_.cend()) | ||||
|    { | ||||
|       // If the enabling refresh for a different product, or disabling refresh
 | ||||
|       if (currentProviderManager->second != providerManager || !enabled) | ||||
|       { | ||||
|          // Determine number of entries in the map for the current provider
 | ||||
|          // manager
 | ||||
|          auto currentProviderManagerCount = std::count_if( | ||||
|             refreshMap_.cbegin(), | ||||
|             refreshMap_.cend(), | ||||
|             [&](const auto& provider) | ||||
|             { return provider.second == currentProviderManager->second; }); | ||||
| 
 | ||||
|          // If this is the last reference to the provider in the refresh map
 | ||||
|          if (currentProviderManagerCount == 1) | ||||
|          { | ||||
|             // Disable current provider
 | ||||
|             currentProviderManager->second->Disable(); | ||||
|          } | ||||
| 
 | ||||
|          // Dissociate uuid from current provider manager
 | ||||
|          refreshMap_.erase(currentProviderManager); | ||||
| 
 | ||||
|          // If we are enabling a new provider manager
 | ||||
|          if (enabled) | ||||
|          { | ||||
|             // Associate uuid to providerManager
 | ||||
|             refreshMap_.emplace(uuid, providerManager); | ||||
|          } | ||||
|       } | ||||
|    } | ||||
|    else if (enabled) | ||||
|    { | ||||
|       // We are enabling a new provider manager
 | ||||
|       // Associate uuid to provider manager
 | ||||
|       refreshMap_.emplace(uuid, providerManager); | ||||
|    } | ||||
| 
 | ||||
|    // Release the refresh map mutex
 | ||||
|    lock.unlock(); | ||||
| 
 | ||||
|    // We have already handled a disable request by this point. If enabling, and
 | ||||
|    // the provider manager refresh isn't already enabled, enable it.
 | ||||
|    if (enabled && providerManager->refreshEnabled_ != enabled) | ||||
|    { | ||||
|       providerManager->refreshEnabled_ = enabled; | ||||
| 
 | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ | |||
| #include <unordered_map> | ||||
| #include <vector> | ||||
| 
 | ||||
| #include <boost/uuid/nil_generator.hpp> | ||||
| #include <QObject> | ||||
| 
 | ||||
| namespace scwx | ||||
|  | @ -38,9 +39,24 @@ public: | |||
|    std::shared_ptr<config::RadarSite> radar_site() const; | ||||
| 
 | ||||
|    void Initialize(); | ||||
| 
 | ||||
|    /**
 | ||||
|     * @brief Enables or disables refresh associated with a unique identifier | ||||
|     * (UUID) for a given radar product group and product. | ||||
|     * | ||||
|     * Only a single product refresh can be enabled for a given UUID. If a second | ||||
|     * product refresh is enabled for the same UUID, the first product refresh is | ||||
|     * disabled (unless still enabled under a different UUID). | ||||
|     * | ||||
|     * @param [in] group Radar product group | ||||
|     * @param [in] product Radar product name | ||||
|     * @param [in] enabled Whether to enable refresh | ||||
|     * @param [in] uuid Unique identifier. Default is boost::uuids::nil_uuid(). | ||||
|     */ | ||||
|    void EnableRefresh(common::RadarProductGroup group, | ||||
|                       const std::string&        product, | ||||
|                       bool                      enabled); | ||||
|                       bool                      enabled, | ||||
|                       boost::uuids::uuid uuid = boost::uuids::nil_uuid()); | ||||
| 
 | ||||
|    std::tuple<std::shared_ptr<wsr88d::rda::ElevationScan>, | ||||
|               float, | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ | |||
| 
 | ||||
| #include <backends/imgui_impl_opengl3.h> | ||||
| #include <backends/imgui_impl_qt.hpp> | ||||
| #include <boost/uuid/random_generator.hpp> | ||||
| #include <imgui.h> | ||||
| #include <QApplication> | ||||
| #include <QColor> | ||||
|  | @ -58,6 +59,7 @@ class MapWidgetImpl : public QObject | |||
| public: | ||||
|    explicit MapWidgetImpl(MapWidget*                   widget, | ||||
|                           const QMapLibreGL::Settings& settings) : | ||||
|        uuid_ {boost::uuids::random_generator()()}, | ||||
|        context_ {std::make_shared<MapContext>()}, | ||||
|        widget_ {widget}, | ||||
|        settings_(settings), | ||||
|  | @ -126,6 +128,8 @@ public: | |||
|    common::Level2Product | ||||
|    GetLevel2ProductOrDefault(const std::string& productName) const; | ||||
| 
 | ||||
|    boost::uuids::uuid uuid_; | ||||
| 
 | ||||
|    std::shared_ptr<MapContext> context_; | ||||
| 
 | ||||
|    MapWidget*                        widget_; | ||||
|  | @ -399,7 +403,8 @@ void MapWidget::SelectRadarProduct(common::RadarProductGroup group, | |||
| 
 | ||||
|    if (p->autoRefreshEnabled_) | ||||
|    { | ||||
|       p->radarProductManager_->EnableRefresh(group, productName, true); | ||||
|       p->radarProductManager_->EnableRefresh( | ||||
|          group, productName, true, p->uuid_); | ||||
|    } | ||||
| } | ||||
| 
 | ||||
|  | @ -485,7 +490,8 @@ void MapWidget::SetAutoRefresh(bool enabled) | |||
|          p->radarProductManager_->EnableRefresh( | ||||
|             radarProductView->GetRadarProductGroup(), | ||||
|             radarProductView->GetRadarProductName(), | ||||
|             true); | ||||
|             true, | ||||
|             p->uuid_); | ||||
|       } | ||||
|    } | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dan Paulat
						Dan Paulat