diff --git a/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml b/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml
index a0ff44680..d79b1c4e7 100644
--- a/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml
+++ b/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml
@@ -23,12 +23,16 @@
-
+
+
+
+
+
diff --git a/samples/blackmiscquantities_dbus/main.cpp b/samples/blackmiscquantities_dbus/main.cpp
index 14d2bced8..e389d33dc 100644
--- a/samples/blackmiscquantities_dbus/main.cpp
+++ b/samples/blackmiscquantities_dbus/main.cpp
@@ -17,6 +17,7 @@
using namespace BlackMisc::PhysicalQuantities;
using namespace BlackMisc::Aviation;
using namespace BlackMisc::Math;
+using namespace BlackMisc::Geo;
using namespace BlackMiscTest;
/*!
@@ -100,9 +101,6 @@ int main(int argc, char *argv[])
list << 1.0 << 2.0 << 3.0;
testserviceInterface.receiveList(list);
qDebug() << "Send list via interface" << list;
- qDebug() << "Key .......";
- getchar();
-
// PQs
CSpeed speed(speedValue++, BlackMisc::PhysicalQuantities::CSpeedUnit::km_h());
@@ -132,6 +130,15 @@ int main(int argc, char *argv[])
testserviceInterface.receiveMatrix(m33);
qDebug() << "Send matrix" << m33;
+ // Geo
+ // EDDF: 50° 2′ 0″ N, 8° 34′ 14″ E, 100m MSL
+ CLatitude lat = CLatitude::fromWgs84("50° 2′ 1″ 23 N");
+ CLongitude lon = CLongitude::fromWgs84("8° 34′ 14″ E");
+ CLength height(100, CLengthUnit::m());
+ CCoordinateGeodetic geoPos(lat, lon, height);
+ testserviceInterface.receiveGeoPosition(geoPos);
+ qDebug() << "Send geo position" << geoPos;
+
// next round?
qDebug() << "Key .......";
getchar();
diff --git a/samples/blackmiscquantities_dbus/testservice.cpp b/samples/blackmiscquantities_dbus/testservice.cpp
index dbecd51c9..1c00dc048 100644
--- a/samples/blackmiscquantities_dbus/testservice.cpp
+++ b/samples/blackmiscquantities_dbus/testservice.cpp
@@ -70,11 +70,19 @@ void Testservice::receiveMatrix(const BlackMisc::Math::CMatrix3x3 &matrix)
}
/*
- *
+ * Receive a list
*/
void Testservice::receiveList(const QList &list)
{
qDebug() << "Pid:" << TestserviceTool::getPid() << "Received list:" << list;
}
+/*
+ * Receive a geo position
+ */
+void Testservice::receiveGeoPosition(const BlackMisc::Geo::CCoordinateGeodetic &geo)
+{
+ qDebug() << "Pid:" << TestserviceTool::getPid() << "Received geo data:" << geo;
+}
+
} // namespace
diff --git a/samples/blackmiscquantities_dbus/testservice.h b/samples/blackmiscquantities_dbus/testservice.h
index db169fcda..c03bc02b1 100644
--- a/samples/blackmiscquantities_dbus/testservice.h
+++ b/samples/blackmiscquantities_dbus/testservice.h
@@ -88,6 +88,12 @@ public slots:
*/
void receiveList(const QList &list);
+ /*!
+ * \brief Receive a geo position
+ * \param geo
+ */
+ void receiveGeoPosition(const BlackMisc::Geo::CCoordinateGeodetic &geo);
+
public:
static const QString ServiceName;
static const QString ServicePath;
diff --git a/src/blackcore/multiplayer.cpp b/src/blackcore/multiplayer.cpp
index 79ab18a5c..68a9545cc 100644
--- a/src/blackcore/multiplayer.cpp
+++ b/src/blackcore/multiplayer.cpp
@@ -95,7 +95,7 @@ void CMultiPlayer::addPlane(CPlane *plane)
void CMultiPlayer::removePlane(CPlane *plane)
{
- qint32 id;
+ qint32 id = 0;
m_simulator->removePlane(id);
}
diff --git a/src/blackmisc/aviomodulator.cpp b/src/blackmisc/aviomodulator.cpp
index 49e23a232..ce309642b 100644
--- a/src/blackmisc/aviomodulator.cpp
+++ b/src/blackmisc/aviomodulator.cpp
@@ -67,13 +67,11 @@ template bool CModulator::operator !=(const CModulator
return !(otherModulator == (*this));
}
-
// see here for the reason of thess forward instantiations
// http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html
template class CModulator;
template class CModulator;
template class CModulator;
-
} // namespace
} // namespace
diff --git a/src/blackmisc/avverticalpositions.cpp b/src/blackmisc/avverticalpositions.cpp
index 398113626..6c8a43d7b 100644
--- a/src/blackmisc/avverticalpositions.cpp
+++ b/src/blackmisc/avverticalpositions.cpp
@@ -74,9 +74,9 @@ bool CAviationVerticalPositions::operator !=(const CAviationVerticalPositions &o
}
/*
- * String representation for streaming
+ * String representation for converter
*/
-QString CAviationVerticalPositions::stringForStreamingOperator() const
+QString CAviationVerticalPositions::stringForConverter() const
{
QString s = QString("Altitude: ").
append(this->m_altitude.unitValueRoundedWithUnit()).
@@ -109,22 +109,34 @@ CAviationVerticalPositions CAviationVerticalPositions::fromAltitudeAndElevationI
return CAviationVerticalPositions(a, e, h);
}
-/*
- * Stream for log message
+
+/*!
+ * \brief Stream to DBus <<
+ * \param argument
*/
-CLogMessage operator <<(CLogMessage log, const CAviationVerticalPositions &positions)
-{
- log << positions.stringForStreamingOperator();
- return log;
+void CAviationVerticalPositions::marshallToDbus(QDBusArgument &argument) const {
+ argument << this->m_altitude;
+ argument << this->m_elevation;
+ argument << this->m_height;
+}
+
+/*!
+ * \brief Stream from DBus >>
+ * \param argument
+ */
+void CAviationVerticalPositions::unmarshallFromDbus(const QDBusArgument &argument) {
+ argument >> this->m_altitude;
+ argument >> this->m_elevation;
+ argument >> this->m_height;
}
/*
- * Stream for qDebug
+ * Register metadata
*/
-QDebug operator <<(QDebug d, const CAviationVerticalPositions &positions)
+void CAviationVerticalPositions::registerMetadata()
{
- d << positions.stringForStreamingOperator();
- return d;
+ qRegisterMetaType(typeid(CAviationVerticalPositions).name());
+ qDBusRegisterMetaType();
}
} // namespace
diff --git a/src/blackmisc/avverticalpositions.h b/src/blackmisc/avverticalpositions.h
index 1d67e64ac..583383f43 100644
--- a/src/blackmisc/avverticalpositions.h
+++ b/src/blackmisc/avverticalpositions.h
@@ -3,11 +3,12 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#ifndef BLACKMISC_AVLATERALPOSITION_H
-#define BLACKMISC_AVLATERALPOSITION_H
+#ifndef BLACKMISC_AVVERTICALPOSITION_H
+#define BLACKMISC_AVVERTICALPOSITION_H
#include "blackmisc/avaltitude.h"
#include "blackmisc/pqconstants.h"
+#include "blackmisc/basestreamstringifier.h"
namespace BlackMisc
{
@@ -17,25 +18,8 @@ namespace Aviation
/*!
* \brief Vertical (Z) positions of an aircraft
*/
-class CAviationVerticalPositions
+class CAviationVerticalPositions : public BlackMisc::CBaseStreamStringifier
{
- /*!
- * \brief Stream << overload to be used in debugging messages
- * \param d
- * \param positions
- * \return
- */
- friend QDebug operator<<(QDebug d, const CAviationVerticalPositions &positions);
-
- /*!
- * Stream operator for log messages
- * \brief operator <<
- * \param log
- * \param positions
- * \return
- */
- friend CLogMessage operator<<(CLogMessage log, const CAviationVerticalPositions &positions);
-
private:
BlackMisc::Aviation::CAltitude m_altitude; //!< altitude
BlackMisc::PhysicalQuantities::CLength m_elevation; //!< elevation
@@ -43,10 +27,22 @@ private:
protected:
/*!
- * \brief Specific stream operation for heading
+ * \brief String for converter
* \return
*/
- virtual QString stringForStreamingOperator() const;
+ virtual QString stringForConverter() const;
+
+ /*!
+ * \brief Unmarshall from Dbus
+ * \param argument
+ */
+ virtual void unmarshallFromDbus(const QDBusArgument &argument);
+
+ /*!
+ * \brief Unmarshall from Dbus
+ * \param argument
+ */
+ virtual void marshallToDbus(QDBusArgument &argument) const;
public:
/*!
@@ -113,6 +109,7 @@ public:
* \param elevationFt
* \return
*/
+
static CAviationVerticalPositions fromAltitudeAndElevationInFt(double altitudeMslFt, double elevationFt);
/*!
* \brief Factory getting tupel frome levation and altitude values in meters
@@ -121,9 +118,15 @@ public:
* \return
*/
static CAviationVerticalPositions fromAltitudeAndElevationInM(double altitudeMslM, double elevationM);
+
+ /*!
+ * \brief Register metadata
+ */
+ static void registerMetadata();
};
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::Aviation::CAviationVerticalPositions)
-#endif // BLACKMISC_AVLATERALPOSITION_H
+#endif // BLACKMISC_AVVERTICALPOSITION_H
diff --git a/src/blackmisc/basestreamstringifier.h b/src/blackmisc/basestreamstringifier.h
index 9e4e50dee..ba5cbcd6b 100644
--- a/src/blackmisc/basestreamstringifier.h
+++ b/src/blackmisc/basestreamstringifier.h
@@ -14,6 +14,7 @@ namespace BlackMisc
/*!
* \brief Provides "to QString" and stream operators
*/
+// Virtual operators: http://stackoverflow.com/a/4571634/356726
class CBaseStreamStringifier
{
/*!
diff --git a/src/blackmisc/blackmiscfreefunctions.cpp b/src/blackmisc/blackmiscfreefunctions.cpp
index 33649d118..0d7074297 100644
--- a/src/blackmisc/blackmiscfreefunctions.cpp
+++ b/src/blackmisc/blackmiscfreefunctions.cpp
@@ -32,9 +32,9 @@ void BlackMisc::Aviation::registerMetadata()
CNavSystem::registerMetadata();
CAdfSystem::registerMetadata();
CAltitude::registerMetadata();
+ CAviationVerticalPositions::registerMetadata();
}
-
/*
* Metadata for Math
*/
diff --git a/src/blackmisc/blackmiscfreefunctions.h b/src/blackmisc/blackmiscfreefunctions.h
index 15097647f..f413249e7 100644
--- a/src/blackmisc/blackmiscfreefunctions.h
+++ b/src/blackmisc/blackmiscfreefunctions.h
@@ -54,8 +54,6 @@ void registerMetadata();
} // Geo
-
-
/*!
* \brief Register all relevant metadata in BlackMisc
*/
diff --git a/src/blackmisc/coordinategeodetic.cpp b/src/blackmisc/coordinategeodetic.cpp
new file mode 100644
index 000000000..1893e8231
--- /dev/null
+++ b/src/blackmisc/coordinategeodetic.cpp
@@ -0,0 +1,50 @@
+/* Copyright (C) 2013 VATSIM Community / contributors
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "blackmisc/coordinategeodetic.h"
+
+namespace BlackMisc
+{
+namespace Geo
+{
+
+/*
+ * String for converter
+ */
+QString CCoordinateGeodetic::stringForConverter() const
+{
+ QString s = "Geodetic: {%1, %2, %3}";
+ return s.arg(this->m_latitude.unitValueRoundedWithUnit(6)).arg(this->m_longitude.unitValueRoundedWithUnit(6)).arg(this->m_height.unitValueRoundedWithUnit());
+}
+
+/*
+ * Marshall to Dbus
+ */
+void CCoordinateGeodetic::marshallToDbus(QDBusArgument &argument) const {
+ argument << this->m_latitude;
+ argument << this->m_longitude;
+ argument << this->m_height;
+}
+
+/*
+ * Unmarshall from Dbus
+ */
+void CCoordinateGeodetic::unmarshallFromDbus(const QDBusArgument &argument) {
+ argument >> this->m_latitude;
+ argument >> this->m_longitude;
+ argument >> this->m_height;
+}
+
+/*
+ * Register metadata
+ */
+void CCoordinateGeodetic::registerMetadata()
+{
+ qRegisterMetaType(typeid(CCoordinateGeodetic).name());
+ qDBusRegisterMetaType();
+}
+
+} // namespace
+} // namespace
diff --git a/src/blackmisc/coordinategeodetic.h b/src/blackmisc/coordinategeodetic.h
index 2ef42cfbc..e065e8792 100644
--- a/src/blackmisc/coordinategeodetic.h
+++ b/src/blackmisc/coordinategeodetic.h
@@ -51,30 +51,19 @@ protected:
* \brief String for converter
* \return
*/
- virtual QString stringForConverter() const
- {
- QString s = "Geodetic: {%1, %2, %3}";
- return s.arg(this->m_latitude.unitValueRoundedWithUnit(6)).arg(this->m_longitude.unitValueRoundedWithUnit(6)).arg(this->m_height.unitValueRoundedWithUnit());
- }
+ virtual QString stringForConverter() const;
+
/*!
* \brief Stream to DBus
* \param argument
*/
- virtual void marshallToDbus(QDBusArgument &argument) const {
- argument << this->m_latitude;
- argument << this->m_longitude;
- argument << this->m_height;
- }
+ virtual void marshallToDbus(QDBusArgument &argument) const;
/*!
* \brief Stream from DBus
* \param argument
*/
- virtual void unmarshallFromDbus(const QDBusArgument &argument) {
- argument >> this->m_latitude;
- argument >> this->m_longitude;
- argument >> this->m_height;
- }
+ virtual void unmarshallFromDbus(const QDBusArgument &argument);
public:
/*!
diff --git a/src/blackmisc/geoallclasses.h b/src/blackmisc/geoallclasses.h
new file mode 100644
index 000000000..a8b82f0e9
--- /dev/null
+++ b/src/blackmisc/geoallclasses.h
@@ -0,0 +1,16 @@
+/* Copyright (C) 2013 VATSIM Community / contributors
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef BLACKMISC_GEOALLCLASSES_H
+#define BLACKMISC_GEOALLCLASSES_H
+
+#include "blackmisc/geoearthangle.h"
+#include "blackmisc/geolatitude.h"
+#include "blackmisc/geolongitude.h"
+#include "blackmisc/coordinateecef.h"
+#include "blackmisc/coordinatened.h"
+#include "blackmisc/coordinategeodetic.h"
+
+#endif // guard
diff --git a/src/blackmisc/geoearthangle.cpp b/src/blackmisc/geoearthangle.cpp
new file mode 100644
index 000000000..219bc85c0
--- /dev/null
+++ b/src/blackmisc/geoearthangle.cpp
@@ -0,0 +1,77 @@
+/* Copyright (C) 2013 VATSIM Community / contributors
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "blackmisc/geoearthangle.h"
+#include "blackmisc/geolatitude.h"
+#include "blackmisc/geolongitude.h"
+
+namespace BlackMisc
+{
+namespace Geo
+{
+
+/*
+ * Register metadata
+ */
+template void CEarthAngle::registerMetadata()
+{
+ qRegisterMetaType(typeid(LATorLON).name());
+ qDBusRegisterMetaType();
+}
+
+/*
+ * Latitude or Longitude from a WGS string
+ */
+template LATorLON CEarthAngle::fromWgs84(const QString &wgsCoordinate)
+{
+ // http://www.regular-expressions.info/floatingpoint.html
+ QRegExp rx("([-+]?[0-9]*\\.?[0-9]+)");
+ qint32 deg = 0;
+ qint32 min = 0;
+ double sec = 0.0;
+ double secFragment = 0.0;
+ int fragmentLength = 0;
+ int c = 0;
+ int pos= 0;
+ while ((pos = rx.indexIn(wgsCoordinate, pos)) != -1) {
+ QString cap = rx.cap(1);
+ pos += rx.matchedLength();
+ switch(c++) {
+ case 0:
+ deg = cap.toInt();
+ break;
+ case 1:
+ min = cap.toInt();
+ break;
+ case 2:
+ sec = cap.toDouble();
+ break;
+ case 3:
+ secFragment = cap.toDouble();
+ fragmentLength = cap.length();
+ break;
+ default:
+ break;
+ }
+ }
+ if (fragmentLength > 0) {
+ // we do have given ms
+ sec += secFragment / qPow(10,fragmentLength);
+ }
+
+ if (wgsCoordinate.contains('S', Qt::CaseInsensitive) ||
+ wgsCoordinate.contains('W', Qt::CaseInsensitive)) deg *= -1;
+
+ CAngle a(deg, min, sec);
+ return LATorLON(a);
+}
+
+// see here for the reason of thess forward instantiations
+// http://www.parashift.com/c++-faq/separate-template-class-defn-from-decl.html
+template class CEarthAngle;
+template class CEarthAngle;
+
+} // namespace
+} // namespace
diff --git a/src/blackmisc/geoearthangle.h b/src/blackmisc/geoearthangle.h
index c211462d9..7d1b2fc4f 100644
--- a/src/blackmisc/geoearthangle.h
+++ b/src/blackmisc/geoearthangle.h
@@ -3,8 +3,8 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-#ifndef BLACKMISC_GEOLATLONBASE_H
-#define BLACKMISC_GEOLATLONBASE_H
+#ifndef BLACKMISC_GEOEARTHANGLE_H
+#define BLACKMISC_GEOEARTHANGLE_H
#include "blackmisc/pqangle.h"
namespace BlackMisc
@@ -62,6 +62,12 @@ protected:
*/
CEarthAngle(double value, const BlackMisc::PhysicalQuantities::CAngleUnit &unit): CAngle(value, unit) {}
+ /*!
+ * \brief Init by double value
+ * \param angle
+ */
+ CEarthAngle(const BlackMisc::PhysicalQuantities::CAngle &angle): CAngle(angle) {}
+
/*!
* \brief String for converter and streaming
* \return
@@ -212,14 +218,18 @@ public:
return l;
}
- /*
+ /*!
* Register metadata
*/
- static void registerMetadata()
- {
- qRegisterMetaType(typeid(LATorLON).name());
- qDBusRegisterMetaType();
- }
+ static void registerMetadata();
+
+ /*!
+ * \brief Latitude / Longitude from a WGS string such as
+ * \param wgsCoordinate 50° 2′ 0″ N / 8° 34′ 14″ E
+ * \return
+ */
+ static LATorLON fromWgs84(const QString &wgsCoordinate);
+
};
} // namespace
diff --git a/src/blackmisc/geolatitude.h b/src/blackmisc/geolatitude.h
index 3ce1e9a4e..a7187a60f 100644
--- a/src/blackmisc/geolatitude.h
+++ b/src/blackmisc/geolatitude.h
@@ -1,7 +1,10 @@
#ifndef BLACKMISC_GEOLATITUDE_H
#define BLACKMISC_GEOLATITUDE_H
+
+#include
#include "blackmisc/geoearthangle.h"
+
namespace BlackMisc
{
namespace Geo
@@ -34,6 +37,12 @@ public:
*/
CLatitude(const CLatitude &latitude) : CEarthAngle(latitude) {}
+ /*!
+ * \brief Constructor
+ * \param angle
+ */
+ CLatitude(const BlackMisc::PhysicalQuantities::CAngle &angle) : CEarthAngle(angle) {}
+
/*!
* \brief Init by double value
* \param value
@@ -45,6 +54,7 @@ public:
* \brief Virtual destructor
*/
virtual ~CLatitude() {}
+
};
} // namespace
diff --git a/src/blackmisc/geolongitude.h b/src/blackmisc/geolongitude.h
index 2bd89192a..9099d10de 100644
--- a/src/blackmisc/geolongitude.h
+++ b/src/blackmisc/geolongitude.h
@@ -34,6 +34,12 @@ public:
*/
CLongitude(const CLongitude &Longitude) : CEarthAngle(Longitude) {}
+ /*!
+ * \brief Constructor
+ * \param angle
+ */
+ CLongitude(const BlackMisc::PhysicalQuantities::CAngle &angle) : CEarthAngle(angle) {}
+
/*!
* \brief Init by double value
* \param value
diff --git a/src/blackmisc/pqangle.h b/src/blackmisc/pqangle.h
index 7fabb6df8..4cd63098a 100644
--- a/src/blackmisc/pqangle.h
+++ b/src/blackmisc/pqangle.h
@@ -42,6 +42,19 @@ public:
*/
CAngle(double value, const CAngleUnit &unit): CPhysicalQuantity(value, unit, CAngleUnit::rad()) {}
+ /*!
+ * \brief Intir as sexagesimal degrees
+ * \param degrees
+ * \param minutes
+ * \param seconds
+ */
+ CAngle(qint32 degrees, qint32 minutes, double seconds) :
+ CPhysicalQuantity(
+ degrees + minutes / 100.0 + seconds / 10000.0,
+ CAngleUnit::sexagesimalDeg(), CAngleUnit::rad()) {
+ // void
+ }
+
/*!
* \brief Virtual destructor
*/
diff --git a/src/blackmisc/pqunits.cpp b/src/blackmisc/pqunits.cpp
index 396f05332..cd143912e 100644
--- a/src/blackmisc/pqunits.cpp
+++ b/src/blackmisc/pqunits.cpp
@@ -76,7 +76,7 @@ QString CAngleUnit::toQStringRounded(double value, int digits) const
double mi = floor((value - de) * 100.0);
double se = floor((value - de - mi / 100.0) * 1000000) / 100.0;
QString ses = QLocale::system().toString(se, 'f', 2);
- s = QString::number(de).append(this->getUnitName()).append(QString::number(mi))
+ s = QString::number(de).append(" ").append(QString::number(mi))
.append("'").append(ses).append("\"");
}
else
diff --git a/src/blackmisc/pqunits.h b/src/blackmisc/pqunits.h
index 285d02042..3d1ec1605 100644
--- a/src/blackmisc/pqunits.h
+++ b/src/blackmisc/pqunits.h
@@ -246,7 +246,7 @@ public:
*/
static const CAngleUnit °()
{
- static CAngleUnit deg("degree", "°", false, M_PI / 180);
+ static CAngleUnit deg("degree", "deg", false, M_PI / 180);
return deg;
}
@@ -256,7 +256,7 @@ public:
*/
static const CAngleUnit &sexagesimalDeg()
{
- static CAngleUnit deg("segadecimal degree", "°", false, M_PI / 180,
+ static CAngleUnit deg("segadecimal degree", "segd", false, M_PI / 180,
CMeasurementPrefix::One(), 0, 1E-9, CAngleUnit::conversionSexagesimalToSi, CAngleUnit::conversionSexagesimalFromSi); return deg;
}