Commit e828430a authored by Valentin Platzgummer's avatar Valentin Platzgummer

wimaBride converted to singelton and removed from qml, progess locking moded...

wimaBride converted to singelton and removed from qml, progess locking moded to wima planer, wima plan data mod.
parent 8cbb74a1
...@@ -419,6 +419,7 @@ FORMS += \ ...@@ -419,6 +419,7 @@ FORMS += \
HEADERS += \ HEADERS += \
src/Wima/CircularSurvey.h \ src/Wima/CircularSurvey.h \
src/Wima/GenericSingelton.h \
src/Wima/Geometry/GenericCircle.h \ src/Wima/Geometry/GenericCircle.h \
src/Wima/RoutingThread.h \ src/Wima/RoutingThread.h \
src/Wima/Snake/clipper/clipper.hpp \ src/Wima/Snake/clipper/clipper.hpp \
...@@ -464,6 +465,7 @@ HEADERS += \ ...@@ -464,6 +465,7 @@ HEADERS += \
src/Wima/WaypointManager/Slicer.h \ src/Wima/WaypointManager/Slicer.h \
src/Wima/WaypointManager/Utils.h \ src/Wima/WaypointManager/Utils.h \
src/Wima/WimaBridge.h \ src/Wima/WimaBridge.h \
src/Wima/call_once.h \
src/api/QGCCorePlugin.h \ src/api/QGCCorePlugin.h \
src/api/QGCOptions.h \ src/api/QGCOptions.h \
src/api/QGCSettings.h \ src/api/QGCSettings.h \
...@@ -510,6 +512,7 @@ HEADERS += \ ...@@ -510,6 +512,7 @@ HEADERS += \
src/comm/utilities.h src/comm/utilities.h
SOURCES += \ SOURCES += \
src/Wima/CircularSurvey.cc \ src/Wima/CircularSurvey.cc \
src/Wima/GenericSingelton.cpp \
src/Wima/RoutingThread.cpp \ src/Wima/RoutingThread.cpp \
src/Wima/Snake/clipper/clipper.cpp \ src/Wima/Snake/clipper/clipper.cpp \
src/Wima/Snake/snake.cpp \ src/Wima/Snake/snake.cpp \
......
...@@ -117,10 +117,6 @@ QGCView { ...@@ -117,10 +117,6 @@ QGCView {
WimaController { WimaController {
id: wimaController id: wimaController
Component.onCompleted: {
wBridge.wimaController = Qt.binding(function() { return wimaController.thisPointer() })
}
onForceUploadConfirm: { onForceUploadConfirm: {
_guidedController.confirmAction( _guidedController.confirmAction(
_guidedController.actionForceUpload) _guidedController.actionForceUpload)
......
...@@ -90,7 +90,6 @@ ...@@ -90,7 +90,6 @@
#include "ViewWidgetController.h" #include "ViewWidgetController.h"
#include "VisualMissionItem.h" #include "VisualMissionItem.h"
#include "Wima/Snake/NemoInterface.h" #include "Wima/Snake/NemoInterface.h"
#include "Wima/WimaBridge.h"
#include "Wima/WimaController.h" #include "Wima/WimaController.h"
#include "Wima/WimaPlaner.h" #include "Wima/WimaPlaner.h"
...@@ -520,7 +519,6 @@ void QGCApplication::_initCommon(void) { ...@@ -520,7 +519,6 @@ void QGCApplication::_initCommon(void) {
// Wima // Wima
qmlRegisterType<WimaController>("Wima", 1, 0, "WimaController"); qmlRegisterType<WimaController>("Wima", 1, 0, "WimaController");
qmlRegisterType<WimaPlaner>("Wima", 1, 0, "WimaPlaner"); qmlRegisterType<WimaPlaner>("Wima", 1, 0, "WimaPlaner");
qmlRegisterType<WimaBridge>("Wima", 1, 0, "WimaBridge");
qmlRegisterType<NemoInterface>("Wima", 1, 0, "NemoInterface"); qmlRegisterType<NemoInterface>("Wima", 1, 0, "NemoInterface");
// Register Qml Singletons // Register Qml Singletons
......
#pragma once
#include "call_once.h"
#include <QScopedPointer>
#include <QtGlobal>
template <class T> class GenericSingelton {
private:
typedef T *(*CreateInstanceFunction)();
public:
static T *instance(CreateInstanceFunction create);
private:
static void init();
GenericSingelton();
~GenericSingelton();
Q_DISABLE_COPY(GenericSingelton)
static QBasicAtomicPointer<void> create;
static QBasicAtomicInt flag;
static QBasicAtomicPointer<void> tptr;
bool inited;
};
template <class T>
T *GenericSingelton<T>::instance(CreateInstanceFunction create) {
GenericSingelton::create.store(reinterpret_cast<void *>(create));
qCallOnce(init, flag);
return (T *)tptr.load();
}
template <class T> void GenericSingelton<T>::init() {
static GenericSingelton singleton;
if (singleton.inited) {
CreateInstanceFunction createFunction =
(CreateInstanceFunction)GenericSingelton::create.load();
tptr.store(createFunction());
}
}
template <class T> GenericSingelton<T>::GenericSingelton() { inited = true; }
template <class T> GenericSingelton<T>::~GenericSingelton() {
T *createdTptr = (T *)tptr.fetchAndStoreOrdered(nullptr);
if (createdTptr) {
delete createdTptr;
}
create.store(nullptr);
}
template <class T>
QBasicAtomicPointer<void>
GenericSingelton<T>::create = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
template <class T>
QBasicAtomicInt GenericSingelton<T>::flag =
Q_BASIC_ATOMIC_INITIALIZER(CallOnce::CO_Request);
template <class T>
QBasicAtomicPointer<void>
GenericSingelton<T>::tptr = Q_BASIC_ATOMIC_INITIALIZER(nullptr);
...@@ -38,7 +38,7 @@ void WimaMeasurementAreaData::setTileData(const TileData &d) { ...@@ -38,7 +38,7 @@ void WimaMeasurementAreaData::setTileData(const TileData &d) {
} }
void WimaMeasurementAreaData::setProgress(const QVector<int> &d) { void WimaMeasurementAreaData::setProgress(const QVector<int> &d) {
if (this->_progress != d) { if (this->_progress != d && d.size() == this->_tileData.tiles.count()) {
this->_progress = d; this->_progress = d;
emit progressChanged(); emit progressChanged();
} }
......
...@@ -48,7 +48,6 @@ public: ...@@ -48,7 +48,6 @@ public:
void setAutoPublish(bool ap); void setAutoPublish(bool ap);
void setHoldProgress(bool hp); void setHoldProgress(bool hp);
bool lockProgress();
void publishTileData(); void publishTileData();
NemoInterface::STATUS status(); NemoInterface::STATUS status();
...@@ -77,7 +76,6 @@ private: ...@@ -77,7 +76,6 @@ private:
QGeoCoordinate ENUOrigin; QGeoCoordinate ENUOrigin;
mutable std::shared_timed_mutex ENUOriginMutex; mutable std::shared_timed_mutex ENUOriginMutex;
QNemoProgress qProgress; QNemoProgress qProgress;
QNemoProgress qProgressHolded;
mutable std::shared_timed_mutex progressMutex; mutable std::shared_timed_mutex progressMutex;
NemoInterface::STATUS status_; NemoInterface::STATUS status_;
TimePoint nextTimeout; TimePoint nextTimeout;
...@@ -88,7 +86,6 @@ private: ...@@ -88,7 +86,6 @@ private:
// Internals // Internals
std::atomic_bool running_; std::atomic_bool running_;
std::atomic_bool lockProgress_;
std::atomic_bool topicServiceSetupDone; std::atomic_bool topicServiceSetupDone;
ROSBridgePtr pRosBridge; ROSBridgePtr pRosBridge;
QTimer loopTimer; QTimer loopTimer;
...@@ -110,8 +107,7 @@ StatusMap statusMap{ ...@@ -110,8 +107,7 @@ StatusMap statusMap{
NemoInterface::Impl::Impl(NemoInterface *p) NemoInterface::Impl::Impl(NemoInterface *p)
: status_(STATUS::NOT_CONNECTED), nextTimeout(TimePoint::max()), : status_(STATUS::NOT_CONNECTED), nextTimeout(TimePoint::max()),
running_(false), lockProgress_(false), topicServiceSetupDone(false), running_(false), topicServiceSetupDone(false), parent(p) {
parent(p) {
// ROS Bridge. // ROS Bridge.
WimaSettings *wimaSettings = WimaSettings *wimaSettings =
...@@ -188,24 +184,6 @@ bool NemoInterface::Impl::hasTileData(const TileData &tileData) const { ...@@ -188,24 +184,6 @@ bool NemoInterface::Impl::hasTileData(const TileData &tileData) const {
return this->tileData == tileData; return this->tileData == tileData;
} }
void NemoInterface::Impl::setHoldProgress(bool hp) {
if (this->lockProgress_ != hp) {
this->lockProgress_ = hp;
emit this->parent->lockProgressChanged();
if (!this->lockProgress_) {
UniqueLock lk(this->progressMutex);
if (this->qProgress != this->qProgressHolded) {
this->qProgressHolded = this->qProgress;
lk.unlock();
emit this->parent->progressChanged();
}
}
}
}
bool NemoInterface::Impl::lockProgress() { return this->lockProgress_.load(); }
void NemoInterface::Impl::publishTileData() { void NemoInterface::Impl::publishTileData() {
std::lock(this->ENUOriginMutex, this->tilesENUMutex); std::lock(this->ENUOriginMutex, this->tilesENUMutex);
UniqueLock lk1(this->ENUOriginMutex, std::adopt_lock); UniqueLock lk1(this->ENUOriginMutex, std::adopt_lock);
...@@ -225,7 +203,7 @@ NemoInterface::STATUS NemoInterface::Impl::status() { ...@@ -225,7 +203,7 @@ NemoInterface::STATUS NemoInterface::Impl::status() {
QVector<int> NemoInterface::Impl::progress() { QVector<int> NemoInterface::Impl::progress() {
SharedLock lk(this->progressMutex); SharedLock lk(this->progressMutex);
return this->qProgressHolded.progress(); return this->qProgress.progress();
} }
bool NemoInterface::Impl::running() { return this->running_.load(); } bool NemoInterface::Impl::running() { return this->running_.load(); }
...@@ -263,23 +241,17 @@ bool NemoInterface::Impl::doTopicServiceSetup() { ...@@ -263,23 +241,17 @@ bool NemoInterface::Impl::doTopicServiceSetup() {
UniqueLock lk3(this->ENUOriginMutex, std::adopt_lock); UniqueLock lk3(this->ENUOriginMutex, std::adopt_lock);
int requiredSize = this->tilesENU.polygons().size(); int requiredSize = this->tilesENU.polygons().size();
auto hold = this->lockProgress_.load();
auto &progressMsg = this->qProgress; auto &progressMsg = this->qProgress;
if (!nemo_msgs::progress::fromJson(*pDoc, progressMsg) || if (!nemo_msgs::progress::fromJson(*pDoc, progressMsg) ||
progressMsg.progress().size() != progressMsg.progress().size() !=
requiredSize) { // Some error occured. requiredSize) { // Some error occured.
progressMsg.progress().clear(); progressMsg.progress().clear();
qgcApp()->showMessage("Invalid progress message received."); qgcApp()->showMessage("Invalid progress message received.");
} else if (!hold) {
this->qProgressHolded = this->qProgress;
} }
lk1.unlock(); lk1.unlock();
lk2.unlock(); lk2.unlock();
lk3.unlock(); lk3.unlock();
if (!hold) {
emit this->parent->progressChanged();
}
}); });
// Subscribe /nemo/heartbeat. // Subscribe /nemo/heartbeat.
...@@ -452,10 +424,6 @@ bool NemoInterface::hasTileData(const TileData &tileData) const { ...@@ -452,10 +424,6 @@ bool NemoInterface::hasTileData(const TileData &tileData) const {
return this->pImpl->hasTileData(tileData); return this->pImpl->hasTileData(tileData);
} }
void NemoInterface::setHoldProgress(bool hp) {
this->pImpl->setHoldProgress(hp);
}
int NemoInterface::status() const { return integral(this->pImpl->status()); } int NemoInterface::status() const { return integral(this->pImpl->status()); }
NemoInterface::STATUS NemoInterface::statusEnum() const { NemoInterface::STATUS NemoInterface::statusEnum() const {
...@@ -473,5 +441,3 @@ QString NemoInterface::editorQml() { ...@@ -473,5 +441,3 @@ QString NemoInterface::editorQml() {
} }
bool NemoInterface::running() { return this->pImpl->running(); } bool NemoInterface::running() { return this->pImpl->running(); }
bool NemoInterface::lockProgress() { return this->pImpl->lockProgress(); }
...@@ -29,8 +29,6 @@ public: ...@@ -29,8 +29,6 @@ public:
Q_PROPERTY(QVector<int> progress READ progress NOTIFY progressChanged) Q_PROPERTY(QVector<int> progress READ progress NOTIFY progressChanged)
Q_PROPERTY(QString editorQml READ editorQml CONSTANT) Q_PROPERTY(QString editorQml READ editorQml CONSTANT)
Q_PROPERTY(bool running READ running NOTIFY runningChanged) Q_PROPERTY(bool running READ running NOTIFY runningChanged)
Q_PROPERTY(bool lockProgress READ lockProgress WRITE setHoldProgress NOTIFY
lockProgressChanged)
Q_INVOKABLE void start(); Q_INVOKABLE void start();
Q_INVOKABLE void stop(); Q_INVOKABLE void stop();
...@@ -48,13 +46,11 @@ public: ...@@ -48,13 +46,11 @@ public:
QVector<int> progress() const; QVector<int> progress() const;
QString editorQml(); QString editorQml();
bool running(); bool running();
bool lockProgress();
signals: signals:
void statusChanged(); void statusChanged();
void progressChanged(); void progressChanged();
void runningChanged(); void runningChanged();
void lockProgressChanged();
private: private:
PImpl pImpl; PImpl pImpl;
......
#include "WimaBridge.h" #include "WimaBridge.h"
#include "WimaController.h" #include "GenericSingelton.h"
WimaBridge::WimaBridge(QObject *parent) : QObject(parent) {} WimaBridge::WimaBridge(QObject *parent) : QObject(parent) {}
WimaController *WimaBridge::wimaController() { return _wimaController; } WimaBridge *WimaBridge::createInstance() { return new WimaBridge(); }
WimaPlaner *WimaBridge::wimaPlaner() { return _wimaPlaner; } WimaBridge::~WimaBridge() {}
WimaBridge *WimaBridge::thisPointer() { return this; } WimaBridge *WimaBridge::instance() {
return GenericSingelton<WimaBridge>::instance(WimaBridge::createInstance);
void WimaBridge::setWimaController(WimaController *controller) {
if (_wimaController != controller) {
_wimaController = controller;
emit wimaControllerChanged(_wimaController);
}
} }
void WimaBridge::setWimaPlaner(WimaPlaner *planer) { const WimaPlanData &WimaBridge::planData() const { return this->planData_; }
if (_wimaPlaner != planer) {
_wimaPlaner = planer; const QVector<int> &WimaBridge::progress() const { return this->progress_; }
emit wimaPlanerChanged(_wimaPlaner); void WimaBridge::setProgress(const QVector<int> &p) {
if (this->progress_ != p) {
this->progress_ = p;
emit progressChanged();
} }
} }
bool WimaBridge::setWimaPlanData(QSharedPointer<WimaPlanData> planData) { void WimaBridge::setPlanData(const WimaPlanData &planData) {
if (_wimaController != nullptr) { if (this->planData_ != planData) {
return _wimaController->setWimaPlanData(planData); this->planData_ = planData;
emit planDataChanged();
} }
return false;
} }
...@@ -11,34 +11,27 @@ class WimaPlaner; ...@@ -11,34 +11,27 @@ class WimaPlaner;
//! //!
//! \brief The WimaBridge class //! \brief The WimaBridge class
//! //!
//! A bridge establishing a link between WimaController and WimaPlaner //! A singelton bridge establishing a link between WimaController and WimaPlaner
class WimaBridge : public QObject { class WimaBridge : public QObject {
Q_OBJECT Q_OBJECT
public:
WimaBridge(QObject *parent = nullptr); WimaBridge(QObject *parent = nullptr);
WimaBridge(WimaBridge &other) = delete; WimaBridge(WimaBridge &other) = delete;
static WimaBridge *createInstance();
Q_PROPERTY(WimaPlaner *wimaPlaner READ wimaPlaner WRITE setWimaPlaner NOTIFY public:
wimaPlanerChanged) ~WimaBridge();
Q_PROPERTY(WimaController *wimaController READ wimaController WRITE static WimaBridge *instance();
setWimaController NOTIFY wimaControllerChanged) const WimaPlanData &planData() const;
const QVector<int> &progress() const;
WimaController *wimaController();
WimaPlaner *wimaPlaner();
Q_INVOKABLE WimaBridge *thisPointer();
void setWimaController(WimaController *controller);
void setWimaPlaner(WimaPlaner *planer);
signals:
void wimaControllerChanged(WimaController *controller);
void wimaPlanerChanged(WimaPlaner *planer);
public slots: public slots:
bool setWimaPlanData(QSharedPointer<WimaPlanData> planData); void setPlanData(const WimaPlanData &planData);
void setProgress(const QVector<int> &p);
signals:
void planDataChanged();
void progressChanged();
private: private:
WimaController *_wimaController; WimaPlanData planData_;
WimaPlaner *_wimaPlaner; QVector<int> progress_;
}; };
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
#include "SettingsManager.h" #include "SettingsManager.h"
#include "SimpleMissionItem.h" #include "SimpleMissionItem.h"
#include "WimaBridge.h"
#include "WimaPlanData.h"
#include "WimaSettings.h" #include "WimaSettings.h"
#include "Snake/QNemoHeartbeat.h" #include "Snake/QNemoHeartbeat.h"
...@@ -69,6 +71,12 @@ WimaController::WimaController(QObject *parent) ...@@ -69,6 +71,12 @@ WimaController::WimaController(QObject *parent)
connect(&_eventTimer, &QTimer::timeout, this, connect(&_eventTimer, &QTimer::timeout, this,
&WimaController::_eventTimerHandler); &WimaController::_eventTimerHandler);
_eventTimer.start(EVENT_TIMER_INTERVAL); _eventTimer.start(EVENT_TIMER_INTERVAL);
// PlanData and Progress.
connect(WimaBridge::instance(), &WimaBridge::planDataChanged, this,
&WimaController::planDataChangedHandler);
connect(WimaBridge::instance(), &WimaBridge::progressChanged, this,
&WimaController::progressChangedHandler);
} }
PlanMasterController *WimaController::masterController() { PlanMasterController *WimaController::masterController() {
...@@ -214,7 +222,8 @@ bool WimaController::_calcShortestPath(const QGeoCoordinate &start, ...@@ -214,7 +222,8 @@ bool WimaController::_calcShortestPath(const QGeoCoordinate &start,
return retVal; return retVal;
} }
bool WimaController::setWimaPlanData(QSharedPointer<WimaPlanData> planData) { void WimaController::planDataChangedHandler() {
// reset visual items // reset visual items
_areas.clear(); _areas.clear();
_measurementArea = WimaMeasurementAreaData(); _measurementArea = WimaMeasurementAreaData();
...@@ -228,8 +237,9 @@ bool WimaController::setWimaPlanData(QSharedPointer<WimaPlanData> planData) { ...@@ -228,8 +237,9 @@ bool WimaController::setWimaPlanData(QSharedPointer<WimaPlanData> planData) {
_planDataValid = false; _planDataValid = false;
auto planData = WimaBridge::instance()->planData();
// extract list with WimaAreas // extract list with WimaAreas
QList<const WimaAreaData *> areaList = planData->areaList(); QList<const WimaAreaData *> areaList = planData.areaList();
int areaCounter = 0; int areaCounter = 0;
const int numAreas = 4; // extract only numAreas Areas, if there are more const int numAreas = 4; // extract only numAreas Areas, if there are more
...@@ -279,7 +289,7 @@ bool WimaController::setWimaPlanData(QSharedPointer<WimaPlanData> planData) { ...@@ -279,7 +289,7 @@ bool WimaController::setWimaPlanData(QSharedPointer<WimaPlanData> planData) {
if (areaCounter != numAreas) { if (areaCounter != numAreas) {
Q_ASSERT(false); Q_ASSERT(false);
return false; return;
} }
emit visualItemsChanged(); emit visualItemsChanged();
...@@ -288,7 +298,10 @@ bool WimaController::setWimaPlanData(QSharedPointer<WimaPlanData> planData) { ...@@ -288,7 +298,10 @@ bool WimaController::setWimaPlanData(QSharedPointer<WimaPlanData> planData) {
_serviceArea.depot().latitude(), _serviceArea.depot().longitude(), 0)); _serviceArea.depot().latitude(), _serviceArea.depot().longitude(), 0));
_planDataValid = true; _planDataValid = true;
return true; }
void WimaController::progressChangedHandler() {
_measurementArea.setProgress(WimaBridge::instance()->progress());
} }
WimaController *WimaController::thisPointer() { return this; } WimaController *WimaController::thisPointer() { return this; }
......
...@@ -10,8 +10,6 @@ ...@@ -10,8 +10,6 @@
#include "Geometry/WimaMeasurementAreaData.h" #include "Geometry/WimaMeasurementAreaData.h"
#include "Geometry/WimaServiceAreaData.h" #include "Geometry/WimaServiceAreaData.h"
#include "WimaPlanData.h"
#include "SettingsFact.h" #include "SettingsFact.h"
#include "Geometry/GeoPoint3D.h" #include "Geometry/GeoPoint3D.h"
...@@ -69,7 +67,6 @@ public: ...@@ -69,7 +67,6 @@ public:
// Property setters // Property setters
void setMasterController(PlanMasterController *masterController); void setMasterController(PlanMasterController *masterController);
void setMissionController(MissionController *missionController); void setMissionController(MissionController *missionController);
bool setWimaPlanData(QSharedPointer<WimaPlanData> planData);
// Member Methodes // Member Methodes
Q_INVOKABLE WimaController *thisPointer(); Q_INVOKABLE WimaController *thisPointer();
...@@ -107,7 +104,8 @@ signals: ...@@ -107,7 +104,8 @@ signals:
void forceUploadConfirm(void); void forceUploadConfirm(void);
private slots: private slots:
void planDataChangedHandler();
void progressChangedHandler();
bool _calcShortestPath(const QGeoCoordinate &start, bool _calcShortestPath(const QGeoCoordinate &start,
const QGeoCoordinate &destination, const QGeoCoordinate &destination,
QVector<QGeoCoordinate> &path); QVector<QGeoCoordinate> &path);
......
...@@ -31,9 +31,6 @@ WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other) { ...@@ -31,9 +31,6 @@ WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other) {
} }
} }
// copy mission items
_missionItems = other.missionItems();
return *this; return *this;
} }
...@@ -89,37 +86,25 @@ void WimaPlanData::append(const WimaMeasurementAreaData &areaData) { ...@@ -89,37 +86,25 @@ void WimaPlanData::append(const WimaMeasurementAreaData &areaData) {
} }
} }
void WimaPlanData::setTransects(const QList<QList<QGeoCoordinate>> &transects) {
_transects = transects;
}
void WimaPlanData::append(const QList<MissionItem *> &missionItems) {
for (auto *item : missionItems) {
item->setParent(this);
_missionItems.append(item);
}
}
/*! /*!
* \fn void WimaPlanData::append(const WimaServiceAreaData &areaData) * \fn void WimaPlanData::append(const WimaServiceAreaData &areaData)
* *
* Clears all stored objects * Clears all stored objects
*/ */
void WimaPlanData::clear() { void WimaPlanData::clear() { _areaList.clear(); }
_areaList.clear();
_missionItems.clear();
}
const QList<const WimaAreaData *> &WimaPlanData::areaList() const { const QList<const WimaAreaData *> &WimaPlanData::areaList() const {
return _areaList; return _areaList;
} }
const QList<QList<QGeoCoordinate>> &WimaPlanData::transects() const { bool WimaPlanData::operator==(const WimaPlanData &other) const {
return _transects; return this->_joinedArea == other._joinedArea &&
this->_measurementArea == other._measurementArea &&
this->_corridor == other._corridor &&
this->_serviceArea == other._serviceArea;
} }
bool WimaPlanData::operator!=(const WimaPlanData &other) const {
const QList<MissionItem *> &WimaPlanData::missionItems() const { return !(*this == other);
return _missionItems;
} }
/*! /*!
......
...@@ -35,6 +35,9 @@ public: ...@@ -35,6 +35,9 @@ public:
const QList<QList<QGeoCoordinate>> &transects() const; const QList<QList<QGeoCoordinate>> &transects() const;
const QList<MissionItem *> &missionItems() const; const QList<MissionItem *> &missionItems() const;
bool operator==(const WimaPlanData &other) const;
bool operator!=(const WimaPlanData &other) const;
signals: signals:
void areaListChanged(); void areaListChanged();
...@@ -44,7 +47,4 @@ private: ...@@ -44,7 +47,4 @@ private:
WimaCorridorData _corridor; WimaCorridorData _corridor;
WimaMeasurementAreaData _measurementArea; WimaMeasurementAreaData _measurementArea;
QList<const WimaAreaData *> _areaList; QList<const WimaAreaData *> _areaList;
QList<QList<QGeoCoordinate>> _transects;
QList<MissionItem *> _missionItems;
}; };
...@@ -38,12 +38,12 @@ const char *WimaPlaner::missionItemsName = "MissionItems"; ...@@ -38,12 +38,12 @@ const char *WimaPlaner::missionItemsName = "MissionItems";
WimaPlaner::WimaPlaner(QObject *parent) WimaPlaner::WimaPlaner(QObject *parent)
: QObject(parent), _masterController(nullptr), _missionController(nullptr), : QObject(parent), _masterController(nullptr), _missionController(nullptr),
_currentAreaIndex(-1), _wimaBridge(nullptr), _copyMAreaToSurvey(true), _currentAreaIndex(-1), _copyMAreaToSurvey(true), _copySAreaToSurvey(true),
_copySAreaToSurvey(true), _corridorChanged(true), _joinedArea(this), _corridorChanged(true), _joinedArea(this), _arrivalPathLength(0),
_arrivalPathLength(0), _returnPathLength(0), _survey(nullptr), _returnPathLength(0), _survey(nullptr), _surveyChanged(true),
_surveyChanged(true), _synchronized(false), _nemoInterface(this), _synchronized(false), _nemoInterface(this),
_stateMachine(new StateMachine), _areasMonitored(false), _stateMachine(new StateMachine), _areasMonitored(false),
_missionControllerMonitored(false) { _missionControllerMonitored(false), _progressLocked(false) {
connect(this, &WimaPlaner::currentPolygonIndexChanged, this, connect(this, &WimaPlaner::currentPolygonIndexChanged, this,
&WimaPlaner::updatePolygonInteractivity); &WimaPlaner::updatePolygonInteractivity);
...@@ -112,8 +112,6 @@ QGeoCoordinate WimaPlaner::joinedAreaCenter() const { ...@@ -112,8 +112,6 @@ QGeoCoordinate WimaPlaner::joinedAreaCenter() const {
return _joinedArea.center(); return _joinedArea.center();
} }
WimaBridge *WimaPlaner::wimaBridge() { return _wimaBridge; }
NemoInterface *WimaPlaner::nemoInterface() { return &_nemoInterface; } NemoInterface *WimaPlaner::nemoInterface() { return &_nemoInterface; }
void WimaPlaner::setMasterController(PlanMasterController *masterC) { void WimaPlaner::setMasterController(PlanMasterController *masterC) {
...@@ -141,10 +139,14 @@ void WimaPlaner::setCurrentPolygonIndex(int index) { ...@@ -141,10 +139,14 @@ void WimaPlaner::setCurrentPolygonIndex(int index) {
} }
} }
void WimaPlaner::setWimaBridge(WimaBridge *bridge) { void WimaPlaner::setProgressLocked(bool l) {
if (bridge != nullptr) { if (this->_progressLocked != l) {
_wimaBridge = bridge; this->_progressLocked = l;
emit wimaBridgeChanged(); emit progressLockedChanged();
if (!this->_progressLocked) {
this->_measurementArea.setProgress(this->_nemoInterface.progress());
this->_update();
}
} }
} }
...@@ -156,6 +158,8 @@ bool WimaPlaner::readyForSynchronization() { ...@@ -156,6 +158,8 @@ bool WimaPlaner::readyForSynchronization() {
return this->_stateMachine->surveyReady(); return this->_stateMachine->surveyReady();
} }
bool WimaPlaner::progressLocked() { return this->_progressLocked; }
WimaPlaner *WimaPlaner::thisPointer() { return this; } WimaPlaner *WimaPlaner::thisPointer() { return this; }
void WimaPlaner::removeArea(int index) { void WimaPlaner::removeArea(int index) {
...@@ -557,8 +561,13 @@ void WimaPlaner::missionControllerMissionItemCountChangedHandler() { ...@@ -557,8 +561,13 @@ void WimaPlaner::missionControllerMissionItemCountChangedHandler() {
} }
void WimaPlaner::nemoInterfaceProgressChangedHandler() { void WimaPlaner::nemoInterfaceProgressChangedHandler() {
this->_measurementArea.setProgress(this->_nemoInterface.progress()); auto p = this->_nemoInterface.progress();
this->_update(); WimaBridge::instance()->setProgress(p);
if (!progressLocked()) {
this->_measurementArea.setProgress(p);
this->_update();
}
} }
void WimaPlaner::saveToCurrent() { saveToFile(_currentFile); } void WimaPlaner::saveToCurrent() { saveToFile(_currentFile); }
...@@ -792,18 +801,14 @@ void WimaPlaner::updatePolygonInteractivity(int index) { ...@@ -792,18 +801,14 @@ void WimaPlaner::updatePolygonInteractivity(int index) {
} }
void WimaPlaner::synchronize() { void WimaPlaner::synchronize() {
if (_wimaBridge != nullptr) { if (readyForSynchronization()) {
if (readyForSynchronization()) { WimaPlanData planData;
auto planData = toPlanData(); if (toPlanData(planData)) {
if (planData) { WimaBridge::instance()->setPlanData(planData);
(void)_wimaBridge->setWimaPlanData(planData); setSynchronized(true);
setSynchronized(true); } else {
} else { qCWarning(WimaPlanerLog) << "error creating plan data.";
qCWarning(WimaPlanerLog) << "error creating plan data.";
}
} }
} else {
qCWarning(WimaPlanerLog) << "no container assigned.";
} }
} }
...@@ -940,27 +945,14 @@ void WimaPlaner::setInteractive() { ...@@ -940,27 +945,14 @@ void WimaPlaner::setInteractive() {
* *
* \sa WimaController, WimaPlanData * \sa WimaController, WimaPlanData
*/ */
QSharedPointer<WimaPlanData> WimaPlaner::toPlanData() { bool WimaPlaner::toPlanData(WimaPlanData &planData) {
QSharedPointer<WimaPlanData> planData(new WimaPlanData());
// store areas // store areas
planData->append(WimaMeasurementAreaData(_measurementArea)); planData.append(WimaMeasurementAreaData(_measurementArea));
planData->append(WimaServiceAreaData(_serviceArea)); planData.append(WimaServiceAreaData(_serviceArea));
planData->append(WimaCorridorData(_corridor)); planData.append(WimaCorridorData(_corridor));
planData->append(WimaJoinedAreaData(_joinedArea)); planData.append(WimaJoinedAreaData(_joinedArea));
return true;
// convert mission items to mavlink commands
if (_missionController && _missionController->visualItems()) {
int surveyIndex = _missionController->visualItems()->indexOf(_survey);
if (surveyIndex > 0) {
QList<MissionItem *> missionItems;
_survey->appendMissionItems(missionItems, nullptr);
planData->append(missionItems);
planData->setTransects(this->_survey->rawTransects());
return planData;
}
}
return QSharedPointer<WimaPlanData>();
} }
#ifndef NDEBUG #ifndef NDEBUG
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
class MissionController; class MissionController;
class PlanMasterController; class PlanMasterController;
class WimaBridge;
namespace wima_planer_detail { namespace wima_planer_detail {
class StateMachine; class StateMachine;
...@@ -51,13 +50,13 @@ public: ...@@ -51,13 +50,13 @@ public:
Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT) Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT)
Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT) Q_PROPERTY(QString fileExtension READ fileExtension CONSTANT)
Q_PROPERTY(QGeoCoordinate joinedAreaCenter READ joinedAreaCenter CONSTANT) Q_PROPERTY(QGeoCoordinate joinedAreaCenter READ joinedAreaCenter CONSTANT)
Q_PROPERTY(WimaBridge *wimaBridge READ wimaBridge WRITE setWimaBridge NOTIFY
wimaBridgeChanged)
Q_PROPERTY(NemoInterface *nemoInterface READ nemoInterface CONSTANT) Q_PROPERTY(NemoInterface *nemoInterface READ nemoInterface CONSTANT)
Q_PROPERTY(bool synchronized READ synchronized NOTIFY synchronizedChanged) Q_PROPERTY(bool synchronized READ synchronized NOTIFY synchronizedChanged)
Q_PROPERTY(bool needsUpdate READ needsUpdate NOTIFY needsUpdateChanged) Q_PROPERTY(bool needsUpdate READ needsUpdate NOTIFY needsUpdateChanged)
Q_PROPERTY(bool readyForSynchronization READ readyForSynchronization NOTIFY Q_PROPERTY(bool readyForSynchronization READ readyForSynchronization NOTIFY
readyForSynchronizationChanged) readyForSynchronizationChanged)
Q_PROPERTY(bool progressLocked READ progressLocked WRITE setProgressLocked
NOTIFY progressLockedChanged)
// Property accessors // Property accessors
PlanMasterController *masterController(void); PlanMasterController *masterController(void);
...@@ -69,11 +68,11 @@ public: ...@@ -69,11 +68,11 @@ public:
QStringList saveNameFilters(void) const; QStringList saveNameFilters(void) const;
QString fileExtension(void) const; QString fileExtension(void) const;
QGeoCoordinate joinedAreaCenter(void) const; QGeoCoordinate joinedAreaCenter(void) const;
WimaBridge *wimaBridge(void);
NemoInterface *nemoInterface(void); NemoInterface *nemoInterface(void);
bool synchronized(); bool synchronized();
bool needsUpdate(); bool needsUpdate();
bool readyForSynchronization(); bool readyForSynchronization();
bool progressLocked();
// Property setters // Property setters
void setMasterController(PlanMasterController *masterController); void setMasterController(PlanMasterController *masterController);
...@@ -81,7 +80,7 @@ public: ...@@ -81,7 +80,7 @@ public:
/// Sets the integer index pointing to the current polygon. Current polygon is /// Sets the integer index pointing to the current polygon. Current polygon is
/// set interactive. /// set interactive.
void setCurrentPolygonIndex(int index); void setCurrentPolygonIndex(int index);
void setWimaBridge(WimaBridge *bridge); void setProgressLocked(bool l);
Q_INVOKABLE WimaPlaner *thisPointer(); Q_INVOKABLE WimaPlaner *thisPointer();
Q_INVOKABLE bool addMeasurementArea(); Q_INVOKABLE bool addMeasurementArea();
...@@ -120,6 +119,7 @@ signals: ...@@ -120,6 +119,7 @@ signals:
void synchronizedChanged(void); void synchronizedChanged(void);
void needsUpdateChanged(void); void needsUpdateChanged(void);
void readyForSynchronizationChanged(void); void readyForSynchronizationChanged(void);
void progressLockedChanged();
private slots: private slots:
void updatePolygonInteractivity(int index); void updatePolygonInteractivity(int index);
...@@ -152,7 +152,7 @@ signals: ...@@ -152,7 +152,7 @@ signals:
private: private:
// Member Functions // Member Functions
QSharedPointer<WimaPlanData> toPlanData(); bool toPlanData(WimaPlanData &planData);
bool shortestPath(const QGeoCoordinate &start, bool shortestPath(const QGeoCoordinate &start,
const QGeoCoordinate &destination, const QGeoCoordinate &destination,
QVector<QGeoCoordinate> &path); QVector<QGeoCoordinate> &path);
...@@ -169,8 +169,6 @@ private: ...@@ -169,8 +169,6 @@ private:
MissionController *_missionController; MissionController *_missionController;
int _currentAreaIndex; int _currentAreaIndex;
QString _currentFile; QString _currentFile;
// container for data exchange with WimaController
WimaBridge *_wimaBridge;
bool _joinedAreaValid; bool _joinedAreaValid;
WimaMeasurementArea _measurementArea; WimaMeasurementArea _measurementArea;
...@@ -205,4 +203,5 @@ private: ...@@ -205,4 +203,5 @@ private:
QScopedPointer<wima_planer_detail::StateMachine> _stateMachine; QScopedPointer<wima_planer_detail::StateMachine> _stateMachine;
bool _areasMonitored; bool _areasMonitored;
bool _missionControllerMonitored; bool _missionControllerMonitored;
bool _progressLocked;
}; };
#ifndef CALL_ONCE_H
#define CALL_ONCE_H
#include <QAtomicInt>
#include <QMutex>
#include <QThread>
#include <QThreadStorage>
#include <QWaitCondition>
#include <QtGlobal>
namespace CallOnce {
enum ECallOnce { CO_Request, CO_InProgress, CO_Finished };
Q_GLOBAL_STATIC(QThreadStorage<QAtomicInt *>, once_flag)
} // namespace CallOnce
template <class Function>
inline static void qCallOnce(Function func, QBasicAtomicInt &flag) {
using namespace CallOnce;
#if QT_VERSION < 0x050000
int protectFlag = flag.fetchAndStoreAcquire(flag);
#elif QT_VERSION >= 0x050000
int protectFlag = flag.fetchAndStoreAcquire(flag.load());
#endif
if (protectFlag == CO_Finished)
return;
if (protectFlag == CO_Request &&
flag.testAndSetRelaxed(protectFlag, CO_InProgress)) {
func();
flag.fetchAndStoreRelease(CO_Finished);
} else {
do {
QThread::yieldCurrentThread();
} while (!flag.testAndSetAcquire(CO_Finished, CO_Finished));
}
}
template <class Function> inline static void qCallOncePerThread(Function func) {
using namespace CallOnce;
if (!once_flag()->hasLocalData()) {
once_flag()->setLocalData(new QAtomicInt(CO_Request));
qCallOnce(func, *once_flag()->localData());
}
}
#endif // CALL_ONCE_H
...@@ -327,17 +327,16 @@ Rectangle { ...@@ -327,17 +327,16 @@ Rectangle {
property var nemo: wimaPlaner ? wimaPlaner.nemoInterface : undefined property var nemo: wimaPlaner ? wimaPlaner.nemoInterface : undefined
text: qsTr("Lock Progress") text: qsTr("Lock Progress")
checked: nemo ? nemo.lockProgress : false checked: wimaPlaner ? wimaPlaner.progressLocked : false
visible: enableCheckbox.checked visible: enableCheckbox.checked
onCheckedChanged: { onCheckedChanged: {
if (nemo){ if (wimaPlaner){
if (checked){ if (checked){
nemo.lockProgress = true wimaPlaner.progressLocked = true
} else { } else {
nemo.lockProgress = false wimaPlaner.progressLocked = false
} }
checked = Qt.binding(function(){return wimaPlaner.progressLocked})
checked = Qt.binding(function(){return nemo.lockProgress})
} }
} }
Layout.minimumWidth: _mediumValueWidth Layout.minimumWidth: _mediumValueWidth
......
...@@ -208,8 +208,6 @@ QGCView { ...@@ -208,8 +208,6 @@ QGCView {
Component.onCompleted: { Component.onCompleted: {
wimaPlaner.masterController = Qt.binding(function () { return masterController}) wimaPlaner.masterController = Qt.binding(function () { return masterController})
wimaPlaner.missionController = Qt.binding(function () { return masterController.missionController}) wimaPlaner.missionController = Qt.binding(function () { return masterController.missionController})
wimaPlaner.wimaBridge = Qt.binding(function () { return wBridge.thisPointer()})
wBridge.wimaPlaner = Qt.binding(function () { return wimaPlaner.thisPointer()})
} }
function addComplexItem(complexItemName) { function addComplexItem(complexItemName) {
var coordinate = editorMap.center var coordinate = editorMap.center
......
...@@ -174,11 +174,6 @@ Item { ...@@ -174,11 +174,6 @@ Item {
} }
} }
// Wima Data Container
WimaBridge{
id: wimaBridge
}
MessageDialog { MessageDialog {
id: unsavedMissionCloseDialog id: unsavedMissionCloseDialog
title: qsTr("%1 close").arg(QGroundControl.appName) title: qsTr("%1 close").arg(QGroundControl.appName)
...@@ -386,7 +381,6 @@ Item { ...@@ -386,7 +381,6 @@ Item {
visible: false visible: false
property var planToolBar: planToolBar property var planToolBar: planToolBar
property var wBridge: wimaBridge
} }
...@@ -404,7 +398,6 @@ Item { ...@@ -404,7 +398,6 @@ Item {
visible: false visible: false
property var toolbar: wimaToolBar property var toolbar: wimaToolBar
property var wBridge: wimaBridge
} }
...@@ -413,7 +406,6 @@ Item { ...@@ -413,7 +406,6 @@ Item {
anchors.fill: parent anchors.fill: parent
visible: true visible: true
property var wBridge: wimaBridge
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
//-- Loader helper for any child, no matter how deep can display an element //-- Loader helper for any child, no matter how deep can display an element
// on top of the video window. // on top of the video window.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment