swift
pbhsform.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2019 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "pbhsform.h"
5 
6 #include <QDoubleValidator>
7 
8 #include "ui_pbhsform.h"
9 
10 #include "misc/stringutils.h"
11 
12 using namespace swift::misc;
13 using namespace swift::misc::aviation;
14 using namespace swift::misc::physical_quantities;
15 
16 namespace swift::gui::editors
17 {
18  CPbhsForm::CPbhsForm(QWidget *parent) : CForm(parent), ui(new Ui::CPbhsForm)
19  {
20  ui->setupUi(this);
21 
22  ui->le_Bank->setValidator(new QDoubleValidator(-180.0 + CAngleUnit::deg().getEpsilon(), 180.0, 3, ui->le_Bank));
23  ui->le_Pitch->setValidator(
24  new QDoubleValidator(-180.0 + CAngleUnit::deg().getEpsilon(), 180.0, 3, ui->le_Pitch));
25 
26  connect(ui->hs_Bank, &QSlider::valueChanged, this, &CPbhsForm::bankSliderChanged);
27  connect(ui->hs_Pitch, &QSlider::valueChanged, this, &CPbhsForm::pitchSliderChanged);
28  connect(ui->hs_Heading, &QSlider::valueChanged, this, &CPbhsForm::headingSliderChanged);
29  connect(ui->le_Bank, &QLineEdit::editingFinished, this, &CPbhsForm::bankEntered);
30  connect(ui->le_Pitch, &QLineEdit::editingFinished, this, &CPbhsForm::pitchEntered);
31  connect(ui->le_Heading, &QLineEdit::editingFinished, this, &CPbhsForm::headingEntered);
32  connect(ui->tb_ResetBank, &QToolButton::clicked, this, &CPbhsForm::resetBank);
33  connect(ui->tb_ResetPitch, &QToolButton::clicked, this, &CPbhsForm::resetPitch);
34  connect(ui->tb_ResetHeading, &QToolButton::clicked, this, &CPbhsForm::resetHeading);
35  connect(ui->pb_SetOwnAircraft, &QPushButton::released, this, &CPbhsForm::changeValues);
36  }
37 
39 
40  CAngle CPbhsForm::getBankAngle() const { return CAngle(getBankAngleDegrees(), CAngleUnit::deg()); }
41 
42  void CPbhsForm::setBankAngle(const CAngle &angle)
43  {
44  const int value = angle.valueInteger(CAngleUnit::deg());
45  ui->le_Bank->setText(QString::number(value));
46  ui->hs_Bank->setValue(value);
47  }
48 
49  double CPbhsForm::getBankAngleDegrees() const
50  {
51  const QString v(ui->le_Bank->text().replace(',', '.'));
52  bool ok;
53  double vd = v.toDouble(&ok);
54  if (!ok) { vd = 0.0; }
55  return CAngle::normalizeDegrees180(vd, RoundDigits);
56  }
57 
58  CAngle CPbhsForm::getPitchAngle() const { return CAngle(getPitchAngleDegrees(), CAngleUnit::deg()); }
59 
60  void CPbhsForm::setPitchAngle(const CAngle &angle)
61  {
62  const int value = angle.valueInteger(CAngleUnit::deg());
63  ui->le_Pitch->setText(QString::number(value));
64  ui->hs_Pitch->setValue(value);
65  }
66 
67  double CPbhsForm::getPitchAngleDegrees() const
68  {
69  const QString v(ui->le_Pitch->text().replace(',', '.'));
70  bool ok;
71  double vd = v.toDouble(&ok);
72  if (!ok) { vd = 0.0; }
73  return CAngle::normalizeDegrees180(vd, RoundDigits);
74  }
75 
76  CAngle CPbhsForm::getHeadingAngle() const { return CAngle(getHeadingAngleDegrees(), CAngleUnit::deg()); }
77 
78  CHeading CPbhsForm::getHeading() const { return CHeading(this->getHeadingAngle(), CHeading::True); }
79 
81  {
82  const int value = angle.valueInteger(CAngleUnit::deg());
83  ui->le_Heading->setText(QString::number(value));
84  ui->hs_Heading->setValue(value);
85  }
86 
87  double CPbhsForm::getHeadingAngleDegrees() const
88  {
89  const QString v(ui->le_Heading->text().replace(',', '.'));
90  bool ok;
91  double vd = v.toDouble(&ok);
92  if (!ok) { vd = 0.0; }
93  return CAngle::normalizeDegrees180(vd, RoundDigits);
94  }
95 
97  {
98  const int gsKts = ui->sb_GsKts->value();
99  return CSpeed(gsKts, CSpeedUnit::kts());
100  }
101 
103  {
104  this->setBankAngle(situation.getBank());
105  this->setPitchAngle(situation.getPitch());
106  this->setHeadingAngle(situation.getHeading());
107  }
108 
110  {
111  situation.setPitch(this->getPitchAngle());
112  situation.setBank(this->getBankAngle());
113  situation.setHeading(this->getHeading());
114  situation.setGroundSpeed(this->getGroundSpeed());
115  }
116 
117  void CPbhsForm::setReadOnly(bool readOnly)
118  {
119  ui->le_Bank->setReadOnly(readOnly);
120  ui->le_Heading->setReadOnly(readOnly);
121  ui->le_Pitch->setReadOnly(readOnly);
122 
123  ui->hs_Bank->setEnabled(!readOnly);
124  ui->hs_Heading->setEnabled(!readOnly);
125  ui->hs_Pitch->setEnabled(!readOnly);
126  }
127 
128  void CPbhsForm::showSetButton(bool visible) { ui->pb_SetOwnAircraft->setVisible(visible); }
129 
130  void CPbhsForm::bankSliderChanged(int value)
131  {
132  const int angle = clampAngle(qRound(this->getBankAngleDegrees()));
133  if (value == angle) { return; } // avoid roundtrips
134  ui->le_Bank->setText(QString::number(value));
135  }
136 
137  void CPbhsForm::pitchSliderChanged(int value)
138  {
139  const int angle = clampAngle(qRound(this->getPitchAngleDegrees()));
140  if (value == angle) { return; } // avoid roundtrips
141  ui->le_Pitch->setText(QString::number(value));
142  }
143 
144  void CPbhsForm::headingSliderChanged(int value)
145  {
146  const int angle = clampAngle(qRound(this->getHeadingAngleDegrees()));
147  if (value == angle) { return; } // avoid roundtrips
148  ui->le_Heading->setText(QString::number(value));
149  }
150 
151  void CPbhsForm::bankEntered()
152  {
153  const double ad = this->getBankAngleDegrees();
154  QString n = QString::number(ad, 'g', 3 + RoundDigits);
155  if (ui->le_Pitch->validator()) { dotToLocaleDecimalPoint(n); }
156  ui->le_Bank->setText(n);
157  const int angle = clampAngle(qRound(ad));
158  if (angle == ui->hs_Bank->value()) { return; } // avoid roundtrips
159  ui->hs_Bank->setValue(angle);
160  }
161 
162  void CPbhsForm::resetBank()
163  {
164  ui->le_Bank->setText("0");
165  ui->hs_Bank->setValue(0);
166  }
167 
168  void CPbhsForm::pitchEntered()
169  {
170  const double ad = this->getPitchAngleDegrees();
171  QString n = QString::number(ad, 'g', 3 + RoundDigits);
172  if (ui->le_Pitch->validator()) { dotToLocaleDecimalPoint(n); }
173  ui->le_Pitch->setText(n);
174  const int angle = clampAngle(qRound(ad));
175  if (angle == ui->hs_Pitch->value()) { return; } // avoid roundtrips
176  ui->hs_Pitch->setValue(angle);
177  }
178 
179  void CPbhsForm::resetPitch()
180  {
181  ui->le_Pitch->setText("0");
182  ui->hs_Pitch->setValue(0);
183  }
184 
185  void CPbhsForm::headingEntered()
186  {
187  const double ad = this->getHeadingAngleDegrees();
188  QString n = QString::number(ad, 'g', 3 + RoundDigits);
189  if (ui->le_Heading->validator()) { dotToLocaleDecimalPoint(n); }
190  ui->le_Heading->setText(n);
191  const int angle = clampAngle(qRound(ad));
192  if (angle == ui->hs_Heading->value()) { return; } // avoid roundtrips
193  ui->hs_Heading->setValue(angle);
194  }
195 
196  void CPbhsForm::resetHeading()
197  {
198  ui->le_Heading->setText("0");
199  ui->hs_Heading->setValue(0);
200  }
201 
202 } // namespace swift::gui::editors
Form base class.
Definition: form.h:27
Pitch, bank, heading and speed form.
Definition: pbhsform.h:26
virtual void setReadOnly(bool readOnly)
Set editable.
Definition: pbhsform.cpp:117
void setBankAngle(const swift::misc::physical_quantities::CAngle &angle)
Set bank angle.
Definition: pbhsform.cpp:42
swift::misc::physical_quantities::CSpeed getGroundSpeed() const
Get ground speed.
Definition: pbhsform.cpp:96
void setHeadingAngle(const swift::misc::physical_quantities::CAngle &angle)
Set heading angle.
Definition: pbhsform.cpp:80
swift::misc::physical_quantities::CAngle getBankAngle() const
Get bank angle.
Definition: pbhsform.cpp:40
void updateSituation(swift::misc::aviation::CAircraftSituation &situation)
Update PBHs in situation.
Definition: pbhsform.cpp:109
swift::misc::aviation::CHeading getHeading() const
Get heading.
Definition: pbhsform.cpp:78
swift::misc::physical_quantities::CAngle getHeadingAngle() const
Get heading angle.
Definition: pbhsform.cpp:76
void changeValues()
Changed values.
void setPitchAngle(const swift::misc::physical_quantities::CAngle &angle)
Set pitch angle.
Definition: pbhsform.cpp:60
swift::misc::physical_quantities::CAngle getPitchAngle() const
Get pitch angle.
Definition: pbhsform.cpp:58
void showSetButton(bool visible)
Show the "SET" button.
Definition: pbhsform.cpp:128
void setSituation(const swift::misc::aviation::CAircraftSituation &situation)
Set situation.
Definition: pbhsform.cpp:102
Value object encapsulating information of an aircraft's situation.
void setGroundSpeed(const physical_quantities::CSpeed &groundspeed)
Set ground speed.
const CHeading & getHeading() const
Get heading.
void setBank(const physical_quantities::CAngle &bank)
Set bank (angle)
void setHeading(const CHeading &heading)
Set heading.
void setPitch(const physical_quantities::CAngle &pitch)
Set pitch.
const physical_quantities::CAngle & getBank() const
Get bank (angle)
const physical_quantities::CAngle & getPitch() const
Get pitch.
Heading as used in aviation, can be true or magnetic heading.
Definition: heading.h:41
Physical unit angle (radians, degrees)
Definition: angle.h:23
int valueInteger(MU unit) const
As integer value.
Free functions in swift::misc.
SWIFT_MISC_EXPORT QString dotToLocaleDecimalPoint(QString &input)
Replace dot '.' by locale decimal point.