Fix refresh if the product time is unknown to the product manager (expired product manager)

This commit is contained in:
Dan Paulat 2023-04-12 23:24:04 -05:00
parent 1b71143d71
commit bb31bdfc00

View file

@ -176,11 +176,13 @@ public:
bool enabled);
void RefreshData(std::shared_ptr<ProviderManager> providerManager);
std::shared_ptr<types::RadarProductRecord>
GetLevel2ProductRecord(std::chrono::system_clock::time_point& time);
std::shared_ptr<types::RadarProductRecord>
std::tuple<std::shared_ptr<types::RadarProductRecord>,
std::chrono::system_clock::time_point>
GetLevel2ProductRecord(std::chrono::system_clock::time_point time);
std::tuple<std::shared_ptr<types::RadarProductRecord>,
std::chrono::system_clock::time_point>
GetLevel3ProductRecord(const std::string& product,
std::chrono::system_clock::time_point& time);
std::chrono::system_clock::time_point time);
std::shared_ptr<types::RadarProductRecord>
StoreRadarProductRecord(std::shared_ptr<types::RadarProductRecord> record);
void UpdateRecentRecords(RadarProductRecordList& recentList,
@ -857,12 +859,14 @@ void RadarProductManagerImpl::LoadNexradFile(
});
}
std::shared_ptr<types::RadarProductRecord>
std::tuple<std::shared_ptr<types::RadarProductRecord>,
std::chrono::system_clock::time_point>
RadarProductManagerImpl::GetLevel2ProductRecord(
std::chrono::system_clock::time_point& time)
std::chrono::system_clock::time_point time)
{
std::shared_ptr<types::RadarProductRecord> record;
std::shared_ptr<types::RadarProductRecord> record {nullptr};
RadarProductRecordMap::const_pointer recordPtr {nullptr};
std::chrono::system_clock::time_point recordTime {time};
if (!level2ProductRecords_.empty() &&
time == std::chrono::system_clock::time_point {})
@ -872,16 +876,22 @@ RadarProductManagerImpl::GetLevel2ProductRecord(
}
else
{
// TODO: Round to minutes
recordPtr =
scwx::util::GetBoundedElementPointer(level2ProductRecords_, time);
}
if (recordPtr != nullptr)
{
time = recordPtr->first;
if (time == std::chrono::system_clock::time_point {} ||
time == recordPtr->first)
{
recordTime = recordPtr->first;
record = recordPtr->second.lock();
if (record == nullptr)
}
}
if (record == nullptr &&
recordTime != std::chrono::system_clock::time_point {})
{
// Product is expired, reload it
std::shared_ptr<request::NexradFileRequest> request =
@ -892,21 +902,27 @@ RadarProductManagerImpl::GetLevel2ProductRecord(
&request::NexradFileRequest::RequestComplete,
self_,
[this](std::shared_ptr<request::NexradFileRequest> request)
{ emit self_->DataReloaded(request->radar_product_record()); });
self_->LoadLevel2Data(recordPtr->first, request);
}
}
return record;
}
std::shared_ptr<types::RadarProductRecord>
RadarProductManagerImpl::GetLevel3ProductRecord(
const std::string& product, std::chrono::system_clock::time_point& time)
{
std::shared_ptr<types::RadarProductRecord> record = nullptr;
if (request->radar_product_record() != nullptr)
{
emit self_->DataReloaded(request->radar_product_record());
}
});
self_->LoadLevel2Data(recordTime, request);
}
return {record, recordTime};
}
std::tuple<std::shared_ptr<types::RadarProductRecord>,
std::chrono::system_clock::time_point>
RadarProductManagerImpl::GetLevel3ProductRecord(
const std::string& product, std::chrono::system_clock::time_point time)
{
std::shared_ptr<types::RadarProductRecord> record {nullptr};
RadarProductRecordMap::const_pointer recordPtr {nullptr};
std::chrono::system_clock::time_point recordTime {time};
std::unique_lock lock {level3ProductRecordMutex_};
@ -931,9 +947,16 @@ RadarProductManagerImpl::GetLevel3ProductRecord(
if (recordPtr != nullptr)
{
time = recordPtr->first;
if (time == std::chrono::system_clock::time_point {} ||
time == recordPtr->first)
{
recordTime = recordPtr->first;
record = recordPtr->second.lock();
if (record == nullptr)
}
}
if (record == nullptr &&
recordTime != std::chrono::system_clock::time_point {})
{
// Product is expired, reload it
std::shared_ptr<request::NexradFileRequest> request =
@ -944,13 +967,17 @@ RadarProductManagerImpl::GetLevel3ProductRecord(
&request::NexradFileRequest::RequestComplete,
self_,
[this](std::shared_ptr<request::NexradFileRequest> request)
{ emit self_->DataReloaded(request->radar_product_record()); });
self_->LoadLevel3Data(product, recordPtr->first, request);
{
if (request->radar_product_record() != nullptr)
{
emit self_->DataReloaded(request->radar_product_record());
}
});
self_->LoadLevel3Data(product, recordTime, request);
}
return record;
return {record, recordTime};
}
std::shared_ptr<types::RadarProductRecord>
@ -1058,8 +1085,8 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
float elevationCut = 0.0f;
std::vector<float> elevationCuts;
std::shared_ptr<types::RadarProductRecord> record =
p->GetLevel2ProductRecord(time);
std::shared_ptr<types::RadarProductRecord> record;
std::tie(record, time) = p->GetLevel2ProductRecord(time);
if (record != nullptr)
{
@ -1068,7 +1095,7 @@ RadarProductManager::GetLevel2Data(wsr88d::rda::DataBlockType dataBlockType,
dataBlockType, elevation, time);
}
return std::tie(radarData, elevationCut, elevationCuts, time);
return {radarData, elevationCut, elevationCuts, time};
}
std::tuple<std::shared_ptr<wsr88d::rpg::Level3Message>,
@ -1078,15 +1105,15 @@ RadarProductManager::GetLevel3Data(const std::string& product,
{
std::shared_ptr<wsr88d::rpg::Level3Message> message = nullptr;
std::shared_ptr<types::RadarProductRecord> record =
p->GetLevel3ProductRecord(product, time);
std::shared_ptr<types::RadarProductRecord> record;
std::tie(record, time) = p->GetLevel3ProductRecord(product, time);
if (record != nullptr)
{
message = record->level3_file()->message();
}
return std::tie(message, time);
return {message, time};
}
common::Level3ProductCategoryMap