diff --git a/qgroundcontrol.pro b/qgroundcontrol.pro index 3677488dd7f9123df5c7de7ba472750c3c65f98c..76a017f54e25e7619aacb6c655bdda2973c1e1a9 100644 --- a/qgroundcontrol.pro +++ b/qgroundcontrol.pro @@ -445,6 +445,10 @@ contains (DEFINES, QGC_ENABLE_PAIRING) { # HEADERS += \ + src/MeasurementComplexItem/IDArray.h \ + src/MeasurementComplexItem/LogicalArray.h \ + src/MeasurementComplexItem/TileArray.h \ + src/MeasurementComplexItem/TilePtrArray.h \ src/MeasurementComplexItem/geometry/ProgressArray.h \ src/MeasurementComplexItem/geometry/TileDiff.h \ src/MeasurementComplexItem/geometry/geometry.h \ diff --git a/src/MeasurementComplexItem/IDArray.h b/src/MeasurementComplexItem/IDArray.h new file mode 100644 index 0000000000000000000000000000000000000000..6052cec19198cd28f626ca53443516c0e3d27bb8 --- /dev/null +++ b/src/MeasurementComplexItem/IDArray.h @@ -0,0 +1,5 @@ +#ifndef IDARRAY_H +#define IDARRAY_H +typedef QVector IDArray; + +#endif // IDARRAY_H diff --git a/src/MeasurementComplexItem/LogicalArray.h b/src/MeasurementComplexItem/LogicalArray.h new file mode 100644 index 0000000000000000000000000000000000000000..359eb67a3891776dc6bc4cf33be4dc0bd4dcf818 --- /dev/null +++ b/src/MeasurementComplexItem/LogicalArray.h @@ -0,0 +1,5 @@ +#ifndef LOGICALARRAY_H +#define LOGICALARRAY_H +typedef QVector LogicalArray; + +#endif // LOGICALARRAY_H diff --git a/src/MeasurementComplexItem/NemoInterface.cpp b/src/MeasurementComplexItem/NemoInterface.cpp index 4cfd1f104fb9f15d082d79d8700e02472ee5e734..264dc58111b3719aefaca2b88c4b4331d15840bc 100644 --- a/src/MeasurementComplexItem/NemoInterface.cpp +++ b/src/MeasurementComplexItem/NemoInterface.cpp @@ -15,9 +15,9 @@ #include "GenericSingelton.h" #include "geometry/MeasurementArea.h" #include "geometry/geometry.h" +#include "nemo_interface/MeasurementTile.h" #include "nemo_interface/QNemoHeartbeat.h" #include "nemo_interface/QNemoProgress.h" -#include "nemo_interface/MeasurementTile.h" #include "ros_bridge/include/messages/geographic_msgs/geopoint.h" #include "ros_bridge/include/messages/jsk_recognition_msgs/polygon_array.h" @@ -31,7 +31,7 @@ QGC_LOGGING_CATEGORY(NemoInterfaceLog, "NemoInterfaceLog") #define EVENT_TIMER_INTERVAL 100 // ms -auto static timeoutInterval = std::chrono::milliseconds(3000); +auto constexpr static timeoutInterval = std::chrono::milliseconds(3000); using ROSBridgePtr = std::unique_ptr; using JsonDocUPtr = ros_bridge::com_private::JsonDocUPtr; @@ -47,15 +47,20 @@ public: void start(); void stop(); - void setTileData(const TileData &tileData); - bool hasTileData(const TileData &tileData) const; - void setAutoPublish(bool ap); - void setHoldProgress(bool hp); + void addTiles(const TilePtrArray &tileArray); + void addTiles(const TileArray &tileArray); + void removeTiles(const IDArray &idArray); + void clearTiles(); + TileArray getTiles(const IDArray &idArray); + TileArray getAllTiles(); + LogicalArray containsTiles(const IDArray &idArray); + TileArray extractTiles(const IDArray &idArray); + std::size_t size(); + bool empty(); void publishTileData(); NemoInterface::STATUS status(); - QVector progress(); bool running(); private: @@ -63,32 +68,13 @@ private: void loop(); static STATUS heartbeatToStatus( const ros_bridge::messages::nemo_msgs::heartbeat::Heartbeat &hb); - //! - //! \brief Publishes tilesENU - //! \pre this->tilesENUMutex must be locked - //! - void publishTilesENU(); - //! - //! \brief Publishes ENUOrigin - //! \pre this->ENUOriginMutex must be locked - //! - void publishENUOrigin(); + bool setStatus(NemoInterface::STATUS s); - // Data. - SnakeTilesLocal tilesENU; - mutable std::shared_timed_mutex tilesENUMutex; - QGeoCoordinate ENUOrigin; - mutable std::shared_timed_mutex ENUOriginMutex; - QNemoProgress qProgress; - mutable std::shared_timed_mutex progressMutex; TimePoint nextTimeout; mutable std::shared_timed_mutex timeoutMutex; std::atomic status_; - // Not protected data. - TileData tileData; - // Internals std::atomic_bool running_; std::atomic_bool topicServiceSetupDone; @@ -170,7 +156,8 @@ void NemoInterface::Impl::setTileData(const TileData &tileData) { tile = qobject_cast(obj); if (tile != nullptr) { SnakeTileLocal tileENU; - geometry::areaToEnu(origin, tile->coordinateList(), tileENU.path()); + geometry::areaToEnu(origin, tile->coordinateList(), + tileENU.path()); this->tilesENU.polygons().push_back(std::move(tileENU)); } else { qCDebug(NemoInterfaceLog) << "Impl::setTileData(): nullptr."; @@ -443,6 +430,44 @@ void NemoInterface::start() { this->pImpl->start(); } void NemoInterface::stop() { this->pImpl->stop(); } +void NemoInterface::addTiles(const NemoInterface::TilePtrArray &tileArray) { + this->pImpl - +} + +void NemoInterface::addTiles(const TileArray &tileArray) { + TilePtrArray ptrArray; + for (const auto &tile : tileArray) { + ptrArray.append(&tile); + } + addTiles(ptrArray); +} + +void NemoInterface::removeTiles(const IDArray &idArray) { + this->pImpl->removeTiles(idArray); +} + +void NemoInterface::clearTiles() { this->pImpl->clearTiles(); } + +TileArray NemoInterface::getTiles(const IDArray &idArray) { + return this->pImpl->getTiles(idArray); +} + +TileArray NemoInterface::getAllTiles() { + return this->pImpl->getTiles(idArray); +} + +LogicalArray NemoInterface::containsTiles(const IDArray &idArray) { + return this->pImpl->containsTiles(idArray); +} + +TileArray NemoInterface::extractTiles(const IDArray &idArray) { + return this->pImpl->extractTiles(idArray); +} + +std::size_t NemoInterface::size() { return this->pImpl->size(); } + +bool NemoInterface::empty() { return this->pImpl->empty(); } + void NemoInterface::publishTileData() { this->pImpl->publishTileData(); } void NemoInterface::requestProgress() { diff --git a/src/MeasurementComplexItem/NemoInterface.h b/src/MeasurementComplexItem/NemoInterface.h index 681d3251ca8543d3928d13d5756601d184bc028a..745a907d834295580485475ec0a8f010964afa4d 100644 --- a/src/MeasurementComplexItem/NemoInterface.h +++ b/src/MeasurementComplexItem/NemoInterface.h @@ -5,8 +5,13 @@ #include -class TileData; +#include "IDArray.h" +#include "LogicalArray.h" +#include "TileArray.h" +#include "TilePtrArray.h" +// Singelton class used to interface measurement devices implementing the nemo +// interface. class NemoInterface : public QObject { Q_OBJECT class Impl; @@ -31,23 +36,25 @@ public: Q_PROPERTY(STATUS status READ status NOTIFY statusChanged) Q_PROPERTY(QString statusString READ statusString NOTIFY statusChanged) - Q_PROPERTY(QVector progress READ progress NOTIFY progressChanged) Q_PROPERTY(QString editorQml READ editorQml CONSTANT) Q_PROPERTY(bool running READ running NOTIFY runningChanged) Q_INVOKABLE void start(); Q_INVOKABLE void stop(); - Q_INVOKABLE void publishTileData(); - Q_INVOKABLE void requestProgress(); - void setTileData(const TileData &tileData); - bool hasTileData(const TileData &tileData) const; - void setAutoPublish(bool ap); - void setHoldProgress(bool hp); + void addTiles(const TilePtrArray &tileArray); + void addTiles(const TileArray &tileArray); + void removeTiles(const IDArray &idArray); + void clearTiles(); + TileArray getTiles(const IDArray &idArray); + TileArray getAllTiles(); + LogicalArray containsTiles(const IDArray &idArray); + TileArray extractTiles(const IDArray &idArray); + std::size_t size(); + bool empty(); STATUS status() const; QString statusString() const; - QVector progress() const; QString editorQml(); bool running(); diff --git a/src/MeasurementComplexItem/TileArray.h b/src/MeasurementComplexItem/TileArray.h new file mode 100644 index 0000000000000000000000000000000000000000..c611f02756fcab1d2c35f049350271330824ad02 --- /dev/null +++ b/src/MeasurementComplexItem/TileArray.h @@ -0,0 +1,5 @@ +#ifndef TILEARRAY_H +#define TILEARRAY_H +typedef QVector TileArray; + +#endif // TILEARRAY_H diff --git a/src/MeasurementComplexItem/TilePtrArray.h b/src/MeasurementComplexItem/TilePtrArray.h new file mode 100644 index 0000000000000000000000000000000000000000..e40d27d85d4950dfbee469b0f143f100aad2b2ab --- /dev/null +++ b/src/MeasurementComplexItem/TilePtrArray.h @@ -0,0 +1,5 @@ +#ifndef TILEPTRARRAY_H +#define TILEPTRARRAY_H +typedef QVector TilePtrArray; + +#endif // TILEPTRARRAY_H