Ref T602, read conversion table (ft/m) and functions from/to ft/m

This commit is contained in:
Klaus Basan
2019-04-13 01:49:37 +02:00
parent 9be734ee73
commit aecce06b33
2 changed files with 64 additions and 0 deletions

View File

@@ -11,6 +11,9 @@
#include "blackmisc/pq/constants.h"
#include "blackmisc/pq/pqstring.h"
#include "blackmisc/math/mathutils.h"
#include "blackmisc/fileutils.h"
#include "blackmisc/directoryutils.h"
#include "blackmisc/stringutils.h"
#include "blackmisc/comparefunctions.h"
#include "blackmisc/iconlist.h"
#include "blackmisc/icons.h"
@@ -27,6 +30,28 @@ namespace BlackMisc
{
namespace Aviation
{
namespace Private
{
QVector<CAltitude::MetricTuple> initMetricValues()
{
QVector<CAltitude::MetricTuple> v;
const QString f = CFileUtils::appendFilePaths(CDirectoryUtils::shareMiscDirectory(), "Metric Altitudes.csv");
const QString ma = CFileUtils::readFileToString(f);
const QStringList values = splitLines(ma);
for (const QString &value : values)
{
const QStringList alts = value.split(";");
int v1 = -1, v2 = -1, v3 = -1;
if (alts.size() >= 1) { v1 = alts[0].toInt(); }
if (alts.size() >= 2) { v2 = alts[1].toInt(); }
if (alts.size() >= 3) { v3 = alts[2].toInt(); }
const CAltitude::MetricTuple m(v1, v2, v3);
v.push_back(m);
}
return v;
}
}
void CAltitude::registerMetadata()
{
Mixin::MetaType<CAltitude>::registerMetadata();
@@ -34,6 +59,12 @@ namespace BlackMisc
qRegisterMetaType<CAltitude::AltitudeType>();
}
const QVector<CAltitude::MetricTuple> &CAltitude::metricTuples()
{
static const QVector<MetricTuple> v = Private::initMetricValues();
return v;
}
CAltitude::CAltitude(const QString &altitudeAsString, CPqString::SeparatorMode mode) : CLength(0, CLengthUnit::m()), m_datum(MeanSeaLevel)
{
this->parseFromString(altitudeAsString, mode);
@@ -388,6 +419,26 @@ namespace BlackMisc
return a;
}
int CAltitude::findMetricAltitude(int feet)
{
// m/ft/FL
for (const MetricTuple &m : metricTuples())
{
if (std::get<1>(m) == feet) return std::get<0>(m);
}
return -1;
}
int CAltitude::findAltitudeForMetricAltitude(int metric)
{
// m/ft/FL
for (const MetricTuple &m : metricTuples())
{
if (std::get<0>(m) == metric) return std::get<1>(m);
}
return -1;
}
const CAltitude &CAltitude::null()
{
static const CAltitude null(0, CAltitude::MeanSeaLevel, CLengthUnit::nullUnit());

View File

@@ -30,6 +30,8 @@
#include <QMetaType>
#include <QString>
#include <QRegularExpression>
#include <QVector>
#include <tuple>
namespace BlackMisc
{
@@ -57,6 +59,9 @@ namespace BlackMisc
//! Base type
using base_type = PhysicalQuantities::CLength;
//! Metric tuple
using MetricTuple = std::tuple<int, int, int>;
BLACKMISC_DECLARE_USING_MIXIN_METATYPE(CAltitude)
BLACKMISC_DECLARE_USING_MIXIN_STRING(CAltitude)
BLACKMISC_DECLARE_USING_MIXIN_DBUS(CAltitude)
@@ -196,6 +201,11 @@ namespace BlackMisc
//! \remark https://en.wikipedia.org/wiki/Flight_level
CAltitude roundedToNearest100ft(bool roundDown) const;
//! Search the corresponding feet <-> metric / metric <-> feet @{
static int findMetricAltitude(int feet);
static int findAltitudeForMetricAltitude(int metric);
//! @}
//! Null altitude (MSL)
static const CAltitude &null();
@@ -213,6 +223,9 @@ namespace BlackMisc
ReferenceDatum m_datum; //!< MSL or AGL?
AltitudeType m_altitudeType = TrueAltitude; //!< type
//! The metric tuples m/ft/FL
static const QVector<MetricTuple> &metricTuples();
BLACK_METACLASS(
CAltitude,
BLACK_METAMEMBER(datum),