/** * @RDE_HEADER@ * MeteoDataManagement - Static Meteo Data Edit Dialog * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2016-10-17 */ #include "esc_firing_smoke.h" #include "ui_esc_firing_smoke.h" #include "esc_smoke_state.h" #include "esc_safety_confirmation_widget.h" #include "esc_order_edit.h" #include namespace EffectShowClient { //============================================================================= FiringSmoke::FiringSmoke(QWidget *parent) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly) , m_timer(new QTimer(this)) , m_meteoTimer(new QTimer(this)) , m_dtc(nullptr) , m_ftc(nullptr) , m_session(nullptr) , m_smokeState(nullptr) , m_safetyConfirmationWidget(nullptr) , m_ui(new Ui::FiringSmoke) , m_requestHelper(new LtsUtils::RequestHelper(this)) , m_idOrder(0) , m_firingClearanceCountDown(0) , m_endOfFiringClearanceCountDown(0) , m_logger(getLogger("FiringSmoke")) { DEBUG_LOG(m_logger) << "FiringSmoke::FiringSmoke()"; m_ui->setupUi(this); m_smokeState = new SmokeState(this); m_ui->layoutSmokeState->addWidget(m_smokeState); m_meteoTimer->setInterval(15 * 60 * 1000); connect(m_timer, &QTimer::timeout, this, &FiringSmoke::onFiringClearanceCountDown); connect(m_meteoTimer, &QTimer::timeout, this, &FiringSmoke::onMeteoTimerTimeout); setOnlineHelpFilename(QLatin1String("OC-Smoke")); } //============================================================================= FiringSmoke::~FiringSmoke() { delete m_ui; } //============================================================================= bool FiringSmoke::init(const std::shared_ptr &dtc, const std::shared_ptr &ftc, LtsSession::LtsSession *session, bool freeForm) { DEBUG_LOG(m_logger) << "FiringSmoke::init()"; if (!dtc || !ftc) { ERROR_LOG(m_logger) << "FiringSmoke::init() Invalid shared_ptr!"; return false; } m_dtc = dtc; m_ftc = ftc; m_session = session; m_safetyConfirmationWidget = new EffectShowClient::SafetyConfirmationWidget(this); m_safetyConfirmationWidget->init(m_ftc); //m_ui->FiringSmoke insertWidget(3, m_safetyConfirmationWidget); m_ui->hz->insertWidget(0, m_safetyConfirmationWidget); connect(m_dtc.get(), &EffectShowClient::Interface::Dtc::firingSmokeEntityChanged, this, &FiringSmoke::onFiringSmokeEntityChanged); connect(m_dtc.get(), &EffectShowClient::Interface::Dtc::operatingConditionEntityChanged, this, &FiringSmoke::onOperatingConditionEntityChanged); connect(m_dtc.get(), &EffectShowClient::Interface::Dtc::meteoNearVehicleChanged, this, &FiringSmoke::onMeteoDataChanged); const EffectShowClient::MeteoNearVehicle dat = m_dtc.get()->meteoNearVehicle(); if (dat.windDirection() > 0) onMeteoDataChanged(dat, DataModification()); else onMeteoTimerTimeout(); // display data if (!freeForm) onFiringSmokeEntityChanged(m_dtc->firingSmokeEntity(), DataModification::eAdded); m_buttonBox->connectButton(LtsWidgets::DialogButton::Yes, this, &FiringSmoke::onCarriedOut); m_buttonBox->setText(LtsWidgets::DialogButton::Yes, tr("Carried Out")); m_buttonBox->connectButton(LtsWidgets::DialogButton::No, this, &FiringSmoke::onAbort); m_buttonBox->setText(LtsWidgets::DialogButton::No, tr("Abort")); return true; } //----------------------------------------------------------------------------- void FiringSmoke::retranslate() { translate(m_ui, tr("Firing Smoke")); // todo only "Firing" } //----------------------------------------------------------------------------- void FiringSmoke::onFiringSmokeEntityChanged(const EffectShowClient::FiringSmokeEntity &data, DataModification modType) { if (modType == DataModification::eRemoved) return; // freeze of indication m_idOrder = data.idOrder(); if (data.idEffectShow() > 0) { const EffectShowClient::Order &order = m_dtc->order(data.idOrder()); m_ui->leEffectShow->setText(QString::fromStdString(order.info())); m_ui->lblLengthOfFogZone->setText(tr("%1m x %2m").arg(QString::number(order.areaWidth()), QString::number(order.areaDepth()))); m_ui->lblDirectionOfFogZone->setText(QString::number(order.areaRotation())); } else { m_ui->leEffectShow->setText(QString()); m_ui->lblLengthOfFogZone->setText(tr("0m x 0m")); m_ui->lblDirectionOfFogZone->setText(QString::number(0)); } m_firingClearanceCountDown = data.firingClearanceTime().is_set() ? (1000 + data.firingClearanceTime().get() - m_session->partitionTime()) : 0; m_endOfFiringClearanceCountDown = data.endOfFiringClearanceTime().is_set() ? (1000 + data.endOfFiringClearanceTime().get() - m_session->partitionTime()) : 0; m_timer->stop(); onFiringClearanceCountDown(); m_safetyConfirmation = data.safetyConfirmation(); onSafetyConfirmationDisplay(); m_oldEntity = data; } void FiringSmoke::onOperatingConditionEntityChanged(const OperatingConditionEntity &data, DataModification modType) { Q_UNUSED(modType) QVector onColor = { data.smokeCartridge1().underlying() <= EffectShowClient::StatusSmokeCartridge_e_def::Ready ? QColor(0, 255, 0) : QColor(255, 255, 0), data.smokeCartridge2().underlying() <= EffectShowClient::StatusSmokeCartridge_e_def::Ready ? QColor(0, 255, 0) : QColor(255, 255, 0), data.smokeCartridge3().underlying() <= EffectShowClient::StatusSmokeCartridge_e_def::Ready ? QColor(0, 255, 0) : QColor(255, 255, 0), data.smokeCartridge4().underlying() <= EffectShowClient::StatusSmokeCartridge_e_def::Ready ? QColor(0, 255, 0) : QColor(255, 255, 0), data.smokeCartridge5().underlying() <= EffectShowClient::StatusSmokeCartridge_e_def::Ready ? QColor(0, 255, 0) : QColor(255, 255, 0) }; QVector status = { ((data.smokeCartridge1().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) || (data.smokeCartridge1().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Smoking) ), ((data.smokeCartridge2().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) || (data.smokeCartridge2().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Smoking) ), ((data.smokeCartridge3().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) || (data.smokeCartridge3().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Smoking) ), ((data.smokeCartridge4().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) || (data.smokeCartridge4().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Smoking) ), ((data.smokeCartridge5().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Ready) || (data.smokeCartridge5().underlying() == EffectShowClient::StatusSmokeCartridge_e_def::Smoking) ) }; m_smokeState->setSmokeState(status, onColor); m_safetyConfirmationWidget->onOperatingConditionEntityChanged(data); } void FiringSmoke::onMeteoDataChanged(const MeteoNearVehicle &data, DataModification modType) { Q_UNUSED(modType) m_meteoTimer->start(), m_ui->lblWeather->setText(tr("Speed [m/s]: %1 | Direction [°]: %2").arg(data.windSpeed()).arg(data.windDirection())); } void FiringSmoke::onMeteoTimerTimeout() { m_ui->lblWeather->setText(tr("Speed [m/s]: --- | Direction [°]: ---")); } //----------------------------------------------------------------------------- void FiringSmoke::onApply() { if (!statusChangedForManuallyEffectShow(EffectShowStatus_e::Apply)) ERROR_LOG(m_logger) << "Firing Smoke Apply failed"; } //----------------------------------------------------------------------------- void FiringSmoke::onAbort() { if (m_idOrder > 0) { OrderEdit *edit = new OrderEdit(m_dtc->order(m_idOrder), false, this); edit->init(m_ftc, EffectShowManagement::OrderConfirmation_e::Abort); addDialog(edit, menuGroup(), QLatin1String("escOrder"), LtsWidgets::LayoutArea::eDialogTab); return; } else statusChangedForManuallyEffectShow(EffectShowStatus_e::Abort); } //----------------------------------------------------------------------------- void FiringSmoke::onCarriedOut() { if (m_idOrder > 0) { OrderEdit *edit = new OrderEdit(m_dtc->order(m_idOrder), false, this); edit->init(m_ftc, EffectShowManagement::OrderConfirmation_e::OrderCarriedOut); addDialog(edit, menuGroup(), QLatin1String("escOrder"), LtsWidgets::LayoutArea::eDialogTab); return; } else statusChangedForManuallyEffectShow(EffectShowStatus_e::CarriedOut); } //----------------------------------------------------------------------------- void FiringSmoke::onSafetyConfirmationDisplay() { if (!m_safetyConfirmationWidget) return; m_safetyConfirmationWidget->setNewSafetyConfirmationDisplay(m_safetyConfirmation.underlying()); } //----------------------------------------------------------------------------- void FiringSmoke::onFiringClearanceCountDown() { if (m_timer->isActive()) { m_firingClearanceCountDown -= 1000; m_endOfFiringClearanceCountDown -= 1000; } if (m_firingClearanceCountDown > 0) m_ui->leFiringClearanceIn->setText(OrderModel::timeOfDayString(m_firingClearanceCountDown / 1000)); else m_ui->leFiringClearanceIn->setText(OrderModel::timeOfDayString(0)); if (m_endOfFiringClearanceCountDown > 0) m_ui->leEndOfFiringClearanceIn->setText(OrderModel::timeOfDayString(m_endOfFiringClearanceCountDown / 1000)); else m_ui->leEndOfFiringClearanceIn->setText(OrderModel::timeOfDayString(0)); if ((m_firingClearanceCountDown > 0) || (m_endOfFiringClearanceCountDown > 0)) m_timer->start(1000); } //----------------------------------------------------------------------------- bool FiringSmoke::statusChangedForManuallyEffectShow(EffectShowStatus_e status) { m_uiRequirements->clear(); return m_requestHelper->startSingleRequest([this, status]() { EffectShowClient::ManuallySmokeRequest request; request.directionOfFogZone(0); request.lengthOfFogZone(0); request.pbAbort(status == EffectShowStatus_e::Abort); request.pbCarriedOut(status == EffectShowStatus_e::CarriedOut); return m_ftc->manuallySmokeRequest(request, this); }); } //----------------------------------------------------------------------------- bool FiringSmoke::statusChangedForOrderedEffectShow(EffectShowStatus_e status) { m_uiRequirements->clear(); if (!m_uiRequirements->checkRequirements(this)) return true; // not all inputs done return m_requestHelper->startSingleRequest([this, status]() { OrderModifyRequest orderModifyRequest; orderModifyRequest.id(m_idOrder); EffectShowManagement::OrderConfirmation_e oc; switch (status) { case EffectShowStatus_e::Abort: oc = EffectShowManagement::OrderConfirmation_e_def::Abort; break; case EffectShowStatus_e::CarriedOut: oc = EffectShowManagement::OrderConfirmation_e_def::OrderCarriedOut; break; default: DEBUG_LOG(m_logger) << "FiringSmoke::statusChangedForOrderedEffectShow switch is defaulting, should not happen I guess..."; break; } orderModifyRequest.orderConfirmation(oc); orderModifyRequest.answerText(QString().toStdString()); return m_ftc->orderModifyRequest(orderModifyRequest, this); }); } } // namespace EffectShowClient