/** * Subscribe to MeteoDataManagement and provide the correct weather for the given position * $Id$ * $HeadURL$ * $Author$ */ #include "handler_mdm_data.h" #include "initialization.h" #include #include "settings.h" using namespace EffectShowManagement; //============================================================================= HandlerMdmData::HandlerMdmData(const std::shared_ptr &ddsHandler, QObject *parent) : QObject(parent) , m_ddsHandler(ddsHandler) , m_logger(getLogger("HandlerMdmData")) { } //============================================================================= bool HandlerMdmData::init() { DEBUG_LOG(m_logger) << "init() HandlerMdmData"; auto dtcMdm = m_ddsHandler->dtcMdm(); connect(dtcMdm.get(), &MeteoDataManagement::Interface::Dtc::meteoDataChanged, this, &HandlerMdmData::onMeteoDataChanged); // Get current data for all weather data { auto cb = [this](const MeteoDataManagement::MeteoData & meteoData) { onMeteoDataChanged(meteoData, DataModification::eAdded); }; if (!dtcMdm->meteoDatas(cb)) return false; } return true; } //============================================================================= bool HandlerMdmData::getNearestWeather(const Core::GeoPosition2D &pos, MeteoDataManagement::MeteoData &data) const { const LtsCoordTrans::UtmCoordinate utm(LtsCoordTrans::UtmCoordinate::fromGeographic(pos.lon(), pos.lat())); double nearestDistanceSquared = std::numeric_limits::max(); bool found = false; for (const auto &md : qAsConst(m_meteoData)) { if (md.isStaticMeteoData()) continue; const double distanceSquared = LtsCoordTrans::squareDistance(utm, md.pos().lon(), md.pos().lat()); if (distanceSquared < nearestDistanceSquared) { found = true; data = md; nearestDistanceSquared = distanceSquared; } } return found; } //----------------------------------------------------------------------------- void HandlerMdmData::onMeteoDataChanged(const MeteoDataManagement::MeteoData &data, DataModification modType) { switch (modType) { case DataModification::eRemoved: m_meteoData.remove(data.id()); break; case DataModification::eAdded: case DataModification::eModified: m_meteoData[data.id()] = data; break; } }