Skip to content
WimaPlaner.cc 31.9 KiB
Newer Older
#include "WimaPlaner.h"
#include "MissionController.h"
#include "MissionSettingsItem.h"
#include "PlanMasterController.h"
#include "QGCApplication.h"
#include "QGCLoggingCategory.h"
#include "QGCMapPolygon.h"
#include "SimpleMissionItem.h"
#include "Geometry/GeoUtilities.h"
#include "Geometry/PlanimetryCalculus.h"
#include "OptimisationTools.h"
#include "CircularSurvey.h"
#include "Geometry/WimaArea.h"
#include "Geometry/WimaAreaData.h"
#include "WimaBridge.h"
#include "StateMachine.h"
using namespace wima_planer_detail;

#include <functional>

QGC_LOGGING_CATEGORY(WimaPlanerLog, "WimaPlanerLog")

class CommandRAII {
  std::function<void(void)> f;

public:
  CommandRAII(const std::function<void(void)> &fun) : f(fun) {}
  ~CommandRAII() { f(); }
};

const char *WimaPlaner::wimaFileExtension = "wima";
const char *WimaPlaner::areaItemsName = "AreaItems";
const char *WimaPlaner::missionItemsName = "MissionItems";

WimaPlaner::WimaPlaner(QObject *parent)
    : QObject(parent), _masterController(nullptr), _missionController(nullptr),
Valentin Platzgummer's avatar
Valentin Platzgummer committed
      _currentAreaIndex(-1), _joinedArea(this), _survey(nullptr),
      _synchronized(false), _nemoInterface(this),
      _stateMachine(new StateMachine), _areasMonitored(false),
      _missionControllerMonitored(false), _progressLocked(false) {

  connect(this, &WimaPlaner::currentPolygonIndexChanged, this,
Valentin Platzgummer's avatar
Valentin Platzgummer committed
          &WimaPlaner::updatePolygonInteractivity);
  // Monitoring.
  enableAreaMonitoring();
  // Mission controller not set at this point. Not enabling monitoring.
Valentin Platzgummer's avatar
Valentin Platzgummer committed
#ifndef NDEBUG
  // for debugging and testing purpose, remove if not needed anymore
  connect(&_autoLoadTimer, &QTimer::timeout, this,
          &WimaPlaner::autoLoadMission);
  _autoLoadTimer.setSingleShot(true);
  _autoLoadTimer.start(300);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
#endif
  connect(&this->_nemoInterface, &NemoInterface::progressChanged, this,
          &WimaPlaner::nemoInterfaceProgressChangedHandler);

  // StateMachine
  connect(this->_stateMachine.get(), &StateMachine::upToDateChanged, this,
          &WimaPlaner::needsUpdateChanged);
  connect(this->_stateMachine.get(), &StateMachine::surveyReadyChanged, this,
          &WimaPlaner::readyForSynchronizationChanged);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
  connect(this->_stateMachine.get(), &StateMachine::surveyReadyChanged, this,
          &WimaPlaner::surveyReadyChanged);
WimaPlaner::~WimaPlaner() {}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
PlanMasterController *WimaPlaner::masterController() {
  return _masterController;
}

MissionController *WimaPlaner::missionController() {
  return _missionController;
QmlObjectListModel *WimaPlaner::visualItems() { return &_visualItems; }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
int WimaPlaner::currentPolygonIndex() const { return _currentAreaIndex; }

QString WimaPlaner::currentFile() const { return _currentFile; }

QStringList WimaPlaner::loadNameFilters() const {
  QStringList filters;
  filters << tr("Supported types (*.%1 *.%2)")
                 .arg(wimaFileExtension)
                 .arg(AppSettings::planFileExtension)
          << tr("All Files (*.*)");
  return filters;
QStringList WimaPlaner::saveNameFilters() const {
  QStringList filters;
  filters << tr("Supported types (*.%1 *.%2)")
                 .arg(wimaFileExtension)
                 .arg(AppSettings::planFileExtension);
  return filters;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
QString WimaPlaner::fileExtension() const { return wimaFileExtension; }

QGeoCoordinate WimaPlaner::joinedAreaCenter() const {
  return _joinedArea.center();
NemoInterface *WimaPlaner::nemoInterface() { return &_nemoInterface; }

void WimaPlaner::setMasterController(PlanMasterController *masterC) {
  if (_masterController != masterC) {
    _masterController = masterC;
    emit masterControllerChanged();
  }
void WimaPlaner::setMissionController(MissionController *missionC) {
  if (_missionController != missionC) {
    disableMissionControllerMonitoring();
    _missionController = missionC;
    enableMissionControllerMonitoring();
    emit missionControllerChanged();
  }
void WimaPlaner::setCurrentPolygonIndex(int index) {
  if (index >= 0 && index < _visualItems.count() &&
      index != _currentAreaIndex) {
    _currentAreaIndex = index;
    emit currentPolygonIndexChanged(index);
  }
void WimaPlaner::setProgressLocked(bool l) {
  if (this->_progressLocked != l) {
    this->_progressLocked = l;
    emit progressLockedChanged();
    if (!this->_progressLocked) {
      if (this->_measurementArea.setProgress(this->_nemoInterface.progress()))
        this->_update();
Valentin Platzgummer's avatar
Valentin Platzgummer committed
bool WimaPlaner::synchronized() { return _synchronized; }
bool WimaPlaner::needsUpdate() { return !this->_stateMachine->upToDate(); }
bool WimaPlaner::readyForSynchronization() {
  return this->_stateMachine->surveyReady();
}

Valentin Platzgummer's avatar
Valentin Platzgummer committed
bool WimaPlaner::surveyReady() { return this->_stateMachine->surveyReady(); }

bool WimaPlaner::progressLocked() { return this->_progressLocked; }

void WimaPlaner::removeArea(int index) {
  if (index >= 0 && index < _visualItems.count()) {
    WimaArea *area = qobject_cast<WimaArea *>(_visualItems.removeAt(index));
    if (area == nullptr) {
      qCWarning(WimaPlanerLog)
          << "removeArea(): nullptr catched, internal error.";
    area->clear();
    area->borderPolygon()->clear();
    emit visualItemsChanged();
    if (_visualItems.count() == 0) {
      // this branch is reached if all items are removed
      // to guarentee proper behavior, _currentAreaIndex must be set to a
      // invalid value, as on constructor init.
      resetAllInteractive();
      _currentAreaIndex = -1;
      return;
    if (_currentAreaIndex >= _visualItems.count()) {
      setCurrentPolygonIndex(_visualItems.count() - 1);
Valentin Platzgummer's avatar
Valentin Platzgummer committed
      updatePolygonInteractivity(_currentAreaIndex);
    qCWarning(WimaPlanerLog) << "removeArea(): Index out of bounds!";
bool WimaPlaner::addMeasurementArea() {
  if (!_visualItems.contains(&_measurementArea)) {
    _visualItems.append(&_measurementArea);
Loading
Loading full blame...