/** * @RDE_HEADER@ * Gui Plugin for EffectShowClient * $Id$ * $HeadURL$ * $Author$ * Created by Patric Karwat, SLSE, 2016-10-05 */ #include "esc_effect_show_gui_plugin.h" #include "esc_order_list.h" #include "esc_operating_condition.h" #include "esc_firing_explosion.h" #include "esc_firing_smoke.h" #include #include #include #include #include #include #include namespace EffectShowClient { std::shared_ptr GuiPlugin::createGuiInterface(LtsSession::LtsSession *session) { return std::make_shared(session); } const QString InterfaceImpl::s_dmfOrderList = QStringLiteral("escOrderList"); InterfaceImpl::InterfaceImpl(LtsSession::LtsSession *session) : GuiPluginBase::Interface(session, getLogger("Plugins.Gui.Esc.EffectShow")) , m_operationalStatusTimer(new QTimer) { qApp->installEventFilter(this); connect(m_operationalStatusTimer, &QTimer::timeout, this, &InterfaceImpl::onOperationalStatusTimeout); } bool InterfaceImpl::fetchInterfaces() { if (!m_session->getDtc(m_dtc)) return false; if (!m_session->getFtc(m_ftc)) return false; if (!m_session->getDtc(m_dtcTabOC)) WARNING_LOG(m_logger) << "Got no TabOc Dtc. No Distance Measurement"; m_dtc->enableAll(); return true; } void InterfaceImpl::clearInterfaces() { m_dtc = nullptr; m_ftc = nullptr; m_dtcTabOC = nullptr; } QString InterfaceImpl::menuGroup() const { return tr("Effect Representation"); } QVector InterfaceImpl::getActions() { QVector ret; LtsWidgets::PluginData plData; plData.menuGroup = menuGroup(); plData.menuText = tr("Order List"); plData.identifier = QLatin1String("escOrderList"); plData.menuIcon = QIcon(QLatin1String("icon:effect_order_vehicle.svg")); //plData.operatorRight = OperatorRights::EffectShowEdit; plData.exercisePart = LtsWidgets::ExercisePart::eExecution; plData.createWidgetFunc = [this](QWidget * parent) { return onShowOrderList(parent); }; m_effecShowAction = plData; plData.menuText = tr("Relocation List"); plData.identifier = QLatin1String("escRelocationList"); plData.menuIcon = QIcon(QLatin1String("icon:reloc_vehicle.svg")); plData.createWidgetFunc = [this](QWidget * parent) { return onShowRelocationList(parent); }; ret.append(plData); plData.menuText = tr("Operating Condition"); plData.identifier = QLatin1String("escOperatingCondition"); plData.menuIcon = QIcon(QLatin1String("icon:status_vehicle.svg")); //plData.operatorRight = OperatorRights::RelocationsEdit; plData.createWidgetFunc = [this](QWidget * parent) { return onShowOperatingCondition(parent); }; ret.append(plData); plData.menuGroup = menuGroup(); plData.menuText = tr("Firing Explosive"); plData.identifier = QLatin1String("escFiringExplosion"); plData.menuIcon = QIcon(QLatin1String("icon:fire_vehicle.svg")); //plData.operatorRight = OperatorRights::ActorEdit; plData.createWidgetFunc = [this](QWidget * parent) { return onShowFiringExplosion(parent); }; m_fireAction = plData; plData.menuGroup = menuGroup(); plData.menuText = tr("Firing Smoke"); plData.identifier = QLatin1String("escFiringSmoke"); plData.menuIcon = QIcon(QLatin1String("icon:smoke_vehicle.svg")); //plData.operatorRight = OperatorRights::VehicleStatusShow; plData.createWidgetFunc = [this](QWidget * parent) { return onShowFiringSmoke(parent); }; m_smokeAction = plData; // Noti: plData.createInstant = LtsWidgets::CreateInstantType::CreateInstantAndDiscardAction; plData.identifier = QStringLiteral("DMFIcon"); plData.menuText = QStringLiteral("DMFIcon"); plData.createWidgetFunc = nullptr; plData.directFunc = [this](const LtsWidgets::PluginData &) { m_notiDmf = m_session->createNotification(QStringLiteral("DMF")); m_notiDmf->setIcon(QIcon(QStringLiteral("icon:status_dmf_red.svg"))); m_notiDmf->setToolTip(tr("No DMF")); m_notiDmf->setAction([this]() { LtsWidgets::LtsMessageDialog::showMessage(m_session->baseLayout(), m_notiDmf->tooltip()); }); }; ret.append(plData); m_timer = new QTimer(this); connect(m_timer, &QTimer::timeout, this, &InterfaceImpl::checkLastState); m_timer->start(3000); connect(m_dtc.get(), &EffectShowClient::Interface::Dtc::operatingConditionEntityChanged, this, &InterfaceImpl::onOperatingConditionEntityChanged); return ret; } void InterfaceImpl::onOperatingConditionEntityChanged(const OperatingConditionEntity &data, DataModification modType) { Q_UNUSED(modType) //change icons and actions depending of vehicle type if (data.vehicleFeature() != m_vehicleType) { //Change state m_vehicleType = data.vehicleFeature(); // Readd action EffectShowOrderList m_session->baseLayout()->addMenuAction(m_effecShowAction); if (m_vehicleType == EffectShowManagement::Feature_e::NotSpecified) { m_session->baseLayout()->removeMenuAction(m_fireAction); m_session->baseLayout()->removeMenuAction(m_smokeAction); m_session->baseLayout()->removeMenuAction(m_effecShowAction); m_notiDmf->setIcon(QIcon(QStringLiteral("icon:status_dmf_red.svg"))); m_notiDmf->setToolTip(tr("No Effect Show Connected")); // close dialogs if(m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escFiringExplosion"))) m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escFiringExplosion"))->closeRequest(); if(m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escFiringSmoke"))) m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escFiringSmoke"))->closeRequest(); if(m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escOrderList"))) m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escOrderList"))->closeRequest(); } else { QString feature = tr("Effect Show Connected: "); if (m_vehicleType == EffectShowManagement::Feature_e::Smoke) { //Feature Smoke m_session->baseLayout()->removeMenuAction(m_fireAction); m_session->baseLayout()->addMenuAction(m_smokeAction); feature += tr("Smoke"); if(m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escFiringExplosion"))) m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escFiringExplosion"))->closeRequest(); } else { if (m_vehicleType == EffectShowManagement::Feature_e::Explosion24) feature += tr("Explosion (24)"); else feature += tr("Explosion (48)"); //Feature Explosion m_session->baseLayout()->removeMenuAction(m_smokeAction); m_session->baseLayout()->addMenuAction(m_fireAction); if(m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escFiringSmoke"))) m_session->baseLayout()->getWidget(menuGroup(), QStringLiteral("escFiringSmoke"))->closeRequest(); } m_notiDmf->setIcon(QIcon(QStringLiteral("icon:status_dmf_green.svg"))); m_notiDmf->setToolTip(feature); } } int currentSmokeLoad = 0; // now we send our ammuniton to excon if changed if (m_vehicleType == EffectShowManagement::Feature_e::Smoke) { //send current smoke load to excon if (data.smokeCartridge1().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) currentSmokeLoad++; if (data.smokeCartridge2().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) currentSmokeLoad++; if (data.smokeCartridge3().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) currentSmokeLoad++; if (data.smokeCartridge4().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) currentSmokeLoad++; if (data.smokeCartridge5().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) currentSmokeLoad++; if (currentSmokeLoad != m_oldSmokeCount) { m_oldSmokeCount = currentSmokeLoad; onSendAmmunition(currentSmokeLoad); } } else if (m_vehicleType != EffectShowManagement::Feature_e::NotSpecified) { // send current magazin load to excon if (m_oldCondition.ammunitionMagazine() != data.ammunitionMagazine()) onSendAmmunition(); } m_lastStatesTime = m_session->partitionTime(); if (data.readiness() && !m_oldCondition.readiness() && !m_operationalStatusTimer->isActive()) { DEBUG_LOG(m_logger) << "Operating condition: operational. Starting timer."; m_operationalStatusTimer->start(10 * 60 * 1000); } // if m_oldCondition = data; m_oldSmokeCount = currentSmokeLoad; } void InterfaceImpl::onSendAmmunition(int currentSmokeCount) { const OperatingConditionEntity &condition = m_dtc->operatingConditionEntity(); SendAmmunitionRequest req; if (currentSmokeCount >= 0) req.ammunitionMagazine(currentSmokeCount); else req.ammunitionMagazine(condition.ammunitionMagazine()); req.ammunitionAvailable(condition.ammunitionAvailable()); m_ftc->sendAmmunitionRequest(req, this); } void InterfaceImpl::checkLastState() { if ((m_session->partitionTime() - 10 * 1000) > m_lastStatesTime) { m_notiDmf->setIcon(QIcon(QStringLiteral("icon:status_dmf_red.svg"))); m_notiDmf->setToolTip(tr("No Effect Show Connected")); m_vehicleType = EffectShowManagement::Feature_e::NotSpecified; } } void InterfaceImpl::onOperationalStatusTimeout() { DEBUG_LOG(m_logger) << "Sending operational status: " << (m_oldCondition.readiness() ? "operational." : "not operational."); SendReadinessRequest req; req.readiness(m_oldCondition.readiness()); m_ftc->sendReadinessRequest(req, this); if (!m_oldCondition.readiness()) { DEBUG_LOG(m_logger) << "Operating condition: not operational. Stopping timer."; m_operationalStatusTimer->stop(); } // if } LtsWidgets::LtsDialog *InterfaceImpl::onShowRelocationList(QWidget *parent) { return LtsWidgets::initDialog(new OrderList(menuGroup(), m_session, parent), false, m_dtc, m_ftc, m_dtcTabOC); } LtsWidgets::LtsDialog *InterfaceImpl::onShowOrderList(QWidget *parent) { return LtsWidgets::initDialog(new OrderList(menuGroup(), m_session, parent), true, m_dtc, m_ftc, m_dtcTabOC); } void InterfaceImpl::onShowOrderList(bool isEffectShow) { OrderList *dialog = new OrderList(menuGroup(), m_session); if (!dialog->init(isEffectShow, m_dtc, m_ftc, m_dtcTabOC)) { delete dialog; return; } m_session->addWidget(dialog, menuGroup(), s_dmfOrderList, LtsWidgets::LayoutArea::eDialogTab); } LtsWidgets::LtsDialog *InterfaceImpl::onShowOperatingCondition(QWidget *parent) { return LtsWidgets::initDialog(new OperatingCondition(parent), m_dtc, m_ftc); } LtsWidgets::LtsDialog *InterfaceImpl::onShowFiringExplosion(QWidget *parent) { //m_dtc->firingSmokeEntity() return LtsWidgets::initDialog(new FiringExplosion(parent), m_dtc, m_ftc, m_session, true); } LtsWidgets::LtsDialog *InterfaceImpl::onShowFiringSmoke(QWidget *parent) { FiringSmoke *dialog = new FiringSmoke(parent); dialog->init(m_dtc, m_ftc, m_session, true); return dialog; } bool InterfaceImpl::eventFilter(QObject *obj, QEvent *event) { if (obj == qApp && !event->isAccepted() && event->type() == LtsWidgets::LtsLinkEvent::eventTypeId()) { auto ev = static_cast(event); const auto isChildOfSession = [this](QWidget *w) { if (!w) return true; const auto baseLayout = m_session->baseLayout(); return baseLayout->isAncestorOf(w); }; bool isEffectShow = true; if (isChildOfSession(ev->sourceBaseLayoutWidget()) && ev->url().host() == s_dmfOrderList.toLower()) { const QStringList params = ev->url().path().split(QStringLiteral("/")); DEBUG_LOG(m_logger) << "eventFilter onShowOrderList" << ", path=" << ev->url().path() << ", params.size=" << params.size(); if (params.size() > 1) { isEffectShow = params.at(1).toInt(); DEBUG_LOG(m_logger) << "isEffectShow=" << isEffectShow << ", params.at(0)=" << params.at(0) << ", params.at(1)=" << params.at(1); } onShowOrderList(isEffectShow); return true; } } return QObject::eventFilter(obj, event); } } // namespace EffectShowClient