From 5dbf4468f2fa0b36fa575354f87a8ea870177161 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Sun, 30 Sep 2018 22:28:37 +0200 Subject: [PATCH] COM frequency rounding + testcase --- src/blackmisc/aviation/comsystem.cpp | 14 ++++++------ .../aviation/testaviation/testaviation.cpp | 22 +++++++++++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/blackmisc/aviation/comsystem.cpp b/src/blackmisc/aviation/comsystem.cpp index f6c17eb72..9622b35b1 100644 --- a/src/blackmisc/aviation/comsystem.cpp +++ b/src/blackmisc/aviation/comsystem.cpp @@ -125,14 +125,14 @@ namespace BlackMisc { if (frequency.isNull()) { return; } const double channelSpacingKHz = CComSystem::channelSpacingToFrequencyKHz(channelSpacing); - const double f = frequency.valueRounded(CFrequencyUnit::kHz(), 0); - const quint32 d = static_cast(f / channelSpacingKHz); + const double fKHz = frequency.valueRounded(CFrequencyUnit::kHz(), 0); + const int dDown = static_cast(fKHz / channelSpacingKHz); + const double fDownKHz = dDown * channelSpacingKHz; + const double fUpKHz = (dDown + 1) * channelSpacingKHz; + const bool down = qAbs(fKHz - fDownKHz) < qAbs(fUpKHz - fKHz); // which is the closest value + const double fMHz(CMathUtils::round((down ? fDownKHz : fUpKHz) / 1000.0, 3)); frequency.switchUnit(CFrequencyUnit::MHz()); - const double f0 = frequency.valueRounded(CFrequencyUnit::MHz(), 3); - const double f1 = CMathUtils::round(d * (channelSpacingKHz / 1000.0), 3); - const double f2 = CMathUtils::round((d + 1) * (channelSpacingKHz / 1000.0), 3); - const bool down = qAbs(f1 - f0) < qAbs(f2 - f0); // which is the closest value - frequency.setCurrentUnitValue(down ? f1 : f2); + frequency.setCurrentUnitValue(fMHz); } bool CComSystem::isWithinChannelSpacing(const CFrequency &setFrequency, const CFrequency &compareFrequency, CComSystem::ChannelSpacing channelSpacing) diff --git a/tests/blackmisc/aviation/testaviation/testaviation.cpp b/tests/blackmisc/aviation/testaviation/testaviation.cpp index 9bebe8a67..42f4aa6c7 100644 --- a/tests/blackmisc/aviation/testaviation/testaviation.cpp +++ b/tests/blackmisc/aviation/testaviation/testaviation.cpp @@ -59,6 +59,9 @@ namespace BlackMiscTest //! COM and NAV units void comAndNav(); + //! COM frequency rounding + void comFrequencyRounding(); + //! Transponder void transponder(); @@ -108,6 +111,25 @@ namespace BlackMiscTest QVERIFY2(!CNavSystem::isValidCivilNavigationFrequency(CFrequency(200.0, CFrequencyUnit::MHz())), "Expect invalid nav frequency"); } + void CTestAviation::comFrequencyRounding() + { + const CFrequency f1 = CFrequency(122.8, CFrequencyUnit::MHz()); + const CFrequency f2 = CFrequency(122.795, CFrequencyUnit::MHz()); + const CFrequency f3 = CFrequency(122.805, CFrequencyUnit::MHz()); + + QVERIFY2(f1 == f1, "Ups, how can this fail"); + QVERIFY2(f1 != f2, "Ups, how can this fail"); + QVERIFY2(f1 != f3, "Ups, how can this fail"); + + CFrequency up(f2); + CComSystem::roundToChannelSpacing(up, CComSystem::ChannelSpacing25KHz); + QVERIFY2(up == f1, "Expect rounding up"); + + CFrequency down(f3); + CComSystem::roundToChannelSpacing(down, CComSystem::ChannelSpacing25KHz); + QVERIFY2(down == f1, "Expect rounding up"); + } + void CTestAviation::transponder() { CTransponder t1 = CTransponder::getStandardTransponder(7000, CTransponder::StateStandby);