/** * @RDE_HEADER@ * GUI Plugin for IED- Info * $Id$ * $HeadURL$ * $Author$ * Created by Philipp Dassow, SLEA, 2017-08-23 */ #include "gim_info_dialog.h" #include "ui_gim_info_dialog.h" #include #include #include #include #include #include namespace GuezIedManagement { InfoDialog::InfoDialog(int iedEntityId, QWidget *parent) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly) , m_iedEntityId(iedEntityId) , m_session(nullptr) , m_dtc(nullptr) , m_ppmDtc(nullptr) , m_asbIfc(nullptr) , m_symbolWatcher(nullptr) , m_ui(new Ui::InfoDialog) , m_logger(getLogger("IedInfoDialog")) { m_ui->setupUi(this); setUnchangeable(); m_symbolWatcher = new AdvancedSymbology::SymbolResultWatcherLabel(m_ui->lblIcon); connect(m_ui->pbFindOnMap, &QToolButton::clicked, this, &InfoDialog::onFindOnMap); } InfoDialog::~InfoDialog() { delete m_symbolWatcher; delete m_ui; } bool InfoDialog::init(LtsSession::LtsSession *session, const std::shared_ptr &dtc, const std::shared_ptr &ppmDtc, const std::shared_ptr &situationIfc, const std::shared_ptr &asbIfc) { m_session = session; m_dtc = dtc; m_ppmDtc = ppmDtc; m_situationIfc = situationIfc; m_asbIfc = asbIfc; if (!m_dtc->enableIed()) return false; if (!m_ppmDtc->enableParty()) return false; connect(m_dtc.get(), &Interface::Dtc::iedChanged, this, &InfoDialog::onIedChanged); connect(m_dtc.get(), &Interface::Dtc::iedPositionChanged, this, &InfoDialog::onIedPositionChanged); showIedInfos(); return true; } void InfoDialog::retranslate() { translate(m_ui, QString::number(m_dtc->ied(m_iedEntityId).equipmentNumber()), false, tr("IED")); } void InfoDialog::showIedInfos() { Ied ied = m_dtc->ied(m_iedEntityId); m_ui->lblEquipmentNumber->setText(QString::number(ied.equipmentNumber())); m_ui->lblParty->setText(ParticipantManagement::trPartyName(m_ppmDtc->party(ied.partyId()).name())); m_ui->lblDesignator->setText(QString::fromStdString(ied.name())); setPosition(m_dtc->iedPosition(m_iedEntityId)); m_ui->lblExplosiveForce->setText(QString::number(ied.explosiveForce())); m_ui->lblTriggerRemote->setEnabled(ied.remoteTrigger()); m_ui->lblTriggerButton->setEnabled(ied.switchTrigger()); m_ui->lblTriggerLightbarrier->setEnabled(ied.lightBarrierTrigger()); m_ui->lblTriggerWire->setEnabled(ied.tautWireTrigger()); if (ied.pyrotechnics()) m_ui->lblPyrotechnics->setText(tr("Active")); else m_ui->lblPyrotechnics->setText(tr("Inactive")); m_ui->lblState->setText(GuezIedManagement::toString(ied.tacticalState())); m_ui->tbwBit->setRowCount(0); if (ied.electronicsError().underlying() != IedError_def::NoError) { QTableWidgetItem *device = new QTableWidgetItem(tr("Electronics")); QTableWidgetItem *error = new QTableWidgetItem(GuezIedManagement::toString(ied.electronicsError())); addTbwBitEntry(device, error); } if (ied.pyrotechnics1Error().underlying() != IedError_def::NoError) { QTableWidgetItem *device = new QTableWidgetItem(tr("Pyrotechnics 1")); QTableWidgetItem *error = new QTableWidgetItem(GuezIedManagement::toString(ied.pyrotechnics1Error())); addTbwBitEntry(device, error); } if (ied.pyrotechnics2Error().underlying() != IedError_def::NoError) { QTableWidgetItem *device = new QTableWidgetItem(tr("Pyrotechnics 2")); QTableWidgetItem *error = new QTableWidgetItem(GuezIedManagement::toString(ied.pyrotechnics2Error())); addTbwBitEntry(device, error); } if (ied.pyrotechnics3Error().underlying() != IedError_def::NoError) { QTableWidgetItem *device = new QTableWidgetItem(tr("Pyrotechnics 3")); QTableWidgetItem *error = new QTableWidgetItem(GuezIedManagement::toString(ied.pyrotechnics3Error())); addTbwBitEntry(device, error); } if ((ied.electronicsError().underlying() == IedError_def::NoError) && (ied.pyrotechnics1Error().underlying() == IedError_def::NoError) && (ied.pyrotechnics2Error().underlying() == IedError_def::NoError) && (ied.pyrotechnics3Error().underlying() == IedError_def::NoError)) { QTableWidgetItem *device = new QTableWidgetItem(tr("no Errors")); addTbwBitEntry(device, nullptr); } const QColor &color = QColor::fromRgb(QRgb(m_ppmDtc->party(ied.partyId()).color())); const AdvancedSymbology::Role &role = AdvancedSymbology::roleToRole<>(m_ppmDtc->party(ied.partyId()).role()); updateIcon(color, role, ied.tacticalState(), QString::fromStdString(ied.symbol())); } void InfoDialog::setPosition(const IedPosition &pos) { if (std::isnan(pos.position().lon()) || std::isnan(pos.position().lat())) m_ui->lblPosition->setText(tr("Invalid Position")); else m_ui->lblPosition->setText(LtsCoordTrans::mgrsFromGeographic(pos.position().lon(), pos.position().lat())); } AdvancedSymbology::Injury guezIedStateToInjury(const GuezIedManagement::IedTacticalState &iedState) { switch (iedState.underlying()) { case GuezIedManagement::IedTacticalState::Active: return AdvancedSymbology::Injury::NoInjury; // "" break; default: return AdvancedSymbology::Injury::TotalKill; // "/\" } } void updateIedPyro(const GuezIedManagement::IedTacticalState &iedStateIn, AdvancedSymbology::Injury &injuryInOut, QString &symbolInOut) { // Note: // Special: triggered Ied has seperate SIDC: // "M25D|CMPL|10014000001103000000"); // SIDC for IED (OHNE ZickZack) // "M25D|CMPL|10014000001103010000"); // SIDC for IED (MIT ZickZack) // ^ // | -> Therefore suppress Injury // handled at guez_ied_to_map.cpp and gim_info_dialog.cpp if (injuryInOut != AdvancedSymbology::Injury::TotalKill) return; switch (iedStateIn.underlying()) { case GuezIedManagement::IedTacticalState::Unknown: case GuezIedManagement::IedTacticalState::NotActive: case GuezIedManagement::IedTacticalState::Active: // empty break; case GuezIedManagement::IedTacticalState::TriggeredBySwitch: case GuezIedManagement::IedTacticalState::TriggeredByRemote: case GuezIedManagement::IedTacticalState::TriggeredByLightBarrier: case GuezIedManagement::IedTacticalState::TriggeredByTautWire: case GuezIedManagement::IedTacticalState::TriggeredByControlDevice: { // Sonderfall: type == Ied: // sidc MIT ZickZack ersetzt 'sidc OHNE ZickZack && TotalKill' const QString &bsc = AdvancedSymbology::SidcBuilderBase::concreteSidcToBaseSymbolCode(symbolInOut); // QStringLiteral("AP6D|CMPL|10014000001103000000"); // SIDC for IED (OHNE ZickZack) if ((bsc.compare(QStringLiteral("AP6D|BASE|40110300")) == 0 || bsc.compare(QStringLiteral("M25D|BASE|40110300")) == 0) ) { symbolInOut = QStringLiteral("AP6D|CMPL|10014000001103010000"); // SIDC for IED (MIT ZickZack) injuryInOut = AdvancedSymbology::Injury::NoInjury; } } break; case GuezIedManagement::IedTacticalState::Defused: // empty return; } //switch } void InfoDialog::updateIcon(const QColor &color, AdvancedSymbology::Role role, const IedTacticalState &state, const QString &sidc) { AdvancedSymbology::SymbolDataToRender symDataToRender(sidc); //symDataToRender.injury = stateToInjury(state); symDataToRender.role = role; symDataToRender.injuryColor = Qt::black; symDataToRender.fillColor = color; symDataToRender.fillColorReplace = true; symDataToRender.injury = guezIedStateToInjury(state); // copy of Lts/Plugins/SituationMapPlugin/Gui/SituationMap/AdapterDds/guez_ied_to_map.cpp : updateIedPyro(state, symDataToRender.injury, symDataToRender.sidc); // : copy of Lts/Plugins/SituationMapPlugin/Gui/SituationMap/AdapterDds/guez_ied_to_map.cpp m_symbolWatcher->setSymbolResult(m_asbIfc->findImage(symDataToRender)); } void InfoDialog::onFindOnMap() { m_situationIfc->centerMapToGuezIedObject(m_iedEntityId); } void InfoDialog::onIedChanged(const Ied &data, DataModification modType) { Q_UNUSED(modType); if (data.id() != m_iedEntityId) return; showIedInfos(); } void InfoDialog::onIedPositionChanged(const IedPosition &data, DataModification modType) { if (data.id() != m_iedEntityId || modType == DataModification::eRemoved) return; setPosition(data); } void InfoDialog::addTbwBitEntry(QTableWidgetItem *device, QTableWidgetItem *error) { m_ui->tbwBit->setSortingEnabled(false); int newRow = m_ui->tbwBit->rowCount(); if (device || error) m_ui->tbwBit->insertRow(newRow); if (device) m_ui->tbwBit->setItem(newRow, 0, device); if (error) m_ui->tbwBit->setItem(newRow, 1, error); m_ui->tbwBit->setSortingEnabled(true); } }