Commit 3dc41359 authored by Valentin Platzgummer's avatar Valentin Platzgummer

src mod

parent 99e5ae38
......@@ -20,13 +20,13 @@ static const char* kMissingMetadata = "Meta data pointer missing";
Fact::Fact(QObject* parent)
: QObject (parent)
, _componentId (-1)
, _rawValue (0)
, _type (FactMetaData::valueTypeInt32)
, _metaData (nullptr)
, _valueSliderModel (nullptr)
, _componentId (-1)
, _sendValueChangedSignals (true)
, _deferredValueChangeSignal(false)
, _valueSliderModel (nullptr)
, _ignoreQGCRebootRequired (false)
{
FactMetaData* metaData = new FactMetaData(_type, this);
......@@ -38,13 +38,13 @@ Fact::Fact(QObject* parent)
Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObject* parent)
: QObject (parent)
, _name (name)
, _componentId (componentId)
, _rawValue (0)
, _type (type)
, _metaData (nullptr)
, _valueSliderModel (nullptr)
, _componentId (componentId)
, _sendValueChangedSignals (true)
, _deferredValueChangeSignal(false)
, _valueSliderModel (nullptr)
, _ignoreQGCRebootRequired (false)
{
FactMetaData* metaData = new FactMetaData(_type, this);
......@@ -56,13 +56,13 @@ Fact::Fact(int componentId, QString name, FactMetaData::ValueType_t type, QObjec
Fact::Fact(const QString& settingsGroup, FactMetaData* metaData, QObject* parent)
: QObject(parent)
, _name (metaData->name())
, _componentId (0)
, _rawValue (0)
, _type (metaData->type())
, _metaData (nullptr)
, _valueSliderModel (nullptr)
, _componentId (0)
, _sendValueChangedSignals (true)
, _deferredValueChangeSignal(false)
, _valueSliderModel (nullptr)
, _ignoreQGCRebootRequired (false)
{
qgcApp()->toolbox()->corePlugin()->adjustSettingMetaData(settingsGroup, *metaData);
......
......@@ -19,6 +19,7 @@
#include "FixedWingLandingComplexItem.h"
#include "VTOLLandingComplexItem.h"
#include "StructureScanComplexItem.h"
#include "Wima/CircularSurvey.h"
#include "CorridorScanComplexItem.h"
#include "JsonHelper.h"
#include "ParameterManager.h"
......@@ -443,6 +444,8 @@ VisualMissionItem* MissionController::insertComplexMissionItem(QString itemName,
newItem = new StructureScanComplexItem(_masterController, _flyView, QString() /* kmlFile */, _visualItems /* parent */);
} else if (itemName == CorridorScanComplexItem::name) {
newItem = new CorridorScanComplexItem(_masterController, _flyView, QString() /* kmlFile */, _visualItems /* parent */);
} else if (itemName == CircularSurvey::name) {
newItem = new CircularSurvey(_masterController, _flyView, QString() /* kmlFile */, _visualItems /* parent */);
} else {
qWarning() << "Internal error: Unknown complex item:" << itemName;
return nullptr;
......@@ -478,7 +481,8 @@ void MissionController::_insertComplexMissionItemWorker(const QGeoCoordinate& ma
int sequenceNumber = _nextSequenceNumber();
bool surveyStyleItem = qobject_cast<SurveyComplexItem*>(complexItem) ||
qobject_cast<CorridorScanComplexItem*>(complexItem) ||
qobject_cast<StructureScanComplexItem*>(complexItem);
qobject_cast<StructureScanComplexItem*>(complexItem) ||
qobject_cast<CircularSurvey*>(complexItem) ;
if (surveyStyleItem) {
bool rollSupported = false;
......@@ -535,7 +539,9 @@ void MissionController::removeVisualItem(int viIndex)
return;
}
bool removeSurveyStyle = _visualItems->value<SurveyComplexItem*>(viIndex) || _visualItems->value<CorridorScanComplexItem*>(viIndex);
bool removeSurveyStyle = _visualItems->value<SurveyComplexItem*>(viIndex) ||
_visualItems->value<CorridorScanComplexItem*>(viIndex) ||
_visualItems->value<CircularSurvey*>(viIndex);
VisualMissionItem* item = qobject_cast<VisualMissionItem*>(_visualItems->removeAt(viIndex));
if (item == _takeoffMissionItem) {
......@@ -549,7 +555,9 @@ void MissionController::removeVisualItem(int viIndex)
// Determine if the mission still has another survey style item in it
bool foundSurvey = false;
for (int i=1; i<_visualItems->count(); i++) {
if (_visualItems->value<SurveyComplexItem*>(i) || _visualItems->value<CorridorScanComplexItem*>(i)) {
if (_visualItems->value<SurveyComplexItem*>(i)
|| _visualItems->value<CorridorScanComplexItem*>(i)
|| _visualItems->value<CircularSurvey*>(i) ) {
foundSurvey = true;
break;
}
......@@ -863,6 +871,15 @@ bool MissionController::_loadJsonMissionFileV2(const QJsonObject& json, QmlObjec
nextSequenceNumber = corridorItem->lastSequenceNumber() + 1;
qCDebug(MissionControllerLog) << "Corridor Scan load complete: nextSequenceNumber" << nextSequenceNumber;
visualItems->append(corridorItem);
} else if (complexItemType == CircularSurvey::jsonComplexItemTypeValue) {
qCDebug(MissionControllerLog) << "Loading Circular Survey: nextSequenceNumber" << nextSequenceNumber;
CircularSurvey* survey = new CircularSurvey(_masterController, _flyView, QString() /* kmlFile */, visualItems);
if (!survey->load(itemObject, nextSequenceNumber++, errorString)) {
return false;
}
nextSequenceNumber = survey->lastSequenceNumber() + 1;
qCDebug(MissionControllerLog) << "Ciruclar Survey load complete: nextSequenceNumber" << nextSequenceNumber;
visualItems->append(survey);
} else {
errorString = tr("Unsupported complex item type: %1").arg(complexItemType);
}
......
......@@ -86,7 +86,7 @@ public:
double specifiedGimbalYaw (void) final { return std::numeric_limits<double>::quiet_NaN(); }
double specifiedGimbalPitch (void) final { return std::numeric_limits<double>::quiet_NaN(); }
void appendMissionItems (QList<MissionItem*>& items, QObject* missionItemParent) final;
void setMissionFlightStatus (MissionController::MissionFlightStatus_t& missionFlightStatus) final;
void setMissionFlightStatus (const MissionController::MissionFlightStatus_t& missionFlightStatus) final;
void applyNewAltitude (double newAltitude) final;
double additionalTimeDelay (void) const final { return 0; }
ReadyForSaveState readyForSaveState (void) const final;
......
......@@ -150,7 +150,7 @@ void VisualMissionItem::setAzimuth(double azimuth)
}
}
void VisualMissionItem::setMissionFlightStatus(MissionController::MissionFlightStatus_t& missionFlightStatus)
void VisualMissionItem::setMissionFlightStatus(const MissionController::MissionFlightStatus_t& missionFlightStatus)
{
if (!QGC::fuzzyCompare(missionFlightStatus.gimbalYaw, _missionGimbalYaw)) {
_missionGimbalYaw = missionFlightStatus.gimbalYaw;
......
......@@ -29,12 +29,15 @@ constexpr typename std::underlying_type<T>::type integral(T value) {
}
const char *CircularSurvey::settingsGroup = "CircularSurvey";
const char *CircularSurvey::CircularSurveyName = "CircularSurvey";
const char *CircularSurvey::jsonComplexItemTypeValue = "CircularSurvey";
const char *CircularSurvey::variantName = "Variant";
const QString CircularSurvey::name(tr("Circular Survey"));
CircularSurvey::CircularSurvey(PlanMasterController *masterController, bool flyView,
const QString &kmlOrShpFile, QObject *parent)
: TransectStyleComplexItem(masterController, flyView, settingsGroup, parent),
CircularSurvey::CircularSurvey(PlanMasterController *masterController,
bool flyView, const QString &kmlOrShpFile,
QObject *parent)
: TransectStyleComplexItem(masterController, flyView, settingsGroup,
parent),
_state(STATE::IDLE),
_metaDataMap(FactMetaData::createMapFromJsonFile(
QStringLiteral(":/json/CircularSurvey.SettingsGroup.json"), this)),
......@@ -65,7 +68,7 @@ CircularSurvey::CircularSurvey(PlanMasterController *masterController, bool flyV
CircularSurvey::~CircularSurvey() {}
void CircularSurvey::reverse() {
this->_state = STATE::REVERSE;
this->_setState(STATE::REVERSE);
this->_rebuildTransects();
}
......@@ -113,7 +116,7 @@ bool CircularSurvey::load(const QJsonObject &complexObject, int sequenceNumber,
QString complexType =
complexObject[ComplexMissionItem::jsonComplexItemTypeKey].toString();
if (itemType != VisualMissionItem::jsonTypeComplexItemValue ||
complexType != CircularSurveyName) {
complexType != jsonComplexItemTypeValue) {
errorString = tr("%1 does not support loading this complex mission item "
"type: %2:%3")
.arg(qgcApp()->applicationName())
......@@ -161,7 +164,8 @@ void CircularSurvey::save(QJsonArray &planItems) {
saveObject[JsonHelper::jsonVersionKey] = 1;
saveObject[VisualMissionItem::jsonTypeKey] =
VisualMissionItem::jsonTypeComplexItemValue;
saveObject[ComplexMissionItem::jsonComplexItemTypeKey] = CircularSurveyName;
saveObject[ComplexMissionItem::jsonComplexItemTypeKey] =
jsonComplexItemTypeValue;
saveObject[variantName] = double(_variant.rawValue().toUInt());
......@@ -171,7 +175,9 @@ void CircularSurvey::save(QJsonArray &planItems) {
planItems.append(saveObject);
}
bool CircularSurvey::specifiesCoordinate() const { return true; }
bool CircularSurvey::specifiesCoordinate() const {
return _transects.count() > 0 ? _transects.first().count() > 0 : false;
}
bool CircularSurvey::_switchToGenerator(
const CircularSurvey::PtrGenerator &newG) {
......@@ -187,7 +193,7 @@ bool CircularSurvey::_switchToGenerator(
this, &CircularSurvey::_rebuildTransects);
emit generatorChanged();
this->_state = STATE::IDLE;
this->_setState(STATE::IDLE);
_rebuildTransects();
return true;
......@@ -196,12 +202,26 @@ bool CircularSurvey::_switchToGenerator(
}
}
void CircularSurvey::_setState(CircularSurvey::STATE state) {
if (this->_state != state) {
auto oldState = this->_state;
this->_state = state;
if (_calculating(oldState) != _calculating(state)) {
emit calculatingChanged();
}
}
}
bool CircularSurvey::_calculating(CircularSurvey::STATE state) const {
return state == STATE::ROUTING;
}
void CircularSurvey::_changeVariant() {
this->_state = STATE::VARIANT_CHANGE;
this->_setState(STATE::VARIANT_CHANGE);
this->_rebuildTransects();
}
void CircularSurvey::_updateWorker() {
bool CircularSurvey::_updateWorker() {
// Reset data.
this->_transects.clear();
this->_variantVector.clear();
......@@ -216,7 +236,7 @@ void CircularSurvey::_updateWorker() {
if (!origin.isValid()) {
qCDebug(CircularSurveyLog)
<< "_updateWorker(): origin invalid." << origin;
return;
return false;
}
// Convert safe area.
......@@ -224,7 +244,7 @@ void CircularSurvey::_updateWorker() {
if (!(geoSafeArea.size() >= 3)) {
qCDebug(CircularSurveyLog)
<< "_updateWorker(): safe area invalid." << geoSafeArea;
return;
return false;
}
for (auto &v : geoSafeArea) {
if (v.isValid()) {
......@@ -233,7 +253,7 @@ void CircularSurvey::_updateWorker() {
qCDebug(CircularSurveyLog)
<< "_updateWorker(): safe area contains invalid coordinate."
<< geoSafeArea;
return;
return false;
}
}
......@@ -249,18 +269,22 @@ void CircularSurvey::_updateWorker() {
if (this->_pGenerator->get(g)) {
// Start/Restart routing worker.
this->_pWorker->route(par, g);
return true;
} else {
qCDebug(CircularSurveyLog)
<< "_updateWorker(): generator creation failed.";
return false;
}
} else {
qCDebug(CircularSurveyLog)
<< "_updateWorker(): pGenerator == nullptr, number of registered "
"generators: "
<< this->_generatorList.size();
return false;
}
} else {
qCDebug(CircularSurveyLog) << "_updateWorker(): plan data invalid.";
return false;
}
}
......@@ -315,7 +339,7 @@ void CircularSurvey::_reverseWorker() {
}
}
double CircularSurvey::timeBetweenShots() { return 1; }
double CircularSurvey::timeBetweenShots() { return 0; }
QString CircularSurvey::commandDescription() const {
return tr("Circular Survey");
......@@ -341,6 +365,8 @@ CircularSurvey::readyForSaveState() const {
double CircularSurvey::additionalTimeDelay() const { return 0; }
QString CircularSurvey::patternName() const { return name; }
bool CircularSurvey::registerGenerator(
const QString &name, std::shared_ptr<routing::GeneratorBase> g) {
if (name.isEmpty()) {
......@@ -451,25 +477,27 @@ void CircularSurvey::_rebuildTransectsPhase1(void) {
switch (this->_state) {
case STATE::SKIPP:
qCDebug(CircularSurveyLog) << "rebuildTransectsPhase1: skipp.";
this->_setState(STATE::IDLE);
break;
case STATE::VARIANT_CHANGE:
qCDebug(CircularSurveyLog) << "rebuildTransectsPhase1: variant change.";
this->_changeVariantWorker();
break;
case STATE::RUN_CHANGE:
qCDebug(CircularSurveyLog) << "rebuildTransectsPhase1: run change.";
this->_changeVariantWorker();
this->_setState(STATE::IDLE);
break;
case STATE::REVERSE:
qCDebug(CircularSurveyLog) << "rebuildTransectsPhase1: reverse.";
this->_reverseWorker();
this->_setState(STATE::IDLE);
break;
case STATE::IDLE:
case STATE::ROUTING:
this->_setState(STATE::ROUTING);
qCDebug(CircularSurveyLog) << "rebuildTransectsPhase1: update.";
this->_updateWorker();
if (!this->_updateWorker()) {
this->_setState(STATE::IDLE);
}
break;
}
this->_state = STATE::IDLE;
qCDebug(CircularSurveyLog)
<< "rebuildTransectsPhase1(): "
......@@ -587,19 +615,19 @@ void CircularSurvey::_setTransects(CircularSurvey::PtrRoutingData pRoute) {
&CircularSurvey::_changeVariant);
this->_changeVariantWorker();
this->_state = STATE::SKIPP;
this->_setState(STATE::SKIPP);
this->_rebuildTransects();
} else {
qCDebug(CircularSurveyLog)
<< "_setTransects(): failed, variantVector empty.";
this->_state = STATE::IDLE;
this->_setState(STATE::IDLE);
}
}
Fact *CircularSurvey::variant() { return &_variant; }
bool CircularSurvey::calculating() const {
return this->_pWorker->calculating();
return this->_calculating(this->_state);
}
/*!
......
......@@ -27,9 +27,11 @@ class CircularSurvey : public TransectStyleComplexItem {
using Transects = QList<QList<CoordInfo_t>>;
using Variant = Transects;
enum class STATE { IDLE, ROUTING, SKIPP, REVERSE, VARIANT_CHANGE };
public:
CircularSurvey(PlanMasterController *masterController, bool flyView, const QString &kmlOrShpFile,
QObject *parent);
CircularSurvey(PlanMasterController *masterController, bool flyView,
const QString &kmlOrShpFile, QObject *parent);
~CircularSurvey();
Q_PROPERTY(Fact *variant READ variant CONSTANT)
......@@ -55,17 +57,18 @@ public:
bool calculating() const;
// Overrides
bool load(const QJsonObject &complexObject, int sequenceNumber,
QString &errorString) override final;
QString mapVisualQML(void) const override final;
void save(QJsonArray &planItems) override final;
bool specifiesCoordinate(void) const override final;
double timeBetweenShots(void) override final;
QString commandDescription(void) const override final;
QString commandName(void) const override final;
QString abbreviation(void) const override final;
ReadyForSaveState readyForSaveState(void) const override final;
double additionalTimeDelay(void) const override final;
virtual bool load(const QJsonObject &complexObject, int sequenceNumber,
QString &errorString) override final;
virtual QString mapVisualQML(void) const override final;
virtual void save(QJsonArray &planItems) override final;
virtual bool specifiesCoordinate(void) const override final;
virtual double timeBetweenShots(void) override final;
virtual QString commandDescription(void) const override final;
virtual QString commandName(void) const override final;
virtual QString abbreviation(void) const override final;
virtual ReadyForSaveState readyForSaveState(void) const override final;
virtual double additionalTimeDelay(void) const override final;
virtual QString patternName(void) const override;
// Generator
bool registerGenerator(const QString &name,
......@@ -80,7 +83,8 @@ public:
static const char *settingsGroup;
static const char *variantName;
static const char *CircularSurveyName;
static const char *jsonComplexItemTypeValue;
static const QString name;
signals:
void calculatingChanged();
......@@ -90,27 +94,22 @@ signals:
private slots:
// Overrides from TransectStyleComplexItem
void _rebuildTransectsPhase1(void) final;
void _recalcCameraShots(void) final;
virtual void _rebuildTransectsPhase1(void) override final;
virtual void _recalcCameraShots(void) override final;
// Worker functions.
void _setTransects(PtrRoutingData pRoute);
void _changeVariant();
void _updateWorker();
bool _updateWorker();
void _changeVariantWorker();
void _reverseWorker();
private:
bool _switchToGenerator(const PtrGenerator &newG);
void _setState(STATE state);
bool _calculating(STATE state) const;
// State.
enum class STATE {
IDLE,
SKIPP,
REVERSE,
VARIANT_CHANGE,
RUN_CHANGE,
};
STATE _state;
// center of the circular lanes, e.g. base station
......
#include "WimaServiceArea.h"
#include "QGCLoggingCategory.h"
#include "QGCQGeoCoordinate.h"
QGC_LOGGING_CATEGORY(WimaServiceAreaLog, "WimaServiceAreaLog")
......@@ -109,9 +110,9 @@ void WimaServiceArea::init() {
int minIndex = 0;
for (int idx = 0; idx < this->pathModel().count(); ++idx) {
const QObject *obj = this->pathModel()[idx];
const auto *vertex = qobject_cast<const QGeoCoordinate *>(obj);
const auto *vertex = qobject_cast<const QGCQGeoCoordinate *>(obj);
if (vertex != nullptr) {
auto d = vertex->distanceTo(this->_depot);
auto d = vertex->coordinate().distanceTo(this->_depot);
if (d < minDist) {
minDist = d;
minIndex = idx;
......@@ -120,10 +121,10 @@ void WimaServiceArea::init() {
qCCritical(WimaServiceAreaLog) << "init(): nullptr catched!";
}
}
this->setDepot(*this->pathModel().value<QGeoCoordinate *>(minIndex));
this->setDepot(this->pathModel().value<QGCQGeoCoordinate *>(minIndex)->coordinate());
} else if (this->pathModel().count() > 0) {
// Use first coordinate.
this->setDepot(*this->pathModel().value<QGeoCoordinate *>(0));
this->setDepot(this->pathModel().value<QGCQGeoCoordinate *>(0)->coordinate());
}
}
});
......
......@@ -350,7 +350,7 @@ void WimaPlaner::_update() {
// Create survey item if not yet present.
if (surveyIndex < 0) {
_missionController->insertComplexMissionItem(
_missionController->circularSurveyComplexItemName(),
CircularSurvey::name,
_measurementArea.center(), missionItems->count());
_survey = qobject_cast<CircularSurvey *>(
missionItems->get(missionItems->count() - 1));
......@@ -361,10 +361,8 @@ void WimaPlaner::_update() {
}
// establish connections
connect(_survey, &CircularSurvey::calculatingChanged, this,
&WimaPlaner::CSCalculatingChangedHandler);
connect(_survey, &CircularSurvey::missionItemReady, this,
&WimaPlaner::CSMissionItemReadyHandler);
connect(_survey, &CircularSurvey::visualTransectPointsChanged, this,
&WimaPlaner::CSVisualTransectPointsChangedHandler);
connect(_survey, &CircularSurvey::destroyed, this,
&WimaPlaner::CSDestroyedHandler);
}
......@@ -470,15 +468,14 @@ void WimaPlaner::CSDestroyedHandler() {
this->_stateMachine->updateState(EVENT::SURVEY_DESTROYED);
}
void WimaPlaner::CSMissionItemReadyHandler() {
void WimaPlaner::CSVisualTransectPointsChangedHandler() {
if (this->_survey && this->_survey->calculating()){
this->_stateMachine->updateState(EVENT::SURVEY_UPDATE_TRIGGERED);
} else {
this->_stateMachine->updateState(EVENT::SURVEY_UPDATED);
this->_update();
}
void WimaPlaner::CSCalculatingChangedHandler() {
if (this->_survey->calculating()) {
this->_stateMachine->updateState(EVENT::SURVEY_UPDATE_TRIGGERED);
}
}
}
void WimaPlaner::mAreaPathChangedHandler() {
......@@ -608,10 +605,8 @@ bool WimaPlaner::loadFromFile(const QString &filename) {
// disconnect old survey
if (_survey != nullptr) {
disconnect(_survey, &CircularSurvey::calculatingChanged, this,
&WimaPlaner::CSCalculatingChangedHandler);
disconnect(_survey, &CircularSurvey::missionItemReady, this,
&WimaPlaner::CSMissionItemReadyHandler);
disconnect(_survey, &CircularSurvey::visualTransectPointsChanged, this,
&WimaPlaner::CSVisualTransectPointsChangedHandler);
disconnect(_survey, &CircularSurvey::destroyed, this,
&WimaPlaner::CSDestroyedHandler);
}
......@@ -753,10 +748,8 @@ bool WimaPlaner::loadFromFile(const QString &filename) {
for (int i = 0; i < missionItems->count(); i++) {
_survey = missionItems->value<CircularSurvey *>(i);
if (_survey != nullptr) {
connect(_survey, &CircularSurvey::calculatingChanged, this,
&WimaPlaner::CSCalculatingChangedHandler);
connect(_survey, &CircularSurvey::missionItemReady, this,
&WimaPlaner::CSMissionItemReadyHandler);
connect(_survey, &CircularSurvey::visualTransectPointsChanged, this,
&WimaPlaner::CSVisualTransectPointsChangedHandler);
connect(_survey, &CircularSurvey::destroyed, this,
&WimaPlaner::CSDestroyedHandler);
break;
......
......@@ -127,8 +127,7 @@ private slots:
void updatePolygonInteractivity(int index);
void _update();
void CSDestroyedHandler();
void CSMissionItemReadyHandler();
void CSCalculatingChangedHandler();
void CSVisualTransectPointsChangedHandler();
void mAreaPathChangedHandler();
void mAreaTilesChangedHandler();
void mAreaProgressChangedHandler();
......
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