From a1e055b44f4d5ad4917dad67ee3995052abf7590 Mon Sep 17 00:00:00 2001 From: Marco Gulino Date: Thu, 23 May 2019 17:54:02 +0100 Subject: [PATCH] Replace QPluginLoader with QLibrary, should allow to create statically linked plugins --- cmake/functions.cmake | 4 +++ src/drivers/driver.h | 15 ++++++--- src/drivers/flycapture2/driver.json | 2 +- src/drivers/flycapture2/fc2_driver.cpp | 2 ++ src/drivers/flycapture2/fc2_driver.h | 2 -- src/drivers/iidc/driver.json | 2 +- src/drivers/iidc/iidc_driver.cpp | 3 ++ src/drivers/iidc/iidc_driver.h | 2 -- src/drivers/qhy/driver.json | 2 +- src/drivers/qhy/qhydriver.cpp | 1 + src/drivers/qhy/qhydriver.h | 1 - src/drivers/simulator/driver.json | 2 +- src/drivers/simulator/simulatordriver.cpp | 1 + src/drivers/simulator/simulatordriver.h | 2 +- src/drivers/supporteddrivers.cpp | 39 ++++++++++++++--------- src/drivers/v4l2/driver.json | 2 +- src/drivers/v4l2/v4l2driver.cpp | 1 + src/drivers/v4l2/v4l2driver.h | 1 - src/drivers/zwo_asi/driver.json | 2 +- src/drivers/zwo_asi/zwo_asi_driver.cpp | 2 ++ src/drivers/zwo_asi/zwo_asi_driver.h | 1 - 21 files changed, 55 insertions(+), 34 deletions(-) diff --git a/cmake/functions.cmake b/cmake/functions.cmake index d85949c..da905c4 100644 --- a/cmake/functions.cmake +++ b/cmake/functions.cmake @@ -34,8 +34,12 @@ function(add_driver) set(disabled_drivers ${disabled_drivers} ${add_driver_NAME} CACHE INTERNAL "") return() endif() + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/driver.json ${CMAKE_CURRENT_BINARY_DIR}/driver_${add_driver_NAME}.json) add_library(${add_driver_NAME} MODULE ${add_driver_SRCS}) target_link_libraries(${add_driver_NAME} GuLinux_Qt_Commons GuLinux_c++_Commons drivers planetaryimager-commons ${add_driver_LINK} Qt5::Core Qt5::Qml ${OpenCV_LIBS}) + + set_target_properties(${add_driver_NAME} PROPERTIES PREFIX "driver_") install(TARGETS ${add_driver_NAME} LIBRARY DESTINATION ${drivers_destination}) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${add_driver_NAME}.json DESTINATION ${drivers_destination}) set(enabled_drivers ${enabled_drivers} ${add_driver_NAME} CACHE INTERNAL "") endfunction() diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 0182e19..857a063 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -38,10 +38,15 @@ class Driver : public QObject { virtual Cameras cameras() const = 0; }; typedef QList Drivers; -#define DRIVER_IID "net.gulinux.planetaryimager.driver" -Q_DECLARE_INTERFACE(Driver, DRIVER_IID) -#define DECLARE_DRIVER_PLUGIN \ -Q_INTERFACES(Driver) \ -Q_PLUGIN_METADATA(IID DRIVER_IID FILE "driver.json") +typedef Driver *(*LoadDriverFunction)(); + +#ifdef Q_OS_WIN +#define EXPORT_DECL __declspec(dllexport) +#else +#define EXPORT_DECL +#endif + +#define PLANETARY_IMAGER_DRIVER_LOAD_F "PlanetaryImager_loadDriver" +#define DECLARE_DRIVER_PLUGIN_INIT(DriverClass) extern "C" EXPORT_DECL Driver *PlanetaryImager_loadDriver() { return new DriverClass(); } #endif diff --git a/src/drivers/flycapture2/driver.json b/src/drivers/flycapture2/driver.json index bf83cd0..8107a7a 100644 --- a/src/drivers/flycapture2/driver.json +++ b/src/drivers/flycapture2/driver.json @@ -1,5 +1,5 @@ { "name": "FlyCapture2", "description": "FLIR/Point Grey native API", - "version": "0.8" + "version": "${FULL_VERSION}" } diff --git a/src/drivers/flycapture2/fc2_driver.cpp b/src/drivers/flycapture2/fc2_driver.cpp index fb3b5fb..989ac57 100644 --- a/src/drivers/flycapture2/fc2_driver.cpp +++ b/src/drivers/flycapture2/fc2_driver.cpp @@ -108,3 +108,5 @@ FC2Driver::FC2Driver(): dptr() FC2Driver::~FC2Driver() { } + +DECLARE_DRIVER_PLUGIN_INIT(FC2Driver) diff --git a/src/drivers/flycapture2/fc2_driver.h b/src/drivers/flycapture2/fc2_driver.h index 5d9e241..165e9f0 100644 --- a/src/drivers/flycapture2/fc2_driver.h +++ b/src/drivers/flycapture2/fc2_driver.h @@ -28,8 +28,6 @@ class FC2Driver: public Driver public: - DECLARE_DRIVER_PLUGIN - FC2Driver(); ~FC2Driver(); diff --git a/src/drivers/iidc/driver.json b/src/drivers/iidc/driver.json index 836f38a..7b80cad 100644 --- a/src/drivers/iidc/driver.json +++ b/src/drivers/iidc/driver.json @@ -1,5 +1,5 @@ { "name": "IIDC", "description": "Instrumentation & Industrial Digital Camera, a standard for camera control over FireWire and USB", - "version": "0.8" + "version": "${FULL_VERSION}" } diff --git a/src/drivers/iidc/iidc_driver.cpp b/src/drivers/iidc/iidc_driver.cpp index 7199e97..02eaab5 100644 --- a/src/drivers/iidc/iidc_driver.cpp +++ b/src/drivers/iidc/iidc_driver.cpp @@ -138,3 +138,6 @@ IIDCDriver::IIDCDriver(): dptr() } IIDCDriver::~IIDCDriver() { } + + +DECLARE_DRIVER_PLUGIN_INIT(IIDCDriver) diff --git a/src/drivers/iidc/iidc_driver.h b/src/drivers/iidc/iidc_driver.h index b096987..6fee025 100644 --- a/src/drivers/iidc/iidc_driver.h +++ b/src/drivers/iidc/iidc_driver.h @@ -28,8 +28,6 @@ class IIDCDriver: public Driver public: - DECLARE_DRIVER_PLUGIN - IIDCDriver(); ~IIDCDriver(); diff --git a/src/drivers/qhy/driver.json b/src/drivers/qhy/driver.json index d0b399e..7666804 100644 --- a/src/drivers/qhy/driver.json +++ b/src/drivers/qhy/driver.json @@ -1,5 +1,5 @@ { "name": "QHY", "description": "QHYCCD Cameras driver", - "version": "0.7" + "version": "${FULL_VERSION}" } diff --git a/src/drivers/qhy/qhydriver.cpp b/src/drivers/qhy/qhydriver.cpp index f6351d0..de0ef90 100644 --- a/src/drivers/qhy/qhydriver.cpp +++ b/src/drivers/qhy/qhydriver.cpp @@ -82,3 +82,4 @@ Driver::Cameras QHYDriver::cameras() const return cameras; } +DECLARE_DRIVER_PLUGIN_INIT(QHYDriver) diff --git a/src/drivers/qhy/qhydriver.h b/src/drivers/qhy/qhydriver.h index 88cd6b9..6189655 100644 --- a/src/drivers/qhy/qhydriver.h +++ b/src/drivers/qhy/qhydriver.h @@ -25,7 +25,6 @@ class QHYDriver : public Driver { Q_OBJECT public: - DECLARE_DRIVER_PLUGIN QHYDriver(); virtual ~QHYDriver(); Cameras cameras() const override; diff --git a/src/drivers/simulator/driver.json b/src/drivers/simulator/driver.json index 1b8e6ca..f57135c 100644 --- a/src/drivers/simulator/driver.json +++ b/src/drivers/simulator/driver.json @@ -1,5 +1,5 @@ { "name": "Simulator", "description": "Various simulator imagers, useful mostly for debugging", - "version": "0.7" + "version": "${FULL_VERSION}" } diff --git a/src/drivers/simulator/simulatordriver.cpp b/src/drivers/simulator/simulatordriver.cpp index ceea371..c1e4131 100644 --- a/src/drivers/simulator/simulatordriver.cpp +++ b/src/drivers/simulator/simulatordriver.cpp @@ -65,4 +65,5 @@ SimulatorDriver::SimulatorDriver() +DECLARE_DRIVER_PLUGIN_INIT(SimulatorDriver) #include "simulatordriver.moc" diff --git a/src/drivers/simulator/simulatordriver.h b/src/drivers/simulator/simulatordriver.h index 164aec4..b4a2704 100644 --- a/src/drivers/simulator/simulatordriver.h +++ b/src/drivers/simulator/simulatordriver.h @@ -25,9 +25,9 @@ class SimulatorDriver : public Driver { Q_OBJECT public: - DECLARE_DRIVER_PLUGIN SimulatorDriver(); virtual Driver::Cameras cameras() const; }; + #endif // SIMULATORDRIVER_H diff --git a/src/drivers/supporteddrivers.cpp b/src/drivers/supporteddrivers.cpp index eb7ea05..ecf6e56 100644 --- a/src/drivers/supporteddrivers.cpp +++ b/src/drivers/supporteddrivers.cpp @@ -17,7 +17,7 @@ */ #include "supporteddrivers.h" -#include +#include #include #include #include @@ -30,7 +30,8 @@ using namespace std; DPTR_IMPL(SupportedDrivers) { SupportedDrivers *q; - QList> drivers; + QList> drivers; + void find_drivers(const QString &directory); void load_driver(const QString &filename); list instances() const; @@ -57,18 +58,25 @@ void SupportedDrivers::Private::find_drivers(const QString& directory) void SupportedDrivers::Private::load_driver(const QString& filename) { - auto plugin = make_shared(filename); - qDebug() << "trying " << filename << ": " << plugin->metaData(); - auto getClassName = [](const auto &p) { return p->metaData().value("className"); }; - if(plugin->metaData().value("IID").toString() == DRIVER_IID && - find_if(drivers.begin(), drivers.end(), [&](const auto &p) { return getClassName(p) == getClassName(plugin); }) == drivers.end() ) { - if(plugin->load()) { - auto metadata = QJsonDocument{plugin->metaData()}.toVariant().toMap(); - qInfo() << "driver " << plugin->fileName() << "loaded:" << metadata["className"].toString() << metadata["MetaData"].toMap()["description"].toString(); - drivers.push_back(plugin); - } else { - qWarning() << "Error loading driver " << plugin->fileName() << ": " << plugin->errorString(); - } + if(!filename.startsWith("driver_") && ! filename.endsWith(".json")) { + return; + } + QString library_name = filename; + library_name.remove(".json"); + + qDebug() << "trying " << filename << ": " << library_name; + + auto driver = make_shared(library_name); + if(driver->load()) { + qDebug() << "Driver " << library_name << " loaded successfully"; + if(driver->resolve(PLANETARY_IMAGER_DRIVER_LOAD_F)) { + qDebug() << "PlanetaryImager_loadDriver resolved on " << library_name; + drivers.push_back(driver); + } else { + qWarning() << "Error resolving PlanetaryImager_loadDriver function on " << library_name; + } + } else { + qWarning() << "Error loading driver: " << library_name; } } @@ -101,7 +109,8 @@ list SupportedDrivers::Private::instances() const transform(begin(drivers), end(drivers), back_inserter(instances), [](const auto &p) -> Driver* { qDebug() << "Initializing driver" << p->fileName(); try { - return qobject_cast(p->instance()); + auto driver_load_function = (LoadDriverFunction) p->resolve(PLANETARY_IMAGER_DRIVER_LOAD_F); + return qobject_cast(driver_load_function()); } catch(const Imager::exception &e) { qWarning() << "Error loading driver: " << e.what(); return nullptr; diff --git a/src/drivers/v4l2/driver.json b/src/drivers/v4l2/driver.json index 740462f..e43906d 100644 --- a/src/drivers/v4l2/driver.json +++ b/src/drivers/v4l2/driver.json @@ -1,5 +1,5 @@ { "name": "V4L2", "description": "V4L2 Devices driver (webcams, The Imaging Soure, Celestron Skyris", - "version": "0.7" + "version": "${FULL_VERSION}" } diff --git a/src/drivers/v4l2/v4l2driver.cpp b/src/drivers/v4l2/v4l2driver.cpp index 4080529..fedac00 100644 --- a/src/drivers/v4l2/v4l2driver.cpp +++ b/src/drivers/v4l2/v4l2driver.cpp @@ -66,3 +66,4 @@ Driver::Cameras V4L2Driver::cameras() const } +DECLARE_DRIVER_PLUGIN_INIT(V4L2Driver) diff --git a/src/drivers/v4l2/v4l2driver.h b/src/drivers/v4l2/v4l2driver.h index f54771f..04d4d06 100644 --- a/src/drivers/v4l2/v4l2driver.h +++ b/src/drivers/v4l2/v4l2driver.h @@ -26,7 +26,6 @@ class V4L2Driver : public Driver { Q_OBJECT public: - DECLARE_DRIVER_PLUGIN V4L2Driver(); ~V4L2Driver(); virtual Driver::Cameras cameras() const; diff --git a/src/drivers/zwo_asi/driver.json b/src/drivers/zwo_asi/driver.json index 655b89a..0c46b08 100644 --- a/src/drivers/zwo_asi/driver.json +++ b/src/drivers/zwo_asi/driver.json @@ -1,5 +1,5 @@ { "name": "ASI", "description": "ZWO ASI CMOS Cameras driver", - "version": "0.7" + "version": "${FULL_VERSION}" } diff --git a/src/drivers/zwo_asi/zwo_asi_driver.cpp b/src/drivers/zwo_asi/zwo_asi_driver.cpp index a776313..6b33ae4 100644 --- a/src/drivers/zwo_asi/zwo_asi_driver.cpp +++ b/src/drivers/zwo_asi/zwo_asi_driver.cpp @@ -76,3 +76,5 @@ Driver::Cameras ZWO_ASI_Driver::cameras() const } return cameras; } + +DECLARE_DRIVER_PLUGIN_INIT(ZWO_ASI_Driver) diff --git a/src/drivers/zwo_asi/zwo_asi_driver.h b/src/drivers/zwo_asi/zwo_asi_driver.h index a493049..ef62532 100644 --- a/src/drivers/zwo_asi/zwo_asi_driver.h +++ b/src/drivers/zwo_asi/zwo_asi_driver.h @@ -27,7 +27,6 @@ class ZWO_ASI_Driver : public Driver { Q_OBJECT public: - DECLARE_DRIVER_PLUGIN ZWO_ASI_Driver(); ~ZWO_ASI_Driver(); virtual Driver::Cameras cameras() const;