2828
2929using namespace std ;
3030
31+ struct SupportedDriver {
32+ typedef shared_ptr<SupportedDriver> ptr;
33+ SupportedDriver (const QString &name, const QVariantMap &info, const shared_ptr<QLibrary> &library) : name(name), info(info), library(library) {}
34+ QString name;
35+ QVariantMap info;
36+ shared_ptr<QLibrary> library;
37+ shared_ptr<Driver> _driver;
38+ shared_ptr<Driver> driver ();
39+ };
40+
41+ typedef int (*LoadDriverFunctionReady)();
42+
43+
44+ std::shared_ptr<Driver> SupportedDriver::driver ()
45+ {
46+ if (!_driver) {
47+ qDebug () << " Initializing driver" << library->fileName ();
48+ try {
49+ Driver *driverptr = ((LoadDriverFunction) library->resolve (PLANETARY_IMAGER_DRIVER_LOAD_F))();
50+ qDebug () << " Loaded driver address: " << (uint64_t )driverptr;
51+ _driver = shared_ptr<Driver>(driverptr);
52+ } catch (const Imager::exception &e) {
53+ qWarning () << " Error loading driver: " << e.what ();
54+ }
55+ }
56+ qDebug () << " Driver loaded: " << !!_driver;
57+ return _driver;
58+ }
59+
60+
61+
3162DPTR_IMPL (SupportedDrivers) {
3263 SupportedDrivers *q;
33- QList<shared_ptr<QLibrary>> drivers ;
64+ QList<SupportedDriver::ptr> supported_drivers ;
3465
3566 void find_drivers (const QString &directory);
3667 void load_driver (const QString &filename);
37- list<Driver*> instances ();
38- list<Driver*> _instances;
3968};
4069
4170
@@ -71,13 +100,21 @@ void SupportedDrivers::Private::load_driver(const QString& filename)
71100 if (driver->load ()) {
72101 qDebug () << " [OK] Driver " << library_name << " loaded successfully" ;
73102 if (driver->resolve (PLANETARY_IMAGER_DRIVER_LOAD_F)) {
103+ QFile json_file (filename);
104+ json_file.open (QIODevice::ReadOnly);
105+ QVariantMap driver_info = QJsonDocument::fromJson (json_file.readAll ()).toVariant ().toMap ();
106+
74107 qDebug () << " [OK] PlanetaryImager_loadDriver resolved on " << library_name;
75- drivers.push_back (driver);
108+ supported_drivers.push_back (make_shared<SupportedDriver>(
109+ QFileInfo (library_name).baseName (),
110+ driver_info,
111+ driver
112+ ));
76113 } else {
77- qWarning () << " [ERR] Error resolving PlanetaryImager_loadDriver function on " << library_name;
114+ qWarning () << " [ERR] Error resolving PlanetaryImager_loadDriver function on " << library_name << " : " << driver-> errorString () ;
78115 }
79116 } else {
80- qWarning () << " [ERR] Error loading driver: " << library_name;
117+ qWarning () << " [ERR] Error loading driver" << library_name << " : " << driver-> errorString () ;
81118 }
82119}
83120
@@ -88,37 +125,29 @@ SupportedDrivers::~SupportedDrivers()
88125
89126void SupportedDrivers::aboutToQuit ()
90127{
91- for (auto driver: d->instances ())
92- driver->aboutToQuit ();
128+ for (auto supported_driver: d->supported_drivers )
129+ if (supported_driver->driver ()) {
130+ supported_driver->driver ()->aboutToQuit ();
131+ }
93132}
94133
95134
96135Driver::Cameras SupportedDrivers::cameras () const
97136{
98137 qDebug () << " Detecting active cameras" ;
99138 Cameras cameras;
100- for (auto driver: d->instances ()) {
101- if (driver)
102- cameras.append (driver->cameras ());
139+ for (auto supported_driver: d->supported_drivers ) {
140+ qDebug () << " Checking cameras on driver " << supported_driver->name ;
141+ if (supported_driver->driver ()) {
142+ auto driver_cameras = supported_driver->driver ()->cameras ();
143+ qDebug () << " Found" << driver_cameras.size () << " on driver" << supported_driver->name ;
144+ cameras.append (driver_cameras);
145+ } else {
146+ qWarning () << " Driver" << supported_driver->name << " doesn't seem to be correctly loaded" ;
147+ }
103148 }
104149 qDebug () << " Detected cameras: " << cameras.size ();
105150 return cameras;
106151}
107152
108- list<Driver *> SupportedDrivers::Private::instances ()
109- {
110- if (_instances.size () == 0 ) {
111- qDebug () << " Initialising driver instances" ;
112- transform (begin (drivers), end (drivers), back_inserter (_instances), [](const auto &p) -> Driver* {
113- qDebug () << " Initializing driver" << p->fileName ();
114- try {
115- auto driver_load_function = (LoadDriverFunction) p->resolve (PLANETARY_IMAGER_DRIVER_LOAD_F);
116- return qobject_cast<Driver*>(driver_load_function ());
117- } catch (const Imager::exception &e) {
118- qWarning () << " Error loading driver: " << e.what ();
119- return nullptr ;
120- }
121- });
122- }
123- return _instances;
124- }
153+
0 commit comments