Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
c880c054
Commit
c880c054
authored
Oct 24, 2015
by
Don Gagne
Browse files
Fix bugs with offline to online transition
parent
457e2a0a
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/MissionManager/MissionController.cc
View file @
c880c054
...
...
@@ -29,6 +29,8 @@ This file is part of the QGROUNDCONTROL project
#include
"QGCMessageBox.h"
#include
"FirmwarePlugin.h"
QGC_LOGGING_CATEGORY
(
MissionControllerLog
,
"MissionControllerLog"
)
const
char
*
MissionController
::
_settingsGroup
=
"MissionController"
;
MissionController
::
MissionController
(
QObject
*
parent
)
...
...
@@ -39,7 +41,7 @@ MissionController::MissionController(QObject *parent)
,
_activeVehicle
(
NULL
)
,
_liveHomePositionAvailable
(
false
)
,
_autoSync
(
false
)
,
_first
MissionItemSync
(
false
)
,
_first
ItemsFromVehicle
(
false
)
,
_missionItemsRequested
(
false
)
,
_queuedSend
(
false
)
{
...
...
@@ -48,50 +50,75 @@ MissionController::MissionController(QObject *parent)
MissionController
::~
MissionController
()
{
// Start with empty list
_canEdit
=
true
;
_missionItems
=
new
QmlObjectListModel
(
this
);
_initAllMissionItems
();
}
void
MissionController
::
start
(
bool
editMode
)
{
qCDebug
(
MissionControllerLog
)
<<
"start editMode"
<<
editMode
;
_editMode
=
editMode
;
MultiVehicleManager
*
multiVehicleMgr
=
MultiVehicleManager
::
instance
();
connect
(
multiVehicleMgr
,
&
MultiVehicleManager
::
activeVehicleChanged
,
this
,
&
MissionController
::
_activeVehicleChanged
);
Vehicle
*
activeVehicle
=
multiVehicleMgr
->
activeVehicle
();
if
(
activeVehicle
)
{
_activeVehicleChanged
(
activeVehicle
);
}
else
{
_missionItemsRequested
=
true
;
_newMissionItemsAvailable
();
}
_setupMissionItems
(
true
/* fromVehicle */
,
true
/* force */
);
}
void
MissionController
::
_newMissionItemsAvailable
(
void
)
void
MissionController
::
_newMissionItemsAvailable
FromVehicle
(
void
)
{
if
(
_editMode
)
{
if
(
_firstMissionItemSync
)
{
// This is the first time the vehicle is seeing items. We have to be careful of transitioning from offline
// to online.
_firstMissionItemSync
=
false
;
if
(
_missionItems
&&
_missionItems
->
count
()
>
1
)
{
QGCMessageBox
::
StandardButton
button
=
QGCMessageBox
::
warning
(
"Mission Editing"
,
"The vehicle has sent a new set of Mission Items. "
"Do you want to discard your current set of unsaved items and use the ones from the vehicle instead?"
,
QGCMessageBox
::
Yes
|
QGCMessageBox
::
No
,
QGCMessageBox
::
No
);
if
(
button
==
QGCMessageBox
::
No
)
{
return
;
qCDebug
(
MissionControllerLog
)
<<
"_newMissionItemsAvailableFromVehicle"
;
_setupMissionItems
(
true
/* fromVehicle */
,
false
/* force */
);
}
/// @param fromVehicle true: load items from vehicle
/// @param force true: disregard any flags which may prevent load
void
MissionController
::
_setupMissionItems
(
bool
fromVehicle
,
bool
force
)
{
qCDebug
(
MissionControllerLog
)
<<
"_setupMissionItems fromVehicle:force:_editMode:_firstItemsFromVehicle"
<<
fromVehicle
<<
force
<<
_editMode
<<
_firstItemsFromVehicle
;
MissionManager
*
missionManager
=
NULL
;
if
(
_activeVehicle
)
{
missionManager
=
_activeVehicle
->
missionManager
();
}
else
{
qCDebug
(
MissionControllerLog
)
<<
"running offline"
;
}
if
(
!
force
)
{
if
(
_editMode
&&
fromVehicle
)
{
if
(
_firstItemsFromVehicle
)
{
if
(
missionManager
)
{
if
(
missionManager
->
inProgress
())
{
// Still in progress of retrieving items from vehicle, leave current set alone and wait for
// mission manager to finish
qCDebug
(
MissionControllerLog
)
<<
"disregarding due to MissionManager in progress"
;
return
;
}
else
{
// We have the first set of items from the vehicle. If we haven't already started creating a
// new mission, switch to the items from the vehicle
_firstItemsFromVehicle
=
false
;
if
(
_missionItems
->
count
()
!=
1
)
{
qCDebug
(
MissionControllerLog
)
<<
"disregarding due to existing items"
;
return
;
}
}
}
}
else
if
(
!
_missionItemsRequested
)
{
// We didn't specifically ask for new mission items. Disregard the new set since it is
// the most likely the set we just sent to the vehicle.
qCDebug
(
MissionControllerLog
)
<<
"disregarding due to unrequested notification"
;
return
;
}
}
else
if
(
!
_missionItemsRequested
)
{
// We didn't specifically ask for new mission items. Disregard the new set since it is
// the most likely the set we just sent to the vehicle.
return
;
}
}
qCDebug
(
MissionControllerLog
)
<<
"fell through to main setup"
;
_missionItemsRequested
=
false
;
if
(
_missionItems
)
{
...
...
@@ -99,17 +126,14 @@ void MissionController::_newMissionItemsAvailable(void)
_missionItems
->
deleteLater
();
}
MissionManager
*
missionManager
=
NULL
;
if
(
_activeVehicle
)
{
missionManager
=
_activeVehicle
->
missionManager
();
}
if
(
!
missionManager
||
missionManager
->
inProgress
())
{
if
(
!
missionManager
||
!
fromVehicle
||
missionManager
->
inProgress
())
{
_canEdit
=
true
;
_missionItems
=
new
QmlObjectListModel
(
this
);
qCDebug
(
MissionControllerLog
)
<<
"creating empty set"
;
}
else
{
_canEdit
=
missionManager
->
canEdit
();
_missionItems
=
missionManager
->
copyMissionItems
();
qCDebug
(
MissionControllerLog
)
<<
"loading from vehicle count"
<<
_missionItems
->
count
();
}
_initAllMissionItems
();
...
...
@@ -121,8 +145,6 @@ void MissionController::getMissionItems(void)
if
(
activeVehicle
)
{
_missionItemsRequested
=
true
;
MissionManager
*
missionManager
=
activeVehicle
->
missionManager
();
connect
(
missionManager
,
&
MissionManager
::
newMissionItemsAvailable
,
this
,
&
MissionController
::
_newMissionItemsAvailable
);
activeVehicle
->
missionManager
()
->
requestMissionItems
();
}
}
...
...
@@ -406,15 +428,19 @@ void MissionController::_itemCommandChanged(MavlinkQmlSingleton::Qml_MAV_CMD com
void
MissionController
::
_activeVehicleChanged
(
Vehicle
*
activeVehicle
)
{
qCDebug
(
MissionControllerLog
)
<<
"_activeVehicleChanged activeVehicle"
<<
activeVehicle
;
if
(
_activeVehicle
)
{
MissionManager
*
missionManager
=
_activeVehicle
->
missionManager
();
disconnect
(
missionManager
,
&
MissionManager
::
newMissionItemsAvailable
,
this
,
&
MissionController
::
_newMissionItemsAvailable
);
disconnect
(
missionManager
,
&
MissionManager
::
newMissionItemsAvailable
,
this
,
&
MissionController
::
_newMissionItemsAvailable
FromVehicle
);
disconnect
(
missionManager
,
&
MissionManager
::
inProgressChanged
,
this
,
&
MissionController
::
_inProgressChanged
);
disconnect
(
_activeVehicle
,
&
Vehicle
::
homePositionAvailableChanged
,
this
,
&
MissionController
::
_activeVehicleHomePositionAvailableChanged
);
disconnect
(
_activeVehicle
,
&
Vehicle
::
homePositionChanged
,
this
,
&
MissionController
::
_activeVehicleHomePositionChanged
);
_activeVehicle
=
NULL
;
_newMissionItemsAvailable
();
// When the active vehicle goes away we toss the editor items
_setupMissionItems
(
false
/* fromVehicle */
,
true
/* force */
);
_activeVehicleHomePositionAvailableChanged
(
false
);
}
...
...
@@ -423,21 +449,13 @@ void MissionController::_activeVehicleChanged(Vehicle* activeVehicle)
if
(
_activeVehicle
)
{
MissionManager
*
missionManager
=
activeVehicle
->
missionManager
();
connect
(
missionManager
,
&
MissionManager
::
newMissionItemsAvailable
,
this
,
&
MissionController
::
_newMissionItemsAvailable
);
connect
(
missionManager
,
&
MissionManager
::
newMissionItemsAvailable
,
this
,
&
MissionController
::
_newMissionItemsAvailable
FromVehicle
);
connect
(
missionManager
,
&
MissionManager
::
inProgressChanged
,
this
,
&
MissionController
::
_inProgressChanged
);
connect
(
_activeVehicle
,
&
Vehicle
::
homePositionAvailableChanged
,
this
,
&
MissionController
::
_activeVehicleHomePositionAvailableChanged
);
connect
(
_activeVehicle
,
&
Vehicle
::
homePositionChanged
,
this
,
&
MissionController
::
_activeVehicleHomePositionChanged
);
if
(
missionManager
->
inProgress
())
{
// Vehicle is still in process of requesting mission items
_firstMissionItemSync
=
true
;
}
else
{
// Vehicle already has mission items
_firstMissionItemSync
=
false
;
}
_missionItemsRequested
=
true
;
_newMissionItemsAvailable
();
_firstItemsFromVehicle
=
true
;
_setupMissionItems
(
true
/* fromVehicle */
,
false
/* force */
);
_activeVehicleHomePositionChanged
(
_activeVehicle
->
homePosition
());
_activeVehicleHomePositionAvailableChanged
(
_activeVehicle
->
homePositionAvailable
());
...
...
src/MissionManager/MissionController.h
View file @
c880c054
...
...
@@ -28,6 +28,9 @@ This file is part of the QGROUNDCONTROL project
#include
"QmlObjectListModel.h"
#include
"Vehicle.h"
#include
"QGCLoggingCategory.h"
Q_DECLARE_LOGGING_CATEGORY
(
MissionControllerLog
)
class
MissionController
:
public
QObject
{
...
...
@@ -72,7 +75,7 @@ signals:
void
autoSyncChanged
(
bool
autoSync
);
private
slots
:
void
_newMissionItemsAvailable
();
void
_newMissionItemsAvailable
FromVehicle
();
void
_itemCoordinateChanged
(
const
QGeoCoordinate
&
coordinate
);
void
_itemCommandChanged
(
MavlinkQmlSingleton
::
Qml_MAV_CMD
command
);
void
_activeVehicleChanged
(
Vehicle
*
activeVehicle
);
...
...
@@ -91,6 +94,7 @@ private:
void
_initMissionItem
(
MissionItem
*
item
);
void
_deinitMissionItem
(
MissionItem
*
item
);
void
_autoSyncSend
(
void
);
void
_setupMissionItems
(
bool
fromVehicle
,
bool
force
);
private:
bool
_editMode
;
...
...
@@ -101,7 +105,7 @@ private:
bool
_liveHomePositionAvailable
;
QGeoCoordinate
_liveHomePosition
;
bool
_autoSync
;
bool
_first
MissionItemSync
;
bool
_first
ItemsFromVehicle
;
bool
_missionItemsRequested
;
bool
_queuedSend
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment