/** * @RDE_HEADER@ * HMI Plugin for Observer Controller - SelfTest Dialog * $Id$ * $HeadURL$ * $Author$ * Created by Patric Karwat, SLSE, 2018-01-17 */ #include "osc_selftest.h" #include "ui_osc_selftest.h" #include #include #include namespace OcSituationClient { SelfTest::SelfTest(LtsSession::LtsSession *session, QWidget *parent) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly) , m_timer(nullptr) , m_lastStatesTime(0) , m_session(session) , m_tabocDtc(nullptr) , m_escDtc(nullptr) , m_ui(new Ui::SelfTest) , m_logger(getLogger("SelfTestDialog")) { m_ui->setupUi(this); if ( m_session->getDtc(m_tabocDtc)) { WARNING_LOG(m_logger) << "load tab settings"; connect(m_tabocDtc.get(), &TrainingAreaBaseOC::Interface::Dtc::technicalStateSfmChanged, this, &SelfTest::onSfmStatusChanged); onSfmStatusChanged(m_tabocDtc->technicalStateSfm(1), DataModification()); } LtsUtils::ProjectSettings *ps = LtsUtils::ProjectSettings::getInstance(); const bool enableEffectShowManagement = ps->value(QStringLiteral("esm"), QStringLiteral("enableEffectShowManagement")).toBool(); if (!enableEffectShowManagement) { m_ui->lblEsc->hide(); m_ui->leEsc->hide(); } else { m_timer = new QTimer(this); if ( m_escDtc.get() != nullptr) { connect(m_escDtc.get(), &EffectShowClient::Interface::Dtc::operatingConditionEntityChanged, this, &SelfTest::onEscOperationConditionChanged); onEscOperationConditionChanged(m_escDtc->operatingConditionEntity(), DataModification()); connect(m_timer, &QTimer::timeout, this, &SelfTest::onCheckLastCondition); m_timer->start(3000); } } setOnlineHelpFilename(QStringLiteral("OC-Self_Test")); } // end of ctor() void SelfTest::onCheckLastCondition() { if ((m_session->partitionTime() - 10*1000) > m_lastStatesTime ) { m_ui->leEsc->setText(tr("No Effect Show Connected")); } } SelfTest::~SelfTest() { delete m_ui; } void SelfTest::retranslate() { translate(m_ui, tr("Self Test") ); } QString SelfTest::getTechStatError(u_char errorID) const { switch (errorID) { case 1: return tr("Error ROM"); case 2: return tr("Error RAM"); case 3: return tr("Error SCC1"); case 4: return tr("Error SCC2"); case 5: return tr("Error SCP"); case 10: return tr("Error EEPROM"); case 11: return tr("Error A/D-Converter"); case 12: return tr("Error CAN"); case 13: return tr("Error DUART A"); case 14: return tr("Error DUART B"); case 20: return tr("Error GPS"); case 21: return tr("Error PUMA/T"); case 30: return tr("Error Equipment Configuration"); case 31: return tr("Error Exercise Configuration"); case 40: return tr("Error Login"); case 41: return tr("Error TETRA Registration"); case 42: return tr("Error Transparent Channel O/C"); case 43: return tr("Error Transparent Channel DMF"); default: break; } return tr("Unknown Error (%1)").arg(errorID); } void SelfTest::onStatusHDD() { QStorageInfo storage(QCoreApplication::applicationFilePath()); if (storage.isValid() && storage.isReady()) { quint64 freeBytesAvailable = storage.bytesAvailable(); quint64 bytesAvailable = storage.bytesTotal(); double percent = bytesAvailable ? 100.0 * freeBytesAvailable / bytesAvailable : 0; m_ui->leDisk->setText(tr("%1% available (%2)").arg(QString::number(percent, 'f', 2), readableSize(freeBytesAvailable))); } else { m_ui->leDisk->setText(tr("Error reading available disk space")); } } void SelfTest::onSfmStatusChanged(const TrainingAreaBaseOC::TechnicalStateSfm &data, DataModification modType) { Q_UNUSED(modType) m_ui->leRadio->setText(data.radioAvailable() ? tr("Available") : tr("Not Available")); m_ui->leLicense->setText(data.licensed() ? tr("Yes") : tr("No")); m_ui->leSfm->setText(data.sfmConnected() ? tr("Connected") : tr("Not Connected")); m_ui->leSfmMani->setText(data.manipulationSfm() ? tr("Yes") : tr("No")); m_ui->leEquipmentMani->setText(data.manipulationEquipment() ? tr("Yes") : tr("No")); m_ui->lblErrorCodes->setText(data.errorCode() > 0 ? getTechStatError(data.errorCode()) : QLatin1String("")); onStatusHDD(); } void SelfTest::onEscOperationConditionChanged(const EffectShowClient::OperatingConditionEntity &data, DataModification modType) { Q_UNUSED(modType) QString feature = tr("Effect Show Connected: "); switch (data.vehicleFeature().underlying()) { case EffectShowManagement::Feature_e::Smoke: feature += tr("Smoke"); break; case EffectShowManagement::Feature_e::Explosion24: feature += tr("Explosion (24)"); break; case EffectShowManagement::Feature_e::Explosion48: feature += tr("Explosion (48)"); break; case EffectShowManagement::Feature_e::NotSpecified: feature.clear(); break; } if (feature.isEmpty()) m_ui->leEsc->setText(tr("No Effect Show Connected")); else m_ui->leEsc->setText(feature); m_lastStatesTime = m_session->partitionTime(); } QString SelfTest::readableSize(quint64 bytes) const { if (bytes > TB) return tr("%1 TB").arg((double) bytes / TB, 0, 'f', 2); else if (bytes > GB) return tr("%1 GB").arg((double) bytes / GB, 0, 'f', 2); else if (bytes > MB) return tr("%1 MB").arg((double) bytes / MB, 0, 'f', 2); else if (bytes > KB) return tr("%1 KB").arg((double) bytes / KB, 0, 'f', 2); else return tr("%1 Bytes").arg(bytes); } } // namespace OcSituationClient