From c88d02ff5faf66ef53a333e4cad80f82d3f9b0cd Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 9 Nov 2018 22:45:36 +0100 Subject: [PATCH] Ref T429, allow to set heading in emulated driver so PBH can be tested --- .../components/settingsswiftplugin.ui | 69 +++-- src/blackgui/editors/coordinateform.cpp | 11 +- src/blackgui/editors/coordinateform.h | 2 +- src/blackgui/editors/situationform.cpp | 80 +++++- src/blackgui/editors/situationform.h | 17 +- src/blackgui/editors/situationform.ui | 238 ++++++++++-------- .../simulatoremulatedmonitordialog.cpp | 8 +- 7 files changed, 288 insertions(+), 137 deletions(-) diff --git a/src/blackgui/components/settingsswiftplugin.ui b/src/blackgui/components/settingsswiftplugin.ui index db2486040..33fd76a55 100644 --- a/src/blackgui/components/settingsswiftplugin.ui +++ b/src/blackgui/components/settingsswiftplugin.ui @@ -6,8 +6,8 @@ 0 0 - 215 - 168 + 272 + 162 @@ -21,27 +21,17 @@ - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - + Default model: - + - + @@ -67,30 +57,71 @@ - + function calls - + Logging: - + Own model: - + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 125 + 0 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + diff --git a/src/blackgui/editors/coordinateform.cpp b/src/blackgui/editors/coordinateform.cpp index 05535b415..07f9451c0 100644 --- a/src/blackgui/editors/coordinateform.cpp +++ b/src/blackgui/editors/coordinateform.cpp @@ -73,10 +73,12 @@ namespace BlackGui CCoordinateForm::~CCoordinateForm() { } - void CCoordinateForm::setCoordinate(const ICoordinateGeodetic &coordinate) + bool CCoordinateForm::setCoordinate(const ICoordinateGeodetic &coordinate) { + if (coordinate == m_coordinate) { return false; } m_coordinate = coordinate; + const CLatitude lat = coordinate.latitude(); const QString latWgs = lat.toWgs84(); ui->le_Latitude->setText(latWgs); @@ -117,7 +119,11 @@ namespace BlackGui ui->le_LngSec->setText(lngParts.secAsString()); ui->le_LngSecFrag->setText(lngParts.fractionalSecAsString()); - ui->le_Elevation->setText(coordinate.geodeticHeightAsString()); + const QString elvString = coordinate.geodeticHeightAsString(); + ui->le_Elevation->setText(elvString); + ui->lblp_ElvCheck->setTicked(!elvString.isEmpty()); + + return true; } void CCoordinateForm::setReadOnly(bool readonly) @@ -143,6 +149,7 @@ namespace BlackGui CStatusMessageList CCoordinateForm::validate(bool nested) const { + // not implemented Q_UNUSED(nested); CStatusMessageList ml; return ml; diff --git a/src/blackgui/editors/coordinateform.h b/src/blackgui/editors/coordinateform.h index 73f76b6ad..a99d3a0db 100644 --- a/src/blackgui/editors/coordinateform.h +++ b/src/blackgui/editors/coordinateform.h @@ -40,7 +40,7 @@ namespace BlackGui BlackMisc::Geo::CCoordinateGeodetic getCoordinate() const { return m_coordinate; } //! Set the coordinate - void setCoordinate(const BlackMisc::Geo::ICoordinateGeodetic &coordinate); + bool setCoordinate(const BlackMisc::Geo::ICoordinateGeodetic &coordinate); //! \name Form class implementations //! @{ diff --git a/src/blackgui/editors/situationform.cpp b/src/blackgui/editors/situationform.cpp index bab01c870..fcf7e1d8a 100644 --- a/src/blackgui/editors/situationform.cpp +++ b/src/blackgui/editors/situationform.cpp @@ -9,6 +9,8 @@ #include "situationform.h" #include "ui_situationform.h" +#include "blackgui/guiapplication.h" +#include "blackcore/context/contextownaircraft.h" #include "blackmisc/pq/pressure.h" #include "blackmisc/pq/angle.h" #include "blackmisc/stringutils.h" @@ -36,16 +38,21 @@ namespace BlackGui connect(ui->hs_Bank, &QSlider::valueChanged, this, &CSituationForm::bankSliderChanged); connect(ui->hs_Pitch, &QSlider::valueChanged, this, &CSituationForm::pitchSliderChanged); + connect(ui->hs_Heading, &QSlider::valueChanged, this, &CSituationForm::headingSliderChanged); connect(ui->hs_Pressure, &QSlider::valueChanged, this, &CSituationForm::pressureSliderChanged); connect(ui->le_Bank, &QLineEdit::editingFinished, this, &CSituationForm::bankEntered); connect(ui->le_Pitch, &QLineEdit::editingFinished, this, &CSituationForm::pitchEntered); connect(ui->le_Pressure, &QLineEdit::editingFinished, this, &CSituationForm::pressureEntered); + connect(ui->le_Heading, &QLineEdit::editingFinished, this, &CSituationForm::headingEntered); + connect(ui->tb_ResetBank, &QToolButton::clicked, this, &CSituationForm::resetBank); connect(ui->tb_ResetPitch, &QToolButton::clicked, this, &CSituationForm::resetPitch); + connect(ui->tb_ResetHeading, &QToolButton::clicked, this, &CSituationForm::resetHeading); connect(ui->tb_ResetPressure, &QToolButton::clicked, this, &CSituationForm::resetPressure); - connect(ui->pb_Set, &QPushButton::clicked, this, &CSituationForm::changeAircraftSituation); - connect(ui->pb_SetEnvironment, &QPushButton::clicked, this, &CSituationForm::changeAircraftSituation); - connect(ui->comp_Coordinate, &CCoordinateForm::changedCoordinate, this, &CSituationForm::changeAircraftSituation); + connect(ui->pb_SetOwnAircraft, &QPushButton::released, this, &CSituationForm::changeAircraftSituation); + connect(ui->pb_SetEnvironment, &QPushButton::released, this, &CSituationForm::changeAircraftSituation); + connect(ui->pb_PresetOwnAircraft, &QPushButton::released, this, &CSituationForm::presetOwnAircraftSituation); + connect(ui->comp_Coordinate, &CCoordinateForm::changedCoordinate, this, &CSituationForm::onCoordinateChanged); } CSituationForm::~CSituationForm() @@ -54,6 +61,9 @@ namespace BlackGui void CSituationForm::setSituation(const BlackMisc::Aviation::CAircraftSituation &situation) { ui->comp_Coordinate->setCoordinate(situation); + this->bankSliderChanged(situation.getBank().valueInteger(CAngleUnit::deg())); + this->pitchSliderChanged(situation.getPitch().valueInteger(CAngleUnit::deg())); + this->headingSliderChanged(situation.getHeading().valueInteger(CAngleUnit::deg())); } CAircraftSituation CSituationForm::getSituation() const @@ -64,6 +74,7 @@ namespace BlackGui CAircraftSituation s(position); s.setBank(this->getBankAngle()); s.setPitch(this->getPitchAngle()); + s.setHeading(CHeading(this->getHeadingAngle(), CHeading::True)); s.setGroundSpeed(this->getGroundSpeed()); if (!pressureAltitude.isNull() && pressureAltitude.getAltitudeType() == CAltitude::PressureAltitude) @@ -101,6 +112,20 @@ namespace BlackGui return CAngle::normalizeDegrees180(vd, RoundDigits); } + CAngle CSituationForm::getHeadingAngle() const + { + return CAngle(getHeadingAngleDegrees(), CAngleUnit::deg()); + } + + double CSituationForm::getHeadingAngleDegrees() const + { + const QString v(ui->le_Heading->text().replace(',', '.')); + bool ok; + double vd = v.toDouble(&ok); + if (!ok) { vd = 0.0; } + return CAngle::normalizeDegrees180(vd, RoundDigits); + } + double CSituationForm::getBarometricPressureMslMillibar() const { const QString v(ui->le_Pressure->text().replace(',', '.')); @@ -123,6 +148,17 @@ namespace BlackGui void CSituationForm::setReadOnly(bool readonly) { ui->comp_Coordinate->setReadOnly(readonly); + + ui->le_Bank->setReadOnly(readonly); + ui->le_Heading->setReadOnly(readonly); + ui->le_Pitch->setReadOnly(readonly); + ui->le_Pressure->setReadOnly(readonly); + + ui->hs_Bank->setEnabled(!readonly); + ui->hs_Heading->setEnabled(!readonly); + ui->hs_Pitch->setEnabled(!readonly); + ui->hs_Pressure->setEnabled(!readonly); + this->forceStyleSheetUpdate(); } @@ -143,7 +179,7 @@ namespace BlackGui void CSituationForm::showSetButton(bool visible) { - ui->pb_Set->setVisible(visible); + ui->pb_SetOwnAircraft->setVisible(visible); } int clampAngle(int in) @@ -165,6 +201,13 @@ namespace BlackGui ui->le_Pitch->setText(QString::number(value)); } + void CSituationForm::headingSliderChanged(int value) + { + const int angle = clampAngle(qRound(this->getHeadingAngleDegrees())); + if (value == angle) { return; } // avoid roundtrips + ui->le_Heading->setText(QString::number(value)); + } + void CSituationForm::pressureSliderChanged(int value) { const int pressure = qRound(this->getBarometricPressureMslMillibar()); @@ -206,6 +249,23 @@ namespace BlackGui ui->hs_Pitch->setValue(0); } + void CSituationForm::headingEntered() + { + const double ad = this->getHeadingAngleDegrees(); + QString n = QString::number(ad, 'g', 3 + RoundDigits); + if (ui->le_Heading->validator()) { dotToLocaleDecimalPoint(n); } + ui->le_Heading->setText(n); + const int angle = clampAngle(qRound(ad)); + if (angle == ui->hs_Heading->value()) { return; } // avoid roundtrips + ui->hs_Heading->setValue(angle); + } + + void CSituationForm::resetHeading() + { + ui->le_Heading->setText("0"); + ui->hs_Heading->setValue(0); + } + void CSituationForm::pressureEntered() { const double pd = this->getBarometricPressureMslMillibar(); @@ -224,5 +284,17 @@ namespace BlackGui ui->le_Pressure->setText(vs); ui->hs_Pressure->setValue(v); } + + void CSituationForm::presetOwnAircraftSituation() + { + if (!sGui || sGui->isShuttingDown() || !sGui->getIContextOwnAircraft()) { return; } + const CAircraftSituation s = sGui->getIContextOwnAircraft()->getOwnAircraftSituation(); + this->setSituation(s); + } + + void CSituationForm::onCoordinateChanged() + { + emit this->changeAircraftSituation(); + } } // ns } // ns diff --git a/src/blackgui/editors/situationform.h b/src/blackgui/editors/situationform.h index b499846f3..e8446df4e 100644 --- a/src/blackgui/editors/situationform.h +++ b/src/blackgui/editors/situationform.h @@ -18,8 +18,6 @@ #include "blackmisc/statusmessagelist.h" #include -class QWidget; - namespace Ui { class CSituationForm; } namespace BlackGui { @@ -74,6 +72,12 @@ namespace BlackGui //! Get pitch angle double getPitchAngleDegrees() const; + //! Get heading angle + BlackMisc::PhysicalQuantities::CAngle getHeadingAngle() const; + + //! Get heading angle + double getHeadingAngleDegrees() const; + //! Get barometric pressure at MSL (mean sea level) BlackMisc::PhysicalQuantities::CPressure getBarometricPressureMsl() const; @@ -83,15 +87,24 @@ namespace BlackGui //! Get pressure at mean sea level double getBarometricPressureMslMillibar() const; + //! Values changed from UI @{ void bankSliderChanged(int value); void pitchSliderChanged(int value); + void headingSliderChanged(int value); void pressureSliderChanged(int value); void bankEntered(); void resetBank(); void pitchEntered(); void resetPitch(); + void headingEntered(); + void resetHeading(); void pressureEntered(); void resetPressure(); + void presetOwnAircraftSituation(); + //! @} + + //! Coordinate has been changed + void onCoordinateChanged(); QScopedPointer ui; }; diff --git a/src/blackgui/editors/situationform.ui b/src/blackgui/editors/situationform.ui index 33c7835cb..ea47de0ee 100644 --- a/src/blackgui/editors/situationform.ui +++ b/src/blackgui/editors/situationform.ui @@ -6,8 +6,8 @@ 0 0 - 512 - 439 + 362 + 414 @@ -29,19 +29,102 @@ - Situation + Situation (PBH) - + - - - QFrame::Raised - - - - + + + + - Bank (-179° to 180°): + 0 + + + + + + + -179 + + + 180 + + + Qt::Horizontal + + + + + + + set + + + + + + + ... + + + + :/diagona/icons/diagona/icons/cross-white.png:/diagona/icons/diagona/icons/cross-white.png + + + + + + + Ground speed (kts): + + + + + + + kts + + + 300 + + + + + + + Heading (-179° to 180°): + + + + + + + ... + + + + :/diagona/icons/diagona/icons/cross-white.png:/diagona/icons/diagona/icons/cross-white.png + + + + + + + 0 + + + deg. + + + + + + + 0 + + + deg. @@ -64,23 +147,21 @@ - - + + - 0 - - - deg. + Bank (-179° to 180°): - - + + - 0 + ... - - deg. + + + :/diagona/icons/diagona/icons/cross-white.png:/diagona/icons/diagona/icons/cross-white.png @@ -110,65 +191,6 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - :/diagona/icons/diagona/icons/cross-white.png:/diagona/icons/diagona/icons/cross-white.png - - - - - - - ... - - - - :/diagona/icons/diagona/icons/cross-white.png:/diagona/icons/diagona/icons/cross-white.png - - - - - - - set - - - - - - - Ground speed (kts): - - - - - - - kts - - - 300 - - - @@ -180,7 +202,7 @@ Coordinate - + @@ -205,16 +227,10 @@ Environment - + - - - QFrame::NoFrame - - - QFrame::Raised - - + + @@ -287,25 +303,19 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - + + + + reset to own aircraft values + + + @@ -316,6 +326,24 @@ 1 + + le_Bank + tb_ResetBank + hs_Bank + le_Pitch + tb_ResetPitch + hs_Pitch + le_Heading + tb_ResetHeading + hs_Heading + sb_GsKts + pb_SetOwnAircraft + le_Pressure + tb_ResetPressure + hs_Pressure + pb_SetEnvironment + pb_PresetOwnAircraft + diff --git a/src/plugins/simulator/emulated/simulatoremulatedmonitordialog.cpp b/src/plugins/simulator/emulated/simulatoremulatedmonitordialog.cpp index c4bd5cab2..ecc730ed3 100644 --- a/src/plugins/simulator/emulated/simulatoremulatedmonitordialog.cpp +++ b/src/plugins/simulator/emulated/simulatoremulatedmonitordialog.cpp @@ -52,10 +52,10 @@ namespace BlackSimPlugin connect(ui->cb_Paused, &QCheckBox::released, this, &CSimulatorEmulatedMonitorDialog::onSimulatorValuesChanged); connect(ui->cb_Simulating, &QCheckBox::released, this, &CSimulatorEmulatedMonitorDialog::onSimulatorValuesChanged); - connect(ui->editor_Situation, &CSituationForm::changeAircraftSituation, this, &CSimulatorEmulatedMonitorDialog::changeSituationFromUi); - connect(ui->editor_AircraftParts, &CAircraftPartsForm::changeAircraftParts, this, &CSimulatorEmulatedMonitorDialog::changePartsFromUi); - connect(ui->editor_Com, &CCockpitComForm::changedCockpitValues, this, &CSimulatorEmulatedMonitorDialog::changeComFromUi); - connect(ui->editor_Com, &CCockpitComForm::changedSelcal, this, &CSimulatorEmulatedMonitorDialog::changeSelcalFromUi); + connect(ui->editor_Situation, &CSituationForm::changeAircraftSituation, this, &CSimulatorEmulatedMonitorDialog::changeSituationFromUi, Qt::QueuedConnection); + connect(ui->editor_AircraftParts, &CAircraftPartsForm::changeAircraftParts, this, &CSimulatorEmulatedMonitorDialog::changePartsFromUi, Qt::QueuedConnection); + connect(ui->editor_Com, &CCockpitComForm::changedCockpitValues, this, &CSimulatorEmulatedMonitorDialog::changeComFromUi, Qt::QueuedConnection); + connect(ui->editor_Com, &CCockpitComForm::changedSelcal, this, &CSimulatorEmulatedMonitorDialog::changeSelcalFromUi, Qt::QueuedConnection); connect(ui->pb_ResetStatistics, &QPushButton::clicked, this, &CSimulatorEmulatedMonitorDialog::resetStatistics); connect(ui->pb_InterpolatorStopLog, &QPushButton::clicked, this, &CSimulatorEmulatedMonitorDialog::interpolatorLogButton);