diff --git a/.gitignore b/.gitignore
index 83118b313..6f275a76e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -81,4 +81,5 @@ Thumbs.db
desktop.ini
# Editors temporary files
-*~
\ No newline at end of file
+*~
+/client.pro.user.2.7pre1
diff --git a/client.pro b/client.pro
index e08006914..6806cdb7f 100644
--- a/client.pro
+++ b/client.pro
@@ -16,6 +16,7 @@ WITH_SAMPLES = ON
equals(WITH_BLACKMISC, ON) {
SUBDIRS += src/blackmisc
+ SUBDIRS += src/blackmisc_cpp2xml
}
equals(WITH_BLACKCORE, ON) {
@@ -50,8 +51,10 @@ equals(WITH_SAMPLES, ON) {
SUBDIRS += samples/logging/sample_logging.pro
SUBDIRS += samples/plugin/sample_plugin.pro
SUBDIRS += samples/pluginmgr/sample_pluginmgr.pro
- SUBDIRS += samples/blackmiscquantities/sample_quantities_avionics.pro
SUBDIRS += samples/blackmiscvectorgeo/sample_vector_geo.pro
+ SUBDIRS += samples/blackmiscquantities/sample_quantities_avionics.pro
+ SUBDIRS += samples/blackmiscquantities_dbus/sample_quantities_avionics_dbus.pro
+ SUBDIRS +=
}
equals(WITH_UNITTESTS, ON) {
diff --git a/samples/blackmiscquantities/sample_quantities_avionics.pro b/samples/blackmiscquantities/sample_quantities_avionics.pro
index 2e9e95d87..98c3d24c0 100644
--- a/samples/blackmiscquantities/sample_quantities_avionics.pro
+++ b/samples/blackmiscquantities/sample_quantities_avionics.pro
@@ -1,13 +1,13 @@
-QT += core
+QT += core dbus
QT -= gui
-TARGET = sample_physicalquantities
+TARGET = sample_quantities_avionics
TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
-DEPENDPATH += . ../../src
+DEPENDPATH += . ../../src/blackmisc
INCLUDEPATH += . ../../src
LIBS += -L../../lib -lblackmisc
@@ -19,3 +19,5 @@ DESTDIR = ../../bin
HEADERS += *.h
SOURCES += *.cpp
+
+OTHER_FILES +=
diff --git a/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml b/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml
new file mode 100644
index 000000000..fec10b6e1
--- /dev/null
+++ b/samples/blackmiscquantities_dbus/BlackMiscTest.Testservice.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/blackmiscquantities_dbus/main.cpp b/samples/blackmiscquantities_dbus/main.cpp
new file mode 100644
index 000000000..905f4ca78
--- /dev/null
+++ b/samples/blackmiscquantities_dbus/main.cpp
@@ -0,0 +1,114 @@
+/* Copyright (C) 2013 VATSIM Community / authors
+ * 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
+#include
+#include
+#include
+
+#include "testservice.h"
+#include "testservice_adaptor.h"
+#include "testservice_interface.h"
+#include "testservicetool.h"
+
+using namespace BlackMisc::PhysicalQuantities;
+using namespace BlackMisc::Aviation;
+using namespace BlackMiscTest;
+
+/*!
+ * Sample tests
+ */
+int main(int argc, char *argv[])
+{
+ BlackMisc::registerMetadata();
+ QCoreApplication a(argc, argv);
+
+ // init
+ if (argc < 1) {
+ qFatal("Missing name of executable");
+ }
+ const QString executable = QString(argv[0]);
+ Testservice* pTestservice = NULL;
+ TestserviceAdaptor* pTestserviceAdaptor = NULL;
+
+ // Create a Testservice instance and register it with the session bus only if
+ // the service isn't already available.
+ QDBusConnection connection = QDBusConnection::sessionBus();
+ if (!connection.interface()->isServiceRegistered(Testservice::ServiceName)) {
+ pTestservice = new Testservice(&a);
+ pTestserviceAdaptor = new TestserviceAdaptor(pTestservice);
+
+ if (!connection.registerService(Testservice::ServiceName)) {
+ QDBusError err = connection.lastError();
+ qWarning() << err.message();
+ qWarning() << "Started dbus-daemon.exe --session?";
+ qWarning() << "Created directory session.d? See https://dev.vatsim-germany.org/projects/vatpilotclient/wiki/DBusExample#Running-the-example";
+ qFatal("Could not register service!");
+ }
+
+ if (!connection.registerObject(Testservice::ServicePath, pTestservice)) {
+ qFatal("Could not register service object!");
+ }
+
+ qDebug() << "Registration running as pid: " << TestserviceTool::getPid();
+ if (pTestservice) qDebug() << "Service registered";
+ if (pTestserviceAdaptor) qDebug() << "Adaptor object registered";
+
+ new TestserviceAdaptor(pTestservice); // adaptor
+ QString service; // service not needed
+ if (QDBusConnection::sessionBus().connect(
+ service, Testservice::ServicePath, Testservice::ServiceName,
+ "sendStringMessage", pTestservice,
+ SLOT(receiveStringMessage(const QString &)))) {
+ qDebug() << "Connected object with bus sendStringMessage";
+ } else {
+ qFatal("Cannot connect service with DBus");
+ }
+
+ // Call myself to implement client
+ TestserviceTool::startNewProcess(executable, &a);
+
+ } else {
+ qDebug() << "Already registered, assuming 2nd pid: " << TestserviceTool::getPid();
+ BlackmisctestTestserviceInterface testserviceInterface(Testservice::ServiceName, Testservice::ServicePath, connection, &a);
+ double speedValue = 200.0;
+ while (true) {
+ QDBusMessage m = QDBusMessage::createSignal(
+ Testservice::ServicePath, Testservice::ServiceName,
+ "sendStringMessage");
+
+ //The << operator is used to add the parameters for the slot
+ QDateTime dtnow = QDateTime::currentDateTimeUtc();
+ QString msg = QString("Message from %1 at %2").arg(TestserviceTool::getPid()).arg(dtnow.toString("MM/dd/yyyy @ hh:mm:ss"));
+ m << msg;
+
+ // We send this as a non-replying message. This is used for sending errors, replys, signals,
+ // and method calls (slots) that don't return
+ if (connection.send(m)) {
+ qDebug() << "Send via low level method" << m;
+ }
+ TestserviceTool::sleep(2500);
+
+ // same as interface message
+ testserviceInterface.receiveStringMessage(msg);
+ qDebug() << "Send string via interface" << msg;
+ TestserviceTool::sleep(2500);
+
+ // PQs
+ CSpeed speed(speedValue++, BlackMisc::PhysicalQuantities::CSpeedUnit::km_h());
+ testserviceInterface.receiveSpeed(speed);
+ qDebug() << "Send speed via interface" << speed;
+ TestserviceTool::sleep(2500);
+
+ // Aviation
+ CComSystem comSystem = CComSystem("DBUS COM1", CPhysicalQuantitiesConstants::FrequencyInternationalAirDistress(), CPhysicalQuantitiesConstants::FrequencyUnicom());
+ testserviceInterface.receiveComUnit(comSystem);
+ qDebug() << "Send COM via interface" << comSystem;
+ TestserviceTool::sleep(2500);
+ }
+ }
+
+ return a.exec();
+}
diff --git a/samples/blackmiscquantities_dbus/readme.txt b/samples/blackmiscquantities_dbus/readme.txt
new file mode 100644
index 000000000..4481e7f8f
--- /dev/null
+++ b/samples/blackmiscquantities_dbus/readme.txt
@@ -0,0 +1,9 @@
+Starting: dbus-daemon.exe --session
+- blocks CMD (sometimes daemon continues to run when pressing CTRL/C)
+- does not start without directory session.d, i.e. ..\Qt\Qt5.1.0DBus\qtbase\etc\dbus-1\session.d
+
+qdbuscpp2xml testservice.h -x H:\Projects\QtBuilds\build-client-Qt_5_1_0_VATSIM_qmake_Microsoft_Visual_C_Compiler_10_0_x86_2-Release\bin\blackmisc_cpp2xml.dll -o BlackMiscTest.Testservice.xml
+
+Done automatically, but if required manually
+Interface: qdbusxml2cpp blackbus.testservice.xml -p itestservice
+Adaptor: qdbusxml2cpp blackbus.testservice.xml -a atestservice
diff --git a/samples/blackmiscquantities_dbus/sample_quantities_avionics_dbus.pro b/samples/blackmiscquantities_dbus/sample_quantities_avionics_dbus.pro
new file mode 100644
index 000000000..52ddd002e
--- /dev/null
+++ b/samples/blackmiscquantities_dbus/sample_quantities_avionics_dbus.pro
@@ -0,0 +1,30 @@
+QT += core dbus
+QT -= gui
+
+TARGET = sample_quantities_avionics_dbus
+TEMPLATE = app
+
+CONFIG += console
+CONFIG -= app_bundle
+
+# Causes nmake to run qdbusxml2cpp to automatically generate the dbus adaptor and interface classes,
+# then automatically adds them to the sources to compile
+DBUS_ADAPTORS += BlackMiscTest.Testservice.xml
+DBUS_INTERFACES += BlackMiscTest.Testservice.xml
+QDBUSXML2CPP_INTERFACE_HEADER_FLAGS = -i blackmisc/blackmiscfreefunctions.h
+QDBUSXML2CPP_ADAPTOR_HEADER_FLAGS = -i blackmisc/blackmiscfreefunctions.h
+
+DEPENDPATH += . ../../src/blackmisc
+INCLUDEPATH += . ../../src
+
+LIBS += -L../../lib -lblackmisc
+
+win32:!win32-g++*: PRE_TARGETDEPS += ../../lib/blackmisc.lib
+else: PRE_TARGETDEPS += ../../lib/libblackmisc.a
+
+DESTDIR = ../../bin
+
+HEADERS += *.h
+SOURCES += *.cpp
+
+OTHER_FILES += readme.txt BlackMiscTest.Testservice.xml
diff --git a/samples/blackmiscquantities_dbus/testservice.cpp b/samples/blackmiscquantities_dbus/testservice.cpp
new file mode 100644
index 000000000..bcfac37e3
--- /dev/null
+++ b/samples/blackmiscquantities_dbus/testservice.cpp
@@ -0,0 +1,56 @@
+/* Copyright (C) 2013 VATSIM Community / authors
+ * 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 "testservice.h"
+
+namespace BlackMiscTest
+{
+
+const QString Testservice::ServiceName = QString(BLACKMISCKTEST_SERVICENAME);
+const QString Testservice::ServicePath = QString(BLACKMISCKTEST_SERVICEPATH);
+
+/*
+ * Constructor
+ */
+Testservice::Testservice(QObject *parent) : QObject(parent)
+{
+ // void
+}
+
+/*
+ * Slot to receive messages
+ */
+void Testservice::receiveStringMessage(const QString &message)
+{
+ qDebug() << "Pid:" << TestserviceTool::getPid() << "Received message:" << message;
+}
+
+/*
+ * Receive variant
+ */
+void Testservice::receiveVariant(const QDBusVariant &variant)
+{
+ QVariant qv = variant.variant();
+ qDebug() << "Pid:" << TestserviceTool::getPid() << "Received variant:" << qv;
+}
+
+/*
+ * Receive speed
+ */
+void Testservice::receiveSpeed(const BlackMisc::PhysicalQuantities::CSpeed &speed)
+{
+ qDebug() << "Pid:" << TestserviceTool::getPid() << "Received speed:" << speed;
+}
+
+/*
+ * Receive COM unit
+ */
+void Testservice::receiveComUnit(const BlackMisc::Aviation::CComSystem &comUnit)
+{
+ qDebug() << "Pid:" << TestserviceTool::getPid() << "Received COM:" << comUnit;
+}
+
+
+} // namespace
diff --git a/samples/blackmiscquantities_dbus/testservice.h b/samples/blackmiscquantities_dbus/testservice.h
new file mode 100644
index 000000000..6ce955b27
--- /dev/null
+++ b/samples/blackmiscquantities_dbus/testservice.h
@@ -0,0 +1,89 @@
+/* Copyright (C) 2013 VATSIM Community / authors
+ * 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 BLACKMISCKTEST_TESTSERVICEPQAV_H
+#define BLACKMISCKTEST_TESTSERVICEPQAV_H
+
+// clash with struct interace in objbase.h used to happen
+#pragma push_macro("interface")
+#undef interface
+
+#define BLACKMISCKTEST_SERVICENAME "blackmisctest.testservice"
+#define BLACKMISCKTEST_SERVICEPATH "/blackbus"
+
+#include
+#include
+#include
+#include "blackmisc/blackmiscfreefunctions.h"
+#include "testservicetool.h"
+
+namespace BlackMiscTest {
+
+/*!
+ * \brief Testservice for PQ DBus tests
+ */
+class Testservice : public QObject
+{
+ // http://techbase.kde.org/Development/Tutorials/D-Bus/CustomTypes#Write_a_class
+ // https://dev.vatsim-germany.org/projects/vatpilotclient/wiki/DBusExample
+ // http://qt-project.org/doc/qt-4.8/examples-dbus.html
+ // http://dbus.freedesktop.org/doc/dbus-tutorial.html#meta
+
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", BLACKMISCKTEST_SERVICENAME)
+
+ // For some reasons the interface name in the XML is not set correctly
+ // to the above name
+
+
+signals:
+ /*!
+ * \brief Send string message
+ * \param message
+ */
+ void sendStringMessage(const QString& message);
+
+public slots:
+ /*!
+ * \brief Receive string message
+ * \param message
+ */
+ void receiveStringMessage(const QString &message);
+
+ /*!
+ * \brief Receive a QVariant
+ * \param variant
+ */
+ void receiveVariant(const QDBusVariant &variant);
+
+ /*!
+ * \brief Receive speed
+ * \param speed
+ */
+ void receiveSpeed(const BlackMisc::PhysicalQuantities::CSpeed &speed);
+
+ /*!
+ * \brief receiveComUnit
+ * \param comUnit
+ */
+ void receiveComUnit(const BlackMisc::Aviation::CComSystem &comUnit);
+
+public:
+ static const QString ServiceName;
+ static const QString ServicePath;
+
+ /*!
+ * \brief Constructor
+ * \param parent
+ */
+ explicit Testservice(QObject *parent = 0);
+
+};
+
+} // namespace
+
+#pragma pop_macro("interface")
+
+#endif // BLACKMISCKTEST_TESTSERVICEPQAV_H
diff --git a/samples/blackmiscquantities_dbus/testservicetool.cpp b/samples/blackmiscquantities_dbus/testservicetool.cpp
new file mode 100644
index 000000000..8c40db048
--- /dev/null
+++ b/samples/blackmiscquantities_dbus/testservicetool.cpp
@@ -0,0 +1,32 @@
+#include "testservicetool.h"
+
+namespace BlackMiscTest
+{
+
+/*
+ * Start a new process
+ */
+QProcess * TestserviceTool::startNewProcess(const QString &executable, QObject *parent = 0)
+{
+ QProcess *process = new QProcess(parent);
+ process->startDetached(executable);
+ return process;
+}
+
+/*
+ * Sleep
+ */
+void TestserviceTool::sleep(qint32 ms)
+{
+ if (ms < 1) return;
+
+#ifdef Q_OS_WIN
+ Sleep(uint(ms));
+#else
+ struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
+ nanosleep(&ts, NULL);
+#endif
+
+}
+
+} // namespace
diff --git a/samples/blackmiscquantities_dbus/testservicetool.h b/samples/blackmiscquantities_dbus/testservicetool.h
new file mode 100644
index 000000000..125db190e
--- /dev/null
+++ b/samples/blackmiscquantities_dbus/testservicetool.h
@@ -0,0 +1,53 @@
+#ifndef BLACKMISCTEST_TESTSERVICETOOL_H
+#define BLACKMISCTEST_TESTSERVICETOOL_H
+
+#include
+#include
+#ifdef Q_OS_WIN
+// for qdatetime, see here http://qt-project.org/forums/viewthread/22133
+#define NOMINMAX
+#include // for Sleep
+#endif
+
+namespace BlackMiscTest
+{
+
+/*!
+ * \brief Supporting functions for running the tests
+ */
+class TestserviceTool
+{
+private:
+ /*!
+ * \brief Constructor
+ */
+ TestserviceTool() {}
+
+public:
+ /*!
+ * \brief Get process id
+ * \return
+ */
+ static qint64 getPid() {
+ return QCoreApplication::applicationPid();
+ }
+
+ /*!
+ * \brief Start a new process
+ * \param executable
+ * \param parent
+ * \return
+ */
+ static QProcess *startNewProcess(const QString &executable, QObject *parent);
+
+ /*!
+ * \brief Own sleep to avoid inlude of QTest
+ * \param ms
+ */
+ static void sleep(qint32 ms);
+
+};
+
+} // namespace
+
+#endif // BLACKMISCTEST_TESTSERVICETOOL_H
diff --git a/samples/blackmiscquantities_dbus_xmlplugin/sample_quantities_avionics_xmlplugin.pro b/samples/blackmiscquantities_dbus_xmlplugin/sample_quantities_avionics_xmlplugin.pro
new file mode 100644
index 000000000..02804edab
--- /dev/null
+++ b/samples/blackmiscquantities_dbus_xmlplugin/sample_quantities_avionics_xmlplugin.pro
@@ -0,0 +1,25 @@
+QT += core dbus
+
+TARGET = sample_quantities_avionics_xmlplugin
+TEMPLATE = lib
+
+CONFIG += plugin
+
+DEPENDPATH += . ../../src/blackmisc
+INCLUDEPATH += . ../../src
+
+LIBS += -L../../lib -lblackmisc \
+ ../blackmiscquantities_dbus/release/dummy.obj \
+ ../blackmiscquantities_dbus/release/moc_dummy.obj \
+ ../blackmiscquantities_dbus/release/dummynoq.obj
+
+win32:!win32-g++*: PRE_TARGETDEPS += ../../lib/blackmisc.lib \
+ ../../samples/blackmiscquantities_dbus/release/dummy.obj
+else: PRE_TARGETDEPS += ../../lib/libblackmisc.a \
+ ../../samples/blackmiscquantities_dbus/release/dummy.obj
+
+DESTDIR = ../../bin
+
+HEADERS += *.h
+SOURCES += *.cpp
+
diff --git a/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.cpp b/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.cpp
new file mode 100644
index 000000000..edf3829ba
--- /dev/null
+++ b/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.cpp
@@ -0,0 +1,12 @@
+#include "sampleplugin.h"
+
+
+void CXmlSamplePlugin::registerMetaTypes()
+{
+ qRegisterMetaType("BlackMiscTest::Dummy");
+ qDBusRegisterMetaType();
+
+ qRegisterMetaType("BlackMiscTest::DummyNoQ");
+ qDBusRegisterMetaType();
+
+}
diff --git a/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.h b/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.h
new file mode 100644
index 000000000..921247b2b
--- /dev/null
+++ b/samples/blackmiscquantities_dbus_xmlplugin/sampleplugin.h
@@ -0,0 +1,21 @@
+#ifndef SAMPLEPLUGIN_H
+#define SAMPLEPLUGIN_H
+
+#include
+#include
+#include
+#include
+#include "../blackmiscquantities_dbus/dummy.h"
+#include "../blackmiscquantities_dbus/dummynoq.h"
+
+class CXmlSamplePlugin : public QObject, public QDBusCpp2XmlPlugin
+{
+ Q_OBJECT
+ Q_INTERFACES(QDBusCpp2XmlPlugin)
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.DBus.Cpp2XmlPlugin")
+
+public:
+ virtual void registerMetaTypes();
+};
+
+#endif // SAMPLEPLUGIN_H
diff --git a/samples/blackmiscvectorgeo/sample_vector_geo.pro b/samples/blackmiscvectorgeo/sample_vector_geo.pro
index a44bebc4a..134fc28fe 100644
--- a/samples/blackmiscvectorgeo/sample_vector_geo.pro
+++ b/samples/blackmiscvectorgeo/sample_vector_geo.pro
@@ -1,4 +1,4 @@
-QT += core
+QT += core dbus
TARGET = sample_vector_geo
CONFIG += console
diff --git a/samples/interpolator/sample_interpolator.pro b/samples/interpolator/sample_interpolator.pro
index aa2fea407..97ede3805 100644
--- a/samples/interpolator/sample_interpolator.pro
+++ b/samples/interpolator/sample_interpolator.pro
@@ -1,4 +1,4 @@
-QT += core
+QT += core dbus
TARGET = sample_interpolator
CONFIG += console
diff --git a/src/blackcore/blackcore.pro b/src/blackcore/blackcore.pro
index 08d1b0717..98361abb9 100644
--- a/src/blackcore/blackcore.pro
+++ b/src/blackcore/blackcore.pro
@@ -1,5 +1,5 @@
# GUI is required for the matrix classes
-QT += network
+QT += network dbus
TARGET = blackcore
TEMPLATE = lib
diff --git a/src/blackmisc/avallclasses.h b/src/blackmisc/avallclasses.h
new file mode 100644
index 000000000..a1626c962
--- /dev/null
+++ b/src/blackmisc/avallclasses.h
@@ -0,0 +1,18 @@
+/* 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_AVALLCLASSES_H
+#define BLACKMISC_AVALLCLASSES_H
+
+#include "blackmisc/avaltitude.h"
+#include "blackmisc/avheading.h"
+#include "blackmisc/avioadfsystem.h"
+#include "blackmisc/aviocomsystem.h"
+#include "blackmisc/avionavsystem.h"
+#include "blackmisc/aviotransponder.h"
+#include "blackmisc/avtrack.h"
+#include "blackmisc/avverticalpositions.h"
+
+#endif // guard
diff --git a/src/blackmisc/avioadfsystem.h b/src/blackmisc/avioadfsystem.h
index f940aad55..5cff56b5d 100644
--- a/src/blackmisc/avioadfsystem.h
+++ b/src/blackmisc/avioadfsystem.h
@@ -24,9 +24,9 @@ private:
* \param f
* \return
*/
- bool isValidFrequency(CFrequency f) const
+ bool isValidFrequency(PhysicalQuantities::CFrequency f) const
{
- double fr = f.valueRounded(CFrequencyUnit::kHz(), this->m_digits);
+ double fr = f.valueRounded(PhysicalQuantities::CFrequencyUnit::kHz(), this->m_digits);
return fr >= 190.0 && fr <= 1750.0;
}
/*!
@@ -38,7 +38,7 @@ private:
* \param digits
*
*/
- CAdfSystem(bool validate, const QString &name, const CFrequency &activeFrequency, const CFrequency &standbyFrequency, int digits = 3):
+ CAdfSystem(bool validate, const QString &name, const PhysicalQuantities::CFrequency &activeFrequency, const PhysicalQuantities::CFrequency &standbyFrequency, int digits = 3):
CModulator(name, activeFrequency, standbyFrequency, digits)
{
this->validate(validate);
@@ -90,7 +90,7 @@ public:
* \param standbyFrequency
* \param digits
*/
- CAdfSystem(const QString &name, const CFrequency &activeFrequency, const CFrequency &standbyFrequency = CModulator::FrequencyNotSet(), int digits = 3):
+ CAdfSystem(const QString &name, const PhysicalQuantities::CFrequency &activeFrequency, const PhysicalQuantities::CFrequency &standbyFrequency = CModulator::FrequencyNotSet(), int digits = 3):
CModulator(name, activeFrequency, standbyFrequency == CModulator::FrequencyNotSet() ? activeFrequency : standbyFrequency, digits)
{
this->validate(true);
@@ -108,7 +108,7 @@ public:
* \brief Set standby frequency
* \param frequencyKHz
*/
- void setFrequencyActiveKHz(double frequencyKHz)
+ void setFrequencyStandbyKHz(double frequencyKHz)
{
CModulator::setFrequencyStandbyKHz(frequencyKHz);
this->validate(true);
@@ -144,7 +144,7 @@ public:
/*!
* Try to get a ADF unit with given name and frequency. Returns true in case an object
- * has been sucessfully created, otherwise returns a default object.
+ * has been sucessfully created, otherwise returns a default object and false.
* \param adfSystem
* \param name
* \param activeFrequencyKHz
@@ -153,7 +153,7 @@ public:
*/
static bool tryGetAdfSystem(CAdfSystem &adfSystem, const QString &name, double activeFrequencyKHz, double standbyFrequencyKHz = -1)
{
- adfSystem = CAdfSystem(false, name, CFrequency(activeFrequencyKHz, CFrequencyUnit::MHz()), CFrequency(standbyFrequencyKHz < 0 ? activeFrequencyKHz : standbyFrequencyKHz, CFrequencyUnit::MHz()));
+ adfSystem = CAdfSystem(false, name, PhysicalQuantities::CFrequency(activeFrequencyKHz, PhysicalQuantities::CFrequencyUnit::MHz()), PhysicalQuantities::CFrequency(standbyFrequencyKHz < 0 ? activeFrequencyKHz : standbyFrequencyKHz, PhysicalQuantities::CFrequencyUnit::MHz()));
bool s;
if (!(s = adfSystem.validate(false))) adfSystem = CAdfSystem(); // reset to default
return s;
@@ -168,7 +168,7 @@ public:
* \param standbyFrequency
* \return
*/
- static bool tryGetAdfSystem(CAdfSystem &adfSystem, const QString &name, CFrequency activeFrequency, CFrequency standbyFrequency = CModulator::FrequencyNotSet())
+ static bool tryGetAdfSystem(CAdfSystem &adfSystem, const QString &name, PhysicalQuantities::CFrequency activeFrequency, PhysicalQuantities::CFrequency standbyFrequency = CModulator::FrequencyNotSet())
{
adfSystem = CAdfSystem(false, name, activeFrequency, standbyFrequency);
bool s;
@@ -183,7 +183,7 @@ public:
*/
static CAdfSystem GetAdf1System(double activeFrequencyKHz, double standbyFrequencyKHz = -1)
{
- return CAdfSystem(CModulator::NameCom1(), CFrequency(activeFrequencyKHz, CFrequencyUnit::MHz()), CFrequency(standbyFrequencyKHz < 0 ? activeFrequencyKHz : standbyFrequencyKHz, CFrequencyUnit::MHz()));
+ return CAdfSystem(CModulator::NameCom1(), PhysicalQuantities::CFrequency(activeFrequencyKHz, PhysicalQuantities::CFrequencyUnit::MHz()), PhysicalQuantities::CFrequency(standbyFrequencyKHz < 0 ? activeFrequencyKHz : standbyFrequencyKHz, PhysicalQuantities::CFrequencyUnit::MHz()));
}
/*!
* \brief ADF1 unit
@@ -191,7 +191,7 @@ public:
* \param standbyFrequency
* \return
*/
- static CAdfSystem GetAdf1System(CFrequency activeFrequency, CFrequency standbyFrequency = CModulator::FrequencyNotSet())
+ static CAdfSystem GetAdf1System(PhysicalQuantities::CFrequency activeFrequency, PhysicalQuantities::CFrequency standbyFrequency = CModulator::FrequencyNotSet())
{
return CAdfSystem(CModulator::NameCom1(), activeFrequency, standbyFrequency == CModulator::FrequencyNotSet() ? activeFrequency : standbyFrequency);
}
@@ -213,7 +213,7 @@ public:
* \param standbyFrequency
* \return
*/
- static bool tryGetAdf1Unit(CAdfSystem &adfSystem, CFrequency activeFrequency, CFrequency standbyFrequency = CModulator::FrequencyNotSet())
+ static bool tryGetAdf1Unit(CAdfSystem &adfSystem, PhysicalQuantities::CFrequency activeFrequency, PhysicalQuantities::CFrequency standbyFrequency = CModulator::FrequencyNotSet())
{
return CAdfSystem::tryGetAdfSystem(adfSystem, CModulator::NameCom1(), activeFrequency, standbyFrequency);
}
@@ -225,7 +225,7 @@ public:
*/
static CAdfSystem GetAdf2System(double activeFrequencyKHz, double standbyFrequencyKHz = -1)
{
- return CAdfSystem(CModulator::NameCom2(), CFrequency(activeFrequencyKHz, CFrequencyUnit::MHz()), CFrequency(standbyFrequencyKHz < 0 ? activeFrequencyKHz : standbyFrequencyKHz, CFrequencyUnit::MHz()));
+ return CAdfSystem(CModulator::NameCom2(), PhysicalQuantities::CFrequency(activeFrequencyKHz, PhysicalQuantities::CFrequencyUnit::MHz()), PhysicalQuantities::CFrequency(standbyFrequencyKHz < 0 ? activeFrequencyKHz : standbyFrequencyKHz, PhysicalQuantities::CFrequencyUnit::MHz()));
}
/*!
* \brief ADF2 unit
@@ -233,7 +233,7 @@ public:
* \param standbyFrequency
* \return
*/
- static CAdfSystem GetAdf2System(CFrequency activeFrequency, CFrequency standbyFrequency = CModulator::FrequencyNotSet())
+ static CAdfSystem GetAdf2System(PhysicalQuantities::CFrequency activeFrequency, PhysicalQuantities::CFrequency standbyFrequency = CModulator::FrequencyNotSet())
{
return CAdfSystem(CModulator::NameCom2(), activeFrequency, standbyFrequency == CModulator::FrequencyNotSet() ? activeFrequency : standbyFrequency);
}
@@ -255,7 +255,7 @@ public:
* \param standbyFrequency
* \return
*/
- static bool tryGetAdf2System(CAdfSystem &adfSystem, CFrequency activeFrequency, CFrequency standbyFrequency = CModulator::FrequencyNotSet())
+ static bool tryGetAdf2System(CAdfSystem &adfSystem, PhysicalQuantities::CFrequency activeFrequency, PhysicalQuantities::CFrequency standbyFrequency = CModulator::FrequencyNotSet())
{
return CAdfSystem::tryGetAdfSystem(adfSystem, CModulator::NameCom2(), activeFrequency, standbyFrequency);
}
@@ -263,6 +263,6 @@ public:
} // namespace
} // namespace
-
+Q_DECLARE_METATYPE(BlackMisc::Aviation::CAdfSystem)
#endif // BLACKMISC_AVIOADFSYSTEM_H
diff --git a/src/blackmisc/aviobase.h b/src/blackmisc/aviobase.h
index 1973f1ee7..cd739cc35 100644
--- a/src/blackmisc/aviobase.h
+++ b/src/blackmisc/aviobase.h
@@ -22,11 +22,10 @@ namespace Aviation
class CAvionicsBase : public CBaseStreamStringifier
{
-private:
- QString m_name; //!< name of the unit
-
protected:
+ QString m_name; //!< name of the unit
+
/*!
* \brief Default constructor
*/
diff --git a/src/blackmisc/aviocomsystem.h b/src/blackmisc/aviocomsystem.h
index ba558c73c..57857b572 100644
--- a/src/blackmisc/aviocomsystem.h
+++ b/src/blackmisc/aviocomsystem.h
@@ -320,5 +320,6 @@ public:
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::Aviation::CComSystem)
#endif // include guard
diff --git a/src/blackmisc/aviomodulator.cpp b/src/blackmisc/aviomodulator.cpp
index 6bf3bd4b8..d13c083c3 100644
--- a/src/blackmisc/aviomodulator.cpp
+++ b/src/blackmisc/aviomodulator.cpp
@@ -25,17 +25,6 @@ template void CModulator::toggleActiveStandby()
this->m_frequencyStandby = a;
}
-/*
- * String representation
- */
-template QString CModulator::stringForConverter() const
-{
- QString s(this->getName());
- s.append(" Active: ").append(this->m_frequencyActive.unitValueRoundedWithUnit(3));
- s.append(" Standby: ").append(this->m_frequencyStandby.unitValueRoundedWithUnit(3));
- return s;
-}
-
/*
* Assigment operator =
*/
diff --git a/src/blackmisc/aviomodulator.h b/src/blackmisc/aviomodulator.h
index 6a1bd90cd..dcb9e0cf3 100644
--- a/src/blackmisc/aviomodulator.h
+++ b/src/blackmisc/aviomodulator.h
@@ -5,6 +5,8 @@
#ifndef BLACKMISC_AVIOMODULATORUNIT_H
#define BLACKMISC_AVIOMODULATORUNIT_H
+
+#include
#include "blackmisc/aviobase.h"
namespace BlackMisc
@@ -52,7 +54,12 @@ protected:
* \brief String for converter
* \return
*/
- virtual QString stringForConverter() const;
+ virtual QString stringForConverter() const {
+ QString s(this->getName());
+ s.append(" Active: ").append(this->m_frequencyActive.unitValueRoundedWithUnit(3));
+ s.append(" Standby: ").append(this->m_frequencyStandby.unitValueRoundedWithUnit(3));
+ return s;
+ }
/*!
* \brief Set active frequency
@@ -254,6 +261,48 @@ public:
{
this->m_frequencyStandby = frequency;
}
+
+ /*!
+ * \brief Unmarshalling operator >>, DBus to object
+ * \param argument
+ * \param aviationUnit
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, AVIO &aviationUnit) {
+ argument.beginStructure();
+ argument >> aviationUnit.m_frequencyActive;
+ argument >> aviationUnit.m_frequencyStandby;
+ argument >> aviationUnit.m_digits;
+ argument >> aviationUnit.m_name;
+ argument.endStructure();
+ return argument;
+ }
+
+ /*!
+ * \brief Marshalling operator <<, object to DBus
+ * \param argument
+ * \param aviationUnit
+ * \return
+ */
+ friend QDBusArgument &operator<<(QDBusArgument &argument, const AVIO& aviationUnit)
+ {
+ argument.beginStructure();
+ argument << aviationUnit.m_frequencyActive;
+ argument << aviationUnit.m_frequencyStandby;
+ argument << aviationUnit.m_digits;
+ argument << aviationUnit.m_name;
+ argument.endStructure();
+ return argument;
+ }
+
+ /*!
+ * \brief Register metadata
+ */
+ static void registerMetadata()
+ {
+ qRegisterMetaType(typeid(AVIO).name());
+ qDBusRegisterMetaType();
+ }
};
} // namespace
diff --git a/src/blackmisc/avionavsystem.h b/src/blackmisc/avionavsystem.h
index 8beef0be8..b2d448037 100644
--- a/src/blackmisc/avionavsystem.h
+++ b/src/blackmisc/avionavsystem.h
@@ -273,5 +273,6 @@ public:
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::Aviation::CNavSystem)
#endif // BLACKMISC_AVIONAVSYSTEM_H
diff --git a/src/blackmisc/aviotransponder.h b/src/blackmisc/aviotransponder.h
index c742e5240..ffff37c1a 100644
--- a/src/blackmisc/aviotransponder.h
+++ b/src/blackmisc/aviotransponder.h
@@ -315,5 +315,6 @@ public:
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::Aviation::CTransponder)
#endif // BLACKMISC_AVIOTRANSPONDER_H
diff --git a/src/blackmisc/basestreamstringifier.h b/src/blackmisc/basestreamstringifier.h
index 412ff78f6..7557f236f 100644
--- a/src/blackmisc/basestreamstringifier.h
+++ b/src/blackmisc/basestreamstringifier.h
@@ -23,7 +23,7 @@ class CBaseStreamStringifier
*/
friend QDebug operator<<(QDebug debug, const CBaseStreamStringifier &uc)
{
- const CBaseStreamStringifier &sf = uc; // allows to acces protected method
+ const CBaseStreamStringifier &sf = uc; // allows to access protected method
debug << sf.stringForStreaming();
return debug;
}
diff --git a/src/blackmisc/blackmisc.pro b/src/blackmisc/blackmisc.pro
index 6eb4b7008..e2ca61f58 100644
--- a/src/blackmisc/blackmisc.pro
+++ b/src/blackmisc/blackmisc.pro
@@ -1,4 +1,4 @@
-QT += network
+QT += network dbus
TARGET = blackmisc
TEMPLATE = lib
@@ -16,5 +16,4 @@ DEFINES += LOG_IN_FILE
HEADERS += *.h
SOURCES += *.cpp
-
DESTDIR = ../../lib
diff --git a/src/blackmisc/blackmiscfreefunctions.cpp b/src/blackmisc/blackmiscfreefunctions.cpp
new file mode 100644
index 000000000..7634b2843
--- /dev/null
+++ b/src/blackmisc/blackmiscfreefunctions.cpp
@@ -0,0 +1,43 @@
+/* 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 "blackmiscfreefunctions.h"
+
+/*
+ * Metadata for PQs
+ */
+void BlackMisc::PhysicalQuantities::registerMetadata()
+{
+ {
+ CAcceleration::registerMetadata();
+ CAngle::registerMetadata();
+ CFrequency::registerMetadata();
+ CLength::registerMetadata();
+ CMass::registerMetadata();
+ CPressure::registerMetadata();
+ CSpeed::registerMetadata();
+ CTemperature::registerMetadata();
+ CTime::registerMetadata();
+ }
+}
+
+/*
+ * Metadata for aviation
+ */
+void BlackMisc::Aviation::registerMetadata()
+{
+ CComSystem::registerMetadata();
+ CAdfSystem::registerMetadata();
+ CNavSystem::registerMetadata();
+}
+
+/*
+ * Metadata for Blackmisc
+ */
+void BlackMisc::registerMetadata()
+{
+ PhysicalQuantities::registerMetadata();
+ Aviation::registerMetadata();
+}
diff --git a/src/blackmisc/blackmiscfreefunctions.h b/src/blackmisc/blackmiscfreefunctions.h
new file mode 100644
index 000000000..22133fbf0
--- /dev/null
+++ b/src/blackmisc/blackmiscfreefunctions.h
@@ -0,0 +1,44 @@
+/* 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_FREEFUNCTIONS_H
+#define BLACKMISC_FREEFUNCTIONS_H
+#include "avallclasses.h"
+#include "pqallquantities.h"
+
+namespace BlackMisc {
+
+/*!
+ * Free functions in PQ
+ */
+namespace PhysicalQuantities {
+
+/*!
+ * \brief Register all metadata for PQs
+ */
+void registerMetadata();
+
+} // PQ
+
+/*!
+ * Free functions in aviation
+ */
+namespace Aviation {
+
+/*!
+ * \brief Register metadata for aviation
+ */
+void registerMetadata();
+
+} // Aviation
+
+/*!
+ * \brief Register all relevant metadata in BlackMisc
+ */
+void registerMetadata();
+
+} // BlackMisc
+
+#endif // BLACKMISC_FREEFUNCTIONS_H
diff --git a/src/blackmisc/coordinategeodetic.h b/src/blackmisc/coordinategeodetic.h
index 228ab7bed..0e68b021a 100644
--- a/src/blackmisc/coordinategeodetic.h
+++ b/src/blackmisc/coordinategeodetic.h
@@ -16,6 +16,7 @@ namespace Geo
{
/*!
+ * Latitude and longitude interface
* \brief Interface for geodetic ccordinates
*/
class ICoordinateGeodetic
diff --git a/src/blackmisc/pqacceleration.h b/src/blackmisc/pqacceleration.h
index 70962cd79..1a8c4bba4 100644
--- a/src/blackmisc/pqacceleration.h
+++ b/src/blackmisc/pqacceleration.h
@@ -51,4 +51,6 @@ public:
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CAcceleration)
+
#endif // guard
diff --git a/src/blackmisc/pqallquantities.h b/src/blackmisc/pqallquantities.h
index 0381c0b60..1a402e504 100644
--- a/src/blackmisc/pqallquantities.h
+++ b/src/blackmisc/pqallquantities.h
@@ -7,7 +7,7 @@
#define BLACKMISC_PQUNITSALL_H
// All units / quantities, required for the instantiations of the template
-// especially as CRTP is used.
+// especially as CRTP (Curiously recurring template pattern) is used.
// http://www.parashift.com/c++-faq-lite/separate-template-fn-defn-from-decl.html
// http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
@@ -20,5 +20,6 @@
#include "blackmisc/pqangle.h"
#include "blackmisc/pqtime.h"
#include "blackmisc/pqacceleration.h"
+#include "blackmisc/pqunits.h"
#endif // guard
diff --git a/src/blackmisc/pqangle.h b/src/blackmisc/pqangle.h
index 9ba211680..7fabb6df8 100644
--- a/src/blackmisc/pqangle.h
+++ b/src/blackmisc/pqangle.h
@@ -69,4 +69,6 @@ public:
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CAngle)
+
#endif // BLACKMISC_PQANGLE_H
diff --git a/src/blackmisc/pqbase.h b/src/blackmisc/pqbase.h
index ae37c6a8f..3c0dc5451 100644
--- a/src/blackmisc/pqbase.h
+++ b/src/blackmisc/pqbase.h
@@ -8,10 +8,12 @@
#include "blackmisc/basestreamstringifier.h"
#include "blackmisc/debug.h"
+#include
#include
#include
#include
+
namespace BlackMisc
{
namespace PhysicalQuantities
@@ -240,6 +242,19 @@ protected:
*/
typedef double(*UnitConverter)(const CMeasurementUnit &, double);
+ /*!
+ * \brief Get unit from DBus argument
+ * \param argument
+ * \return
+ */
+ static QString unitNameUnmarshalling(const QDBusArgument &argument) {
+ QString type;
+ argument.beginStructure();
+ argument >> type;
+ argument.endStructure();
+ return type;
+ }
+
private:
QString m_name; //!< name, e.g. "meter"
QString m_unitName; //!< unit name, e.g. "m"
@@ -250,8 +265,8 @@ private:
double m_epsilon; //!< values with differences below epsilon are the equal
int m_displayDigits; //!< standard rounding for string conversions
CMeasurementPrefix m_multiplier; //!< multiplier (kilo, Mega)
- UnitConverter m_fromSiConverter; //! allows an arbitrary conversion method as per object
- UnitConverter m_toSiConverter; //! allows an arbitrary conversion method as per object
+ UnitConverter m_fromSiConverter; //! allows an arbitrary conversion method as per object (e.g. angle, sexagesimal)
+ UnitConverter m_toSiConverter; //! allows an arbitrary conversion method as per object (e.g. angle, sexagesimal)
protected:
/*!
@@ -505,6 +520,21 @@ public:
return abs(checkValue) <= this->m_epsilon;
}
+ /*!
+ * Marshalling (to DBus) operator, unmarshalling to be found in specialized classes and
+ * mapping back to static object
+ * \brief Marshalling (to DBus) operator <<
+ * \param argument
+ * \param unit
+ * \return
+ */
+ friend QDBusArgument &operator<<(QDBusArgument &argument, const CMeasurementUnit& unit) {
+ argument.beginStructure();
+ argument << unit.m_unitName;
+ argument.endStructure();
+ return argument;
+ }
+
// --------------------------------------------------------------------
// -- static
// --------------------------------------------------------------------
@@ -518,6 +548,7 @@ public:
static CMeasurementUnit none("none", "", "", false, false, 0.0, CMeasurementPrefix::None(), 0, 0);
return none;
}
+
};
} // namespace
diff --git a/src/blackmisc/pqfrequency.h b/src/blackmisc/pqfrequency.h
index 6a1fd94b4..def61d65d 100644
--- a/src/blackmisc/pqfrequency.h
+++ b/src/blackmisc/pqfrequency.h
@@ -46,4 +46,7 @@ public:
};
} // namespace
} // namespace
+
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CFrequency)
+
#endif // BLACKMISC_PQFREQUENCY_H
diff --git a/src/blackmisc/pqlength.h b/src/blackmisc/pqlength.h
index 41846948b..a5b914174 100644
--- a/src/blackmisc/pqlength.h
+++ b/src/blackmisc/pqlength.h
@@ -46,4 +46,7 @@ public:
};
} // namespace
} // namespace
+
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CLength)
+
#endif // BLACKMISC_PQLENGTH_H
diff --git a/src/blackmisc/pqmass.h b/src/blackmisc/pqmass.h
index f4127174b..414a2c9a7 100644
--- a/src/blackmisc/pqmass.h
+++ b/src/blackmisc/pqmass.h
@@ -51,4 +51,6 @@ public:
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CMass)
+
#endif // guard
diff --git a/src/blackmisc/pqphysicalquantity.h b/src/blackmisc/pqphysicalquantity.h
index 815bc9ca2..9d9701a86 100644
--- a/src/blackmisc/pqphysicalquantity.h
+++ b/src/blackmisc/pqphysicalquantity.h
@@ -10,6 +10,7 @@
#include "blackmisc/pqbase.h"
#include "blackmisc/pqunits.h"
#include "blackmisc/debug.h"
+#include
#include
#include
#include
@@ -21,8 +22,10 @@ namespace PhysicalQuantities
/*!
* \brief A physical quantity such as "5m", "20s", "1500ft/s"
*/
+
template class CPhysicalQuantity : public BlackMisc::CBaseStreamStringifier
{
+
private:
double m_unitValueD; //!< value backed by double
qint32 m_unitValueI; //!< value backed by integer, allows sole integer arithmetic
@@ -236,7 +239,7 @@ public:
qint32 convertedSiValueToInteger() const
{
return static_cast(
- BlackMisc::Math::CMath::round(this->m_convertedSiUnitValueD, 0));
+ BlackMisc::Math::CMath::round(this->m_convertedSiUnitValueD, 0));
}
/*!
@@ -417,6 +420,55 @@ public:
{
return this->isZeroEpsilon() || this->m_unitValueD < 0;
}
+
+ /*!
+ * \brief Unmarshalling operator >>, DBus to object
+ * \param argument
+ * \param pq
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, PQ &pq) {
+ argument.beginStructure();
+ argument >> pq.m_unitValueD;
+ argument >> pq.m_unitValueI;
+ argument >> pq.m_convertedSiUnitValueD;
+ argument >> pq.m_isIntegerBaseValue;
+ argument >> pq.m_unit;
+ argument >> pq.m_conversionSiUnit;
+ argument.endStructure();
+ return argument;
+ }
+
+ /*!
+ * \brief Marshalling operator <<, object to DBus
+ * \param argument
+ * \param pq
+ * \return
+ */
+ friend QDBusArgument &operator<<(QDBusArgument &argument, const PQ& pq)
+ {
+ argument.beginStructure();
+ argument << pq.m_unitValueD;
+ argument << pq.m_unitValueI;
+ argument << pq.m_convertedSiUnitValueD;
+ argument << pq.m_isIntegerBaseValue;
+ argument << pq.m_unit;
+ argument << pq.m_conversionSiUnit;
+ argument.endStructure();
+ return argument;
+ }
+
+ /*!
+ * \brief Register metadata of unit and quantity
+ */
+ static void registerMetadata()
+ {
+ qRegisterMetaType(typeid(MU).name());
+ qDBusRegisterMetaType();
+ qRegisterMetaType(typeid(PQ).name());
+ qDBusRegisterMetaType();
+ }
+
};
} // namespace
diff --git a/src/blackmisc/pqpressure.h b/src/blackmisc/pqpressure.h
index c330d63fe..3cfd5fbdb 100644
--- a/src/blackmisc/pqpressure.h
+++ b/src/blackmisc/pqpressure.h
@@ -47,4 +47,7 @@ public:
};
} // namespace
} // namespace
+
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CPressure)
+
#endif // BLACKMISC_PQPRESSURE_H
diff --git a/src/blackmisc/pqspeed.h b/src/blackmisc/pqspeed.h
index ed4d2968e..e49dd3f2f 100644
--- a/src/blackmisc/pqspeed.h
+++ b/src/blackmisc/pqspeed.h
@@ -18,15 +18,16 @@ namespace PhysicalQuantities
*/
class CSpeed : public CPhysicalQuantity
{
+
public:
/*!
* \brief Default constructor
*/
CSpeed() : CPhysicalQuantity(0, CSpeedUnit::m_s(), CSpeedUnit::m_s()) {}
- /**
+ /*!
*\brief Copy constructor
*/
- CSpeed(const CPhysicalQuantity &speed): CPhysicalQuantity(speed) {}
+ CSpeed(const CSpeed &speed): CPhysicalQuantity(speed) {}
/*!
* \brief Init by int value
* \param value
@@ -44,7 +45,10 @@ public:
*/
virtual ~CSpeed() {}
};
+
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CSpeed)
+
#endif // BLACKMISC_CSPEED_H
diff --git a/src/blackmisc/pqtemperature.h b/src/blackmisc/pqtemperature.h
index 892e88bbf..bec623817 100644
--- a/src/blackmisc/pqtemperature.h
+++ b/src/blackmisc/pqtemperature.h
@@ -46,4 +46,7 @@ public:
};
} // namespace
} // namespace
+
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CTemperature)
+
#endif // BLACKMISC_CTEMPERATURE_H
diff --git a/src/blackmisc/pqtime.h b/src/blackmisc/pqtime.h
index 00f3479a7..9641e8d45 100644
--- a/src/blackmisc/pqtime.h
+++ b/src/blackmisc/pqtime.h
@@ -48,4 +48,6 @@ public:
} // namespace
} // namespace
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CTime)
+
#endif // BLACKMISC_PQTIME_H
diff --git a/src/blackmisc/pqunits.h b/src/blackmisc/pqunits.h
index 736ef86b8..774bf5ebb 100644
--- a/src/blackmisc/pqunits.h
+++ b/src/blackmisc/pqunits.h
@@ -7,8 +7,11 @@
#define BLACKMISC_PQUNITS_H
#include "blackmisc/pqbase.h"
+#include
+#include
#include
+
//
// Used with the template for quantities. This is the reason for
// having all units in one file, since template requires concrete instantiations
@@ -25,7 +28,7 @@ class CLengthUnit : public CMeasurementUnit
{
private:
/*!
- * \brief Constructor Distance unit
+ * \brief Constructor length unit
* \param name
* \param unitName
* \param isSiUnit
@@ -41,6 +44,11 @@ private:
// void
}
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CLengthUnit() : CMeasurementUnit("meter", "m", "distance", true, true) {}
+
/*!
* \brief Copy constructor
* \param otherUnit
@@ -120,7 +128,51 @@ public:
return mi;
}
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CLengthUnit::cm());
+ u.append(CLengthUnit::ft());
+ u.append(CLengthUnit::km());
+ u.append(CLengthUnit::m());
+ u.append(CLengthUnit::mi());
+ u.append(CLengthUnit::miStatute());
+ u.append(CLengthUnit::NM());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CLengthUnit &fromUnitName(const QString &unitName) {
+ QList units = CLengthUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CLengthUnit::m(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CLengthUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CLengthUnit::fromUnitName(unitName);
+ return argument;
+ }
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CLengthUnit)
/*!
* \brief Specialized class for angles (degrees, radian).
@@ -160,6 +212,11 @@ private:
static double conversionSexagesimalFromSi(const CMeasurementUnit &angleUnit, double value);
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CAngleUnit() : CMeasurementUnit("radian", "rad", "angle", true, false) {}
+
/*!
* \brief Copy constructor
* \param otherUnit
@@ -203,7 +260,48 @@ public:
static CAngleUnit deg("segadecimal degree", "°", false, M_PI / 180,
CMeasurementPrefix::One(), 0, 1E-9, CAngleUnit::conversionSexagesimalToSi, CAngleUnit::conversionSexagesimalFromSi); return deg;
}
+
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CAngleUnit::deg());
+ u.append(CAngleUnit::rad());
+ u.append(CAngleUnit::sexagesimalDeg());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CAngleUnit &fromUnitName(const QString &unitName) {
+ QList units = CAngleUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CAngleUnit::rad(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CAngleUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CAngleUnit::fromUnitName(unitName);
+ return argument;
+ }
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CAngleUnit)
/*!
* \brief Specialized class for frequency (hertz, mega hertz, kilo hertz).
@@ -225,6 +323,11 @@ private:
CFrequencyUnit(const QString &name, const QString &unitName, bool isSiUnit, double conversionFactorToSI = 1.0, const CMeasurementPrefix &mulitplier = CMeasurementPrefix::One(), qint32 displayDigits = 2, double epsilon = 1E-9) :
CMeasurementUnit(name, unitName, "frequency", isSiUnit, false, conversionFactorToSI, mulitplier, displayDigits, epsilon) {}
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CFrequencyUnit() : CMeasurementUnit("hertz", "Hz", "frequency", true, false) {}
+
/*!
* \brief Copy constructor
* \param otherUnit
@@ -273,7 +376,49 @@ public:
static CFrequencyUnit GHz("gigahertz", "GHz", true, CMeasurementPrefix::G().getFactor(), CMeasurementPrefix::G(), 2);
return GHz;
}
+
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CFrequencyUnit::GHz());
+ u.append(CFrequencyUnit::Hz());
+ u.append(CFrequencyUnit::kHz());
+ u.append(CFrequencyUnit::MHz());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CFrequencyUnit &fromUnitName(const QString &unitName) {
+ QList units = CFrequencyUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CFrequencyUnit::Hz(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CFrequencyUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CFrequencyUnit::fromUnitName(unitName);
+ return argument;
+ }
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CFrequencyUnit)
/*!
* \brief Specialized class for mass units (kg, lbs).
@@ -295,6 +440,11 @@ private:
CMassUnit(const QString &name, const QString &unitName, bool isSiUnit, bool isSIBaseUnit, double conversionFactorToSI = 1.0, const CMeasurementPrefix &mulitplier = CMeasurementPrefix::One(), qint32 displayDigits = 2, double epsilon = 1E-9) :
CMeasurementUnit(name, unitName, "mass", isSiUnit, isSIBaseUnit, conversionFactorToSI, mulitplier, displayDigits, epsilon) {}
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CMassUnit() : CMeasurementUnit("kilogram", "kg", "mass", true, true, 1.0, CMeasurementPrefix::k(), 1) {}
+
/*!
* \brief Copy constructor
* \param otherUnit
@@ -343,7 +493,50 @@ public:
static CMassUnit lbs("pound", "lb", false, false, 0.45359237, CMeasurementPrefix::One(), 1);
return lbs;
}
+
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CMassUnit::g());
+ u.append(CMassUnit::kg());
+ u.append(CMassUnit::lb());
+ u.append(CMassUnit::t());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CMassUnit &fromUnitName(const QString &unitName) {
+ QList units = CMassUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CMassUnit::kg(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CMassUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CMassUnit::fromUnitName(unitName);
+ return argument;
+ }
+
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CMassUnit)
/*!
* \brief Specialized class for pressure (psi, hPa, bar).
@@ -363,8 +556,13 @@ private:
* \param epsilon
*/
CPressureUnit(const QString &name, const QString &unitName, bool isSiUnit, double conversionFactorToSI = 1.0, const CMeasurementPrefix &mulitplier = CMeasurementPrefix::One(), qint32 displayDigits = 2, double epsilon = 1E-9) :
- CMeasurementUnit(name, unitName, "frequency", isSiUnit, false, conversionFactorToSI, mulitplier, displayDigits, epsilon) {}
+ CMeasurementUnit(name, unitName, "pressure", isSiUnit, false, conversionFactorToSI, mulitplier, displayDigits, epsilon) {}
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CPressureUnit() : CMeasurementUnit("pascal", "Pa", "pressure", true, false) {}
+
/*!
* \brief Copy constructor
* \param otherUnit
@@ -443,7 +641,51 @@ public:
static CPressureUnit inhg("Inch of mercury ", "inHg", false, 3386.5307486631);
return inhg;
}
+
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CPressureUnit::bar());
+ u.append(CPressureUnit::hPa());
+ u.append(CPressureUnit::inHg());
+ u.append(CPressureUnit::inHgFL());
+ u.append(CPressureUnit::mbar());
+ u.append(CPressureUnit::psi());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CPressureUnit &fromUnitName(const QString &unitName) {
+ QList units = CPressureUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CPressureUnit::Pa(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CPressureUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CPressureUnit::fromUnitName(unitName);
+ return argument;
+ }
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CPressureUnit)
/*!
* \brief Specialized class for temperatur units (kelvin, centidegree).
@@ -483,6 +725,11 @@ protected:
virtual double conversionFromSiConversionUnit(double value) const;
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CTemperatureUnit() : CMeasurementUnit("Kelvin", "K", "temperature", true, true) {}
+
/*!
* \brief Copy constructor
* \param otherUnit
@@ -529,7 +776,48 @@ public:
static CTemperatureUnit F("Fahrenheit", "°F", false, false, 5.0 / 9.0, 459.67);
return F;
}
+
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CTemperatureUnit::C());
+ u.append(CTemperatureUnit::F());
+ u.append(CTemperatureUnit::K());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CTemperatureUnit &fromUnitName(const QString &unitName) {
+ QList units = CTemperatureUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CTemperatureUnit::K(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CTemperatureUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CTemperatureUnit::fromUnitName(unitName);
+ return argument;
+ }
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CTemperatureUnit)
/*!
* \brief Specialized class for speed units (m/s, ft/s, NM/h).
@@ -552,6 +840,11 @@ private:
CSpeedUnit(const QString &name, const QString &unitName, bool isSiUnit, bool isSIBaseUnit, double conversionFactorToSI = 1.0, const CMeasurementPrefix &mulitplier = CMeasurementPrefix::One(), qint32 displayDigits = 2, double epsilon = 1E-9) :
CMeasurementUnit(name, unitName, "speed", isSiUnit, isSIBaseUnit, conversionFactorToSI, mulitplier, displayDigits, epsilon) {}
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CSpeedUnit() : CMeasurementUnit("meters/second", "m/s", "speed", true, false) {}
+
/*!
* Constructor, allows to implement methods in base class
* \param otherUnit
@@ -617,7 +910,51 @@ public:
static CSpeedUnit kmh("kilometers/hour", "km/h", false, false, 1.0 / 3.6, CMeasurementPrefix::One(), 1);
return kmh;
}
+
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CSpeedUnit::ft_min());
+ u.append(CSpeedUnit::ft_s());
+ u.append(CSpeedUnit::km_h());
+ u.append(CSpeedUnit::kts());
+ u.append(CSpeedUnit::m_s());
+ u.append(CSpeedUnit::NM_h());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CSpeedUnit &fromUnitName(const QString &unitName) {
+ QList units = CSpeedUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CSpeedUnit::m_s(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CSpeedUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CSpeedUnit::fromUnitName(unitName);
+ return argument;
+ }
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CSpeedUnit)
/*!
* \brief Specialized class for time units (ms, hour, min).
@@ -640,6 +977,10 @@ private:
CTimeUnit(const QString &name, const QString &unitName, bool isSiUnit, bool isSIBaseUnit, double conversionFactorToSI = 1.0, const CMeasurementPrefix &mulitplier = CMeasurementPrefix::One(), qint32 displayDigits = 2, double epsilon = 1E-9) :
CMeasurementUnit(name, unitName, "time", isSiUnit, isSIBaseUnit, conversionFactorToSI, mulitplier, displayDigits, epsilon) {}
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CTimeUnit() : CMeasurementUnit("second", "s", "time", true, true, 1, CMeasurementPrefix::None()) {}
/*!
* Constructor, allows to implement methods in base class
@@ -697,7 +1038,49 @@ public:
return day;
}
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CTimeUnit::d());
+ u.append(CTimeUnit::h());
+ u.append(CTimeUnit::min());
+ u.append(CTimeUnit::ms());
+ u.append(CTimeUnit::s());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CTimeUnit &fromUnitName(const QString &unitName) {
+ QList units = CTimeUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CTimeUnit::s(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CTimeUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CTimeUnit::fromUnitName(unitName);
+ return argument;
+ }
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CTimeUnit)
/*!
* \brief Specialized class for acceleration units (m/s2, ft/s2).
@@ -718,8 +1101,13 @@ private:
* \param epsilon
*/
CAccelerationUnit(const QString &name, const QString &unitName, bool isSiUnit, bool isSIBaseUnit, double conversionFactorToSI = 1.0, const CMeasurementPrefix &mulitplier = CMeasurementPrefix::One(), qint32 displayDigits = 2, double epsilon = 1E-9) :
- CMeasurementUnit(name, unitName, "time", isSiUnit, isSIBaseUnit, conversionFactorToSI, mulitplier, displayDigits, epsilon) {}
+ CMeasurementUnit(name, unitName, "acceleration", isSiUnit, isSIBaseUnit, conversionFactorToSI, mulitplier, displayDigits, epsilon) {}
public:
+ /*!
+ * Default constructor, we do not want this, but required for Qt Metasystem
+ */
+ CAccelerationUnit() : CMeasurementUnit("meter/second²", "m/s²", "acceleration", true, false, 1, CMeasurementPrefix::None(), 1) {}
+
/*!
* Constructor, allows to implement methods in base class
* \param otherUnit
@@ -745,7 +1133,47 @@ public:
static CAccelerationUnit fts2("feet/seconds²", "ft/s²", true, false, 3.28084, CMeasurementPrefix::m(), 0);
return fts2;
}
+
+ /*!
+ * \brief All units
+ * \return
+ */
+ static const QList &units()
+ {
+ static QList u;
+ u.append(CAccelerationUnit::ft_s2());
+ u.append(CAccelerationUnit::m_s2());
+ return u;
+ }
+
+ /*!
+ * \brief Unit from name
+ * \param unitName must be valid!
+ * \return
+ */
+ static const CAccelerationUnit &fromUnitName(const QString &unitName) {
+ QList units = CAccelerationUnit::units();
+ // read only, avoid deep copy
+ for (int i = 0; i < units.size(); ++i) {
+ if (units.at(i).getUnitName() == unitName) return (units.at(i));
+ }
+ qFatal("Illegal unit name");
+ return CAccelerationUnit::m_s2(); // just suppress "not all control paths return a value"
+ }
+
+ /*!
+ * \brief Unmarshalling operator >>, map back to concrete static object
+ * \param argument
+ * \param dummy
+ * \return
+ */
+ friend const QDBusArgument &operator>>(const QDBusArgument &argument, CAccelerationUnit &unit) {
+ QString unitName = CMeasurementUnit::unitNameUnmarshalling(argument);
+ unit = CAccelerationUnit::fromUnitName(unitName);
+ return argument;
+ }
};
+Q_DECLARE_METATYPE(BlackMisc::PhysicalQuantities::CAccelerationUnit)
} // namespace
} // namespace
diff --git a/src/blackmisc_cpp2xml/blackmisc_cpp2xml.pro b/src/blackmisc_cpp2xml/blackmisc_cpp2xml.pro
new file mode 100644
index 000000000..099fcf4d6
--- /dev/null
+++ b/src/blackmisc_cpp2xml/blackmisc_cpp2xml.pro
@@ -0,0 +1,19 @@
+QT += core dbus
+
+TARGET = blackmisc_cpp2xml
+TEMPLATE = lib
+
+CONFIG += plugin
+
+DEPENDPATH += . ../../src/blackmisc
+INCLUDEPATH += . ../../src
+
+LIBS += -L../../lib -lblackmisc
+
+win32:!win32-g++*: PRE_TARGETDEPS += ../../lib/blackmisc.lib
+else: PRE_TARGETDEPS += ../../lib/libblackmisc.a
+
+DESTDIR = ../../bin
+
+HEADERS += *.h
+SOURCES += *.cpp
diff --git a/src/blackmisc_cpp2xml/blackmiscplugin.cpp b/src/blackmisc_cpp2xml/blackmiscplugin.cpp
new file mode 100644
index 000000000..93beffe00
--- /dev/null
+++ b/src/blackmisc_cpp2xml/blackmiscplugin.cpp
@@ -0,0 +1,15 @@
+/* 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 "blackmiscplugin.h"
+#include "blackmisc/blackmiscfreefunctions.h"
+
+/*
+ * Register all metatypes
+ */
+void BlackmiscPlugin::registerMetaTypes()
+{
+ BlackMisc::registerMetadata();
+}
diff --git a/src/blackmisc_cpp2xml/blackmiscplugin.h b/src/blackmisc_cpp2xml/blackmiscplugin.h
new file mode 100644
index 000000000..b57584559
--- /dev/null
+++ b/src/blackmisc_cpp2xml/blackmiscplugin.h
@@ -0,0 +1,28 @@
+/* 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_CPP2XML_H
+#define BLACKMISC_CPP2XML_H
+
+#include
+#include
+
+/*!
+ * \brief Plugin to register all relevant blackmisc classes for QDBusCpp2XmlPlugin
+ */
+class BlackmiscPlugin : public QObject, public QDBusCpp2XmlPlugin
+{
+ Q_OBJECT
+ Q_INTERFACES(QDBusCpp2XmlPlugin)
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.DBus.Cpp2XmlPlugin")
+
+public:
+ /*!
+ * \brief Register Metatypes
+ */
+ virtual void registerMetaTypes();
+};
+
+#endif // BLACKMISC_CPP2XML_H
diff --git a/tests/blackcore/test_blackcore.pro b/tests/blackcore/test_blackcore.pro
index d4076c16a..a64285298 100644
--- a/tests/blackcore/test_blackcore.pro
+++ b/tests/blackcore/test_blackcore.pro
@@ -1,4 +1,4 @@
-QT += core testlib
+QT += core testlib dbus
TARGET = test_blackcore
TEMPLATE = app
diff --git a/tests/blackmisc/test_blackmisc.pro b/tests/blackmisc/test_blackmisc.pro
index dbbab21ba..d9e8ae911 100644
--- a/tests/blackmisc/test_blackmisc.pro
+++ b/tests/blackmisc/test_blackmisc.pro
@@ -1,4 +1,4 @@
-QT += core testlib
+QT += core testlib dbus
TARGET = test_blackmisc
TEMPLATE = app