Add another CWeatherManager API to request weather grid

Instead of the existing one, this newly added API allows to request
a weather grid without a callback as argument. Instead the final grid
will be emitted as signal.
This API is also made available in ISimulatorContext for GUI access.

refs #663
This commit is contained in:
Roland Winklmeier
2016-06-05 22:51:44 +02:00
parent 10c4fa920d
commit 62491ad4e6
8 changed files with 59 additions and 3 deletions

View File

@@ -30,6 +30,7 @@
#include "blackcore/corefacadeconfig.h" #include "blackcore/corefacadeconfig.h"
#include "blackcore/simulator.h" #include "blackcore/simulator.h"
#include "blackmisc/aviation/airportlist.h" #include "blackmisc/aviation/airportlist.h"
#include "blackmisc/identifier.h"
#include "blackmisc/pixmap.h" #include "blackmisc/pixmap.h"
#include "blackmisc/pq/length.h" #include "blackmisc/pq/length.h"
#include "blackmisc/pq/time.h" #include "blackmisc/pq/time.h"
@@ -37,6 +38,7 @@
#include "blackmisc/simulation/simulatorplugininfo.h" #include "blackmisc/simulation/simulatorplugininfo.h"
#include "blackmisc/simulation/simulatorplugininfolist.h" #include "blackmisc/simulation/simulatorplugininfolist.h"
#include "blackmisc/simulation/simulatorsetup.h" #include "blackmisc/simulation/simulatorsetup.h"
#include "blackmisc/weather/weathergrid.h"
#include <QObject> #include <QObject>
#include <QString> #include <QString>
@@ -99,6 +101,9 @@ namespace BlackCore
//! An airspace snapshot was handled //! An airspace snapshot was handled
void airspaceSnapshotHandled(); void airspaceSnapshotHandled();
//! A weather grid, requested with requestWeatherGrid(), is received
void weatherGridReceived(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier);
public slots: public slots:
//! Simulator info, currently loaded plugin //! Simulator info, currently loaded plugin
virtual BlackMisc::Simulation::CSimulatorPluginInfo getSimulatorPluginInfo() const = 0; virtual BlackMisc::Simulation::CSimulatorPluginInfo getSimulatorPluginInfo() const = 0;
@@ -186,6 +191,9 @@ namespace BlackCore
//! Highlight aircraft in simulator //! Highlight aircraft in simulator
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) = 0; virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) = 0;
//! Request weather grid. Argument identifier is past in the signal to identify the requestor
virtual void requestWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier) = 0;
protected: protected:
//! Constructor //! Constructor
IContextSimulator(CCoreFacadeConfig::ContextMode mode, CCoreFacade *runtime) : CContext(mode, runtime) {} IContextSimulator(CCoreFacadeConfig::ContextMode mode, CCoreFacade *runtime) : CContext(mode, runtime) {}

View File

@@ -208,6 +208,14 @@ namespace BlackCore
logEmptyContextWarning(Q_FUNC_INFO); logEmptyContextWarning(Q_FUNC_INFO);
} }
//! \copydoc IContextSimulator::requestWeatherGrid
virtual void requestWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier) override
{
Q_UNUSED(weatherGrid);
Q_UNUSED(identifier);
logEmptyContextWarning(Q_FUNC_INFO);
}
//! \copydoc ISimulator::enableDebugMessages //! \copydoc ISimulator::enableDebugMessages
virtual void enableDebugMessages(bool driver, bool interpolator) override virtual void enableDebugMessages(bool driver, bool interpolator) override
{ {

View File

@@ -48,6 +48,7 @@ namespace BlackCore
m_plugins(new CPluginManagerSimulator(this)) m_plugins(new CPluginManagerSimulator(this))
{ {
this->setObjectName("CContextSimulator"); this->setObjectName("CContextSimulator");
connect(&m_weatherManager, &CWeatherManager::weatherGridReceived, this, &CContextSimulator::weatherGridReceived);
m_plugins->collectPlugins(); m_plugins->collectPlugins();
} }
@@ -607,6 +608,11 @@ namespace BlackCore
m_simulatorPlugin.second->highlightAircraft(aircraftToHighlight, enableHighlight, displayTime); m_simulatorPlugin.second->highlightAircraft(aircraftToHighlight, enableHighlight, displayTime);
} }
void CContextSimulator::requestWeatherGrid(const Weather::CWeatherGrid &weatherGrid, const CIdentifier &identifier)
{
m_weatherManager.requestWeatherGrid(weatherGrid, identifier);
}
void CContextSimulator::ps_simulatorStarted(const CSimulatorPluginInfo &info) void CContextSimulator::ps_simulatorStarted(const CSimulatorPluginInfo &info)
{ {
stopSimulatorListeners(); stopSimulatorListeners();

View File

@@ -143,6 +143,9 @@ namespace BlackCore
//! \copydoc IContextSimulator::highlightAircraft //! \copydoc IContextSimulator::highlightAircraft
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override; virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override;
//! \copydoc IContextSimulator::requestWeatherGrid
virtual void requestWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier) override;
protected: protected:
//! Constructor //! Constructor
CContextSimulator(CCoreFacadeConfig::ContextMode, CCoreFacade *runtime); CContextSimulator(CCoreFacadeConfig::ContextMode, CCoreFacade *runtime);

View File

@@ -58,6 +58,9 @@ namespace BlackCore
s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(), s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
"airspaceSnapshotHandled", this, SIGNAL(airspaceSnapshotHandled())); "airspaceSnapshotHandled", this, SIGNAL(airspaceSnapshotHandled()));
Q_ASSERT(s); Q_ASSERT(s);
s = connection.connect(serviceName, IContextSimulator::ObjectPath(), IContextSimulator::InterfaceName(),
"weatherGridReceived", this, SIGNAL(weatherGridReceived()));
Q_ASSERT(s);
Q_UNUSED(s); Q_UNUSED(s);
} }
@@ -186,6 +189,11 @@ namespace BlackCore
m_dBusInterface->callDBus(QLatin1Literal("highlightAircraft"), aircraftToHighlight, enableHighlight, displayTime); m_dBusInterface->callDBus(QLatin1Literal("highlightAircraft"), aircraftToHighlight, enableHighlight, displayTime);
} }
void CContextSimulatorProxy::requestWeatherGrid(const Weather::CWeatherGrid &weatherGrid, const CIdentifier &identifier)
{
m_dBusInterface->callDBus(QLatin1Literal("requestWeatherGrid"), weatherGrid, identifier);
}
void CContextSimulatorProxy::enableDebugMessages(bool driver, bool interpolator) void CContextSimulatorProxy::enableDebugMessages(bool driver, bool interpolator)
{ {
m_dBusInterface->callDBus(QLatin1Literal("enableDebugMessages"), driver, interpolator); m_dBusInterface->callDBus(QLatin1Literal("enableDebugMessages"), driver, interpolator);

View File

@@ -139,6 +139,9 @@ namespace BlackCore
//! \copydoc IContextSimulator::highlightAircraft //! \copydoc IContextSimulator::highlightAircraft
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override; virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override;
//! \copydoc IContextSimulator::requestWeatherGrid
virtual void requestWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier) override;
//! \copydoc ISimulator::enableDebugMessages //! \copydoc ISimulator::enableDebugMessages
virtual void enableDebugMessages(bool driver, bool interpolator) override; virtual void enableDebugMessages(bool driver, bool interpolator) override;
}; };

View File

@@ -12,6 +12,7 @@
#include "blackmisc/logmessage.h" #include "blackmisc/logmessage.h"
#include "blackmisc/pq/length.h" #include "blackmisc/pq/length.h"
#include "blackmisc/pq/units.h" #include "blackmisc/pq/units.h"
#include "blackmisc/range.h"
#include "blackmisc/statusmessage.h" #include "blackmisc/statusmessage.h"
#include "blackmisc/weather/gridpoint.h" #include "blackmisc/weather/gridpoint.h"
#include "blackmisc/weather/weatherdataplugininfo.h" #include "blackmisc/weather/weatherdataplugininfo.h"
@@ -39,6 +40,14 @@ namespace BlackCore
// todo: send weather grid to drivers from here // todo: send weather grid to drivers from here
} }
void CWeatherManager::requestWeatherGrid(const CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier)
{
WeatherRequest request { identifier, weatherGrid, {} };
m_pendingRequests.append(request);
// Serialize the requests, since plugins can handle only one at a time
if (m_pendingRequests.size() == 1) { fetchNextWeatherData(); }
}
void CWeatherManager::requestWeatherGrid(const CWeatherGrid &weatherGrid, void CWeatherManager::requestWeatherGrid(const CWeatherGrid &weatherGrid,
const BlackMisc::CSlot<void(const BlackMisc::Weather::CWeatherGrid &)> &callback) const BlackMisc::CSlot<void(const BlackMisc::Weather::CWeatherGrid &)> &callback)
{ {
@@ -48,7 +57,7 @@ namespace BlackCore
return; return;
} }
WeatherRequest weatherRequest { weatherGrid, callback }; WeatherRequest weatherRequest { CIdentifier::anonymous(), 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
@@ -116,7 +125,8 @@ namespace BlackCore
gridPoint.copyWeatherDataFrom(nearestGridPoint); gridPoint.copyWeatherDataFrom(nearestGridPoint);
} }
weatherRequest.callback(requestedWeatherGrid); if (weatherRequest.callback) { weatherRequest.callback(requestedWeatherGrid); }
if (!weatherRequest.identifier.isAnonymous()) { emit weatherGridReceived(requestedWeatherGrid, weatherRequest.identifier); }
m_pendingRequests.pop_front(); m_pendingRequests.pop_front();
// In case there are pending requests, start over again // In case there are pending requests, start over again

View File

@@ -14,6 +14,7 @@
#include "blackcore/blackcoreexport.h" #include "blackcore/blackcoreexport.h"
#include "blackcore/pluginmanagerweatherdata.h" #include "blackcore/pluginmanagerweatherdata.h"
#include "blackmisc/identifier.h"
#include "blackmisc/slot.h" #include "blackmisc/slot.h"
#include "blackmisc/weather/weathergrid.h" #include "blackmisc/weather/weathergrid.h"
#include "blackmisc/weather/weathergridprovider.h" #include "blackmisc/weather/weathergridprovider.h"
@@ -45,13 +46,22 @@ namespace BlackCore
//! Is weather overwritten to clear? //! Is weather overwritten to clear?
bool isWeatherClear() const { return m_isWeatherClear; } bool isWeatherClear() const { return m_isWeatherClear; }
//! Request weather by grid //! Request weather grid
void requestWeatherGrid(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier);
//! \copydoc BlackMisc::Weather::IWeatherGridProvider::requestWeatherGrid
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;
signals:
//! The weather grid, requested from identified, is available
void weatherGridReceived(const BlackMisc::Weather::CWeatherGrid &weatherGrid, const BlackMisc::CIdentifier &identifier);
private: private:
struct WeatherRequest struct WeatherRequest
{ {
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;
}; };