From 0a9d836eccf4a44de35faae04406029dbefda4ed Mon Sep 17 00:00:00 2001 From: Valentin Platzgummer Date: Fri, 24 Jul 2020 10:55:55 +0200 Subject: [PATCH] befor integrating Waypoint managers into WimaController --- qgroundcontrol.pro | 4 +- src/QmlControls/QmlObjectListModel.h | 2 +- src/Wima/Geometry/WimaJoinedAreaData.h | 4 - src/Wima/WaypointManager/AreaInterface.cpp | 10 ++ src/Wima/WaypointManager/DefaultManager.cpp | 8 +- src/Wima/WaypointManager/DefaultManager.h | 3 +- src/Wima/WaypointManager/GenericSlicer.cpp | 1 - src/Wima/WaypointManager/GenericSlicer.h | 164 ------------------ .../WaypointManager/GenericWaypointManager.h | 15 +- src/Wima/WaypointManager/Slicer.cpp | 70 ++++++++ src/Wima/WaypointManager/Slicer.h | 94 ++++++++++ src/Wima/WaypointManager/Utils.h | 6 +- 12 files changed, 190 insertions(+), 191 deletions(-) delete mode 100644 src/Wima/WaypointManager/GenericSlicer.cpp delete mode 100644 src/Wima/WaypointManager/GenericSlicer.h create mode 100644 src/Wima/WaypointManager/Slicer.cpp create mode 100644 src/Wima/WaypointManager/Slicer.h diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index b119dafa3..47f87b22a 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -440,11 +440,11 @@ HEADERS += \ src/Wima/Snake/SnakeWorker.h \ src/Wima/WaypointManager/AreaInterface.h \ src/Wima/WaypointManager/DefaultManager.h \ - src/Wima/WaypointManager/GenericSlicer.h \ src/Wima/WaypointManager/GenericWaypointManager.h \ src/Wima/Geometry/WimaPolygonArray.h \ src/Wima/Snake/snaketile.h \ src/Wima/WaypointManager/Settings.h \ + src/Wima/WaypointManager/Slicer.h \ src/Wima/WaypointManager/Utils.h \ src/api/QGCCorePlugin.h \ src/api/QGCOptions.h \ @@ -501,9 +501,9 @@ SOURCES += \ src/Wima/Snake/SnakeWorker.cc \ src/Wima/WaypointManager/AreaInterface.cpp \ src/Wima/WaypointManager/DefaultManager.cpp \ - src/Wima/WaypointManager/GenericSlicer.cpp \ src/Wima/WaypointManager/GenericWaypointManager.cpp \ src/Wima/WaypointManager/Settings.cpp \ + src/Wima/WaypointManager/Slicer.cpp \ src/Wima/WaypointManager/Utils.cpp \ src/comm/ros_bridge/include/ComPrivateInclude.cpp \ src/comm/ros_bridge/include/MessageTag.cpp \ diff --git a/src/QmlControls/QmlObjectListModel.h b/src/QmlControls/QmlObjectListModel.h index 110fa2c8d..42d0b5a9f 100644 --- a/src/QmlControls/QmlObjectListModel.h +++ b/src/QmlControls/QmlObjectListModel.h @@ -47,7 +47,7 @@ public: QObject* operator[] (int i); const QObject* operator[] (int i) const; - template T value (int index) { return qobject_cast(_objectList[index]); } + template T value (int index) const { return qobject_cast(_objectList[index]); } QList* objectList () { return &_objectList; } /// Calls deleteLater on all items and this itself. diff --git a/src/Wima/Geometry/WimaJoinedAreaData.h b/src/Wima/Geometry/WimaJoinedAreaData.h index 5260d29bd..f00bd73a3 100644 --- a/src/Wima/Geometry/WimaJoinedAreaData.h +++ b/src/Wima/Geometry/WimaJoinedAreaData.h @@ -23,10 +23,6 @@ public: static const char* typeString; -signals: - -public slots: - protected: void assign(const WimaJoinedAreaData &other); void assign(const WimaJoinedArea &other); diff --git a/src/Wima/WaypointManager/AreaInterface.cpp b/src/Wima/WaypointManager/AreaInterface.cpp index bba104c07..d2ba5b105 100644 --- a/src/Wima/WaypointManager/AreaInterface.cpp +++ b/src/Wima/WaypointManager/AreaInterface.cpp @@ -41,6 +41,16 @@ void WaypointManager::AreaInterface::setJoinedArea(WimaJoinedAreaData *area) _jArea = area; } +const WimaMeasurementAreaData *WaypointManager::AreaInterface::measurementArea() const +{ + return _mArea; +} + +const WimaServiceAreaData *WaypointManager::AreaInterface::serviceArea() const +{ + return _sArea; +} + const WimaCorridorData *WaypointManager::AreaInterface::corridor() const { return _cArea; diff --git a/src/Wima/WaypointManager/DefaultManager.cpp b/src/Wima/WaypointManager/DefaultManager.cpp index 1c58931ad..8ec5ff3c8 100644 --- a/src/Wima/WaypointManager/DefaultManager.cpp +++ b/src/Wima/WaypointManager/DefaultManager.cpp @@ -8,7 +8,7 @@ bool WaypointManager::DefaultManager::update() { // extract waypoints _slice.clear(); - _slicer->update(_waypoints, _slice); + Slicer::update(_waypoints, _slice); return _worker(); } @@ -16,7 +16,7 @@ bool WaypointManager::DefaultManager::next() { // extract waypoints _slice.clear(); - _slicer->next(_waypoints, _slice); + Slicer::next(_waypoints, _slice); return _worker(); } @@ -24,7 +24,7 @@ bool WaypointManager::DefaultManager::previous() { // extract waypoints _slice.clear(); - _slicer->previous(_waypoints, _slice); + Slicer::previous(_waypoints, _slice); return _worker(); } @@ -32,7 +32,7 @@ bool WaypointManager::DefaultManager::reset() { // extract waypoints _slice.clear(); - _slicer->reset(_waypoints, _slice); + Slicer::reset(_waypoints, _slice); return _worker(); } diff --git a/src/Wima/WaypointManager/DefaultManager.h b/src/Wima/WaypointManager/DefaultManager.h index 80817f05b..19cd2e504 100644 --- a/src/Wima/WaypointManager/DefaultManager.h +++ b/src/Wima/WaypointManager/DefaultManager.h @@ -20,8 +20,7 @@ class DefaultManager : public ManagerBase { public: DefaultManager() = delete; - DefaultManager(Slicer *slicer, - Settings *settings, + DefaultManager(Settings *settings, AreaInterface *interface); diff --git a/src/Wima/WaypointManager/GenericSlicer.cpp b/src/Wima/WaypointManager/GenericSlicer.cpp deleted file mode 100644 index 2131d73c9..000000000 --- a/src/Wima/WaypointManager/GenericSlicer.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "GenericSlicer.h" diff --git a/src/Wima/WaypointManager/GenericSlicer.h b/src/Wima/WaypointManager/GenericSlicer.h deleted file mode 100644 index 992023adb..000000000 --- a/src/Wima/WaypointManager/GenericSlicer.h +++ /dev/null @@ -1,164 +0,0 @@ -#pragma once - -#include -#include - -#include "Utils.h" - -//! @brief Base class for all waypoint managers. -template class Container /*e.g. QVector*/> -class GenericSlicer -{ -public: - typedef Container ContainerType; - GenericSlicer(); - - - // Slicing. - void update (const ContainerType &source, ContainerType &update); - void next (const ContainerType &source, ContainerType &update); - void previous (const ContainerType &source, ContainerType &update); - void reset (const ContainerType &source, ContainerType &update); - - - // Slicing parameters. - //! @brief Sets the overlap. - //! - //! @param overlap The number of overlapping vertices - //! between on and the next slice. - void setOverlap (uint32_t overlap); - //! @brief Sets the number of vertices per slice. - //! - //! @param N The number of vertices per slice. - void setN (std::uint32_t N); - //! @brief Sets the start index. - //! - //! @param idxStart The start index. - void setStartIndex (int idxStart); - - //! @return Returns the overlap. - uint32_t overlap (); - //! @return Returns the number of vertices per slice N. - uint32_t N (); - //! @return Returns the start index. - int startIndex (); - - -private: - void _updateIdx(std::size_t size); - - long _idxStart; - long _idxEnd; - long _idxNext; - long _idxPrevious; - uint32_t _overlap; - uint32_t _N; - bool _idxValid; - bool _atEnd; - - -}; - - -template class Container /*e.g. QVector*/> -GenericSlicer::GenericSlicer(): - _idxValid(false) - , _atEnd(false) -{} - -template class Container /*e.g. QVector*/> -void GenericSlicer::setOverlap(std::uint32_t overlap) -{ - _idxValid = false; - _overlap = overlap; -} - -template class Container /*e.g. QVector*/> -void GenericSlicer::setN(uint32_t N) -{ - _idxValid = false; - _N = N > 0 ? N : 1; -} - -template class Container /*e.g. QVector*/> -void GenericSlicer::setStartIndex(int idxStart) -{ - _idxValid = false; - _idxStart = idxStart; -} - -template class Container /*e.g. QVector*/> -uint32_t GenericSlicer::overlap() -{ - return _overlap; -} - -template class Container /*e.g. QVector*/> -uint32_t GenericSlicer::N() -{ - return _N; -} - -template class Container /*e.g. QVector*/> -int GenericSlicer::startIndex() -{ - return _idxStart; -} - - -template class Container /*e.g. QVector*/> -void GenericSlicer::_updateIdx(std::size_t size) -{ - _idxValid = true; - _atEnd = false; - if ( _idxStart >= size-1 ) { - _idxStart = size-1; - _idxEnd = _idxStart; - _idxNext = _idxStart; - _atEnd = true; - return; - } - - _idxStart < 0 ? 0 : _idxStart; - - _idxEnd = _idxStart + _N - 1; - _idxEnd = _idxEnd < size ? _idxEnd : size-1; - - _idxNext = _idxEnd + 1 - _overlap; - _idxNext = _idxNext < 0 ? 0 : _idxNext; - _idxNext = _idxNext < size ? _idxNext : size-1; - - _idxPrevious = _idxStart - 1 + _overlap; - _idxPrevious = _idxPrevious < 0 ? 0 : _idxPrevious; - _idxPrevious = _idxPrevious < size ? _idxPrevious : size-1; -} - -template class Container /*e.g. QVector*/> -void GenericSlicer::update(const ContainerType &source, - Container &slice){ - - if ( !_idxValid) - _updateIdx(source.size()); - - WaypointManager::Utils::extract(source, slice, _idxStart, _idxEnd); - // extract waypoints - -} - -template class Container /*e.g. QVector*/> -void GenericSlicer::next(const ContainerType &source, Container &slice){ - setStartIndex(_idxNext); - slice(source, slice); -} - -template class Container /*e.g. QVector*/> -void GenericSlicer::previous(const ContainerType &source, Container &slice){ - setStartIndex(_idxPrevious); - slice(source, slice); -} - -template class Container /*e.g. QVector*/> -void GenericSlicer::reset(const ContainerType &source, Container &slice){ - setStartIndex(0); - slice(source, slice); -} diff --git a/src/Wima/WaypointManager/GenericWaypointManager.h b/src/Wima/WaypointManager/GenericWaypointManager.h index 162d3c0fb..f1e3e4b88 100644 --- a/src/Wima/WaypointManager/GenericWaypointManager.h +++ b/src/Wima/WaypointManager/GenericWaypointManager.h @@ -2,7 +2,7 @@ #include -#include "GenericSlicer.h" +#include "Slicer.h" namespace WaypointManager { @@ -10,14 +10,13 @@ template class ContainerType, class MissionItemList, class SettingsType> -class GenericWaypointManager +class GenericWaypointManager : public Slicer { public: - typedef GenericSlicer Slicer; typedef ContainerType WaypointList; GenericWaypointManager() = delete; - GenericWaypointManager(Slicer *slicer, SettingsType *settings); + GenericWaypointManager(SettingsType *settings); // Waypoint editing. void setWaypoints(const WaypointList &waypoints); @@ -42,7 +41,6 @@ protected: WaypointList _waypoints; WaypointList _slice; MissionItemList _missionItems; - Slicer *_slicer; SettingsType *_settings; }; @@ -54,12 +52,9 @@ template::GenericWaypointManager( - Slicer *slicer, - SettingsType *Settings + SettingsType>::GenericWaypointManager(SettingsType *Settings ) - : _slicer(slicer) - , _settings(_settings) + : _settings(_settings) {} template 0 ? N : 1; +} + +void Slicer::setStartIndex(int idxStart) +{ + _idxValid = false; + _idxStart = idxStart; +} + +uint32_t Slicer::overlap() +{ + return _overlap; +} + +uint32_t Slicer::N() +{ + return _N; +} + +int Slicer::startIndex() +{ + return _idxStart; +} + +Slicer &Slicer::operator=(const Slicer &other) +{ + +} + +void Slicer::_updateIdx(std::size_t size) +{ + _idxValid = true; + _atEnd = false; + if ( _idxStart >= long(size)-1 ) { + _idxStart = long(size)-1; + _idxEnd = _idxStart; + _idxNext = _idxStart; + _atEnd = true; + return; + } + + _idxStart = _idxStart < 0 ? 0 : _idxStart; + + _idxEnd = _idxStart + _N - 1; + _idxEnd = _idxEnd < long(size) ? _idxEnd : size-1; + + _idxNext = _idxEnd + 1 - _overlap; + _idxNext = _idxNext < 0 ? 0 : _idxNext; + _idxNext = _idxNext < long(size) ? _idxNext : size-1; + + _idxPrevious = _idxStart - 1 + _overlap; + _idxPrevious = _idxPrevious < 0 ? 0 : _idxPrevious; + _idxPrevious = _idxPrevious < long(size) ? _idxPrevious : size-1; +} diff --git a/src/Wima/WaypointManager/Slicer.h b/src/Wima/WaypointManager/Slicer.h new file mode 100644 index 000000000..d934f60f8 --- /dev/null +++ b/src/Wima/WaypointManager/Slicer.h @@ -0,0 +1,94 @@ +#pragma once + +#include +#include + +#include "Utils.h" + +//! @brief Base class for all waypoint managers. +class Slicer +{ +public: + Slicer(); + + +protected: + // Slicing. + template + void update (const Container1 &source, Container2 &slice); + template + void next (const Container1 &source, Container2 &slice); + template + void previous (const Container1 &source, Container2 &slice); + template + void reset (const Container1 &source, Container2 &slice); + +public: + // Slicing parameters. + //! @brief Sets the overlap. + //! + //! @param overlap The number of overlapping vertices + //! between on and the next slice. + void setOverlap (uint32_t overlap); + //! @brief Sets the number of vertices per slice. + //! + //! @param N The number of vertices per slice. + void setN (std::uint32_t N); + //! @brief Sets the start index. + //! + //! @param idxStart The start index. + void setStartIndex (int idxStart); + + //! @return Returns the overlap. + uint32_t overlap (); + //! @return Returns the number of vertices per slice N. + uint32_t N (); + //! @return Returns the start index. + int startIndex (); + + Slicer &operator=(const Slicer &other); + + +private: + void _updateIdx(std::size_t size); + + long _idxStart; + long _idxEnd; + long _idxNext; + long _idxPrevious; + uint32_t _overlap; + uint32_t _N; + bool _idxValid; + bool _atEnd; + + +}; + +template +void Slicer::update(const Container1 &source, Container2 &slice){ + + if ( !_idxValid) + _updateIdx(source.size()); + + WaypointManager::Utils::extract(source, slice, _idxStart, _idxEnd); +} + +template +void Slicer::next(const Container1 &source, Container2 &slice){ + setStartIndex(_idxNext); + update(source, slice); +} + + +template +void Slicer::previous(const Container1 &source, Container2 &slice){ + setStartIndex(_idxPrevious); + update(source, slice); +} + + +template +void Slicer::reset(const Container1 &source, Container2 &slice){ + setStartIndex(0); + update(source, slice); +} diff --git a/src/Wima/WaypointManager/Utils.h b/src/Wima/WaypointManager/Utils.h index 175185d13..96963aa15 100644 --- a/src/Wima/WaypointManager/Utils.h +++ b/src/Wima/WaypointManager/Utils.h @@ -20,7 +20,7 @@ QVariant getCoordinate(const SimpleMissionItem* item); /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList. template class ContainerType> -bool extract(QmlObjectListModel &missionItems, +bool extract(const QmlObjectListModel &missionItems, ContainerType &coordinateList, std::size_t startIndex, std::size_t endIndex) @@ -59,7 +59,7 @@ bool extract(QmlObjectListModel &missionItems, /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList. template class ContainerType> -bool extract(QmlObjectListModel &missionItems, +bool extract(const QmlObjectListModel &missionItems, ContainerType &coordinateList) { @@ -73,7 +73,7 @@ bool extract(QmlObjectListModel &missionItems, /// extracts the coordinates stored in missionItems (list of MissionItems) and stores them in coordinateList. template class ContainerType> -bool extract(ContainerType &source, +bool extract(const ContainerType &source, ContainerType &destination, std::size_t startIndex, std::size_t endIndex) -- 2.22.0