6#include <QDBusMetaType>
13using namespace swift::misc::physical_quantities;
14using namespace swift::misc::math;
16namespace swift::misc::aviation
21 qDBusRegisterMetaType<ChannelSpacing>();
22 qDBusRegisterMetaType<ComUnit>();
81 standbyFrequency.
isNull() ? activeFrequency : standbyFrequency };
95 standbyFrequency.
isNull() ? activeFrequency : standbyFrequency };
100 if (f.
isNull())
return false;
104 return fr >= 118000 && fr <= 136990;
109 if (f.
isNull())
return false;
111 return fr >= 220000 && fr <= 399950;
125 const int lastDigits =
static_cast<int>(fKHz) % 100;
126 return fKHz % 5 == 0 && lastDigits != 20 && lastDigits != 45 && lastDigits != 70 && lastDigits != 95;
133 const int diff =
static_cast<int>(fKHz) % 5;
134 int lower = fKHz - diff;
141 int upper = fKHz + (5 - diff);
148 const int lowerDiff = abs(fKHz - lower);
149 const int upperDiff = abs(fKHz - upper);
151 fKHz = lowerDiff < upperDiff ? lower : upper;
152 fKHz = std::clamp(fKHz, 118000, 136990);
163 const double channelSpacingKHz = CComSystem::channelSpacingToFrequencyKHz(channelSpacing);
174 const int dDown =
static_cast<int>(fKHz / channelSpacingKHz);
175 const double fDownKHz = dDown * channelSpacingKHz;
176 const double fUpKHz = (dDown + 1) * channelSpacingKHz;
177 const bool down = qAbs(fKHz - fDownKHz) < qAbs(fUpKHz - fKHz);
202 using namespace swift::misc::physical_quantities::Literals;
211 if (freq_end == 20 || freq_end == 70)
218 CFrequency normalized_freq1 = normalize(freq1);
219 CFrequency normalized_freq2 = normalize(freq2);
221 if (normalized_freq1 == normalized_freq2)
240 const double f = input.toDouble();
269 double CComSystem::channelSpacingToFrequencyKHz(ChannelSpacing channelSpacing)
271 switch (channelSpacing)
276 default: qFatal(
"Wrong channel spacing");
return 0.0;
static CFrequencyUnit MHz()
Megahertz.
static CFrequencyUnit kHz()
Kilohertz.
static bool isValid8_33kHzChannel(int fKHz)
Is passed frequency in kHz a valid 8.33 channel. This does not check if the frequency is within the c...
static void roundToChannelSpacing(physical_quantities::CFrequency &frequency, ChannelSpacing channelSpacing)
Round to channel spacing, set MHz as unit.
static CComSystem getCom1System(double activeFrequencyMHz, double standbyFrequencyMHz=-1)
COM1 unit.
void setFrequencyActiveMHz(double frequencyMHz)
Set active frequency.
static bool isWithin25kHzChannel(const physical_quantities::CFrequency &freq)
Is frequency within 25 kHz frequency spacing.
void setActiveUnicom()
Set UNICOM frequency as active.
static bool isSameFrequency(const physical_quantities::CFrequency &freq1, const physical_quantities::CFrequency &freq2)
Compare frequencies under consideration that on VATSIM frequencies .x20/.x25 and ....
void setFrequencyStandby(const physical_quantities::CFrequency &frequency)
Set active frequency.
void setFrequencyStandbyMHz(double frequencyMHz)
Set standby frequency.
static physical_quantities::CFrequency parseComFrequency(const QString &input, physical_quantities::CPqString::SeparatorMode sep)
Parses almost any shitty string to a valid COM frequency.
static bool isValidComFrequency(const physical_quantities::CFrequency &f)
Valid COM frequency (either civil or military).
bool isActiveFrequencySameFrequency(const physical_quantities::CFrequency &comFrequency) const
Is active frequency the same frequency.
static bool isExclusiveWithin8_33kHzChannel(const physical_quantities::CFrequency &freq)
Is frequency a "new" 8.33 kHz frequency and not within 25 kHz spacing E.g. returns false for 122....
ChannelSpacing
Channel spacing frequency.
@ ChannelSpacing25KHz
25kHz
@ ChannelSpacing50KHz
50kHz
@ ChannelSpacing8_33KHz
8.33kHz
CComSystem()=default
Default constructor.
static int round8_33kHzChannel(int fKHz)
Round passed frequency in kHz to 8.33 frequency spacing.
void setFrequencyActive(const physical_quantities::CFrequency &frequency)
Set active frequency.
static CComSystem getCom2System(double activeFrequencyMHz, double standbyFrequencyMHz=-1)
COM2 unit.
static bool isValidMilitaryFrequency(const physical_quantities::CFrequency &f)
Valid military aviation frequency?
static void registerMetadata()
Register metadata.
static bool isValidCivilAviationFrequency(const physical_quantities::CFrequency &f)
Valid civil aviation frequency?
swift::misc::physical_quantities::CFrequency getFrequencyStandby() const
static const QString & NameCom1()
COM1.
void setFrequencyStandby(const swift::misc::physical_quantities::CFrequency &frequency)
Set standby frequency.
swift::misc::physical_quantities::CFrequency getFrequencyActive() const
void toggleActiveStandby()
void setFrequencyActive(const swift::misc::physical_quantities::CFrequency &frequency)
Set active frequency.
static const QString & NameCom2()
COM2.
static double round(double value, int digits)
Utility round method.
static CFrequencyUnit MHz()
Megahertz.
static CFrequencyUnit kHz()
Kilohertz.
static const CFrequency & FrequencyUnicom()
Unicom frequency.
void parseFromString(const QString &value)
Parse value from string.
int valueInteger(MU unit) const
As integer value.
PQ & switchUnit(const MU &newUnit)
Change unit, and convert value to maintain the same quantity.
bool isNull() const
Is quantity null?
double value(MU unit) const
Value in given unit.
void setCurrentUnitValue(double value)
Set value in current unit.
static const CFrequency & null()
double valueRounded(MU unit, int digits=-1) const
Rounded value in given unit.
SeparatorMode
Number separators / group separators.
static double parseNumber(const QString &number, bool &success, SeparatorMode mode=SeparatorBestGuess)
Locale aware parsing.
T::const_iterator end(const LockFreeReader< T > &reader)
Non-member begin() and end() for so LockFree containers can be used in ranged for loops.
bool isDigitsOnlyString(const QString &testString)
String with digits only.