/** * Subscribe to MeteoDataManagement and provide the correct weather for the given position * $Id$ * $HeadURL$ * $Author$ */ #include "meteo_data_provider.h" #include "main_handler.h" #include #include "settings.h" using namespace AreaEffectSimulation; MeteoDataProvider::MeteoDataProvider(MainHandler *mainHandler) : QObject() , m_mainHandler(mainHandler) , m_mdmDtc(MeteoDataManagement::Interface::Dtc::create(m_mainHandler->dds()->ddsConnector())) , m_staticWeatherId(0) { connect(m_mdmDtc.get(), &MeteoDataManagement::Interface::Dtc::meteoDataChanged, this, &MeteoDataProvider::meteoDataChanged); m_mdmDtc->enableMeteoData(); } MeteoDataProvider::~MeteoDataProvider() {} MeteoDataManagement::MeteoData MeteoDataProvider::getStaticWeather() { initWeatherData(); if (m_staticWeatherId > 0) { auto it = m_meteoData.find(m_staticWeatherId); if (it != m_meteoData.end()) return it.value(); } // default values from wikipedia for aviations MeteoDataManagement::MeteoData dummyWeather; dummyWeather.pressure(1013.25); dummyWeather.temperature(15); dummyWeather.humidity(0); dummyWeather.timeStamp(m_mainHandler->dds()->currentPartitionTimeMSec()); dummyWeather.windDirection(0); dummyWeather.windSpeed(0); dummyWeather.windOk(true); dummyWeather.climateOk(true); return dummyWeather; } MeteoDataManagement::MeteoData MeteoDataProvider::getNearestWeather(const Core::GeoPosition2D &pos) { initWeatherData(); LtsCoordTrans::UtmCoordinate utm(LtsCoordTrans::UtmCoordinate::fromGeographic(pos.lon(), pos.lat())); double nearestDistanceSquared = std::numeric_limits::max(); MeteoDataManagement::MeteoData retMd; for (const auto &md : qAsConst(m_meteoData)) { if (md.isStaticMeteoData()) continue; if (QDateTime::fromMSecsSinceEpoch(md.timeStamp()).addMSecs(Settings::getValidityPeriodWeatherData()) < m_mainHandler->dds()->currentPartitionTime()) continue; const double distanceSquared = LtsCoordTrans::squareDistance(utm, md.pos().lon(), md.pos().lat()); if (distanceSquared < nearestDistanceSquared) { retMd = md; nearestDistanceSquared = distanceSquared; } } return (retMd.id() > 0) ? retMd : getStaticWeather(); } void MeteoDataProvider::meteoDataChanged(const MeteoDataManagement::MeteoData &data, DataModification modType) { switch (modType) { case DataModification::eRemoved: m_meteoData.remove(data.id()); if (m_staticWeatherId == data.id()) m_staticWeatherId = 0; break; case DataModification::eAdded: case DataModification::eModified: m_meteoData[data.id()] = data; if (data.isStaticMeteoData()) m_staticWeatherId = data.id(); break; } } void MeteoDataProvider::initWeatherData() { if (!m_meteoData.isEmpty()) return; m_mdmDtc->waitForHistoricalDataMeteoData(); m_meteoData = m_mdmDtc->meteoDatas(); for (const auto &data : qAsConst(m_meteoData)) if (data.isStaticMeteoData()) { m_staticWeatherId = data.id(); return; } }