From f7b8778e0de6c1f98c4e2138b13ce1e7d2600a39 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 13 Feb 2022 11:20:34 -0600 Subject: [PATCH] Radar product manager load file functionality --- .../scwx/qt/manager/radar_product_manager.cpp | 65 +++++++++++++++++++ .../scwx/qt/manager/radar_product_manager.hpp | 11 ++++ 2 files changed, 76 insertions(+) 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 277a32b9..39afc216 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -2,10 +2,12 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -23,6 +25,13 @@ namespace manager static const std::string logPrefix_ = "[scwx::qt::manager::radar_product_manager] "; +typedef std::function()> + CreateNexradFileFunction; + +static void LoadNexradFile(CreateNexradFileFunction load, + FileLoadCompleteFunction onComplete, + QObject* context); + static constexpr uint32_t NUM_RADIAL_GATES_0_5_DEGREE = common::MAX_0_5_DEGREE_RADIALS * common::MAX_DATA_MOMENT_GATES; static constexpr uint32_t NUM_RADIAL_GATES_1_DEGREE = @@ -36,6 +45,8 @@ static constexpr uint32_t NUM_COORIDNATES_1_DEGREE = static std::unordered_map> instanceMap_; +static std::shared_mutex fileLoadMutex_; + class RadarProductManagerImpl { public: @@ -199,6 +210,60 @@ void RadarProductManager::Initialize() p->initialized_ = true; } +void RadarProductManager::LoadData(std::istream& is, + FileLoadCompleteFunction onComplete, + QObject* context) +{ + LoadNexradFile( + [=, &is]() -> std::shared_ptr { + return wsr88d::NexradFileFactory::Create(is); + }, + onComplete, + context); +} + +void RadarProductManager::LoadFile(const std::string& filename, + FileLoadCompleteFunction onComplete, + QObject* context) +{ + LoadNexradFile( + [=]() -> std::shared_ptr { + return wsr88d::NexradFileFactory::Create(filename); + }, + onComplete, + context); +} + +static void LoadNexradFile(CreateNexradFileFunction load, + FileLoadCompleteFunction onComplete, + QObject* context) +{ + scwx::util::async( + [=]() + { + std::unique_lock lock(fileLoadMutex_); + std::shared_ptr nexradFile = load(); + + // TODO: Store and index + // - Should this impact arguments sent back in onComplete? + + lock.unlock(); + + if (onComplete != nullptr) + { + if (context == nullptr) + { + onComplete(nexradFile); + } + else + { + QMetaObject::invokeMethod(context, + [=]() { onComplete(nexradFile); }); + } + } + }); +} + void RadarProductManager::LoadLevel2Data(const std::string& filename) { std::shared_ptr ar2vFile = 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 73d54b30..bc81c60b 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -16,6 +17,9 @@ namespace qt namespace manager { +typedef std::function)> + FileLoadCompleteFunction; + class RadarProductManagerImpl; class RadarProductManager : public QObject @@ -45,6 +49,13 @@ public: static std::shared_ptr Instance(const std::string& radarSite); + static void LoadData(std::istream& is, + FileLoadCompleteFunction onComplete, + QObject* context = nullptr); + static void LoadFile(const std::string& filename, + FileLoadCompleteFunction onComplete, + QObject* context = nullptr); + signals: void Level2DataLoaded();