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 if (m_initialized && m_worker) {
41 (void) disconnect(m_worker);
42 m_worker->stop();
43 (void) m_worker->wait();
44 }
45
46 qCDebug(QGCMapEngineLog) << this;
47}
48
50{
51 return _mapEngine();
52}
53
54void QGCMapEngine::init(const QString &databasePath)
55{
56 if (m_initialized) {
57 return;
58 }
59
60 m_initialized = true;
61
62 m_worker = new QGCCacheWorker(this);
63 m_worker->setDatabaseFile(databasePath);
64 (void) connect(m_worker, &QGCCacheWorker::updateTotals, this, &QGCMapEngine::_updateTotals);
65
67 if (!addTask(task)) {
68 task->deleteLater();
69 m_initialized = false;
70 }
71}
72
74{
75 // DirectConnection is intentional: the worker thread uses a custom loop (not
76 // an event loop), so queued connections would never be delivered. The queue
77 // is mutex-protected in enqueueTask, so calling from the main thread is safe.
78 bool result = false;
79 (void) QMetaObject::invokeMethod(m_worker, &QGCCacheWorker::enqueueTask, Qt::DirectConnection, qReturnArg(result), task);
80 return result;
81}
82
83void QGCMapEngine::_updateTotals(quint32 totaltiles, quint64 totalsize, quint32 defaulttiles, quint64 defaultsize)
84{
85 emit updateTotals(totaltiles, totalsize, defaulttiles, defaultsize);
86
87 const quint64 maxSize = static_cast<quint64>(QGeoFileTileCacheQGC::getMaxDiskCacheSetting()) * qPow(1024, 2);
88 if (!m_pruning && (defaultsize > maxSize)) {
89 m_pruning = true;
90
91 const quint64 amountToPrune = defaultsize - maxSize;
92 QGCPruneCacheTask *task = new QGCPruneCacheTask(amountToPrune);
93 (void) connect(task, &QGCPruneCacheTask::pruned, this, &QGCMapEngine::_pruned);
94 if (!addTask(task)) {
95 task->deleteLater();
96 m_pruning = false;
97 }
98 }
99}
#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()