Commit 46adaf36 authored by Valentin Platzgummer's avatar Valentin Platzgummer

wima planer, wima controller edited

parent 912e993b
......@@ -174,23 +174,30 @@ Rectangle {
BusyIndicator{
id: indicator
anchors.horizontalCenter: parent.horizontalCenter
running: missionItem.calculating
property bool calculating: missionItem.calculating
running: calculating
onRunningChanged: {
if(running){
onCalculatingChanged: {
if(calculating){
visible = true
} else {
timer.restart()
}
}
Component.onCompleted: {
if (calculating){
visible = true
}
}
Timer{
id: timer
interval: 2000
interval: 1000
repeat: false
onTriggered: {
if (indicator.running == false){
if (indicator.calculating == false){
indicator.visible = false
}
}
......
......@@ -64,6 +64,9 @@ void CSWorker::update(const QGeoCoordinate &depot,
Lock lk(this->_mutex);
this->_depot = depot;
this->_safeArea = safeArea;
for (auto &v : this->_safeArea) {
v.setAltitude(0);
}
this->_polygon = polygon;
for (auto &v : this->_polygon) {
v.setAltitude(0);
......@@ -96,6 +99,7 @@ void CSWorker::run() {
depot = this->_depot;
safeArea = this->_safeArea;
} else {
depot = this->_origin;
safeArea = this->_polygon;
}
const auto polygon = this->_polygon;
......@@ -379,11 +383,11 @@ void CSWorker::run() {
} else {
// Find index of first waypoint.
std::size_t idxFirst = 0;
const auto &info1 =
this->_useDepotSafeArea ? transectsInfo[1] : transectsInfo[0];
const auto &firstTransect = transectsENU[info1.index];
const auto &firstWaypoint =
info1.reversed ? firstTransect.back() : firstTransect.front();
const auto &infoFirst = transectsInfo.front();
const auto &firstTransect = transectsENU[infoFirst.index];
const auto &firstWaypoint = infoFirst.reversed
? firstTransect.back()
: firstTransect.front();
double th = 0.001;
for (std::size_t i = 0; i < route.size(); ++i) {
auto dist = bg::distance(route[i], firstWaypoint);
......@@ -393,11 +397,11 @@ void CSWorker::run() {
}
}
// Find index of last waypoint.
std::size_t idxLast = 0;
const auto &info = transectsInfo.back();
const auto &lastTransect = transectsENU[info.index];
std::size_t idxLast = route.size() - 1;
const auto &infoLast = transectsInfo.back();
const auto &lastTransect = transectsENU[infoLast.index];
const auto &lastWaypoint =
info.reversed ? lastTransect.front() : lastTransect.back();
infoLast.reversed ? lastTransect.front() : lastTransect.back();
for (long i = route.size() - 1; i >= 0; --i) {
auto dist = bg::distance(route[i], lastWaypoint);
if (dist < th) {
......
......@@ -29,7 +29,7 @@ public:
Q_PROPERTY(Fact *deltaAlpha READ deltaAlpha CONSTANT)
Q_PROPERTY(Fact *transectMinLength READ transectMinLength CONSTANT)
Q_PROPERTY(bool calculating READ calculating NOTIFY calculatingChanged)
Q_PROPERTY(bool hidePolygon READ hidePolygon NOTIFY hidePolygon)
Q_PROPERTY(bool hidePolygon READ hidePolygon NOTIFY hidePolygonChanged)
Q_INVOKABLE void resetReference(void);
Q_INVOKABLE void reverse(void);
......
......@@ -20,11 +20,15 @@ WimaServiceArea &WimaServiceArea::operator=(const WimaServiceArea &other) {
return *this;
}
void WimaServiceArea::setDepot(const QGeoCoordinate &coordinate) {
bool WimaServiceArea::setDepot(const QGeoCoordinate &coordinate) {
if (_depot != coordinate) {
_depot = coordinate;
emit depotChanged();
if (this->containsCoordinate(coordinate)) {
_depot = coordinate;
emit depotChanged();
return true;
}
}
return false;
}
void WimaServiceArea::saveToJson(QJsonObject &json) {
......@@ -58,8 +62,8 @@ void print(const WimaServiceArea &area, QString &outputStr) {
void WimaServiceArea::init() {
this->setObjectName(wimaServiceAreaName);
connect(this, &WimaServiceArea::centerChanged, [this] {
if (!this->_depot.isValid()) {
connect(this, &WimaArea::pathChanged, [this] {
if (!this->_depot.isValid() || !this->containsCoordinate(this->_depot)) {
this->setDepot(this->center());
}
});
......
......@@ -34,7 +34,7 @@ signals:
void depotChanged(void);
public slots:
void setDepot(const QGeoCoordinate &coordinate);
bool setDepot(const QGeoCoordinate &coordinate);
private:
// Member Methodes
......
......@@ -2,37 +2,33 @@
const char *WimaServiceAreaData::typeString = "WimaServiceAreaData";
WimaServiceAreaData::WimaServiceAreaData(QObject *parent)
: WimaAreaData(parent)
{
: WimaAreaData(parent) {}
WimaServiceAreaData::WimaServiceAreaData(const WimaServiceAreaData &other,
QObject *parent)
: WimaAreaData(parent) {
*this = other;
}
WimaServiceAreaData::WimaServiceAreaData(const WimaServiceAreaData &other, QObject *parent)
: WimaAreaData (parent)
{
*this = other;
WimaServiceAreaData::WimaServiceAreaData(const WimaServiceArea &other,
QObject *parent)
: WimaAreaData(parent) {
*this = other;
}
WimaServiceAreaData::WimaServiceAreaData(const WimaServiceArea &other, QObject *parent)
: WimaAreaData (parent)
{
*this = other;
WimaServiceAreaData &WimaServiceAreaData::
operator=(const WimaServiceAreaData &otherData) {
this->assign(otherData);
this->setDepot(otherData.depot());
return *this;
}
WimaServiceAreaData &WimaServiceAreaData::operator=(const WimaServiceAreaData &otherData)
{
this->assign(otherData);
return *this;
}
WimaServiceAreaData &WimaServiceAreaData::operator=(const WimaServiceArea &otherArea)
{
this->assign(otherArea);
return *this;
WimaServiceAreaData &WimaServiceAreaData::
operator=(const WimaServiceArea &otherArea) {
this->assign(otherArea);
this->setDepot(otherArea.depot());
return *this;
}
/*!
......@@ -40,77 +36,41 @@ WimaServiceAreaData &WimaServiceAreaData::operator=(const WimaServiceArea &other
* Returns a constant reference to the takeOffPosition.
*
*/
const QGeoCoordinate &WimaServiceAreaData::takeOffPosition() const
{
return _takeOffPosition;
}
/*!
* \fn const QGeoCoordinate &WimaServiceAreaData::landOffPosition() const
* Returns a constant reference to the landOffPosition.
*
*/
const QGeoCoordinate &WimaServiceAreaData::landPosition() const
{
return _landPosition;
}
QString WimaServiceAreaData::type() const
{
return this->typeString;
}
/*!
* \fn void WimaServiceAreaData::setTakeOffPosition(const QGeoCoordinate &newCoordinate)
* Sets the takeoff position to the \a newCoordinate and emits the takeOffPositionChanged() signal,
* if newCoordinate differs from the member value.
*
*/
void WimaServiceAreaData::setTakeOffPosition(const QGeoCoordinate &newCoordinate)
{
if (_takeOffPosition != newCoordinate) {
_takeOffPosition = newCoordinate;
emit takeOffPositionChanged(_takeOffPosition);
}
}
const QGeoCoordinate &WimaServiceAreaData::depot() const { return _depot; }
QString WimaServiceAreaData::type() const { return this->typeString; }
/*!
* \fn void WimaServiceAreaData::setLandOffPosition(const QGeoCoordinate &newCoordinate)
* Sets the land position to the \a newCoordinate and emits the landOffPositionChanged() signal,
* if newCoordinate differs from the member value.
* \fn void WimaServiceAreaData::setTakeOffPosition(const QGeoCoordinate
* &newCoordinate) Sets the takeoff position to the \a newCoordinate and emits
* the takeOffPositionChanged() signal, if newCoordinate differs from the member
* value.
*
*/
void WimaServiceAreaData::setLandPosition(const QGeoCoordinate &newCoordinate)
{
if (_landPosition != newCoordinate) {
_landPosition = newCoordinate;
emit landPositionChanged(_landPosition);
}
void WimaServiceAreaData::setDepot(const QGeoCoordinate &newCoordinate) {
if (_depot != newCoordinate) {
_depot = newCoordinate;
emit depotChanged(_depot);
}
}
void WimaServiceAreaData::assign(const WimaServiceAreaData &other)
{
WimaAreaData::assign(other);
setLandPosition(other.landPosition());
setTakeOffPosition(other.takeOffPosition());
void WimaServiceAreaData::assign(const WimaServiceAreaData &other) {
WimaAreaData::assign(other);
setDepot(other.depot());
}
void WimaServiceAreaData::assign(const WimaServiceArea &other)
{
WimaAreaData::assign(other);
setLandPosition(other.landPosition());
setTakeOffPosition(other.depot());
void WimaServiceAreaData::assign(const WimaServiceArea &other) {
WimaAreaData::assign(other);
setDepot(other.depot());
}
/*!
* \class WimaAreaData::WimaServiceAreaData
* \brief Class to store and exchange data of a \c WimaServiceArea Object.
* Class to store and exchange data of a \c WimaServiceArea Object. In contrast to \c WimaServiceArea this class
* does not provied any interface to a grafical user interface, neiter it uses the QGC Fact System.
* It is designed to exchange data between the \c WimaPlaner and the \c WimaController class. And it
* is the derived from WimaAreaData.
* Class to store and exchange data of a \c WimaServiceArea Object. In contrast
* to \c WimaServiceArea this class does not provied any interface to a grafical
* user interface, neiter it uses the QGC Fact System. It is designed to
* exchange data between the \c WimaPlaner and the \c WimaController class. And
* it is the derived from WimaAreaData.
*
* \sa WimaServiceArea, WimaAreaData
*/
#pragma once
#include <QObject>
#include "QGeoCoordinate"
#include <QObject>
#include "WimaAreaData.h"
#include "WimaServiceArea.h"
class WimaServiceAreaData : public WimaAreaData
{
Q_OBJECT
class WimaServiceAreaData : public WimaAreaData {
Q_OBJECT
public:
WimaServiceAreaData(QObject *parent = nullptr);
WimaServiceAreaData(const WimaServiceAreaData &other, QObject *parent = nullptr);
WimaServiceAreaData(const WimaServiceArea &other, QObject *parent = nullptr);
WimaServiceAreaData& operator=(const WimaServiceAreaData &otherData);
WimaServiceAreaData& operator=(const WimaServiceArea &otherArea);
WimaServiceAreaData(QObject *parent = nullptr);
WimaServiceAreaData(const WimaServiceAreaData &other,
QObject *parent = nullptr);
WimaServiceAreaData(const WimaServiceArea &other, QObject *parent = nullptr);
WimaServiceAreaData &operator=(const WimaServiceAreaData &otherData);
WimaServiceAreaData &operator=(const WimaServiceArea &otherArea);
const QGeoCoordinate &takeOffPosition() const;
const QGeoCoordinate &landPosition() const;
const QGeoCoordinate &depot() const;
QString type() const;
WimaServiceAreaData *Clone() const {return new WimaServiceAreaData();}
static const char* typeString;
QString type() const;
WimaServiceAreaData *Clone() const { return new WimaServiceAreaData(); }
static const char *typeString;
signals:
void takeOffPositionChanged(const QGeoCoordinate& other);
void landPositionChanged(const QGeoCoordinate& other);
void depotChanged(const QGeoCoordinate &other);
public slots:
void setTakeOffPosition(const QGeoCoordinate& newCoordinate);
void setLandPosition(const QGeoCoordinate& newCoordinate);
void setDepot(const QGeoCoordinate &newCoordinate);
protected:
void assign(const WimaServiceAreaData &other);
void assign(const WimaServiceArea &other);
void assign(const WimaServiceAreaData &other);
void assign(const WimaServiceArea &other);
private:
// see WimaServieArea.h for explanation
QGeoCoordinate _takeOffPosition;
QGeoCoordinate _landPosition;
// see WimaServieArea.h for explanation
QGeoCoordinate _depot;
};
#include "WimaBridge.h"
#include "WimaController.h"
WimaBridge::WimaBridge(QObject *parent)
: QObject (parent)
{
WimaBridge::WimaBridge(QObject *parent) : QObject(parent) {}
}
WimaController *WimaBridge::wimaController() { return _wimaController; }
WimaController *WimaBridge::wimaController()
{
return _wimaController;
}
WimaPlaner *WimaBridge::wimaPlaner() { return _wimaPlaner; }
WimaPlaner *WimaBridge::wimaPlaner()
{
return _wimaPlaner;
}
WimaBridge *WimaBridge::thisPointer()
{
return this;
}
WimaBridge *WimaBridge::thisPointer() { return this; }
void WimaBridge::setWimaController(WimaController *controller)
{
if (_wimaController != controller){
_wimaController = controller;
void WimaBridge::setWimaController(WimaController *controller) {
if (_wimaController != controller) {
_wimaController = controller;
emit wimaControllerChanged(_wimaController);
}
emit wimaControllerChanged(_wimaController);
}
}
void WimaBridge::setWimaPlaner(WimaPlaner *planer)
{
if (_wimaPlaner != planer){
_wimaPlaner = planer;
emit wimaPlanerChanged(_wimaPlaner);
}
void WimaBridge::setWimaPlaner(WimaPlaner *planer) {
if (_wimaPlaner != planer) {
_wimaPlaner = planer;
emit wimaPlanerChanged(_wimaPlaner);
}
}
bool WimaBridge::setWimaPlanData(const WimaPlanData &planData)
{
if ( _wimaController != nullptr) {
return _wimaController->setWimaPlanData(planData);
}
return false;
bool WimaBridge::setWimaPlanData(QSharedPointer<WimaPlanData> planData) {
if (_wimaController != nullptr) {
return _wimaController->setWimaPlanData(planData);
}
return false;
}
#pragma once
#include <QObject>
#include <QSharedPointer>
#include "WimaPlanData.h"
......@@ -11,38 +12,33 @@ class WimaPlaner;
//! \brief The WimaBridge class
//!
//! A bridge establishing a link between WimaController and WimaPlaner
class WimaBridge : public QObject
{
Q_OBJECT
class WimaBridge : public QObject {
Q_OBJECT
public:
WimaBridge(QObject *parent = nullptr);
WimaBridge(WimaBridge &other) = delete;
WimaBridge(QObject *parent = nullptr);
WimaBridge(WimaBridge &other) = delete;
Q_PROPERTY(WimaPlaner *wimaPlaner
READ wimaPlaner
WRITE setWimaPlaner
NOTIFY wimaPlanerChanged)
Q_PROPERTY(WimaController *wimaController
READ wimaController
WRITE setWimaController
NOTIFY wimaControllerChanged)
Q_PROPERTY(WimaPlaner *wimaPlaner READ wimaPlaner WRITE setWimaPlaner NOTIFY
wimaPlanerChanged)
Q_PROPERTY(WimaController *wimaController READ wimaController WRITE
setWimaController NOTIFY wimaControllerChanged)
WimaController *wimaController();
WimaPlaner *wimaPlaner();
WimaController *wimaController();
WimaPlaner *wimaPlaner();
Q_INVOKABLE WimaBridge *thisPointer();
Q_INVOKABLE WimaBridge *thisPointer();
void setWimaController (WimaController *controller);
void setWimaPlaner (WimaPlaner *planer);
void setWimaController(WimaController *controller);
void setWimaPlaner(WimaPlaner *planer);
signals:
void wimaControllerChanged (WimaController *controller);
void wimaPlanerChanged (WimaPlaner *planer);
void wimaControllerChanged(WimaController *controller);
void wimaPlanerChanged(WimaPlaner *planer);
public slots:
bool setWimaPlanData(const WimaPlanData &planData);
bool setWimaPlanData(QSharedPointer<WimaPlanData> planData);
private:
WimaController *_wimaController;
WimaPlaner *_wimaPlaner;
WimaController *_wimaController;
WimaPlaner *_wimaPlaner;
};
......@@ -353,7 +353,7 @@ bool WimaController::_calcShortestPath(const QGeoCoordinate &start,
return retVal;
}
bool WimaController::setWimaPlanData(const WimaPlanData &planData) {
bool WimaController::setWimaPlanData(QSharedPointer<WimaPlanData> planData) {
// reset visual items
_areas.clear();
_defaultWM.clear();
......@@ -368,7 +368,7 @@ bool WimaController::setWimaPlanData(const WimaPlanData &planData) {
_localPlanDataValid = false;
// extract list with WimaAreas
QList<const WimaAreaData *> areaList = planData.areaList();
QList<const WimaAreaData *> areaList = planData->areaList();
int areaCounter = 0;
const int numAreas = 4; // extract only numAreas Areas, if there are more they
......@@ -424,7 +424,7 @@ bool WimaController::setWimaPlanData(const WimaPlanData &planData) {
emit visualItemsChanged();
// extract mission items
QList<MissionItem> tempMissionItems = planData.missionItems();
QList<MissionItem> tempMissionItems = planData->missionItems();
if (tempMissionItems.size() < 1) {
qWarning("WimaController: Mission items from WimaPlaner empty!");
return false;
......@@ -435,7 +435,7 @@ bool WimaController::setWimaPlanData(const WimaPlanData &planData) {
}
_WMSettings.setHomePosition(QGeoCoordinate(
_serviceArea.center().latitude(), _serviceArea.center().longitude(), 0));
_serviceArea.depot().latitude(), _serviceArea.depot().longitude(), 0));
if (!_defaultWM.reset()) {
Q_ASSERT(false);
......
......@@ -148,7 +148,7 @@ public:
// Property setters
void setMasterController(PlanMasterController *masterController);
void setMissionController(MissionController *missionController);
bool setWimaPlanData(const WimaPlanData &planData);
bool setWimaPlanData(QSharedPointer<WimaPlanData> planData);
// Member Methodes
Q_INVOKABLE WimaController *thisPointer();
......
#include "WimaPlanData.h"
WimaPlanData::WimaPlanData(QObject *parent)
: QObject (parent)
{
}
WimaPlanData::WimaPlanData(QObject *parent) : QObject(parent) {}
WimaPlanData::WimaPlanData(const WimaPlanData &other, QObject *parent)
: QObject (parent)
{
*this = other;
: QObject(parent) {
*this = other;
}
/*!
......@@ -18,44 +13,41 @@ WimaPlanData::WimaPlanData(const WimaPlanData &other, QObject *parent)
* Copies the data area list of \a other to the calling \c WimaPlanData object.
* Returns a reference to the calling \c WimaPlanData object.
*/
WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other)
{
// copy wima areas
QList<const WimaAreaData*> areaList = other.areaList();
_areaList.clear();
for (int i = 0; i < areaList.size(); i++) {
const WimaAreaData *areaData = areaList[i];
// determine area type and append
if (areaData->type() == WimaJoinedAreaData::typeString) {
this->append(*qobject_cast<const WimaJoinedAreaData*>(areaData));
}else if (areaData->type() == WimaServiceAreaData::typeString) {
this->append(*qobject_cast<const WimaServiceAreaData*>(areaData));
}else if (areaData->type() == WimaMeasurementAreaData::typeString) {
this->append(*qobject_cast<const WimaMeasurementAreaData*>(areaData));
}else if (areaData->type() == WimaCorridorData::typeString) {
this->append(*qobject_cast<const WimaCorridorData*>(areaData));
}
WimaPlanData &WimaPlanData::operator=(const WimaPlanData &other) {
// copy wima areas
QList<const WimaAreaData *> areaList = other.areaList();
_areaList.clear();
for (int i = 0; i < areaList.size(); i++) {
const WimaAreaData *areaData = areaList[i];
// determine area type and append
if (areaData->type() == WimaJoinedAreaData::typeString) {
this->append(*qobject_cast<const WimaJoinedAreaData *>(areaData));
} else if (areaData->type() == WimaServiceAreaData::typeString) {
this->append(*qobject_cast<const WimaServiceAreaData *>(areaData));
} else if (areaData->type() == WimaMeasurementAreaData::typeString) {
this->append(*qobject_cast<const WimaMeasurementAreaData *>(areaData));
} else if (areaData->type() == WimaCorridorData::typeString) {
this->append(*qobject_cast<const WimaCorridorData *>(areaData));
}
}
// copy mission items
_missionItems = other.missionItems();
// copy mission items
_missionItems = other.missionItems();
return *this;
return *this;
}
/*!
* \fn void WimaPlanData::append(const WimaAreaData &areaData)
*
* Adds a WimaAreaData item.
*/
void WimaPlanData::append(const WimaJoinedAreaData &areaData)
{
_joinedArea = areaData;
void WimaPlanData::append(const WimaJoinedAreaData &areaData) {
_joinedArea = areaData;
if( !_areaList.contains(&_joinedArea) ) {
_areaList.append(&_joinedArea);
}
if (!_areaList.contains(&_joinedArea)) {
_areaList.append(&_joinedArea);
}
}
/*!
......@@ -63,13 +55,12 @@ void WimaPlanData::append(const WimaJoinedAreaData &areaData)
*
* Adds a WimaServiceAreaData item.
*/
void WimaPlanData::append(const WimaServiceAreaData &areaData)
{
_serviceArea = areaData;
void WimaPlanData::append(const WimaServiceAreaData &areaData) {
_serviceArea = areaData;
if( !_areaList.contains(&_serviceArea) ) {
_areaList.append(&_serviceArea);
}
if (!_areaList.contains(&_serviceArea)) {
_areaList.append(&_serviceArea);
}
}
/*!
......@@ -77,13 +68,12 @@ void WimaPlanData::append(const WimaServiceAreaData &areaData)
*
* Adds a WimaCorridorData item.
*/
void WimaPlanData::append(const WimaCorridorData &areaData)
{
_corridor = areaData;
void WimaPlanData::append(const WimaCorridorData &areaData) {
_corridor = areaData;
if( !_areaList.contains(&_corridor) ) {
_areaList.append(&_corridor);
}
if (!_areaList.contains(&_corridor)) {
_areaList.append(&_corridor);
}
}
/*!
......@@ -91,21 +81,19 @@ void WimaPlanData::append(const WimaCorridorData &areaData)
*
* Adds a WimaMeasurementAreaData item.
*/
void WimaPlanData::append(const WimaMeasurementAreaData &areaData)
{
_measurementArea = areaData;
void WimaPlanData::append(const WimaMeasurementAreaData &areaData) {
_measurementArea = areaData;
if( !_areaList.contains(&_measurementArea) ) {
_areaList.append(&_measurementArea);
}
if (!_areaList.contains(&_measurementArea)) {
_areaList.append(&_measurementArea);
}
}
void WimaPlanData::append(const QList<MissionItem *> &missionItems)
{
for (MissionItem *item : missionItems) {
MissionItem copy = MissionItem(*item, this);
_missionItems.append(copy);
}
void WimaPlanData::append(const QList<MissionItem *> &missionItems) {
for (auto *item : missionItems) {
item->setParent(this);
_missionItems.append(item);
}
}
/*!
......@@ -113,20 +101,17 @@ void WimaPlanData::append(const QList<MissionItem *> &missionItems)
*
* Clears all stored objects
*/
void WimaPlanData::clear()
{
_areaList.clear();
_missionItems.clear();
void WimaPlanData::clear() {
_areaList.clear();
_missionItems.clear();
}
QList<const WimaAreaData *> WimaPlanData::areaList() const
{
return _areaList;
const QList<const WimaAreaData *> &WimaPlanData::areaList() const {