Files
qt5-legatus-legacy/Lts/Plugins/GuezIedManagement/Gui/InfoDialog/gim_info_dialog.cpp
T
2026-08-13 18:33:10 +02:00

272 lines
9.0 KiB
C++
Executable File

/**
* @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 <QTableWidgetItem>
#include <LtsCoordTrans/lts_coord_trans.h>
#include <GuezIedManagement/gim_translation.h>
#include <ParticipantManagement/ppm_translation.h>
#include <Symbology/symbol_data_to_render_role.h>
#include <Symbology/sidc_builder_base.h>
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<Interface::Dtc> &dtc,
const std::shared_ptr<ParticipantManagement::Interface::Dtc> &ppmDtc,
const std::shared_ptr<SituationMap::ForeignGuiInterface> &situationIfc,
const std::shared_ptr<AdvancedSymbology::ForeignDataInterface> &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<Small|Big> 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);
}
}