diff --git a/samples/blackgui/mainwindow.h b/samples/blackgui/mainwindow.h index 6b6d29161..cdaaf4362 100644 --- a/samples/blackgui/mainwindow.h +++ b/samples/blackgui/mainwindow.h @@ -18,6 +18,7 @@ #include "blackcore/context_application.h" #include "blackcore/context_simulator.h" #include "blackcore/coreruntime.h" +#include "blackgui/transpondermodeselector.h" #include "blackgui/atcstationlistmodel.h" #include "blackgui/serverlistmodel.h" #include "blackgui/aircraftlistmodel.h" diff --git a/samples/blackgui/mainwindow.ui b/samples/blackgui/mainwindow.ui index 866b6f9b0..54ab5a055 100644 --- a/samples/blackgui/mainwindow.ui +++ b/samples/blackgui/mainwindow.ui @@ -454,7 +454,7 @@ QStatusBar QLabel { QFrame::NoFrame - 7 + 4 @@ -1388,7 +1388,7 @@ QStatusBar QLabel { - + 0 @@ -1401,21 +1401,6 @@ QStatusBar QLabel { 16777215 - - - S - - - - - C - - - - - I - - @@ -1800,7 +1785,7 @@ QStatusBar QLabel { - 3 + 0 @@ -3195,6 +3180,13 @@ QStatusBar QLabel { + + + BlackGui::CTransponderModeSelector + QComboBox +
blackgui/transpondermodeselector.h
+
+
cb_StatusWithDBus le_StatusNetworkContext @@ -3223,7 +3215,7 @@ QStatusBar QLabel { cb_CockpitSelcal1 cb_CockpitSelcal2 ds_CockpitTransponder - cb_CockpitTransponderMode + cbp_CockpitTransponderMode le_CockpitVoiceRoomCom1 cb_CockpitVoiceRoom1Override le_CockpitVoiceRoomCom2 diff --git a/samples/blackgui/mainwindow_cockpit.cpp b/samples/blackgui/mainwindow_cockpit.cpp index 5ffe7cfec..c8456d2d0 100644 --- a/samples/blackgui/mainwindow_cockpit.cpp +++ b/samples/blackgui/mainwindow_cockpit.cpp @@ -42,15 +42,15 @@ void MainWindow::cockpitValuesChanged() else if (sender == this->ui->pb_CockpitIdent) { // trigger the real button - if (this->ui->cb_CockpitTransponderMode->currentText() == "I") + if (this->ui->cbp_CockpitTransponderMode->isIdentSelected()) { this->ui->pb_CockpitIdent->setStyleSheet(""); - this->resetTransponderMode(); + this->ui->cbp_CockpitTransponderMode->resetTransponderMode(); } else { this->ui->pb_CockpitIdent->setStyleSheet("background: red"); - this->ui->cb_CockpitTransponderMode->setCurrentText("I"); // trigger real button and whole process + this->ui->cbp_CockpitTransponderMode->setSelectedTransponderModeStateIdent(); // trigger real button and whole process } return; } @@ -92,25 +92,7 @@ void MainWindow::updateCockpitFromContext() this->ui->ds_CockpitTransponder->setValue(tc); } - QString tm = this->ui->cb_CockpitTransponderMode->currentText().trimmed().toUpper(); - switch (transponder.getTransponderMode()) - { - case CTransponder::StateStandby: - case CTransponder::ModeS: - if (tm != "S") - this->ui->cb_CockpitTransponderMode->setCurrentText("S"); - break; - case CTransponder::ModeC: - if (tm != "C") - this->ui->cb_CockpitTransponderMode->setCurrentText("C"); - break; - case CTransponder::StateIdent: - if (tm != "I") - this->ui->cb_CockpitTransponderMode->setCurrentText("I"); - break; - default: - break; - } + this->ui->cbp_CockpitTransponderMode->setSelectedTransponderMode(transponder.getTransponderMode()); if (this->m_contextNetworkAvailable) { @@ -228,11 +210,6 @@ void MainWindow::updateComFrequencyDisplays(const CComSystem &com1, const CComSy void MainWindow::resetTransponderMode() { this->ui->pb_CockpitIdent->setStyleSheet(""); - if (this->ui->cb_CockpitTransponderMode->currentText() == "I") - { - // only reset if still "I" - this->ui->cb_CockpitTransponderMode->setCurrentText(this->m_transponderResetValue); - } } /* @@ -258,25 +235,11 @@ void MainWindow::sendCockpitUpdates() this->ui->ds_CockpitTransponder->setValue(transponder.getTransponderCode()); } - QString tm = this->ui->cb_CockpitTransponderMode->currentText().toUpper(); - if (tm == "S") - transponder.setTransponderMode(CTransponder::ModeS); - else if (tm == "C") - transponder.setTransponderMode(CTransponder::ModeC); - else if (tm == "I") + transponder.setTransponderMode(this->ui->cbp_CockpitTransponderMode->getSelectedTransponderMode()); + if (this->ui->cbp_CockpitTransponderMode->isIdentSelected()) { // ident shall be sent for some time, then reset - transponder.setTransponderMode(CTransponder::StateIdent); this->ui->pb_CockpitIdent->setStyleSheet("background: red"); - if (this->m_ownAircraft.getTransponderMode() == CTransponder::ModeS) - { - this->m_transponderResetValue = "S"; - } - else - { - this->m_transponderResetValue = "C"; - } - QTimer::singleShot(5000, this, SLOT(resetTransponderMode())); } // diff --git a/samples/blackgui/mainwindow_init.cpp b/samples/blackgui/mainwindow_init.cpp index 2bddb60e4..6e687153b 100644 --- a/samples/blackgui/mainwindow_init.cpp +++ b/samples/blackgui/mainwindow_init.cpp @@ -317,7 +317,7 @@ void MainWindow::initGuiSignals() this->connect(this->ui->le_CommandLineInput, &QLineEdit::returnPressed, this, &MainWindow::commandEntered); // cockpit - connected = this->connect(this->ui->cb_CockpitTransponderMode, SIGNAL(currentIndexChanged(QString)), this, SLOT(cockpitValuesChanged())); + connected = this->connect(this->ui->cbp_CockpitTransponderMode, SIGNAL(currentIndexChanged(QString)), this, SLOT(cockpitValuesChanged())); Q_ASSERT(connected); this->connect(this->ui->ds_CockpitCom1Active, &QDoubleSpinBox::editingFinished, this, &MainWindow::cockpitValuesChanged); this->connect(this->ui->ds_CockpitCom2Active, &QDoubleSpinBox::editingFinished, this, &MainWindow::cockpitValuesChanged); @@ -333,6 +333,7 @@ void MainWindow::initGuiSignals() this->connect(this->ui->pb_CockpitToggleCom2, &QPushButton::clicked, this, &MainWindow::cockpitValuesChanged); this->connect(this->ui->pb_CockpitIdent, &QPushButton::clicked, this, &MainWindow::cockpitValuesChanged); this->connect(this->ui->pb_CockpitSelcalTest, &QPushButton::clicked, this, &MainWindow::testSelcal); + this->connect(this->ui->cbp_CockpitTransponderMode, &CTransponderModeSelector::identEnded, this, &MainWindow::resetTransponderMode); this->connect(qApp, &QApplication::focusChanged, this, &MainWindow::inputFocusChanged); // voice diff --git a/src/blackgui/transpondermodeselector.cpp b/src/blackgui/transpondermodeselector.cpp new file mode 100644 index 000000000..e1b2760bf --- /dev/null +++ b/src/blackgui/transpondermodeselector.cpp @@ -0,0 +1,80 @@ +#include "transpondermodeselector.h" + +using namespace BlackMisc::Aviation; + +namespace BlackGui +{ + + CTransponderModeSelector::CTransponderModeSelector(QWidget *parent) : QComboBox(parent), + m_currentMode(CTransponder::StateStandby), m_resetMode(CTransponder::StateStandby) + { + QComboBox::insertItems(0, CTransponderModeSelector::modes()); + connect(&this->m_resetTimer, &QTimer::timeout, this, &CTransponderModeSelector::resetTransponderMode); + connect(this, &CTransponderModeSelector::currentTextChanged, this, &CTransponderModeSelector::setSelectedTransponderModeAsString); + this->m_resetTimer.setInterval(5000); + } + + const QString &CTransponderModeSelector::transponderStateStandby() + { + static const QString s(BlackMisc::Aviation::CTransponder::modeAsString(BlackMisc::Aviation::CTransponder::StateStandby)); + return s; + } + + const QString &CTransponderModeSelector::transponderStateIdent() + { + static const QString s(BlackMisc::Aviation::CTransponder::modeAsString(BlackMisc::Aviation::CTransponder::StateIdent)); + return s; + } + + const QString &CTransponderModeSelector::transponderModeC() + { + static const QString s(BlackMisc::Aviation::CTransponder::modeAsString(BlackMisc::Aviation::CTransponder::ModeC)); + return s; + } + + const QStringList &CTransponderModeSelector::modes() + { + static QStringList modes; + if (modes.isEmpty()) + { + modes << CTransponderModeSelector::transponderStateStandby(); + modes << CTransponderModeSelector::transponderModeC(); + modes << CTransponderModeSelector::transponderStateIdent(); + } + return modes; + } + + BlackMisc::Aviation::CTransponder::TransponderMode CTransponderModeSelector::getSelectedTransponderMode() const + { + return this->m_currentMode; + } + + void CTransponderModeSelector::setSelectedTransponderMode(CTransponder::TransponderMode mode) + { + if (mode != CTransponder::StateIdent) this->m_resetMode = mode; + if (this->m_currentMode == mode) return; + if (this->m_currentMode == CTransponder::StateIdent) emit this->identEnded(); + this->m_currentMode = mode; + QString m = CTransponder::modeAsString(mode); + QComboBox::setCurrentText(m); + if (mode == CTransponder::StateIdent) + { + this->m_resetTimer.start(); + } + else + { + this->m_resetTimer.stop(); + } + } + + void CTransponderModeSelector::setSelectedTransponderModeAsString(const QString &mode) + { + this->setSelectedTransponderMode(CTransponder::modeFromString(mode)); + } + + void CTransponderModeSelector::resetTransponderMode() + { + if (!this->isIdentSelected()) return; + this->setSelectedTransponderMode(this->m_resetMode); + } +} diff --git a/src/blackgui/transpondermodeselector.h b/src/blackgui/transpondermodeselector.h new file mode 100644 index 000000000..24463da9c --- /dev/null +++ b/src/blackgui/transpondermodeselector.h @@ -0,0 +1,73 @@ +#ifndef BLACKGUI_QWITRANSPONDERMODESELECTOR_H +#define BLACKGUI_QWITRANSPONDERMODESELECTOR_H + +#include "../blackmisc/aviotransponder.h" +#include "blackmisc/aviotransponder.h" +#include +#include +#include + + +namespace BlackGui +{ + + /*! + * \brief Selector for the transponder mode + */ + class CTransponderModeSelector : public QComboBox + { + Q_OBJECT + + private: + BlackMisc::Aviation::CTransponder::TransponderMode m_currentMode; + BlackMisc::Aviation::CTransponder::TransponderMode m_resetMode; + QTimer m_resetTimer; + + public: + //! \brief Constructor + explicit CTransponderModeSelector(QWidget *parent = nullptr); + + //! \brief Standby string + static const QString &transponderStateStandby(); + + //! \brief Ident string + static const QString &transponderStateIdent(); + + //! \brief Mode C string + static const QString &transponderModeC(); + + //! \brief All relevant modes for GUI + static const QStringList &modes(); + + //! \brief Selected transponder mode + BlackMisc::Aviation::CTransponder::TransponderMode getSelectedTransponderMode() const; + + //! \brief Selected transponder mode + void setSelectedTransponderMode(BlackMisc::Aviation::CTransponder::TransponderMode mode); + + //!\ brief Set to ident + void setSelectedTransponderModeStateIdent() + { + this->setSelectedTransponderMode(BlackMisc::Aviation::CTransponder::StateIdent); + } + + //! \brief Ident selected + bool isIdentSelected() const + { + return this->getSelectedTransponderMode() == BlackMisc::Aviation::CTransponder::StateIdent; + } + + public slots: + //! \brief reset to last mode (unequal ident) + void resetTransponderMode(); + + //! \brief Selected transponder mode + void setSelectedTransponderModeAsString(const QString &mode); + + signals: + //! \brief Ident ended + void identEnded(); + }; +} // namespace + +#endif // guard diff --git a/src/blackmisc/aviotransponder.cpp b/src/blackmisc/aviotransponder.cpp index 0bb066042..35b2b5982 100644 --- a/src/blackmisc/aviotransponder.cpp +++ b/src/blackmisc/aviotransponder.cpp @@ -47,89 +47,18 @@ namespace BlackMisc /* * Mode as readable string */ - QString CTransponder::getModeAsString() const + CTransponder::TransponderMode CTransponder::modeFromString(const QString &modeString) { - QString m; - switch (this->getTransponderMode()) - { - case StateIdent: - m = "Ident"; - break; - case StateStandby: - m = "Standby"; - break; - case ModeC: - m = "Mode C"; - break; - case ModeS: - m = "Mode S"; - break; - case ModeMil1: - m = "Mil.Mode 1"; - break; - case ModeMil2: - m = "Mil.Mode 2"; - break; - case ModeMil3: - m = "Mil.Mode 3"; - break; - case ModeMil4: - m = "Mil.Mode 4"; - break; - case ModeMil5: - m = "Mil.Mode 5"; - break; - default: - throw std::range_error("Illegal Transponder Mode"); - } - return m; - } - - /* - * Mode as readable string - */ - void CTransponder::setModeAsString(const QString &m) - { - if (m.startsWith("Ident", Qt::CaseInsensitive)) - { - this->setTransponderMode(StateIdent); - } - else if (m.startsWith("Standby", Qt::CaseInsensitive) || m.startsWith("Stdby", Qt::CaseInsensitive)) - { - this->setTransponderMode(StateStandby); - } - else if (m.startsWith("Mode C", Qt::CaseInsensitive)) - { - this->setTransponderMode(ModeC); - } - else if (m.startsWith("Mode S", Qt::CaseInsensitive)) - { - this->setTransponderMode(ModeS); - } - else if (m.contains("Mode 1", Qt::CaseInsensitive)) - { - this->setTransponderMode(ModeMil1); - } - else if (m.contains("Mode 2", Qt::CaseInsensitive)) - { - this->setTransponderMode(ModeMil2); - } - else if (m.contains("Mode 3", Qt::CaseInsensitive)) - { - this->setTransponderMode(ModeMil3); - } - else if (m.contains("Mode 4", Qt::CaseInsensitive)) - { - this->setTransponderMode(ModeMil4); - } - else if (m.contains("Mode 5", Qt::CaseInsensitive)) - { - this->setTransponderMode(ModeMil5); - } - else - { - throw std::range_error("Illegal Transponder Mode"); - } + if (modeString.startsWith("Ident", Qt::CaseInsensitive)) return StateIdent; + if (modeString.startsWith("Standby", Qt::CaseInsensitive) || modeString.startsWith("Stdby", Qt::CaseInsensitive)) return StateStandby; + if (modeString.startsWith("Mode C", Qt::CaseInsensitive)) return ModeC; + if (modeString.startsWith("Mode S", Qt::CaseInsensitive)) return ModeS; + if (modeString.contains("Mode 1", Qt::CaseInsensitive)) return ModeMil1; + if (modeString.contains("Mode 2", Qt::CaseInsensitive)) return ModeMil2; + if (modeString.contains("Mode 3", Qt::CaseInsensitive)) return ModeMil3; + if (modeString.contains("Mode 4", Qt::CaseInsensitive)) return ModeMil4; + if (modeString.contains("Mode 5", Qt::CaseInsensitive)) return ModeMil5; + return StateStandby; } /* @@ -239,6 +168,47 @@ namespace BlackMisc qDBusRegisterMetaType(); } + /* + * Mode as readable string + */ + const QString &CTransponder::modeAsString(CTransponder::TransponderMode mode) + { + static QString m; + switch (mode) + { + case StateIdent: + m = "Ident"; + break; + case StateStandby: + m = "Standby"; + break; + case ModeC: + m = "Mode C"; + break; + case ModeS: + m = "Mode S"; + break; + case ModeMil1: + m = "Mil.Mode 1"; + break; + case ModeMil2: + m = "Mil.Mode 2"; + break; + case ModeMil3: + m = "Mil.Mode 3"; + break; + case ModeMil4: + m = "Mil.Mode 4"; + break; + case ModeMil5: + m = "Mil.Mode 5"; + break; + default: + qFatal("Illegal Transponder Mode"); + } + return m; + } + /* * Members */ diff --git a/src/blackmisc/aviotransponder.h b/src/blackmisc/aviotransponder.h index 57019ac14..fbc0062f4 100644 --- a/src/blackmisc/aviotransponder.h +++ b/src/blackmisc/aviotransponder.h @@ -45,7 +45,7 @@ namespace BlackMisc * \brief Validate values by assert and exception * \param strict * \throws std::range_error - * \remarks Cannot be virtualsince already used in constructor + * \remarks Cannot be virtual since already used in constructor * \return */ bool validate(bool strict = true) const; @@ -64,7 +64,7 @@ namespace BlackMisc public: //! \brief Default constructor - CTransponder() : CAvionicsBase("transponder"), m_transponderCode(0), m_transponderMode(ModeS) {} + CTransponder() : CAvionicsBase("transponder"), m_transponderCode(0), m_transponderMode(StateStandby) {} //! \brief Copy constructor CTransponder(const CTransponder &other) : CAvionicsBase(other.getName()), @@ -133,10 +133,16 @@ namespace BlackMisc } //! \brief Transponder mode as string - QString getModeAsString() const; + QString getModeAsString() const + { + return CTransponder::modeAsString(this->getTransponderMode()); + } //! \brief Transponder mode as string - void setModeAsString(const QString &mode); + void setModeAsString(const QString &mode) + { + this->setTransponderMode(CTransponder::modeFromString(mode)); + } //! \brief Transponder mode TransponderMode getTransponderMode() const @@ -144,6 +150,9 @@ namespace BlackMisc return this->m_transponderMode; } + //! \brief Transponder mode as string + static const QString &modeAsString(TransponderMode mode); + //! \brief Transponder code qint32 getTransponderCode() const { @@ -166,6 +175,9 @@ namespace BlackMisc //! \brief Set transponder code void setTransponderCode(const QString &transponderCode); + //! \brief Mode from string + static TransponderMode modeFromString(const QString &modeString); + //! \brief Set transponder mode void setTransponderMode(TransponderMode mode) {