From e828430a9ee8e8a4d7ed97dc2961e8444f68062b Mon Sep 17 00:00:00 2001 From: Valentin Platzgummer Date: Thu, 15 Oct 2020 11:35:28 +0200 Subject: [PATCH] wimaBride converted to singelton and removed from qml, progess locking moded to wima planer, wima plan data mod. --- qgroundcontrol.pro | 3 + src/FlightDisplay/FlightDisplayView.qml | 4 - src/QGCApplication.cc | 2 - src/Wima/GenericSingelton.cpp | 0 src/Wima/GenericSingelton.h | 59 +++++++++++++++ src/Wima/Geometry/WimaMeasurementAreaData.cc | 2 +- src/Wima/Snake/NemoInterface.cpp | 40 +--------- src/Wima/Snake/NemoInterface.h | 4 - src/Wima/WimaBridge.cc | 35 ++++----- src/Wima/WimaBridge.h | 35 ++++----- src/Wima/WimaController.cc | 21 +++++- src/Wima/WimaController.h | 6 +- src/Wima/WimaPlanData.cc | 31 ++------ src/Wima/WimaPlanData.h | 6 +- src/Wima/WimaPlaner.cc | 78 +++++++++----------- src/Wima/WimaPlaner.h | 15 ++-- src/Wima/call_once.h | 48 ++++++++++++ src/WimaView/WimaToolBar.qml | 11 ++- src/WimaView/WimaView.qml | 2 - src/ui/MainWindowInner.qml | 8 -- 20 files changed, 221 insertions(+), 189 deletions(-) create mode 100644 src/Wima/GenericSingelton.cpp create mode 100644 src/Wima/GenericSingelton.h create mode 100644 src/Wima/call_once.h diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 1422176f1..b06694ffb 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -419,6 +419,7 @@ FORMS += \ HEADERS += \ src/Wima/CircularSurvey.h \ + src/Wima/GenericSingelton.h \ src/Wima/Geometry/GenericCircle.h \ src/Wima/RoutingThread.h \ src/Wima/Snake/clipper/clipper.hpp \ @@ -464,6 +465,7 @@ HEADERS += \ src/Wima/WaypointManager/Slicer.h \ src/Wima/WaypointManager/Utils.h \ src/Wima/WimaBridge.h \ + src/Wima/call_once.h \ src/api/QGCCorePlugin.h \ src/api/QGCOptions.h \ src/api/QGCSettings.h \ @@ -510,6 +512,7 @@ HEADERS += \ src/comm/utilities.h SOURCES += \ src/Wima/CircularSurvey.cc \ + src/Wima/GenericSingelton.cpp \ src/Wima/RoutingThread.cpp \ src/Wima/Snake/clipper/clipper.cpp \ src/Wima/Snake/snake.cpp \ diff --git a/src/FlightDisplay/FlightDisplayView.qml b/src/FlightDisplay/FlightDisplayView.qml index c125fe43b..763e805fc 100644 --- a/src/FlightDisplay/FlightDisplayView.qml +++ b/src/FlightDisplay/FlightDisplayView.qml @@ -117,10 +117,6 @@ QGCView { WimaController { id: wimaController - Component.onCompleted: { - wBridge.wimaController = Qt.binding(function() { return wimaController.thisPointer() }) - } - onForceUploadConfirm: { _guidedController.confirmAction( _guidedController.actionForceUpload) diff --git a/src/QGCApplication.cc b/src/QGCApplication.cc index a9cb5480b..b6adf4980 100644 --- a/src/QGCApplication.cc +++ b/src/QGCApplication.cc @@ -90,7 +90,6 @@ #include "ViewWidgetController.h" #include "VisualMissionItem.h" #include "Wima/Snake/NemoInterface.h" -#include "Wima/WimaBridge.h" #include "Wima/WimaController.h" #include "Wima/WimaPlaner.h" @@ -520,7 +519,6 @@ void QGCApplication::_initCommon(void) { // Wima qmlRegisterType("Wima", 1, 0, "WimaController"); qmlRegisterType("Wima", 1, 0, "WimaPlaner"); - qmlRegisterType("Wima", 1, 0, "WimaBridge"); qmlRegisterType("Wima", 1, 0, "NemoInterface"); // Register Qml Singletons diff --git a/src/Wima/GenericSingelton.cpp b/src/Wima/GenericSingelton.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/src/Wima/GenericSingelton.h b/src/Wima/GenericSingelton.h new file mode 100644 index 000000000..93e1ec0d5 --- /dev/null +++ b/src/Wima/GenericSingelton.h @@ -0,0 +1,59 @@ +#pragma once +#include "call_once.h" +#include +#include + +template class GenericSingelton { +private: + typedef T *(*CreateInstanceFunction)(); + +public: + static T *instance(CreateInstanceFunction create); + +private: + static void init(); + + GenericSingelton(); + ~GenericSingelton(); + Q_DISABLE_COPY(GenericSingelton) + static QBasicAtomicPointer create; + static QBasicAtomicInt flag; + static QBasicAtomicPointer tptr; + bool inited; +}; + +template +T *GenericSingelton::instance(CreateInstanceFunction create) { + GenericSingelton::create.store(reinterpret_cast(create)); + qCallOnce(init, flag); + return (T *)tptr.load(); +} + +template void GenericSingelton::init() { + static GenericSingelton singleton; + if (singleton.inited) { + CreateInstanceFunction createFunction = + (CreateInstanceFunction)GenericSingelton::create.load(); + tptr.store(createFunction()); + } +} + +template GenericSingelton::GenericSingelton() { inited = true; } + +template GenericSingelton::~GenericSingelton() { + T *createdTptr = (T *)tptr.fetchAndStoreOrdered(nullptr); + if (createdTptr) { + delete createdTptr; + } + create.store(nullptr); +} + +template +QBasicAtomicPointer + GenericSingelton::create = Q_BASIC_ATOMIC_INITIALIZER(nullptr); +template +QBasicAtomicInt GenericSingelton::flag = + Q_BASIC_ATOMIC_INITIALIZER(CallOnce::CO_Request); +template +QBasicAtomicPointer + GenericSingelton::tptr = Q_BASIC_ATOMIC_INITIALIZER(nullptr); diff --git a/src/Wima/Geometry/WimaMeasurementAreaData.cc b/src/Wima/Geometry/WimaMeasurementAreaData.cc index 72c49d252..45a66e540 100644 --- a/src/Wima/Geometry/WimaMeasurementAreaData.cc +++ b/src/Wima/Geometry/WimaMeasurementAreaData.cc @@ -38,7 +38,7 @@ void WimaMeasurementAreaData::setTileData(const TileData &d) { } void WimaMeasurementAreaData::setProgress(const QVector &d) { - if (this->_progress != d) { + if (this->_progress != d && d.size() == this->_tileData.tiles.count()) { this->_progress = d; emit progressChanged(); } diff --git a/src/Wima/Snake/NemoInterface.cpp b/src/Wima/Snake/NemoInterface.cpp index c6fa880f3..671a3ccdc 100644 --- a/src/Wima/Snake/NemoInterface.cpp +++ b/src/Wima/Snake/NemoInterface.cpp @@ -48,7 +48,6 @@ public: void setAutoPublish(bool ap); void setHoldProgress(bool hp); - bool lockProgress(); void publishTileData(); NemoInterface::STATUS status(); @@ -77,7 +76,6 @@ private: QGeoCoordinate ENUOrigin; mutable std::shared_timed_mutex ENUOriginMutex; QNemoProgress qProgress; - QNemoProgress qProgressHolded; mutable std::shared_timed_mutex progressMutex; NemoInterface::STATUS status_; TimePoint nextTimeout; @@ -88,7 +86,6 @@ private: // Internals std::atomic_bool running_; - std::atomic_bool lockProgress_; std::atomic_bool topicServiceSetupDone; ROSBridgePtr pRosBridge; QTimer loopTimer; @@ -110,8 +107,7 @@ StatusMap statusMap{ NemoInterface::Impl::Impl(NemoInterface *p) : status_(STATUS::NOT_CONNECTED), nextTimeout(TimePoint::max()), - running_(false), lockProgress_(false), topicServiceSetupDone(false), - parent(p) { + running_(false), topicServiceSetupDone(false), parent(p) { // ROS Bridge. WimaSettings *wimaSettings = @@ -188,24 +184,6 @@ bool NemoInterface::Impl::hasTileData(const TileData &tileData) const { 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() { std::lock(this->ENUOriginMutex, this->tilesENUMutex); UniqueLock lk1(this->ENUOriginMutex, std::adopt_lock); @@ -225,7 +203,7 @@ NemoInterface::STATUS NemoInterface::Impl::status() { QVector NemoInterface::Impl::progress() { SharedLock lk(this->progressMutex); - return this->qProgressHolded.progress(); + return this->qProgress.progress(); } bool NemoInterface::Impl::running() { return this->running_.load(); } @@ -263,23 +241,17 @@ bool NemoInterface::Impl::doTopicServiceSetup() { UniqueLock lk3(this->ENUOriginMutex, std::adopt_lock); int requiredSize = this->tilesENU.polygons().size(); - auto hold = this->lockProgress_.load(); auto &progressMsg = this->qProgress; if (!nemo_msgs::progress::fromJson(*pDoc, progressMsg) || progressMsg.progress().size() != requiredSize) { // Some error occured. progressMsg.progress().clear(); qgcApp()->showMessage("Invalid progress message received."); - } else if (!hold) { - this->qProgressHolded = this->qProgress; } + lk1.unlock(); lk2.unlock(); lk3.unlock(); - - if (!hold) { - emit this->parent->progressChanged(); - } }); // Subscribe /nemo/heartbeat. @@ -452,10 +424,6 @@ bool NemoInterface::hasTileData(const TileData &tileData) const { return this->pImpl->hasTileData(tileData); } -void NemoInterface::setHoldProgress(bool hp) { - this->pImpl->setHoldProgress(hp); -} - int NemoInterface::status() const { return integral(this->pImpl->status()); } NemoInterface::STATUS NemoInterface::statusEnum() const { @@ -473,5 +441,3 @@ QString NemoInterface::editorQml() { } bool NemoInterface::running() { return this->pImpl->running(); } - -bool NemoInterface::lockProgress() { return this->pImpl->lockProgress(); } diff --git a/src/Wima/Snake/NemoInterface.h b/src/Wima/Snake/NemoInterface.h index 14e8915ed..459f02917 100644 --- a/src/Wima/Snake/NemoInterface.h +++ b/src/Wima/Snake/NemoInterface.h @@ -29,8 +29,6 @@ public: Q_PROPERTY(QVector progress READ progress NOTIFY progressChanged) Q_PROPERTY(QString editorQml READ editorQml CONSTANT) 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 stop(); @@ -48,13 +46,11 @@ public: QVector progress() const; QString editorQml(); bool running(); - bool lockProgress(); signals: void statusChanged(); void progressChanged(); void runningChanged(); - void lockProgressChanged(); private: PImpl pImpl; diff --git a/src/Wima/WimaBridge.cc b/src/Wima/WimaBridge.cc index ef2be8133..e2914a355 100644 --- a/src/Wima/WimaBridge.cc +++ b/src/Wima/WimaBridge.cc @@ -1,33 +1,30 @@ #include "WimaBridge.h" -#include "WimaController.h" +#include "GenericSingelton.h" 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; } - -void WimaBridge::setWimaController(WimaController *controller) { - if (_wimaController != controller) { - _wimaController = controller; - - emit wimaControllerChanged(_wimaController); - } +WimaBridge *WimaBridge::instance() { + return GenericSingelton::instance(WimaBridge::createInstance); } -void WimaBridge::setWimaPlaner(WimaPlaner *planer) { - if (_wimaPlaner != planer) { - _wimaPlaner = planer; +const WimaPlanData &WimaBridge::planData() const { return this->planData_; } + +const QVector &WimaBridge::progress() const { return this->progress_; } - emit wimaPlanerChanged(_wimaPlaner); +void WimaBridge::setProgress(const QVector &p) { + if (this->progress_ != p) { + this->progress_ = p; + emit progressChanged(); } } -bool WimaBridge::setWimaPlanData(QSharedPointer planData) { - if (_wimaController != nullptr) { - return _wimaController->setWimaPlanData(planData); +void WimaBridge::setPlanData(const WimaPlanData &planData) { + if (this->planData_ != planData) { + this->planData_ = planData; + emit planDataChanged(); } - return false; } diff --git a/src/Wima/WimaBridge.h b/src/Wima/WimaBridge.h index 1d411989f..0b411536f 100644 --- a/src/Wima/WimaBridge.h +++ b/src/Wima/WimaBridge.h @@ -11,34 +11,27 @@ class WimaPlaner; //! //! \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 { Q_OBJECT -public: WimaBridge(QObject *parent = nullptr); WimaBridge(WimaBridge &other) = delete; + static WimaBridge *createInstance(); - Q_PROPERTY(WimaPlaner *wimaPlaner READ wimaPlaner WRITE setWimaPlaner NOTIFY - wimaPlanerChanged) - Q_PROPERTY(WimaController *wimaController READ wimaController WRITE - setWimaController NOTIFY wimaControllerChanged) - - 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: + ~WimaBridge(); + static WimaBridge *instance(); + const WimaPlanData &planData() const; + const QVector &progress() const; public slots: - bool setWimaPlanData(QSharedPointer planData); + void setPlanData(const WimaPlanData &planData); + void setProgress(const QVector &p); +signals: + void planDataChanged(); + void progressChanged(); private: - WimaController *_wimaController; - WimaPlaner *_wimaPlaner; + WimaPlanData planData_; + QVector progress_; }; diff --git a/src/Wima/WimaController.cc b/src/Wima/WimaController.cc index 8d299ebba..a35e2462b 100644 --- a/src/Wima/WimaController.cc +++ b/src/Wima/WimaController.cc @@ -10,6 +10,8 @@ #include "SettingsManager.h" #include "SimpleMissionItem.h" +#include "WimaBridge.h" +#include "WimaPlanData.h" #include "WimaSettings.h" #include "Snake/QNemoHeartbeat.h" @@ -69,6 +71,12 @@ WimaController::WimaController(QObject *parent) connect(&_eventTimer, &QTimer::timeout, this, &WimaController::_eventTimerHandler); _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() { @@ -214,7 +222,8 @@ bool WimaController::_calcShortestPath(const QGeoCoordinate &start, return retVal; } -bool WimaController::setWimaPlanData(QSharedPointer planData) { +void WimaController::planDataChangedHandler() { + // reset visual items _areas.clear(); _measurementArea = WimaMeasurementAreaData(); @@ -228,8 +237,9 @@ bool WimaController::setWimaPlanData(QSharedPointer planData) { _planDataValid = false; + auto planData = WimaBridge::instance()->planData(); // extract list with WimaAreas - QList areaList = planData->areaList(); + QList areaList = planData.areaList(); int areaCounter = 0; const int numAreas = 4; // extract only numAreas Areas, if there are more @@ -279,7 +289,7 @@ bool WimaController::setWimaPlanData(QSharedPointer planData) { if (areaCounter != numAreas) { Q_ASSERT(false); - return false; + return; } emit visualItemsChanged(); @@ -288,7 +298,10 @@ bool WimaController::setWimaPlanData(QSharedPointer planData) { _serviceArea.depot().latitude(), _serviceArea.depot().longitude(), 0)); _planDataValid = true; - return true; +} + +void WimaController::progressChangedHandler() { + _measurementArea.setProgress(WimaBridge::instance()->progress()); } WimaController *WimaController::thisPointer() { return this; } diff --git a/src/Wima/WimaController.h b/src/Wima/WimaController.h index 51ce1ae4d..09f6b4d92 100644 --- a/src/Wima/WimaController.h +++ b/src/Wima/WimaController.h @@ -10,8 +10,6 @@ #include "Geometry/WimaMeasurementAreaData.h" #include "Geometry/WimaServiceAreaData.h" -#include "WimaPlanData.h" - #include "SettingsFact.h" #include "Geometry/GeoPoint3D.h" @@ -69,7 +67,6 @@ public: // Property setters void setMasterController(PlanMasterController *masterController); void setMissionController(MissionController *missionController); - bool setWimaPlanData(QSharedPointer planData); // Member Methodes Q_INVOKABLE WimaController *thisPointer(); @@ -107,7 +104,8 @@ signals: void forceUploadConfirm(void); private slots: - + void planDataChangedHandler(); + void progressChangedHandler(); bool _calcShortestPath(const QGeoCoordinate &start, const QGeoCoordinate &destination, QVector &path); diff --git a/src/Wima/WimaPlanData.cc b/src/Wima/WimaPlanData.cc index 6f597f329..51be4cc28 100644 --- a/src/Wima/WimaPlanData.cc +++ b/src/Wima/WimaPlanData.cc @@ -31,9 +31,6 @@ WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other) { } } - // copy mission items - _missionItems = other.missionItems(); - return *this; } @@ -89,37 +86,25 @@ void WimaPlanData::append(const WimaMeasurementAreaData &areaData) { } } -void WimaPlanData::setTransects(const QList> &transects) { - _transects = transects; -} - -void WimaPlanData::append(const QList &missionItems) { - for (auto *item : missionItems) { - item->setParent(this); - _missionItems.append(item); - } -} - /*! * \fn void WimaPlanData::append(const WimaServiceAreaData &areaData) * * Clears all stored objects */ -void WimaPlanData::clear() { - _areaList.clear(); - _missionItems.clear(); -} +void WimaPlanData::clear() { _areaList.clear(); } const QList &WimaPlanData::areaList() const { return _areaList; } -const QList> &WimaPlanData::transects() const { - return _transects; +bool WimaPlanData::operator==(const WimaPlanData &other) const { + return this->_joinedArea == other._joinedArea && + this->_measurementArea == other._measurementArea && + this->_corridor == other._corridor && + this->_serviceArea == other._serviceArea; } - -const QList &WimaPlanData::missionItems() const { - return _missionItems; +bool WimaPlanData::operator!=(const WimaPlanData &other) const { + return !(*this == other); } /*! diff --git a/src/Wima/WimaPlanData.h b/src/Wima/WimaPlanData.h index 0fc6bc41e..869855f28 100644 --- a/src/Wima/WimaPlanData.h +++ b/src/Wima/WimaPlanData.h @@ -35,6 +35,9 @@ public: const QList> &transects() const; const QList &missionItems() const; + bool operator==(const WimaPlanData &other) const; + bool operator!=(const WimaPlanData &other) const; + signals: void areaListChanged(); @@ -44,7 +47,4 @@ private: WimaCorridorData _corridor; WimaMeasurementAreaData _measurementArea; QList _areaList; - - QList> _transects; - QList _missionItems; }; diff --git a/src/Wima/WimaPlaner.cc b/src/Wima/WimaPlaner.cc index 77fdd0211..9451bfaa7 100644 --- a/src/Wima/WimaPlaner.cc +++ b/src/Wima/WimaPlaner.cc @@ -38,12 +38,12 @@ const char *WimaPlaner::missionItemsName = "MissionItems"; WimaPlaner::WimaPlaner(QObject *parent) : QObject(parent), _masterController(nullptr), _missionController(nullptr), - _currentAreaIndex(-1), _wimaBridge(nullptr), _copyMAreaToSurvey(true), - _copySAreaToSurvey(true), _corridorChanged(true), _joinedArea(this), - _arrivalPathLength(0), _returnPathLength(0), _survey(nullptr), - _surveyChanged(true), _synchronized(false), _nemoInterface(this), + _currentAreaIndex(-1), _copyMAreaToSurvey(true), _copySAreaToSurvey(true), + _corridorChanged(true), _joinedArea(this), _arrivalPathLength(0), + _returnPathLength(0), _survey(nullptr), _surveyChanged(true), + _synchronized(false), _nemoInterface(this), _stateMachine(new StateMachine), _areasMonitored(false), - _missionControllerMonitored(false) { + _missionControllerMonitored(false), _progressLocked(false) { connect(this, &WimaPlaner::currentPolygonIndexChanged, this, &WimaPlaner::updatePolygonInteractivity); @@ -112,8 +112,6 @@ QGeoCoordinate WimaPlaner::joinedAreaCenter() const { return _joinedArea.center(); } -WimaBridge *WimaPlaner::wimaBridge() { return _wimaBridge; } - NemoInterface *WimaPlaner::nemoInterface() { return &_nemoInterface; } void WimaPlaner::setMasterController(PlanMasterController *masterC) { @@ -141,10 +139,14 @@ void WimaPlaner::setCurrentPolygonIndex(int index) { } } -void WimaPlaner::setWimaBridge(WimaBridge *bridge) { - if (bridge != nullptr) { - _wimaBridge = bridge; - emit wimaBridgeChanged(); +void WimaPlaner::setProgressLocked(bool l) { + if (this->_progressLocked != l) { + this->_progressLocked = l; + emit progressLockedChanged(); + if (!this->_progressLocked) { + this->_measurementArea.setProgress(this->_nemoInterface.progress()); + this->_update(); + } } } @@ -156,6 +158,8 @@ bool WimaPlaner::readyForSynchronization() { return this->_stateMachine->surveyReady(); } +bool WimaPlaner::progressLocked() { return this->_progressLocked; } + WimaPlaner *WimaPlaner::thisPointer() { return this; } void WimaPlaner::removeArea(int index) { @@ -557,8 +561,13 @@ void WimaPlaner::missionControllerMissionItemCountChangedHandler() { } void WimaPlaner::nemoInterfaceProgressChangedHandler() { - this->_measurementArea.setProgress(this->_nemoInterface.progress()); - this->_update(); + auto p = this->_nemoInterface.progress(); + WimaBridge::instance()->setProgress(p); + + if (!progressLocked()) { + this->_measurementArea.setProgress(p); + this->_update(); + } } void WimaPlaner::saveToCurrent() { saveToFile(_currentFile); } @@ -792,18 +801,14 @@ void WimaPlaner::updatePolygonInteractivity(int index) { } void WimaPlaner::synchronize() { - if (_wimaBridge != nullptr) { - if (readyForSynchronization()) { - auto planData = toPlanData(); - if (planData) { - (void)_wimaBridge->setWimaPlanData(planData); - setSynchronized(true); - } else { - qCWarning(WimaPlanerLog) << "error creating plan data."; - } + if (readyForSynchronization()) { + WimaPlanData planData; + if (toPlanData(planData)) { + WimaBridge::instance()->setPlanData(planData); + setSynchronized(true); + } else { + qCWarning(WimaPlanerLog) << "error creating plan data."; } - } else { - qCWarning(WimaPlanerLog) << "no container assigned."; } } @@ -940,27 +945,14 @@ void WimaPlaner::setInteractive() { * * \sa WimaController, WimaPlanData */ -QSharedPointer WimaPlaner::toPlanData() { - QSharedPointer planData(new WimaPlanData()); +bool WimaPlaner::toPlanData(WimaPlanData &planData) { // store areas - planData->append(WimaMeasurementAreaData(_measurementArea)); - planData->append(WimaServiceAreaData(_serviceArea)); - planData->append(WimaCorridorData(_corridor)); - planData->append(WimaJoinedAreaData(_joinedArea)); - - // convert mission items to mavlink commands - if (_missionController && _missionController->visualItems()) { - int surveyIndex = _missionController->visualItems()->indexOf(_survey); - if (surveyIndex > 0) { - QList missionItems; - _survey->appendMissionItems(missionItems, nullptr); - planData->append(missionItems); - planData->setTransects(this->_survey->rawTransects()); - return planData; - } - } - return QSharedPointer(); + planData.append(WimaMeasurementAreaData(_measurementArea)); + planData.append(WimaServiceAreaData(_serviceArea)); + planData.append(WimaCorridorData(_corridor)); + planData.append(WimaJoinedAreaData(_joinedArea)); + return true; } #ifndef NDEBUG diff --git a/src/Wima/WimaPlaner.h b/src/Wima/WimaPlaner.h index c57d6238a..103319d22 100644 --- a/src/Wima/WimaPlaner.h +++ b/src/Wima/WimaPlaner.h @@ -21,7 +21,6 @@ class MissionController; class PlanMasterController; -class WimaBridge; namespace wima_planer_detail { class StateMachine; @@ -51,13 +50,13 @@ public: Q_PROPERTY(QStringList saveNameFilters READ saveNameFilters CONSTANT) Q_PROPERTY(QString fileExtension READ fileExtension 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(bool synchronized READ synchronized NOTIFY synchronizedChanged) Q_PROPERTY(bool needsUpdate READ needsUpdate NOTIFY needsUpdateChanged) Q_PROPERTY(bool readyForSynchronization READ readyForSynchronization NOTIFY readyForSynchronizationChanged) + Q_PROPERTY(bool progressLocked READ progressLocked WRITE setProgressLocked + NOTIFY progressLockedChanged) // Property accessors PlanMasterController *masterController(void); @@ -69,11 +68,11 @@ public: QStringList saveNameFilters(void) const; QString fileExtension(void) const; QGeoCoordinate joinedAreaCenter(void) const; - WimaBridge *wimaBridge(void); NemoInterface *nemoInterface(void); bool synchronized(); bool needsUpdate(); bool readyForSynchronization(); + bool progressLocked(); // Property setters void setMasterController(PlanMasterController *masterController); @@ -81,7 +80,7 @@ public: /// Sets the integer index pointing to the current polygon. Current polygon is /// set interactive. void setCurrentPolygonIndex(int index); - void setWimaBridge(WimaBridge *bridge); + void setProgressLocked(bool l); Q_INVOKABLE WimaPlaner *thisPointer(); Q_INVOKABLE bool addMeasurementArea(); @@ -120,6 +119,7 @@ signals: void synchronizedChanged(void); void needsUpdateChanged(void); void readyForSynchronizationChanged(void); + void progressLockedChanged(); private slots: void updatePolygonInteractivity(int index); @@ -152,7 +152,7 @@ signals: private: // Member Functions - QSharedPointer toPlanData(); + bool toPlanData(WimaPlanData &planData); bool shortestPath(const QGeoCoordinate &start, const QGeoCoordinate &destination, QVector &path); @@ -169,8 +169,6 @@ private: MissionController *_missionController; int _currentAreaIndex; QString _currentFile; - // container for data exchange with WimaController - WimaBridge *_wimaBridge; bool _joinedAreaValid; WimaMeasurementArea _measurementArea; @@ -205,4 +203,5 @@ private: QScopedPointer _stateMachine; bool _areasMonitored; bool _missionControllerMonitored; + bool _progressLocked; }; diff --git a/src/Wima/call_once.h b/src/Wima/call_once.h new file mode 100644 index 000000000..966f2afa2 --- /dev/null +++ b/src/Wima/call_once.h @@ -0,0 +1,48 @@ +#ifndef CALL_ONCE_H +#define CALL_ONCE_H + +#include +#include +#include +#include +#include +#include + +namespace CallOnce { +enum ECallOnce { CO_Request, CO_InProgress, CO_Finished }; + +Q_GLOBAL_STATIC(QThreadStorage, once_flag) +} // namespace CallOnce + +template +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 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 diff --git a/src/WimaView/WimaToolBar.qml b/src/WimaView/WimaToolBar.qml index d3c007187..bb45e88de 100644 --- a/src/WimaView/WimaToolBar.qml +++ b/src/WimaView/WimaToolBar.qml @@ -327,17 +327,16 @@ Rectangle { property var nemo: wimaPlaner ? wimaPlaner.nemoInterface : undefined text: qsTr("Lock Progress") - checked: nemo ? nemo.lockProgress : false + checked: wimaPlaner ? wimaPlaner.progressLocked : false visible: enableCheckbox.checked onCheckedChanged: { - if (nemo){ + if (wimaPlaner){ if (checked){ - nemo.lockProgress = true + wimaPlaner.progressLocked = true } else { - nemo.lockProgress = false + wimaPlaner.progressLocked = false } - - checked = Qt.binding(function(){return nemo.lockProgress}) + checked = Qt.binding(function(){return wimaPlaner.progressLocked}) } } Layout.minimumWidth: _mediumValueWidth diff --git a/src/WimaView/WimaView.qml b/src/WimaView/WimaView.qml index a9777e9e3..a9bb554c7 100644 --- a/src/WimaView/WimaView.qml +++ b/src/WimaView/WimaView.qml @@ -208,8 +208,6 @@ QGCView { Component.onCompleted: { wimaPlaner.masterController = Qt.binding(function () { return masterController}) 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) { var coordinate = editorMap.center diff --git a/src/ui/MainWindowInner.qml b/src/ui/MainWindowInner.qml index d07cf0810..45aea60e8 100644 --- a/src/ui/MainWindowInner.qml +++ b/src/ui/MainWindowInner.qml @@ -174,11 +174,6 @@ Item { } } - // Wima Data Container - WimaBridge{ - id: wimaBridge - } - MessageDialog { id: unsavedMissionCloseDialog title: qsTr("%1 close").arg(QGroundControl.appName) @@ -386,7 +381,6 @@ Item { visible: false property var planToolBar: planToolBar - property var wBridge: wimaBridge } @@ -404,7 +398,6 @@ Item { visible: false property var toolbar: wimaToolBar - property var wBridge: wimaBridge } @@ -413,7 +406,6 @@ Item { anchors.fill: parent visible: true - property var wBridge: wimaBridge //------------------------------------------------------------------------- //-- Loader helper for any child, no matter how deep can display an element // on top of the video window. -- 2.22.0