WimaController.cc 3.72 KB
Newer Older
Valentin Platzgummer's avatar
Valentin Platzgummer committed
1
#include "WimaController.h"
2

Valentin Platzgummer's avatar
Valentin Platzgummer committed
3
#include "utilities.h"
4

5 6 7 8
#include "MissionController.h"
#include "MissionSettingsItem.h"
#include "PlanMasterController.h"
#include "QGCApplication.h"
9
#include "QGCLoggingCategory.h"
10
#include "SettingsManager.h"
11 12
#include "SimpleMissionItem.h"

13 14
#include "WimaBridge.h"
#include "WimaPlanData.h"
15 16
#include "WimaSettings.h"

17
#include "Snake/QNemoHeartbeat.h"
18
#include "Snake/QNemoProgress.h"
19
#include "Snake/SnakeTile.h"
20

21
#include "QVector3D"
22
#include <QScopedPointer>
23

24
#define CLIPPER_SCALE 1000000
25
#include "clipper/clipper.hpp"
26

27 28
#include <memory>

29 30
QGC_LOGGING_CATEGORY(WimaControllerLog, "WimaControllerLog")

Valentin Platzgummer's avatar
Valentin Platzgummer committed
31 32 33 34 35
template <typename T>
constexpr typename std::underlying_type<T>::type integral(T value) {
  return static_cast<typename std::underlying_type<T>::type>(value);
}

36 37 38 39 40
#define EVENT_TIMER_INTERVAL 50        // ms

const char *WimaController::areaItemsName = "AreaItems";
const char *WimaController::settingsGroup = "WimaController";
const char *WimaController::enableWimaControllerName = "EnableWimaController";
Valentin Platzgummer's avatar
Valentin Platzgummer committed
41

42
WimaController::WimaController(QObject *parent)
43
    : QObject(parent), _joinedArea(), _measurementArea(), _serviceArea(),
44
      _corridor(), _planDataValid(false),
45 46 47
      _metaDataMap(FactMetaData::createMapFromJsonFile(
          QStringLiteral(":/json/WimaController.SettingsGroup.json"), this)),
      _enableWimaController(settingsGroup,
48
                            _metaDataMap[enableWimaControllerName]){
49 50 51 52 53
  // PlanData and Progress.
  connect(WimaBridge::instance(), &WimaBridge::planDataChanged, this,
          &WimaController::planDataChangedHandler);
  connect(WimaBridge::instance(), &WimaBridge::progressChanged, this,
          &WimaController::progressChangedHandler);
54 55
}

56
PlanMasterController *WimaController::masterController() {
57
  return _masterController;
58 59 60
}

MissionController *WimaController::missionController() {
61
  return _missionController;
62 63
}

64
QmlObjectListModel *WimaController::visualItems() { return &_areas; }
65

66
Fact *WimaController::enableWimaController() { return &_enableWimaController; }
67

68 69 70
void WimaController::setMasterController(PlanMasterController *masterC) {
  _masterController = masterC;
  emit masterControllerChanged();
71 72
}

73 74 75
void WimaController::setMissionController(MissionController *missionC) {
  _missionController = missionC;
  emit missionControllerChanged();
76 77
}

78 79
void WimaController::planDataChangedHandler() {

80 81
  // reset visual items
  _areas.clear();
82 83 84 85
  _measurementArea = WimaMeasurementAreaData();
  _serviceArea = WimaServiceAreaData();
  _corridor = WimaCorridorData();
  _joinedArea = WimaJoinedAreaData();
86
  _planDataValid = false;
87

88
  emit visualItemsChanged();
89

90
  // Extract areas.
91
  auto planData = WimaBridge::instance()->planData();
92

93 94 95 96
  // Measurement Area.
  if (planData.measurementArea().coordinateList().size() >= 3) {
    _measurementArea = planData.measurementArea();
    _areas.append(&_measurementArea);
97

98 99 100 101
    // Service Area.
    if (planData.serviceArea().coordinateList().size() >= 3) {
      _serviceArea = planData.serviceArea();
      _areas.append(&_serviceArea);
102

103 104 105 106
      // Joined Area.
      if (planData.joinedArea().coordinateList().size() >= 3) {
        _joinedArea = planData.joinedArea();
        _areas.append(&_joinedArea);
107

108
        _planDataValid = true;
Valentin Platzgummer's avatar
Valentin Platzgummer committed
109

110 111 112 113 114
        // Corridor.
        if (planData.corridor().coordinateList().size() >= 3) {
          _corridor = planData.corridor();
        }
      }
Valentin Platzgummer's avatar
Valentin Platzgummer committed
115
    }
116
  }
117

118 119 120 121 122 123 124 125
  if (_planDataValid) {
    emit visualItemsChanged();
  } else {
    _areas.clear();
    _measurementArea = WimaMeasurementAreaData();
    _serviceArea = WimaServiceAreaData();
    _corridor = WimaCorridorData();
    _joinedArea = WimaJoinedAreaData();
126
  }
127 128 129 130
}

void WimaController::progressChangedHandler() {
  _measurementArea.setProgress(WimaBridge::instance()->progress());
131
}