/** * @RDE_HEADER@ * MeteoDataManagement - Static Meteo Data Edit Dialog * $Id$ * $HeadURL$ * $Author$ * Created by hjl, SLSE, 2016-10-17 */ #include "esc_operating_condition.h" #include "ui_esc_operating_condition.h" #include "esc_smoke_state.h" #include "esc_safety_confirmation_widget.h" #include "LtsWidgets/lts_message_dialog.h" #include #include #include namespace EffectShowClient { //============================================================================= OperatingCondition::OperatingCondition(QWidget *parent) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly) , m_dtc(nullptr) , m_ftc(nullptr) , m_lastState(EffectShowClient::OperatingConditionEntity()) , m_meteoTimerTimeout(60 * 1000 * 15) //15min , m_meteoTimer(new QTimer(this)) , m_smokeState(nullptr) , m_safetyConfirmationWidget(nullptr) , m_ui(new Ui::OperatingCondition) , m_requestHelper(new LtsUtils::RequestHelper(this)) , m_logger(getLogger("OperatingCondition")) { m_ui->setupUi(this); m_smokeState = new EffectShowClient::SmokeState(this); m_ui->hz->insertWidget(1, m_smokeState); m_smokeState->setVisible(false); //Hide for now m_ui->lblStation->hide(); m_ui->leStation->hide(); m_ui->leLastUpdate->clear(); m_ui->leLastUpdate->setEnabled(false); m_batteryVoltage.maximumValue = m_ui->frameGreenVoltage->width(); connect(m_ui->pbSendAmmunition, &QPushButton::clicked, this, &OperatingCondition::onSendAmmunition); setOnlineHelpFilename(QLatin1String("OC-Operating_Condition")); } //============================================================================= OperatingCondition::~OperatingCondition() { delete m_ui; } //============================================================================= bool OperatingCondition::init(const std::shared_ptr &dtc, const std::shared_ptr &ftc) { DEBUG_LOG(m_logger) << "OperatingCondition::init()"; if (!dtc || !ftc) { ERROR_LOG(m_logger) << "OperatingCondition::init() Invalid shared_ptr!"; return false; } m_dtc = dtc; m_ftc = ftc; m_safetyConfirmationWidget = new EffectShowClient::SafetyConfirmationWidget(this); m_safetyConfirmationWidget->init(m_ftc); m_ui->safetyLayout->insertWidget(0, m_safetyConfirmationWidget); // connects for data changes connect(m_dtc.get(), &EffectShowClient::Interface::Dtc::operatingConditionEntityChanged, this, &OperatingCondition::onOperatingConditionEntityChanged); connect(m_dtc.get(), &EffectShowClient::Interface::Dtc::meteoNearVehicleChanged, this, &OperatingCondition::onMeteoNearVehicleChanged); connect(m_dtc.get(), &EffectShowClient::Interface::Dtc::firingExplosionEntityChanged, this, &OperatingCondition::onFiringExplosionEntityChanged); connect(m_dtc.get(), &EffectShowClient::Interface::Dtc::firingSmokeEntityChanged, this, &OperatingCondition::onFiringSmokeEntityChanged); connect(m_meteoTimer, &QTimer::timeout, this, &OperatingCondition::onMeteoTimeout); m_meteoTimer->start(m_meteoTimerTimeout); //resetWeather onMeteoTimeout(); // set constraints for battery voltage setBatteryVoltageConstraints(21.0, 22.0, 36.0); // display data onOperatingConditionEntityChanged(m_dtc->operatingConditionEntity(), DataModification::eAdded); const EffectShowClient::MeteoNearVehicle mdmv = m_dtc->meteoNearVehicle(); if (mdmv.temperature() > 0 && mdmv.windSpeed() > 0) onMeteoNearVehicleChanged(m_dtc->meteoNearVehicle(), DataModification::eAdded); connect(m_ui->pbConfirmReadiness, &QPushButton::clicked, this, &OperatingCondition::onSendConfirmReadiness); connect(m_ui->pbRevokeReadiness, &QPushButton::clicked, this, &OperatingCondition::onSendRevokeReadiness); onSafetyConfirmationDisplay(); return true; } //----------------------------------------------------------------------------- void OperatingCondition::retranslate() { translate(m_ui, tr("Operating Condition")); } int OperatingCondition::getSmokeCount() { const OperatingConditionEntity &data = m_dtc->operatingConditionEntity(); int currentSmokeLoad = 0; 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++; return currentSmokeLoad; } //----------------------------------------------------------------------------- void OperatingCondition::onOperatingConditionEntityChanged(const EffectShowClient::OperatingConditionEntity &data, DataModification modType) { if (modType == DataModification::eRemoved) return; // freeze of indication m_lastState = data; if (data.vehicleFeature() == EffectShowManagement::Feature_e::inner_enum(EffectShowManagement::Feature_e_def::Explosion24)) { m_ui->ledAftLh->hide(); m_ui->ledAftRh->hide(); } else if (data.vehicleFeature() == EffectShowManagement::Feature_e::inner_enum(EffectShowManagement::Feature_e_def::Explosion48)) { m_ui->ledAftLh->show(); m_ui->ledAftRh->show(); } bool isExp = data.vehicleFeature() != EffectShowManagement::Feature_e::inner_enum(EffectShowManagement::Feature_e_def::Smoke); m_ui->frame->setHidden(!isExp); m_ui->lblMagazine->setHidden(!isExp); m_ui->lblMag->setHidden(!isExp); m_ui->sbMagazine->setHidden(!isExp); m_smokeState->setHidden(isExp); //m_ui->frameSmoke->setHidden(isExp); if (m_safetyConfirmationWidget) { bool hasNoWarnings = m_safetyConfirmationWidget->onOperatingConditionEntityChanged(data); m_ui->pbConfirmReadiness->setEnabled(hasNoWarnings); } // battery voltage setBatteryVoltage(data.batteryVoltage()); if (data.vehicleFeature() != EffectShowManagement::Feature_e::inner_enum(EffectShowManagement::Feature_e_def::Smoke)) { if (data.vehicleFeature() == EffectShowManagement::Feature_e::inner_enum(EffectShowManagement::Feature_e_def::NotSpecified)) return; // status firing units int max = data.vehicleFeature() == EffectShowManagement::Feature_e::inner_enum(EffectShowManagement::Feature_e_def::Explosion24) ? 24 : 48; m_ui->sbMagazine->setMaximum(max); m_ui->sbAvailable->setMaximum(255); m_ui->ledFwdLh->setStatus(data.firingUnitReadyFwdLh()); m_ui->ledAftLh->setStatus(data.firingUnitReadyAftLh()); m_ui->ledFwdRh->setStatus(data.firingUnitReadyFwdRh()); m_ui->ledAftRh->setStatus(data.firingUnitReadyAftRh()); } else { // status smoke cartridges m_ui->sbMagazine->setMaximum(5); m_ui->sbAvailable->setMaximum(12); 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); } // set ammunition m_ui->ltsLedWidget->setColor(data.readiness() ? QColor(0, 255, 0) : QColor(255, 0, 0)); m_ui->ltsLedWidget->setStatus(true); if (m_ui->lblAva->text().toInt() != data.ammunitionAvailable()) m_ui->sbAvailable->setValue(data.ammunitionAvailable()); m_ui->lblAva->setText(QString::number(data.ammunitionAvailable())); m_ui->lblMag->setText(QString::number(data.ammunitionMagazine())); // if ((m_lastState.ammunitionAvailable() != data.ammunitionAvailable()) // || (m_lastState.ammunitionMagazine() != data.ammunitionMagazine())) // { // m_ui->sbMagazine->setValue(data.ammunitionMagazine()); // m_ui->sbAvailable->setValue(data.ammunitionAvailable()); // } } void OperatingCondition::onFiringExplosionEntityChanged(const FiringExplosionEntity &data, DataModification modType) { Q_UNUSED(modType) m_safetyConfirmation = data.safetyConfirmation(); onSafetyConfirmationDisplay(); } void OperatingCondition::onFiringSmokeEntityChanged(const FiringSmokeEntity &data, DataModification modType) { Q_UNUSED(modType) m_safetyConfirmation = data.safetyConfirmation(); onSafetyConfirmationDisplay(); } void OperatingCondition::onSafetyConfirmationDisplay() { if (!m_safetyConfirmationWidget) return; m_safetyConfirmationWidget->setNewSafetyConfirmationDisplay(m_safetyConfirmation.underlying()); } bool OperatingCondition::onSendRevokeReadiness() { bool ret = m_requestHelper->startSingleRequest([this]() { EffectShowClient::SendReadinessRequest request; request.readiness(false); return m_ftc->sendReadinessRequest(request, this); }); return ret; } bool OperatingCondition::onSendConfirmReadiness() { bool ret = m_requestHelper->startSingleRequest([this]() { EffectShowClient::SendReadinessRequest request; request.readiness(true); return m_ftc->sendReadinessRequest(request, this); }); return ret; } //----------------------------------------------------------------------------- void OperatingCondition::onMeteoNearVehicleChanged(const EffectShowClient::MeteoNearVehicle &data, DataModification modType) { if (modType == DataModification::eRemoved) return; // freeze of indication m_meteoTimer->start(m_meteoTimerTimeout); m_ui->leTemperature->setText(QString::number(data.temperature(), 'f', 2)); m_ui->leHumidity->setText(QString::number(data.humidity(), 'f', 2)); m_ui->lePressure->setText(QString::number(data.pressure(), 'f', 2)); m_ui->leWindSpeed->setText(QString::number(data.windSpeed(), 'f', 2)); m_ui->leWindDirection->setText(QString::number(data.windDirection(), 'f', 2)); m_ui->leLastUpdate->setText(DTG::toString(QDateTime::currentDateTime())); } void OperatingCondition::onMeteoTimeout() { const QLatin1String lit("---"); m_ui->leTemperature->setText(lit); m_ui->leHumidity->setText(lit); m_ui->lePressure->setText(lit); m_ui->leWindSpeed->setText(lit); m_ui->leWindDirection->setText(lit); m_ui->leLastUpdate->clear(); } //----------------------------------------------------------------------------- bool OperatingCondition::onSendAmmunition() { if (m_ui->sbMagazine->value() > m_ui->sbAvailable->value()) { new LtsWidgets::LtsMessageDialogNew(this, tr("The value for Magazine must not be higher than the value for Available.")); QPalette *palette = new QPalette(); palette->setColor(QPalette::Background, Qt::red); m_ui->sbMagazine->setPalette(*palette); return false; } // if m_ui->sbMagazine->setPalette(QApplication::palette(m_ui->sbMagazine)); return m_requestHelper->startSingleRequest([this]() { EffectShowClient::SendAmmunitionRequest request; const OperatingConditionEntity &condition = m_dtc->operatingConditionEntity(); if (condition.vehicleFeature() == EffectShowManagement::Feature_e::inner_enum(EffectShowManagement::Feature_e_def::Smoke)) request.ammunitionMagazine(getSmokeCount()); else request.ammunitionMagazine(m_ui->sbMagazine->value()); request.ammunitionAvailable(m_ui->sbAvailable->value()); return m_ftc->sendAmmunitionRequest(request, this); }); } //----------------------------------------------------------------------------- void OperatingCondition::setBatteryVoltageConstraints(double redBoundary, double yellowBoundary, double greenMaximum) { m_batteryVoltage.redBoundary = redBoundary; m_batteryVoltage.yellowBoundary = yellowBoundary; m_batteryVoltage.greenMaximum = greenMaximum; QRect greenRect = m_ui->frameGreenVoltage->geometry(); double greenWidth = (double)greenRect.width(); QRect setVal = greenRect; setVal.setWidth((int)(greenWidth * redBoundary / greenMaximum)); m_ui->frameRedVoltage->setGeometry(setVal); setVal.setWidth((int)(greenWidth * yellowBoundary / greenMaximum)); m_ui->frameYellowVoltage->setGeometry(setVal); } //----------------------------------------------------------------------------- void OperatingCondition::setBatteryVoltage(double batteryVoltage) { // set background color decimal value indication if (batteryVoltage < m_batteryVoltage.redBoundary) m_ui->leVoltage->setStyleSheet(QLatin1String("background-color: rgb(255, 0, 0)")); else if (batteryVoltage < m_batteryVoltage.yellowBoundary) m_ui->leVoltage->setStyleSheet(QLatin1String("background-color: rgb(255, 255, 0)")); else m_ui->leVoltage->setStyleSheet(QLatin1String("background-color: rgb(0, 255, 0)")); // set progress bar value QRect barRect = m_ui->frameBarVoltage->geometry(); barRect.setWidth((int)(m_batteryVoltage.maximumValue * batteryVoltage / m_batteryVoltage.greenMaximum)); m_ui->frameBarVoltage->setGeometry(barRect); // set decimal value m_ui->leVoltage->setText(QString::number(batteryVoltage, 'f', 1)); } } // namespace EffectShowClient