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)
{