swift
modulator.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <type_traits>
7 
8 #include <QtGlobal>
9 
12 #include "misc/comparefunctions.h"
13 #include "misc/pq/units.h"
14 #include "misc/propertyindexref.h"
15 
18 
19 namespace swift::misc::aviation
20 {
21  template <class AVIO>
23  {
24  const CFrequency a = m_frequencyActive;
25  m_frequencyActive = m_frequencyStandby;
26  m_frequencyStandby = a;
27  }
28 
29  template <class AVIO>
31  {
32  return m_frequencyActive;
33  }
34 
35  template <class AVIO>
37  {
38  return m_frequencyStandby;
39  }
40 
41  template <class AVIO>
43  {
44  m_frequencyActive = frequency;
45  }
46 
47  template <class AVIO>
49  {
50  m_frequencyStandby = frequency;
51  }
52 
53  template <class AVIO>
55  {
56  return m_volumeReceive;
57  }
58 
59  template <class AVIO>
61  {
62  return m_volumeTransmit;
63  }
64 
65  template <class AVIO>
67  {
68  if (volume >= 100) { m_volumeReceive = 100; }
69  else if (volume <= 0) { m_volumeReceive = 0; }
70  else { m_volumeReceive = volume; }
71  }
72 
73  template <class AVIO>
75  {
76  if (volume >= 100) { m_volumeTransmit = 100; }
77  else if (volume <= 0) { m_volumeTransmit = 0; }
78  else { m_volumeTransmit = volume; }
79  }
80 
81  template <class AVIO>
83  {
84  return m_transmitEnabled;
85  }
86 
87  template <class AVIO>
89  {
90  return m_receiveEnabled;
91  }
92 
93  template <class AVIO>
95  {
96  m_transmitEnabled = enable;
97  }
98 
99  template <class AVIO>
101  {
102  m_receiveEnabled = enable;
103  }
104 
105  template <class AVIO>
107  {
108  return m_name;
109  }
110 
111  template <class AVIO>
113  {
114  if (index.isMyself()) { return QVariant::fromValue(*derived()); }
115  const ColumnIndex i = index.frontCasted<ColumnIndex>();
116  switch (i)
117  {
118  case IndexActiveFrequency: return this->getFrequencyActive().propertyByIndex(index.copyFrontRemoved());
119  case IndexStandbyFrequency: return this->getFrequencyStandby().propertyByIndex(index.copyFrontRemoved());
120  case IndexEnabledTransmit: return QVariant::fromValue(this->isTransmitEnabled());
121  case IndexEnabledReceive: return QVariant::fromValue(this->isReceiveEnabled());
122  case IndexTransmitVolume: return QVariant::fromValue(this->getVolumeTransmit());
123  case IndexReceiveVolume: return QVariant::fromValue(this->getVolumeReceive());
124  default: return CValueObject<CModulator<AVIO>>::propertyByIndex(index);
125  }
126  }
127 
128  template <class AVIO>
129  void CModulator<AVIO>::setPropertyByIndex(CPropertyIndexRef index, const QVariant &variant)
130  {
131  if (index.isMyself())
132  {
133  Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong index to base template");
134  return;
135  }
136  const ColumnIndex i = index.frontCasted<ColumnIndex>();
137  switch (i)
138  {
139  case IndexActiveFrequency: m_frequencyActive.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
140  case IndexStandbyFrequency: m_frequencyStandby.setPropertyByIndex(index.copyFrontRemoved(), variant); break;
141  case IndexEnabledTransmit: this->setTransmitEnabled(variant.toBool()); break;
142  case IndexEnabledReceive: this->setReceiveEnabled(variant.toBool()); break;
143  case IndexTransmitVolume: this->setVolumeTransmit(variant.toInt()); break;
144  case IndexReceiveVolume: this->setVolumeReceive(variant.toInt()); break;
145  default: CValueObject<CModulator<AVIO>>::setPropertyByIndex(index, variant); break;
146  }
147  }
148 
149  template <class AVIO>
150  int CModulator<AVIO>::comparePropertyByIndex(CPropertyIndexRef index, const AVIO &compareValue) const
151  {
152  if (index.isMyself())
153  {
154  return m_frequencyActive.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.m_frequencyActive);
155  }
156  const ColumnIndex i = index.frontCasted<ColumnIndex>();
157  switch (i)
158  {
159  case IndexActiveFrequency:
160  return m_frequencyActive.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.m_frequencyActive);
161  case IndexStandbyFrequency:
162  return m_frequencyStandby.comparePropertyByIndex(index.copyFrontRemoved(), compareValue.m_frequencyStandby);
163  case IndexEnabledTransmit: return Compare::compare(this->isTransmitEnabled(), compareValue.isTransmitEnabled());
164  case IndexEnabledReceive: return Compare::compare(this->isReceiveEnabled(), compareValue.isReceiveEnabled());
165  case IndexTransmitVolume: return Compare::compare(this->getVolumeTransmit(), compareValue.getVolumeTransmit());
166  case IndexReceiveVolume: return Compare::compare(this->getVolumeReceive(), compareValue.getVolumeReceive());
167  default: break;
168  }
169  Q_ASSERT_X(false, Q_FUNC_INFO, "Compare failed");
170  return 0;
171  }
172 
173  template <class AVIO>
174  CModulator<AVIO>::CModulator() : m_name("default")
175  {
176  static_assert(!std::is_polymorphic_v<AVIO>, "Must not use virtual functions for value classes");
177  }
178 
179  template <class AVIO>
180  CModulator<AVIO>::CModulator(const QString &name,
181  const swift::misc::physical_quantities::CFrequency &activeFrequency,
182  const swift::misc::physical_quantities::CFrequency &standbyFrequency)
183  : m_name(name), m_frequencyActive(activeFrequency), m_frequencyStandby(standbyFrequency)
184  {
185  static_assert(!std::is_polymorphic_v<AVIO>, "Must not use virtual functions for value classes");
186  }
187 
188  template <class AVIO>
189  QString CModulator<AVIO>::convertToQString(bool i18n) const
190  {
191  QString s(this->getName());
192  s.append(" Active: ").append(m_frequencyActive.valueRoundedWithUnit(3, i18n));
193  s.append(" Standby: ").append(m_frequencyStandby.valueRoundedWithUnit(3, i18n));
194  return s;
195  }
196 
197  template <class AVIO>
198  void CModulator<AVIO>::setFrequencyActiveKHz(double frequencyKHz)
199  {
202  }
203 
204  template <class AVIO>
206  {
209  }
210 
211  template <class AVIO>
212  const QString &CModulator<AVIO>::NameCom1()
213  {
214  static QString n("COM1");
215  return n;
216  }
217 
218  template <class AVIO>
219  const QString &CModulator<AVIO>::NameCom2()
220  {
221  static QString n("COM2");
222  return n;
223  }
224 
225  template <class AVIO>
226  const QString &CModulator<AVIO>::NameCom3()
227  {
228  static QString n("COM3");
229  return n;
230  }
231 
232  template <class AVIO>
233  const QString &CModulator<AVIO>::NameNav1()
234  {
235  static QString n("NAV1");
236  return n;
237  }
238 
239  template <class AVIO>
240  const QString &CModulator<AVIO>::NameNav2()
241  {
242  static QString n("NAV2");
243  return n;
244  }
245 
246  template <class AVIO>
247  const QString &CModulator<AVIO>::NameNav3()
248  {
249  static QString n("NAV3");
250  return n;
251  }
252 
253  // see here for the reason of the forward instantiations
254  // https://isocpp.org/wiki/faq/templates#separate-template-fn-defn-from-decl
256  template class CModulator<CComSystem>;
257  template class CModulator<CNavSystem>;
259 
260 } // namespace swift::misc::aviation
Non-owning reference to a CPropertyIndex with a subset of its features.
Q_REQUIRED_RESULT CPropertyIndexRef copyFrontRemoved() const
Copy with first element removed.
CastType frontCasted() const
First element casted to given type, usually the PropertIndex enum.
bool isMyself() const
Myself index, used with nesting.
Mix of the most commonly used mixin classes.
Definition: valueobject.h:114
bool isTransmitEnabled() const
Enabled?
Definition: modulator.cpp:82
static const QString & NameNav2()
NAV2.
Definition: modulator.cpp:240
QVariant propertyByIndex(swift::misc::CPropertyIndexRef index) const
Property by index.
Definition: modulator.cpp:112
void setVolumeReceive(int volume)
Output volume 0.100.
Definition: modulator.cpp:66
void setFrequencyStandbyKHz(double frequencyKHz)
Set standby frequency.
Definition: modulator.cpp:205
static const QString & NameCom3()
COM3.
Definition: modulator.cpp:226
void setPropertyByIndex(swift::misc::CPropertyIndexRef index, const QVariant &variant)
Set property by index.
Definition: modulator.cpp:129
QString getName() const
Name.
Definition: modulator.cpp:106
int getVolumeTransmit() const
Input volume 0..100.
Definition: modulator.cpp:60
void setTransmitEnabled(bool enable)
Enabled?
Definition: modulator.cpp:94
swift::misc::physical_quantities::CFrequency getFrequencyStandby() const
Standby frequency.
Definition: modulator.cpp:36
int getVolumeReceive() const
Output volume 0..100.
Definition: modulator.cpp:54
static const QString & NameNav3()
NAV3.
Definition: modulator.cpp:247
static const QString & NameCom1()
COM1.
Definition: modulator.cpp:212
void setVolumeTransmit(int volume)
Input volume 0..100.
Definition: modulator.cpp:74
static const QString & NameNav1()
NAV1.
Definition: modulator.cpp:233
bool isReceiveEnabled() const
Enabled?
Definition: modulator.cpp:88
void setFrequencyStandby(const swift::misc::physical_quantities::CFrequency &frequency)
Set standby frequency.
Definition: modulator.cpp:48
QString convertToQString(bool i18n=false) const
Cast as QString.
Definition: modulator.cpp:189
swift::misc::physical_quantities::CFrequency getFrequencyActive() const
Active frequency.
Definition: modulator.cpp:30
int comparePropertyByIndex(swift::misc::CPropertyIndexRef index, const AVIO &compareValue) const
Compare by property index.
Definition: modulator.cpp:150
void toggleActiveStandby()
Toggle active and standby frequencies.
Definition: modulator.cpp:22
CModulator()
Default constructor.
Definition: modulator.cpp:174
void setFrequencyActive(const swift::misc::physical_quantities::CFrequency &frequency)
Set active frequency.
Definition: modulator.cpp:42
void setReceiveEnabled(bool enable)
Enabled?
Definition: modulator.cpp:100
static const QString & NameCom2()
COM2.
Definition: modulator.cpp:219
void setFrequencyActiveKHz(double frequencyKHz)
Set active frequency.
Definition: modulator.cpp:198
Specialized class for frequency (hertz, mega hertz, kilo hertz).
Definition: units.h:340
static CFrequencyUnit kHz()
Kilohertz.
Definition: units.h:379