From c9e312fd543e250b00959089e0e9e0f3e2480d96 Mon Sep 17 00:00:00 2001 From: Dan Paulat Date: Sun, 27 Feb 2022 22:22:47 -0600 Subject: [PATCH] Create record for loaded NEXRAD file in preparation for storage --- scwx-qt/scwx-qt.cmake | 6 + scwx-qt/source/scwx/qt/main/main_window.cpp | 17 +- .../scwx/qt/manager/radar_product_manager.cpp | 82 +++------- .../scwx/qt/manager/radar_product_manager.hpp | 8 + .../scwx/qt/request/nexrad_file_request.cpp | 51 +----- .../scwx/qt/request/nexrad_file_request.hpp | 14 +- .../scwx/qt/types/radar_product_record.cpp | 148 ++++++++++++++++++ .../scwx/qt/types/radar_product_record.hpp | 49 ++++++ scwx-qt/ts/scwx_en_US.ts | 2 +- .../wsr88d/rpg/general_status_message.hpp | 1 - .../scwx/wsr88d/rpg/level3_message.hpp | 5 +- .../source/scwx/wsr88d/rpg/level3_message.cpp | 6 + 12 files changed, 269 insertions(+), 120 deletions(-) create mode 100644 scwx-qt/source/scwx/qt/types/radar_product_record.cpp create mode 100644 scwx-qt/source/scwx/qt/types/radar_product_record.hpp diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index 0ede03eb..2ac41c9b 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -94,6 +94,8 @@ set(HDR_SETTINGS source/scwx/qt/settings/general_settings.hpp source/scwx/qt/settings/palette_settings.hpp) set(SRC_SETTINGS source/scwx/qt/settings/general_settings.cpp source/scwx/qt/settings/palette_settings.cpp) +set(HDR_TYPES source/scwx/qt/types/radar_product_record.hpp) +set(SRC_TYPES source/scwx/qt/types/radar_product_record.cpp) set(HDR_UI source/scwx/qt/ui/flow_layout.hpp) set(SRC_UI source/scwx/qt/ui/flow_layout.cpp) set(HDR_UTIL source/scwx/qt/util/font.hpp @@ -143,6 +145,8 @@ set(PROJECT_SOURCES ${HDR_MAIN} ${SRC_REQUEST} ${HDR_SETTINGS} ${SRC_SETTINGS} + ${HDR_TYPES} + ${SRC_TYPES} ${HDR_UI} ${SRC_UI} ${HDR_UTIL} @@ -173,6 +177,8 @@ source_group("Header Files\\request" FILES ${HDR_REQUEST}) source_group("Source Files\\request" FILES ${SRC_REQUEST}) source_group("Header Files\\settings" FILES ${HDR_SETTINGS}) source_group("Source Files\\settings" FILES ${SRC_SETTINGS}) +source_group("Header Files\\types" FILES ${HDR_TYPES}) +source_group("Source Files\\types" FILES ${SRC_TYPES}) source_group("Header Files\\ui" FILES ${HDR_UI}) source_group("Source Files\\ui" FILES ${SRC_UI}) source_group("Header Files\\util" FILES ${HDR_UTIL}) diff --git a/scwx-qt/source/scwx/qt/main/main_window.cpp b/scwx-qt/source/scwx/qt/main/main_window.cpp index c21b59a3..73491f52 100644 --- a/scwx-qt/source/scwx/qt/main/main_window.cpp +++ b/scwx-qt/source/scwx/qt/main/main_window.cpp @@ -226,19 +226,22 @@ void MainWindow::on_actionOpen_triggered() std::shared_ptr request = std::make_shared(); - connect( + connect( // request.get(), &request::NexradFileRequest::RequestComplete, this, [=](std::shared_ptr request) { - std::shared_ptr nexradFile = - request->nexrad_file(); + std::shared_ptr record = + request->radar_product_record(); + std::shared_ptr level2File = nullptr; + std::shared_ptr level3File = nullptr; - std::shared_ptr level2File = - std::dynamic_pointer_cast(nexradFile); - std::shared_ptr level3File = - std::dynamic_pointer_cast(nexradFile); + if (record != nullptr) + { + level2File = record->level2_file(); + level3File = record->level3_file(); + } if (level2File != nullptr) { 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 cdc5ecf4..c166b1ce 100644 --- a/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp +++ b/scwx-qt/source/scwx/qt/manager/radar_product_manager.cpp @@ -1,9 +1,6 @@ #include #include -#include -#include #include -#include #include #include @@ -27,12 +24,6 @@ namespace manager static const std::string logPrefix_ = "[scwx::qt::manager::radar_product_manager] "; -typedef std::function()> - CreateNexradFileFunction; - -static void LoadNexradFile(CreateNexradFileFunction load, - std::shared_ptr request); - 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 = @@ -65,6 +56,9 @@ public: } ~RadarProductManagerImpl() = default; + void + StoreRadarProductRecord(std::shared_ptr record); + std::string radarId_; bool initialized_; @@ -214,26 +208,23 @@ void RadarProductManager::Initialize() void RadarProductManager::LoadData( std::istream& is, std::shared_ptr request) { - LoadNexradFile( - [=, &is]() -> std::shared_ptr { - return wsr88d::NexradFileFactory::Create(is); - }, - request); + LoadNexradFile([=, &is]() -> std::shared_ptr + { return wsr88d::NexradFileFactory::Create(is); }, + request); } void RadarProductManager::LoadFile( const std::string& filename, std::shared_ptr request) { - LoadNexradFile( - [=]() -> std::shared_ptr { - return wsr88d::NexradFileFactory::Create(filename); - }, - request); + LoadNexradFile([=]() -> std::shared_ptr + { return wsr88d::NexradFileFactory::Create(filename); }, + request); } -static void LoadNexradFile(CreateNexradFileFunction load, - std::shared_ptr request) +void RadarProductManager::LoadNexradFile( + CreateNexradFileFunction load, + std::shared_ptr request) { scwx::util::async( [=]() @@ -241,45 +232,19 @@ static void LoadNexradFile(CreateNexradFileFunction load, std::unique_lock lock(fileLoadMutex_); std::shared_ptr nexradFile = load(); - std::shared_ptr level2File = - std::dynamic_pointer_cast(nexradFile); - std::shared_ptr level3File = - std::dynamic_pointer_cast(nexradFile); + std::shared_ptr record = nullptr; - bool fileValid = false; - std::string radarId = "????"; - std::string siteId = "???"; - uint16_t julianDate = 0; - uint32_t milliseconds = 0; - - std::chrono::system_clock::time_point time; - - if (level2File != nullptr) - { - fileValid = true; - radarId = level2File->icao(); - siteId = common::GetSiteId(radarId); - julianDate = level2File->julian_date(); - milliseconds = level2File->milliseconds(); - } - else if (level3File != nullptr) - { - fileValid = true; - siteId = level3File->wmo_header()->product_designator(); - radarId = config::GetRadarIdFromSiteId(siteId); - julianDate = level3File->message()->header().date_of_message(); - milliseconds = - level3File->message()->header().time_of_message() * 1000u; - } + bool fileValid = (nexradFile != nullptr); if (fileValid) { - time = util::TimePoint(julianDate, milliseconds); + record = types::RadarProductRecord::Create(nexradFile); std::shared_ptr manager = - RadarProductManager::Instance(radarId); + RadarProductManager::Instance(record->radar_id()); + + manager->p->StoreRadarProductRecord(record); - // TODO: Store and index // TODO: When to initialize? } @@ -287,10 +252,7 @@ static void LoadNexradFile(CreateNexradFileFunction load, if (request != nullptr) { - request->set_nexrad_file(nexradFile); - request->set_radar_id(radarId); - request->set_site_id(siteId); - request->set_time(time); + request->set_radar_product_record(record); emit request->RequestComplete(request); } }); @@ -317,6 +279,12 @@ void RadarProductManager::LoadLevel2Data(const std::string& filename) emit Level2DataLoaded(); } +void RadarProductManagerImpl::StoreRadarProductRecord( + std::shared_ptr record) +{ + // TODO +} + std::tuple, float, std::vector> 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 9b6ce6f4..a079cc4f 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 @@ -58,6 +59,13 @@ signals: void Level2DataLoaded(); private: + typedef std::function()> + CreateNexradFileFunction; + + static void + LoadNexradFile(CreateNexradFileFunction load, + std::shared_ptr request); + std::unique_ptr p; }; diff --git a/scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp b/scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp index 586b5be1..af39c1da 100644 --- a/scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp +++ b/scwx-qt/source/scwx/qt/request/nexrad_file_request.cpp @@ -15,17 +15,11 @@ static const std::string logPrefix_ = class NexradFileRequestImpl { public: - explicit NexradFileRequestImpl() : - nexradFile_ {nullptr}, radarId_ {}, siteId_ {}, time_ {} - { - } + explicit NexradFileRequestImpl() : radarProductRecord_ {nullptr} {} ~NexradFileRequestImpl() {} - std::shared_ptr nexradFile_; - std::string radarId_; - std::string siteId_; - std::chrono::system_clock::time_point time_; + std::shared_ptr radarProductRecord_; }; NexradFileRequest::NexradFileRequest() : @@ -34,45 +28,16 @@ NexradFileRequest::NexradFileRequest() : } NexradFileRequest::~NexradFileRequest() = default; -std::shared_ptr NexradFileRequest::nexrad_file() const +std::shared_ptr +NexradFileRequest::radar_product_record() const { - return p->nexradFile_; + return p->radarProductRecord_; } -std::string NexradFileRequest::radar_id() const +void NexradFileRequest::set_radar_product_record( + std::shared_ptr record) { - return p->radarId_; -} - -std::string NexradFileRequest::site_id() const -{ - return p->siteId_; -} - -std::chrono::system_clock::time_point NexradFileRequest::time() const -{ - return p->time_; -} - -void NexradFileRequest::set_nexrad_file( - std::shared_ptr nexradFile) -{ - p->nexradFile_ = nexradFile; -} - -void NexradFileRequest::set_radar_id(const std::string& radarId) -{ - p->radarId_ = radarId; -} - -void NexradFileRequest::set_site_id(const std::string& siteId) -{ - p->siteId_ = siteId; -} - -void NexradFileRequest::set_time(std::chrono::system_clock::time_point time) -{ - p->time_ = time; + p->radarProductRecord_ = record; } } // namespace request diff --git a/scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp b/scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp index 37fa77cd..787f513b 100644 --- a/scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp +++ b/scwx-qt/source/scwx/qt/request/nexrad_file_request.hpp @@ -1,8 +1,7 @@ #pragma once -#include +#include -#include #include #include @@ -24,15 +23,10 @@ public: explicit NexradFileRequest(); ~NexradFileRequest(); - std::shared_ptr nexrad_file() const; - std::string radar_id() const; - std::string site_id() const; - std::chrono::system_clock::time_point time() const; + std::shared_ptr radar_product_record() const; - void set_nexrad_file(std::shared_ptr nexradFile); - void set_radar_id(const std::string& radarId); - void set_site_id(const std::string& siteId); - void set_time(std::chrono::system_clock::time_point time); + void + set_radar_product_record(std::shared_ptr record); private: std::unique_ptr p; diff --git a/scwx-qt/source/scwx/qt/types/radar_product_record.cpp b/scwx-qt/source/scwx/qt/types/radar_product_record.cpp new file mode 100644 index 00000000..aa690fe7 --- /dev/null +++ b/scwx-qt/source/scwx/qt/types/radar_product_record.cpp @@ -0,0 +1,148 @@ +#include +#include +#include +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace types +{ + +static const std::string logPrefix_ = + "[scwx::qt::types::radar_product_record] "; + +class RadarProductRecordImpl +{ +public: + explicit RadarProductRecordImpl( + std::shared_ptr nexradFile) : + nexradFile_ {nexradFile}, + radarId_ {"????"}, + radarProduct_ {"???"}, + radarProductGroup_ {common::RadarProductGroup::Unknown}, + siteId_ {"???"}, + time_ {util::TimePoint(0, 0)} + { + } + + ~RadarProductRecordImpl() {} + + std::shared_ptr nexradFile_; + std::string radarId_; + std::string radarProduct_; + common::RadarProductGroup radarProductGroup_; + std::string siteId_; + std::chrono::system_clock::time_point time_; +}; + +RadarProductRecord::RadarProductRecord( + std::shared_ptr nexradFile) : + p(std::make_unique(nexradFile)) +{ + std::shared_ptr level2File = level2_file(); + std::shared_ptr level3File = level3_file(); + + uint16_t julianDate = 0; + uint32_t milliseconds = 0; + + std::chrono::system_clock::time_point time; + + if (level2File != nullptr) + { + p->radarProductGroup_ = common::RadarProductGroup::Level2; + p->radarId_ = level2File->icao(); + p->siteId_ = common::GetSiteId(p->radarId_); + julianDate = level2File->julian_date(); + milliseconds = level2File->milliseconds(); + } + else if (level3File != nullptr) + { + p->radarProductGroup_ = common::RadarProductGroup::Level3; + p->radarProduct_ = level3File->wmo_header()->product_category(); + p->siteId_ = level3File->wmo_header()->product_designator(); + p->radarId_ = config::GetRadarIdFromSiteId(p->siteId_); + + auto descriptionBlock = level3File->message()->description_block(); + + if (descriptionBlock != nullptr) + { + julianDate = descriptionBlock->volume_scan_date(); + milliseconds = descriptionBlock->volume_scan_start_time() * 1000u; + } + else + { + julianDate = level3File->message()->header().date_of_message(); + milliseconds = + level3File->message()->header().time_of_message() * 1000u; + } + } + + time = util::TimePoint(julianDate, milliseconds); +} + +RadarProductRecord::~RadarProductRecord() = default; + +RadarProductRecord::RadarProductRecord(RadarProductRecord&&) noexcept = default; +RadarProductRecord& +RadarProductRecord::operator=(RadarProductRecord&&) noexcept = default; + +std::shared_ptr RadarProductRecord::level2_file() const +{ + return std::dynamic_pointer_cast(p->nexradFile_); +} + +std::shared_ptr RadarProductRecord::level3_file() const +{ + return std::dynamic_pointer_cast(p->nexradFile_); +} + +std::shared_ptr RadarProductRecord::nexrad_file() const +{ + return p->nexradFile_; +} + +std::string RadarProductRecord::radar_id() const +{ + return p->radarId_; +} + +std::string RadarProductRecord::radar_product() const +{ + return p->radarProduct_; +} + +common::RadarProductGroup RadarProductRecord::radar_product_group() const +{ + return p->radarProductGroup_; +} + +std::string RadarProductRecord::site_id() const +{ + return p->siteId_; +} + +std::chrono::system_clock::time_point RadarProductRecord::time() const +{ + return p->time_; +} + +std::shared_ptr +RadarProductRecord::Create(std::shared_ptr nexradFile) +{ + std::shared_ptr record = nullptr; + + if (nexradFile != nullptr) + { + record = std::make_shared(nexradFile); + } + + return record; +} + +} // namespace types +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/types/radar_product_record.hpp b/scwx-qt/source/scwx/qt/types/radar_product_record.hpp new file mode 100644 index 00000000..bea5f59a --- /dev/null +++ b/scwx-qt/source/scwx/qt/types/radar_product_record.hpp @@ -0,0 +1,49 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace types +{ + +class RadarProductRecordImpl; + +class RadarProductRecord +{ +public: + explicit RadarProductRecord(std::shared_ptr nexradFile); + ~RadarProductRecord(); + + RadarProductRecord(const RadarProductRecord&) = delete; + RadarProductRecord& operator=(const RadarProductRecord&) = delete; + + RadarProductRecord(RadarProductRecord&&) noexcept; + RadarProductRecord& operator=(RadarProductRecord&&) noexcept; + + std::shared_ptr level2_file() const; + std::shared_ptr level3_file() const; + std::shared_ptr nexrad_file() const; + std::string radar_id() const; + std::string radar_product() const; + common::RadarProductGroup radar_product_group() const; + std::string site_id() const; + std::chrono::system_clock::time_point time() const; + + static std::shared_ptr + Create(std::shared_ptr nexradFile); + +private: + std::unique_ptr p; +}; + +} // namespace types +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/ts/scwx_en_US.ts b/scwx-qt/ts/scwx_en_US.ts index b05543cc..e1342f99 100644 --- a/scwx-qt/ts/scwx_en_US.ts +++ b/scwx-qt/ts/scwx_en_US.ts @@ -102,7 +102,7 @@ scwx::qt::main::MainWindow - + Unrecognized NEXRAD Product: diff --git a/wxdata/include/scwx/wsr88d/rpg/general_status_message.hpp b/wxdata/include/scwx/wsr88d/rpg/general_status_message.hpp index c10fe4b7..baf7ff11 100644 --- a/wxdata/include/scwx/wsr88d/rpg/general_status_message.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/general_status_message.hpp @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include diff --git a/wxdata/include/scwx/wsr88d/rpg/level3_message.hpp b/wxdata/include/scwx/wsr88d/rpg/level3_message.hpp index ff1384da..ee1b7985 100644 --- a/wxdata/include/scwx/wsr88d/rpg/level3_message.hpp +++ b/wxdata/include/scwx/wsr88d/rpg/level3_message.hpp @@ -2,6 +2,7 @@ #include #include +#include namespace scwx { @@ -28,10 +29,12 @@ public: size_t data_size() const override; - const Level3MessageHeader& header() const; + const Level3MessageHeader& header() const; void set_header(Level3MessageHeader&& header); + virtual std::shared_ptr description_block() const; + private: std::unique_ptr p; }; diff --git a/wxdata/source/scwx/wsr88d/rpg/level3_message.cpp b/wxdata/source/scwx/wsr88d/rpg/level3_message.cpp index 482f21e8..90944304 100644 --- a/wxdata/source/scwx/wsr88d/rpg/level3_message.cpp +++ b/wxdata/source/scwx/wsr88d/rpg/level3_message.cpp @@ -44,6 +44,12 @@ void Level3Message::set_header(Level3MessageHeader&& header) p->header_ = std::move(header); } +std::shared_ptr +Level3Message::description_block() const +{ + return nullptr; +} + } // namespace rpg } // namespace wsr88d } // namespace scwx