Radar product manager load file functionality

This commit is contained in:
Dan Paulat 2022-02-13 11:20:34 -06:00
parent 3829b77994
commit f7b8778e0d
2 changed files with 76 additions and 0 deletions

View file

@ -2,10 +2,12 @@
#include <scwx/common/constants.hpp>
#include <scwx/qt/config/radar_site.hpp>
#include <scwx/util/threads.hpp>
#include <scwx/wsr88d/nexrad_file_factory.hpp>
#include <deque>
#include <execution>
#include <mutex>
#include <shared_mutex>
#include <boost/log/trivial.hpp>
#include <boost/range/irange.hpp>
@ -23,6 +25,13 @@ namespace manager
static const std::string logPrefix_ =
"[scwx::qt::manager::radar_product_manager] ";
typedef std::function<std::shared_ptr<wsr88d::NexradFile>()>
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<std::string, std::shared_ptr<RadarProductManager>>
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<wsr88d::NexradFile> {
return wsr88d::NexradFileFactory::Create(is);
},
onComplete,
context);
}
void RadarProductManager::LoadFile(const std::string& filename,
FileLoadCompleteFunction onComplete,
QObject* context)
{
LoadNexradFile(
[=]() -> std::shared_ptr<wsr88d::NexradFile> {
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<wsr88d::NexradFile> 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<wsr88d::Ar2vFile> ar2vFile =

View file

@ -3,6 +3,7 @@
#include <scwx/common/types.hpp>
#include <scwx/qt/config/radar_site.hpp>
#include <scwx/wsr88d/ar2v_file.hpp>
#include <scwx/wsr88d/level3_file.hpp>
#include <memory>
#include <vector>
@ -16,6 +17,9 @@ namespace qt
namespace manager
{
typedef std::function<void(std::shared_ptr<wsr88d::NexradFile>)>
FileLoadCompleteFunction;
class RadarProductManagerImpl;
class RadarProductManager : public QObject
@ -45,6 +49,13 @@ public:
static std::shared_ptr<RadarProductManager>
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();