swift
aircraftvelocity.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2021 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QStringBuilder>
7 
8 #include "misc/verify.h"
9 
10 using namespace swift::misc::physical_quantities;
11 
12 SWIFT_DEFINE_VALUEOBJECT_MIXINS(swift::misc::aviation, CAircraftVelocity)
13 
14 namespace swift::misc::aviation
15 {
16  const CSpeedUnit CAircraftVelocity::c_xyzSpeedUnit = CSpeedUnit::m_s();
17  const CLengthUnit CAircraftVelocity::c_xyzLengthUnit = CLengthUnit::m();
18  const CAngleUnit CAircraftVelocity::c_pbhAngleUnit = CAngleUnit::rad();
19  const CTimeUnit CAircraftVelocity::c_timeUnit = CTimeUnit::s();
20 
21  CAircraftVelocity::CAircraftVelocity() = default;
22 
23  CAircraftVelocity::CAircraftVelocity(double x, double y, double z, CSpeedUnit xyzUnit, double pitch, double roll,
24  double heading, CAngleUnit pbhAngleUnit, CTimeUnit pbhTimeUnit)
25  {
26  setLinearVelocity(x, y, z, xyzUnit);
27  setAngularVelocity(pitch, roll, heading, pbhAngleUnit, pbhTimeUnit);
28  }
29 
30  void CAircraftVelocity::setLinearVelocity(double x, double y, double z, CSpeedUnit xyzUnit)
31  {
32  m_x = c_xyzSpeedUnit.convertFrom(x, xyzUnit);
33  m_y = c_xyzSpeedUnit.convertFrom(y, xyzUnit);
34  m_z = c_xyzSpeedUnit.convertFrom(z, xyzUnit);
35  }
36 
37  void CAircraftVelocity::setAngularVelocity(double pitch, double roll, double heading, CAngleUnit pbhAngleUnit,
38  CTimeUnit pbhTimeUnit)
39  {
40  m_pitch = pbhTimeUnit.convertFrom(c_pbhAngleUnit.convertFrom(pitch, pbhAngleUnit), c_timeUnit);
41  m_roll = pbhTimeUnit.convertFrom(c_pbhAngleUnit.convertFrom(roll, pbhAngleUnit), c_timeUnit);
42  m_heading = pbhTimeUnit.convertFrom(c_pbhAngleUnit.convertFrom(heading, pbhAngleUnit), c_timeUnit);
43  }
44 
45  double CAircraftVelocity::getVelocityX(CSpeedUnit unit) const { return unit.convertFrom(m_x, c_xyzSpeedUnit); }
46 
47  double CAircraftVelocity::getVelocityY(CSpeedUnit unit) const { return unit.convertFrom(m_y, c_xyzSpeedUnit); }
48 
49  double CAircraftVelocity::getVelocityZ(CSpeedUnit unit) const { return unit.convertFrom(m_z, c_xyzSpeedUnit); }
50 
51  double CAircraftVelocity::getPitchVelocity(CAngleUnit angleUnit, CTimeUnit timeUnit) const
52  {
53  return c_timeUnit.convertFrom(angleUnit.convertFrom(m_pitch, c_pbhAngleUnit), timeUnit);
54  }
55 
56  double CAircraftVelocity::getRollVelocity(CAngleUnit angleUnit, CTimeUnit timeUnit) const
57  {
58  return c_timeUnit.convertFrom(angleUnit.convertFrom(m_roll, c_pbhAngleUnit), timeUnit);
59  }
60 
61  double CAircraftVelocity::getHeadingVelocity(CAngleUnit angleUnit, CTimeUnit timeUnit) const
62  {
63  return c_timeUnit.convertFrom(angleUnit.convertFrom(m_heading, c_pbhAngleUnit), timeUnit);
64  }
65 
66  QString CAircraftVelocity::convertToQString(bool i18n) const
67  {
68  return u"Velocity: " % QStringLiteral("%1 %2 %3 ").arg(m_x).arg(m_y).arg(m_z) %
69  c_xyzSpeedUnit.convertToQString(i18n) % u" | Rotation: " %
70  QStringLiteral("%1 %2 %3 ").arg(m_pitch).arg(m_roll).arg(m_heading) %
71  c_pbhAngleUnit.convertToQString(i18n) % u"/" % c_timeUnit.convertToQString(i18n);
72  }
73 
74  QVariant CAircraftVelocity::propertyByIndex(CPropertyIndexRef index) const
75  {
76  SWIFT_VERIFY(index.isMyself());
77  return QVariant::fromValue(*this);
78  }
79 
80  void CAircraftVelocity::setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
81  {
82  SWIFT_VERIFY(index.isMyself());
83  *this = variant.value<CAircraftVelocity>();
84  }
85 
86  int CAircraftVelocity::comparePropertyByIndex(CPropertyIndexRef index, const CAircraftVelocity &compareValue) const
87  {
88  SWIFT_VERIFY(index.isMyself());
89  return compare(*this, compareValue);
90  }
91 } // namespace swift::misc::aviation
Non-owning reference to a CPropertyIndex with a subset of its features.
bool isMyself() const
Myself index, used with nesting.
Velocity and angular velocity for 6DOF bodies.
Specialized class for angles (degrees, radian).
Definition: units.h:233
static CAngleUnit rad()
Radians.
Definition: units.h:270
Specialized class for distance units (meter, foot, nautical miles).
Definition: units.h:95
static CLengthUnit m()
Meter m.
Definition: units.h:142
double convertFrom(double value, const CMeasurementUnit &unit) const
Convert from other unit to this unit.
Specialized class for speed units (m/s, ft/s, NM/h).
Definition: units.h:778
static CSpeedUnit m_s()
Meter/second m/s.
Definition: units.h:824
Specialized class for time units (ms, hour, min).
Definition: units.h:909
static CTimeUnit s()
Second s.
Definition: units.h:954
#define SWIFT_DEFINE_VALUEOBJECT_MIXINS(Namespace, Class)
Explicit template definition of mixins for a CValueObject subclass.
Definition: valueobject.h:67
#define SWIFT_VERIFY(COND)
A weaker kind of assert.
Definition: verify.h:29