diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index 490a0826..f8a4ef90 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -357,6 +357,11 @@ void MainWindow::on_actionImGuiDebug_triggered() p->imGuiDebugDialog_->show(); } +void MainWindow::on_actionDumpRadarProductRecords_triggered() +{ + manager::RadarProductManager::DumpRecords(); +} + void MainWindow::on_actionUserManual_triggered() { QDesktopServices::openUrl(QUrl {"https://supercell-wx.readthedocs.io/"}); diff --git a/scwx-qt/source/scwx/qt/main/main_window.hpp b/scwx-qt/source/scwx/qt/main/main_window.hpp index 0902c0e6..8b64a014 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.hpp +++ b/scwx-qt/source/scwx/qt/main/main_window.hpp @@ -37,6 +37,7 @@ private slots: void on_actionSettings_triggered(); void on_actionExit_triggered(); void on_actionImGuiDebug_triggered(); + void on_actionDumpRadarProductRecords_triggered(); void on_actionUserManual_triggered(); void on_actionDiscord_triggered(); void on_actionGitHubRepository_triggered(); diff --git a/scwx-qt/source/scwx/qt/main/main_window.ui b/scwx-qt/source/scwx/qt/main/main_window.ui index 7cf48f3c..77d45c5e 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.ui +++ b/scwx-qt/source/scwx/qt/main/main_window.ui @@ -83,6 +83,8 @@ &Debug + + @@ -397,6 +399,11 @@ &GitHub Repository + + + Dump Radar &Product Records + + diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp index 7cd70f37..33b12b58 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -54,8 +54,8 @@ static const std::string kDefaultLevel3Product_ {"N0B"}; static constexpr std::chrono::seconds kRetryInterval_ {15}; static std::unordered_map> - instanceMap_; -static std::mutex instanceMutex_; + instanceMap_; +static std::shared_mutex instanceMutex_; static std::unordered_map> @@ -276,6 +276,58 @@ void RadarProductManager::Cleanup() } } +void RadarProductManager::DumpRecords() +{ + scwx::util::async( + [] + { + logger_->info("Record Dump"); + + std::shared_lock instanceLock {instanceMutex_}; + for (auto& instance : instanceMap_) + { + auto radarProductManager = instance.second.lock(); + if (radarProductManager != nullptr) + { + logger_->info(" {}", radarProductManager->radar_site()->id()); + logger_->info(" Level 2"); + + { + std::shared_lock level2ProductLock { + radarProductManager->p->level2ProductRecordMutex_}; + + for (auto& record : + radarProductManager->p->level2ProductRecords_) + { + logger_->info(" {}", + scwx::util::TimeString(record.first)); + } + } + + logger_->info(" Level 3"); + + { + std::shared_lock level3ProductLock { + radarProductManager->p->level3ProductRecordMutex_}; + + for (auto& recordMap : + radarProductManager->p->level3ProductRecordsMap_) + { + // Product Name + logger_->info(" {}", recordMap.first); + + for (auto& record : recordMap.second) + { + logger_->info(" {}", + scwx::util::TimeString(record.first)); + } + } + } + } + } + }); +} + const std::vector& RadarProductManager::coordinates(common::RadialSize radialSize) const { @@ -1030,7 +1082,7 @@ RadarProductManager::Instance(const std::string& radarSite) bool instanceCreated = false; { - std::lock_guard guard(instanceMutex_); + std::unique_lock lock {instanceMutex_}; // Look up instance weak pointer auto it = instanceMap_.find(radarSite); diff --git a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp index cdce3a51..66984ed1 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -34,6 +34,11 @@ public: static void Cleanup(); + /** + * @brief Debug function to dump currently loaded products to the log. + */ + static void DumpRecords(); + const std::vector& coordinates(common::RadialSize radialSize) const; float gate_size() const; std::shared_ptr radar_site() const;