QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
QGCMapEngine.cpp
Go to the documentation of this file.
1#include "QGCMapEngine.h"
2
3#include <QtCore/QApplicationStatic>
4
5#include "QGCCachedTileSet.h"
6#include "QGCCacheTile.h"
8#include "QGCMapTasks.h"
9#include "QGCTile.h"
10#include "QGCTileCacheWorker.h"
11#include "QGCTileSet.h"
13
14QGC_LOGGING_CATEGORY(QGCMapEngineLog, "QtLocationPlugin.QGCMapEngine")
15
17
22
24 : QObject(parent)
25{
26 qCDebug(QGCMapEngineLog) << this;
27
28 (void) qRegisterMetaType<QGCMapTask::TaskType>("QGCMapTask::TaskType");
29 (void) qRegisterMetaType<QGCTile>("QGCTile");
30 (void) qRegisterMetaType<QGCTile*>("QGCTile*");
31 (void) qRegisterMetaType<QList<QGCTile*>>("QList<QGCTile*>");
32 (void) qRegisterMetaType<QGCTileSet>("QGCTileSet");
33 (void) qRegisterMetaType<QGCTileSet*>("QGCTileSet*");
34 (void) qRegisterMetaType<QGCCacheTile>("QGCCacheTile");
35 (void) qRegisterMetaType<QGCCacheTile*>("QGCCacheTile*");
36}
37
39{
40 shutdown();
41
42 qCDebug(QGCMapEngineLog) << this;
43}
44
46{
47 // Tear down whenever a worker exists, even if init() failed partway and
48 // cleared m_initialized - otherwise the worker thread would leak.
49 if (m_worker) {
50 (void) disconnect(m_worker);
51 m_worker->stop();
52 (void) m_worker->wait();
53 delete m_worker;
54 m_worker = nullptr;
55 }
56 m_initialized = false;
57}
58
60{
61 return _mapEngine();
62}
63
64void QGCMapEngine::init(const QString &databasePath)
65{
66 if (m_initialized) {
67 return;
68 }
69
70 m_initialized = true;
71
72 m_worker = new QGCCacheWorker(this);
73 m_worker->setDatabaseFile(databasePath);
74 (void) connect(m_worker, &QGCCacheWorker::updateTotals, this, &QGCMapEngine::_updateTotals);
75
77 if (!addTask(task)) {
78 task->deleteLater();
79 m_initialized = false;
80 }
81}
82
84{
85 if (!m_worker) {
86 return false;
87 }
88
89 // DirectConnection is intentional: the worker thread uses a custom loop (not
90 // an event loop), so queued connections would never be delivered. The queue
91 // is mutex-protected in enqueueTask, so calling from the main thread is safe.
92 bool result = false;
93 (void) QMetaObject::invokeMethod(m_worker, &QGCCacheWorker::enqueueTask, Qt::DirectConnection, qReturnArg(result), task);
94 return result;
95}
96
97void QGCMapEngine::_updateTotals(quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize)
98{
99 emit updateTotals(totaltiles, totalsize, defaulttiles, defaultsize);
100
101 const quint64 maxSize = static_cast<quint64>(QGeoFileTileCacheQGC::getMaxDiskCacheSetting()) * qPow(1024, 2);
102 if (!m_pruning && (defaultsize > maxSize)) {
103 m_pruning = true;
104
105 const quint64 amountToPrune = defaultsize - maxSize;
106 QGCPruneCacheTask *task = new QGCPruneCacheTask(amountToPrune);
107 (void) connect(task, &QGCPruneCacheTask::pruned, this, &QGCMapEngine::_pruned);
108 if (!addTask(task)) {
109 task->deleteLater();
110 m_pruning = false;
111 }
112 }
113}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
Q_APPLICATION_STATIC(QGCMapEngine, _mapEngine)
QGCMapEngine * getQGCMapEngine()
bool enqueueTask(QGCMapTask *task)
void updateTotals(quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize)
void setDatabaseFile(const QString &path)
QGCMapEngine(QObject *parent=nullptr)
static QGCMapEngine * instance()
bool addTask(QGCMapTask *task)
void updateTotals(quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize)
void init(const QString &databasePath)
static quint32 getMaxDiskCacheSetting()