Add methods to read weather grid from file

This commit is contained in:
Roland Winklmeier
2018-09-08 14:18:30 +02:00
committed by Klaus Basan
parent 9f1a51fb13
commit 4b888d87f5
6 changed files with 58 additions and 4 deletions

View File

@@ -34,6 +34,11 @@ namespace BlackCore
virtual void fetchWeatherData(const BlackMisc::Weather::CWeatherGrid &grid, virtual void fetchWeatherData(const BlackMisc::Weather::CWeatherGrid &grid,
const BlackMisc::PhysicalQuantities::CLength &range) = 0; const BlackMisc::PhysicalQuantities::CLength &range) = 0;
//! Fetch new weather around grid from file
virtual void fetchWeatherDataFromFile(const QString &filePath,
const BlackMisc::Weather::CWeatherGrid &grid,
const BlackMisc::PhysicalQuantities::CLength &range) = 0;
//! Get fetched weather data //! Get fetched weather data
virtual BlackMisc::Weather::CWeatherGrid getWeatherData() const = 0; virtual BlackMisc::Weather::CWeatherGrid getWeatherData() const = 0;

View File

@@ -41,7 +41,7 @@ namespace BlackCore
void CWeatherManager::requestWeatherGrid(const CWeatherGrid &weatherGrid, const CIdentifier &identifier) void CWeatherManager::requestWeatherGrid(const CWeatherGrid &weatherGrid, const CIdentifier &identifier)
{ {
WeatherRequest request { identifier, weatherGrid, {} }; WeatherRequest request { {}, identifier, weatherGrid, {} };
m_pendingRequests.append(request); m_pendingRequests.append(request);
// Serialize the requests, since plugins can handle only one at a time // Serialize the requests, since plugins can handle only one at a time
if (m_pendingRequests.size() == 1) { fetchNextWeatherData(); } if (m_pendingRequests.size() == 1) { fetchNextWeatherData(); }
@@ -56,7 +56,23 @@ namespace BlackCore
return; return;
} }
WeatherRequest weatherRequest { CIdentifier::null(), weatherGrid, callback }; WeatherRequest weatherRequest { {}, CIdentifier::null(), weatherGrid, callback };
m_pendingRequests.append(weatherRequest);
// Serialize the requests, since plugins can handle only one at a time
if (m_pendingRequests.size() == 1) { fetchNextWeatherData(); }
}
void CWeatherManager::requestWeatherGridFromFile(const QString &filePath, const CWeatherGrid &weatherGrid,
const CSlot<void(const CWeatherGrid &)> &callback)
{
if (m_isWeatherClear)
{
callback(CWeatherGrid::getClearWeatherGrid());
return;
}
WeatherRequest weatherRequest { filePath, CIdentifier::null(), weatherGrid, callback };
m_pendingRequests.append(weatherRequest); m_pendingRequests.append(weatherRequest);
// Serialize the requests, since plugins can handle only one at a time // Serialize the requests, since plugins can handle only one at a time
@@ -102,7 +118,8 @@ namespace BlackCore
for (IWeatherData *plugin : as_const(m_weatherDataPlugins)) for (IWeatherData *plugin : as_const(m_weatherDataPlugins))
{ {
plugin->fetchWeatherData(weatherRequest.weatherGrid, maxDistance); if (weatherRequest.filePath.isEmpty()) { plugin->fetchWeatherData(weatherRequest.weatherGrid, maxDistance); }
else { plugin->fetchWeatherDataFromFile(weatherRequest.filePath, weatherRequest.weatherGrid, maxDistance); }
} }
} }

View File

@@ -53,6 +53,11 @@ namespace BlackCore
virtual void requestWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid, virtual void requestWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid,
const BlackMisc::CSlot<void(const BlackMisc::Weather::CWeatherGrid &)> &callback) override; const BlackMisc::CSlot<void(const BlackMisc::Weather::CWeatherGrid &)> &callback) override;
//! \copydoc BlackMisc::Weather::IWeatherGridProvider::requestWeatherGrid
virtual void requestWeatherGridFromFile(const QString &filePath,
const BlackMisc::Weather::CWeatherGrid &weatherGrid,
const BlackMisc::CSlot<void(const BlackMisc::Weather::CWeatherGrid &)> &callback) override;
signals: signals:
//! The weather grid, requested from identified, is available //! The weather grid, requested from identified, is available
@@ -61,6 +66,7 @@ namespace BlackCore
private: private:
struct WeatherRequest struct WeatherRequest
{ {
QString filePath;
BlackMisc::CIdentifier identifier; BlackMisc::CIdentifier identifier;
BlackMisc::Weather::CWeatherGrid weatherGrid; BlackMisc::Weather::CWeatherGrid weatherGrid;
BlackMisc::CSlot<void(const BlackMisc::Weather::CWeatherGrid &)> callback; BlackMisc::CSlot<void(const BlackMisc::Weather::CWeatherGrid &)> callback;

View File

@@ -31,6 +31,11 @@ namespace BlackMisc
//! Request weather grid //! Request weather grid
virtual void requestWeatherGrid(const CWeatherGrid &weatherGrid, virtual void requestWeatherGrid(const CWeatherGrid &weatherGrid,
const CSlot<void(const CWeatherGrid &)> &callback) = 0; const CSlot<void(const CWeatherGrid &)> &callback) = 0;
//! Request weather grid from file
virtual void requestWeatherGridFromFile(const QString &filePath,
const BlackMisc::Weather::CWeatherGrid &weatherGrid,
const BlackMisc::CSlot<void(const BlackMisc::Weather::CWeatherGrid &)> &callback) = 0;
}; };
//! Delegating class which can be directly used to access an \sa IWeatherGridProvider instance //! Delegating class which can be directly used to access an \sa IWeatherGridProvider instance
@@ -40,7 +45,6 @@ namespace BlackMisc
//! \copydoc IWeatherGridProvider::requestWeatherGrid //! \copydoc IWeatherGridProvider::requestWeatherGrid
virtual void requestWeatherGrid(const CWeatherGrid &weatherGrid, virtual void requestWeatherGrid(const CWeatherGrid &weatherGrid,
const CSlot<void(const CWeatherGrid &)> &callback); const CSlot<void(const CWeatherGrid &)> &callback);
protected: protected:
//! Constructor //! Constructor
CWeatherGridAware(IWeatherGridProvider *weatherGridProvider) : IProviderAware(weatherGridProvider) { Q_ASSERT(weatherGridProvider); } CWeatherGridAware(IWeatherGridProvider *weatherGridProvider) : IProviderAware(weatherGridProvider) { Q_ASSERT(weatherGridProvider); }

View File

@@ -90,6 +90,23 @@ namespace BlackWxPlugin
} }
} }
void CWeatherDataGfs::fetchWeatherDataFromFile(const QString &filePath, const CWeatherGrid &grid, const CLength &range)
{
m_grid = grid;
m_maxRange = range;
QFile file(filePath);
if (!file.exists() || !file.open(QIODevice::ReadOnly)) { return; }
m_gribData = file.readAll();
Q_ASSERT_X(!m_parseGribFileWorker, Q_FUNC_INFO, "Worker already running");
m_parseGribFileWorker = BlackMisc::CWorker::fromTask(this, "parseGribFile", [this]()
{
parseGfsFileImpl(m_gribData);
});
m_parseGribFileWorker->then(this, &CWeatherDataGfs::fetchingWeatherDataFinished);
}
CWeatherGrid CWeatherDataGfs::getWeatherData() const CWeatherGrid CWeatherDataGfs::getWeatherData() const
{ {
QReadLocker l(&m_lockData); QReadLocker l(&m_lockData);

View File

@@ -50,6 +50,11 @@ namespace BlackWxPlugin
virtual void fetchWeatherData(const BlackMisc::Weather::CWeatherGrid &grid, virtual void fetchWeatherData(const BlackMisc::Weather::CWeatherGrid &grid,
const BlackMisc::PhysicalQuantities::CLength &range) override; const BlackMisc::PhysicalQuantities::CLength &range) override;
//! \copydoc BlackCore::IWeatherData::fetchWeatherDataFromFile
virtual void fetchWeatherDataFromFile(const QString &filePath,
const BlackMisc::Weather::CWeatherGrid &grid,
const BlackMisc::PhysicalQuantities::CLength &range) override;
//! \copydoc BlackCore::IWeatherData::getWeatherData() //! \copydoc BlackCore::IWeatherData::getWeatherData()
virtual BlackMisc::Weather::CWeatherGrid getWeatherData() const override; virtual BlackMisc::Weather::CWeatherGrid getWeatherData() const override;