Commit e46e65e1 authored by Valentin Platzgummer's avatar Valentin Platzgummer

flight view gui modified, added additional features to wimaController

parent eb694b02
...@@ -510,25 +510,31 @@ QGCView { ...@@ -510,25 +510,31 @@ QGCView {
} }
} }
// FlightDisplayViewWidgets { FlightDisplayViewWidgets {
// id: flightDisplayViewWidgets id: flightDisplayViewWidgets
// z: _panel.z + 4
// height: ScreenTools.availableHeight - (singleMultiSelector.visible ? singleMultiSelector.height + _margins : 0)
// anchors.left: parent.left
// anchors.right: altitudeSlider.visible ? altitudeSlider.left : parent.right
// anchors.bottom: parent.bottom
// qgcView: root
// useLightColors: isBackgroundDark
// missionController: _missionController
// visible: singleVehicleView.checked && !QGroundControl.videoManager.fullScreen
// }
FlightDisplayWimaMenu {
id: wimaMenu
z: _panel.z + 4 z: _panel.z + 4
height: ScreenTools.availableHeight - (singleMultiSelector.visible ? singleMultiSelector.height + _margins : 0)
anchors.left: parent.left anchors.left: parent.left
anchors.right: altitudeSlider.visible ? altitudeSlider.left : parent.right anchors.right: altitudeSlider.visible ? altitudeSlider.left : parent.right
anchors.bottom: parent.bottom anchors.bottom: parent.bottom
qgcView: root
useLightColors: isBackgroundDark
missionController: _missionController
visible: singleVehicleView.checked && !QGroundControl.videoManager.fullScreen
}
FlightDisplayWimaMenu {
id: wimaMenu
z: _panel.z + 4
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.leftMargin: ScreenTools.defaultFontPixelHeight * 0.25
anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * 0.25
height: 300
width: 300
wimaController: wimaController
} }
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
......
...@@ -18,15 +18,70 @@ import QGroundControl.Airmap 1.0 ...@@ -18,15 +18,70 @@ import QGroundControl.Airmap 1.0
Item { Item {
id: _root id: _root
property var wimaController // must be provided by the user
// box containing all items
Rectangle { Rectangle {
anchors.top: parent.top anchors.left: parent.left
color: "white" anchors.bottom: parent.bottom
height: 100 height: enableWima.checked ? parent.height : enableWima.height
width: 200 width: enableWima.checked ? parent.width : enableWima.width
color: "black"
// checkbox to enable/ disable wima
QGCCheckBox { QGCCheckBox {
id: enableWima id: enableWima
checked: true
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
text: qsTr("WiMA") text: qsTr("WiMA")
} }
// horizonal line
Rectangle {
id: horizontalLine
anchors.left: parent.left
anchors.right: parent.right
anchors.top: enableWima.bottom
anchors.leftMargin: ScreenTools.defaultFontPixelHeight * 0.5
anchors.rightMargin: ScreenTools.defaultFontPixelHeight * 0.5
anchors.topMargin: ScreenTools.defaultFontPixelHeight * 0.25
height: 1
color: "white"
}
ColumnLayout {
id : mainColumn
anchors.left: parent.left
anchors.right: parent.right
anchors.top: horizontalLine.bottom
anchors.bottom: parent.bottom
anchors.topMargin: ScreenTools.defaultFontPixelHeight * 0.5
anchors.bottomMargin: ScreenTools.defaultFontPixelHeight * 0.5
anchors.rightMargin: ScreenTools.defaultFontPixelHeight * 0.5
anchors.leftMargin: ScreenTools.defaultFontPixelHeight * 0.5
spacing: ScreenTools.defaultFontPixelHeight * 0.5
QGCButton {
id: buttonNextMissionPhase
text: "Next Phase"
onClicked: wimaController.nextPhase();
}
QGCButton {
id: buttonResetPhase
text: "Reset Phase"
onClicked: wimaController.resetPhase();
}
QGCButton {
id: buttonUpload
text: "Upload"
onClicked: wimaController.uploadToVehicle();
}
}
} }
} }
...@@ -103,6 +103,22 @@ void WimaController::nextPhase() ...@@ -103,6 +103,22 @@ void WimaController::nextPhase()
updateCurrentPath(); updateCurrentPath();
} }
void WimaController::previousPhase()
{
}
void WimaController::resetPhase()
{
_startWaypointIndex = 1;
nextPhase();
}
void WimaController::uploadToVehicle()
{
}
void WimaController::startMission() void WimaController::startMission()
{ {
...@@ -294,18 +310,42 @@ void WimaController::containerDataValidChanged(bool valid) ...@@ -294,18 +310,42 @@ void WimaController::containerDataValidChanged(bool valid)
// create mission items // create mission items
_missionController->removeAll(); _missionController->removeAll();
QmlObjectListModel* missionControllerVisualItems = _missionController->visualItems(); QmlObjectListModel* missionControllerVisualItems = _missionController->visualItems();
bool copyON = false;
for ( int i = 0; i < tempMissionItems.size(); i++) {
// find takeoff command
int begin = -1;
for (int i = 0; i < tempMissionItems.size(); i++) {
const MissionItem *missionItem = tempMissionItems[i]; const MissionItem *missionItem = tempMissionItems[i];
if (copyON || missionItem->command() == MAV_CMD_NAV_VTOL_TAKEOFF if ( missionItem->command() == MAV_CMD_NAV_VTOL_TAKEOFF
|| missionItem->command() == MAV_CMD_NAV_TAKEOFF) { || missionItem->command() == MAV_CMD_NAV_TAKEOFF) {
_missionController->insertSimpleMissionItem(*missionItem, missionControllerVisualItems->count()); _missionController->insertSimpleMissionItem(*missionItem, missionControllerVisualItems->count());
copyON = true;
QGeoCoordinate coordinate = missionItem->coordinate();
_takeoffLandPostion.setAltitude(coordinate.altitude());
_takeoffLandPostion.setLatitude(coordinate.latitude());
_takeoffLandPostion.setLongitude(coordinate.longitude());
begin = i + 1;
break;
} }
}
// check if takeoff command found
if (begin < 0) {
qWarning("WimaController::containerDataValidChanged(): No takeoff found.");
return;
}
// copy mission items and create SimpleMissionItem by using _missionController
for ( int i = begin; i < tempMissionItems.size(); i++) {
const MissionItem *missionItem = tempMissionItems[i];
_missionController->insertSimpleMissionItem(*missionItem, missionControllerVisualItems->count());
if ( missionItem->command() == MAV_CMD_NAV_VTOL_LAND if ( missionItem->command() == MAV_CMD_NAV_VTOL_LAND
|| missionItem->command() == MAV_CMD_NAV_LAND) || missionItem->command() == MAV_CMD_NAV_LAND)
break; break;
} }
...@@ -327,15 +367,14 @@ void WimaController::containerDataValidChanged(bool valid) ...@@ -327,15 +367,14 @@ void WimaController::containerDataValidChanged(bool valid)
_missionItems.append(visualItemCopy); _missionItems.append(visualItemCopy);
} }
updateWaypointPath(); if (areaCounter == numAreas)
_localPlanDataValid = true;
updateWaypointPath();
_startWaypointIndex = 1; _startWaypointIndex = 1;
updateCurrentMissionItems(); updateCurrentMissionItems();
updateCurrentPath(); updateCurrentPath();
if (areaCounter == numAreas)
_localPlanDataValid = true;
} else { } else {
_localPlanDataValid = false; _localPlanDataValid = false;
_visualItems.clear(); _visualItems.clear();
...@@ -353,17 +392,12 @@ void WimaController::containerDataValidChanged(bool valid) ...@@ -353,17 +392,12 @@ void WimaController::containerDataValidChanged(bool valid)
void WimaController::updateCurrentMissionItems() void WimaController::updateCurrentMissionItems()
{ {
if (_missionItems.count() < 1 || !_localPlanDataValid)
return;
int numberWaypoints = 30; // the number of waypoints currentMissionItems must not exceed int numberWaypoints = 30; // the number of waypoints currentMissionItems must not exceed
int overlapping = 2; // number of overlapping waypoints of consecutive mission phases int overlapping = 2; // number of overlapping waypoints of consecutive mission phases
SimpleMissionItem *homeItem = _missionItems.value<SimpleMissionItem *>(0);
if (homeItem == nullptr) {
qWarning("WimaController::updateCurrentMissionItems(): nullptr");
_currentMissionItems.clear();
return;
}
QGeoCoordinate homeCoordinate(homeItem->coordinate());
QList<QGeoCoordinate> geoCoordinateList; // list with potential waypoints (from _missionItems), for _currentMissionItems QList<QGeoCoordinate> geoCoordinateList; // list with potential waypoints (from _missionItems), for _currentMissionItems
_endWaypointIndex = std::min(_startWaypointIndex + numberWaypoints - 1, _missionItems.count()-2); // -2 -> last item is land item _endWaypointIndex = std::min(_startWaypointIndex + numberWaypoints - 1, _missionItems.count()-2); // -2 -> last item is land item
if (!extractCoordinateList(_missionItems, geoCoordinateList, _startWaypointIndex, _endWaypointIndex)) { if (!extractCoordinateList(_missionItems, geoCoordinateList, _startWaypointIndex, _endWaypointIndex)) {
...@@ -375,7 +409,7 @@ void WimaController::updateCurrentMissionItems() ...@@ -375,7 +409,7 @@ void WimaController::updateCurrentMissionItems()
// calculate path from home to first waypoint // calculate path from home to first waypoint
QList<QGeoCoordinate> path; QList<QGeoCoordinate> path;
if ( !calcShortestPath(homeCoordinate, geoCoordinateList[0], path) ) { if ( !calcShortestPath(_takeoffLandPostion, geoCoordinateList[0], path) ) {
qWarning("WimaController::updateCurrentMissionItems(): Not able to calc path from home to first waypoint."); qWarning("WimaController::updateCurrentMissionItems(): Not able to calc path from home to first waypoint.");
_currentMissionItems.clear(); _currentMissionItems.clear();
return; return;
...@@ -386,7 +420,7 @@ void WimaController::updateCurrentMissionItems() ...@@ -386,7 +420,7 @@ void WimaController::updateCurrentMissionItems()
// calculate path from last waypoint to home // calculate path from last waypoint to home
path.clear(); path.clear();
if ( !calcShortestPath(geoCoordinateList.last(), homeCoordinate, path) ) { if ( !calcShortestPath(geoCoordinateList.last(), _takeoffLandPostion, path) ) {
qWarning("WimaController::updateCurrentMissionItems(): Not able to calc path from home to first waypoint."); qWarning("WimaController::updateCurrentMissionItems(): Not able to calc path from home to first waypoint.");
_currentMissionItems.clear(); _currentMissionItems.clear();
return; return;
...@@ -394,11 +428,33 @@ void WimaController::updateCurrentMissionItems() ...@@ -394,11 +428,33 @@ void WimaController::updateCurrentMissionItems()
path.removeFirst(); // first coordinate already in geoCoordinateList path.removeFirst(); // first coordinate already in geoCoordinateList
geoCoordinateList.append(path); geoCoordinateList.append(path);
// create Mission Items // create Mission Items
_missionController->removeAll(); _missionController->removeAll();
QmlObjectListModel* missionControllerVisuals = _missionController->visualItems(); QmlObjectListModel* missionControllerVisuals = _missionController->visualItems();
for (auto coordinate : geoCoordinateList)
// set homeposition of settingsItem
MissionSettingsItem* settingsItem = missionControllerVisuals->value<MissionSettingsItem *>(0);
if (settingsItem == nullptr) {
qWarning("WimaController::updateCurrentMissionItems(): nullptr");
_currentMissionItems.clear();
return;
}
settingsItem->setCoordinate(_takeoffLandPostion);
for (auto coordinate : geoCoordinateList) {
_missionController->insertSimpleMissionItem(coordinate, missionControllerVisuals->count()); _missionController->insertSimpleMissionItem(coordinate, missionControllerVisuals->count());
}
// set homeposition for take off item (somehow not working with insertSimpleMissionItem)
SimpleMissionItem* takeoff = missionControllerVisuals->value<SimpleMissionItem *>(1);
if (takeoff == nullptr) {
qWarning("WimaController::updateCurrentMissionItems(): nullptr");
_currentMissionItems.clear();
return;
}
takeoff->setCoordinate(_takeoffLandPostion);
// set land command for last mission item // set land command for last mission item
SimpleMissionItem *landItem = missionControllerVisuals->value<SimpleMissionItem*>(missionControllerVisuals->count()-1); SimpleMissionItem *landItem = missionControllerVisuals->value<SimpleMissionItem*>(missionControllerVisuals->count()-1);
...@@ -417,14 +473,7 @@ void WimaController::updateCurrentMissionItems() ...@@ -417,14 +473,7 @@ void WimaController::updateCurrentMissionItems()
return; return;
} }
// copy mission items to _currentMissionItems // copy to _currentMissionItems
// MissionSettingsItem *settingsItem = qobject_cast<MissionSettingsItem *>((*missionControllerVisuals)[0]);
// if (settingsItem == nullptr) {
// qWarning("WimaController::containerDataValidChanged(): Nullptr at MissionSettingsItem!");
// return;
// }
// _missionItems.append(settingsItem);
_currentMissionItems.clear(); _currentMissionItems.clear();
for ( int i = 1; i < missionControllerVisuals->count(); i++) { for ( int i = 1; i < missionControllerVisuals->count(); i++) {
SimpleMissionItem *visualItem = missionControllerVisuals->value<SimpleMissionItem*>(i); SimpleMissionItem *visualItem = missionControllerVisuals->value<SimpleMissionItem*>(i);
...@@ -433,6 +482,7 @@ void WimaController::updateCurrentMissionItems() ...@@ -433,6 +482,7 @@ void WimaController::updateCurrentMissionItems()
_currentMissionItems.clear(); _currentMissionItems.clear();
return; return;
} }
SimpleMissionItem *visualItemCopy = new SimpleMissionItem(*visualItem, true, this); SimpleMissionItem *visualItemCopy = new SimpleMissionItem(*visualItem, true, this);
_currentMissionItems.append(visualItemCopy); _currentMissionItems.append(visualItemCopy);
} }
...@@ -443,16 +493,14 @@ void WimaController::updateCurrentMissionItems() ...@@ -443,16 +493,14 @@ void WimaController::updateCurrentMissionItems()
void WimaController::updateWaypointPath() void WimaController::updateWaypointPath()
{ {
_waypointPath.clear(); _waypointPath.clear();
if (!extractCoordinateList(_missionItems, _waypointPath, 0, _missionItems.count()-1)) extractCoordinateList(_missionItems, _waypointPath, 0, _missionItems.count()-1);
return;
emit waypointPathChanged(); emit waypointPathChanged();
} }
void WimaController::updateCurrentPath() void WimaController::updateCurrentPath()
{ {
_currentWaypointPath.clear(); _currentWaypointPath.clear();
if (!extractCoordinateList(_currentMissionItems, _currentWaypointPath, 0, _currentMissionItems.count()-1)) extractCoordinateList(_currentMissionItems, _currentWaypointPath, 0, _currentMissionItems.count()-1);
return;
emit currentWaypointPathChanged(); emit currentWaypointPathChanged();
} }
......
...@@ -69,6 +69,9 @@ public: ...@@ -69,6 +69,9 @@ public:
// Member Methodes // Member Methodes
Q_INVOKABLE void nextPhase(); Q_INVOKABLE void nextPhase();
Q_INVOKABLE void previousPhase();
Q_INVOKABLE void resetPhase();
Q_INVOKABLE void uploadToVehicle();
Q_INVOKABLE void startMission(); Q_INVOKABLE void startMission();
Q_INVOKABLE void abortMission(); Q_INVOKABLE void abortMission();
Q_INVOKABLE void pauseMission(); Q_INVOKABLE void pauseMission();
...@@ -134,6 +137,9 @@ private: ...@@ -134,6 +137,9 @@ private:
QVariantList _waypointPath; // path connecting the items in _missionItems QVariantList _waypointPath; // path connecting the items in _missionItems
QVariantList _currentWaypointPath; // path connecting the items in _currentMissionItems QVariantList _currentWaypointPath; // path connecting the items in _currentMissionItems
int _startWaypointIndex; // index to the mission item stored in _missionItems defining the first element of _currentMissionItems int _startWaypointIndex; // index to the mission item stored in _missionItems defining the first element of _currentMissionItems
QList<int> _startWaypointIndexList;
int _endWaypointIndex; // index to the mission item stored in _missionItems defining the last element of _currentMissionItems int _endWaypointIndex; // index to the mission item stored in _missionItems defining the last element of _currentMissionItems
QGeoCoordinate _takeoffLandPostion;
}; };
...@@ -323,11 +323,7 @@ bool WimaPlaner::updateMission() ...@@ -323,11 +323,7 @@ bool WimaPlaner::updateMission()
qgcApp()->showMessage(QString(tr("Not able to calculate the path from measurement area to landing position.")).toLocal8Bit().data()); qgcApp()->showMessage(QString(tr("Not able to calculate the path from measurement area to landing position.")).toLocal8Bit().data());
return false; return false;
} }
// path.clear();
// path.append(end);
// path.append(start);
// path.append(end);
// path.append(end);
for (int i = 1; i < path.count()-1; i++) { for (int i = 1; i < path.count()-1; i++) {
sequenceNumber = _missionController->insertSimpleMissionItem(path.value(i), missionItems->count()); sequenceNumber = _missionController->insertSimpleMissionItem(path.value(i), missionItems->count());
_missionController->setCurrentPlanViewIndex(sequenceNumber, true); _missionController->setCurrentPlanViewIndex(sequenceNumber, true);
......
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