58 bool missionStartsInVTOLMulticopterMode)
60 bool firstCoordinateItem =
true;
63 bool homePositionValid = settingsItem->
coordinate().isValid();
75 _minAMSLAltitude = _maxAMSLAltitude = qQNaN();
77 reset(controllerVehicle, managerVehicle, missionStartsInVTOLMulticopterMode);
79 bool linkStartToHome =
false;
80 bool foundRTL =
false;
81 bool pastLandCommand =
false;
82 double totalHorizontalDistance = 0;
84 for (
int i=0; i<visualItems->
count(); i++) {
89 if (simpleItem && simpleItem->
mavCommand() == MAV_CMD_NAV_RETURN_TO_LAUNCH) {
102 switch (simpleItem->
command()) {
103 case MAV_CMD_NAV_ROI:
104 case MAV_CMD_DO_SET_ROI_LOCATION:
105 case MAV_CMD_DO_SET_ROI_WPNEXT_OFFSET:
106 case MAV_CMD_DO_GIMBAL_MANAGER_PITCHYAW:
117 if (!qIsNaN(gimbalYaw) || planViewSettings->showGimbalOnlyWhenSet()->rawValue().toBool()) {
121 if (!qIsNaN(gimbalPitch) || planViewSettings->showGimbalOnlyWhenSet()->rawValue().toBool()) {
128 if (i != 0 && !foundRTL) {
134 if (firstCoordinateItem && simpleItem && (simpleItem->
mavCommand() == MAV_CMD_NAV_TAKEOFF || simpleItem->
mavCommand() == MAV_CMD_NAV_VTOL_TAKEOFF)) {
135 if (homePositionValid) {
136 linkStartToHome =
true;
137 if (controllerVehicle->
multiRotor() || controllerVehicle->
vtol()) {
139 double azimuth, distance, altDifference;
141 double takeoffTime = qAbs(altDifference) / appSettings->offlineEditingAscentSpeed()->rawValue().toDouble();
142 _addHoverTime(takeoffTime, 0, -1);
147 if (!pastLandCommand)
155 _minAMSLAltitude = std::fmin(_minAMSLAltitude, amslAltitude);
156 _maxAMSLAltitude = std::fmax(_maxAMSLAltitude, amslAltitude);
161 _minAMSLAltitude = std::fmin(_minAMSLAltitude, complexMinAMSLAltitude);
162 _maxAMSLAltitude = std::fmax(_maxAMSLAltitude, complexMaxAMSLAltitude);
166 firstCoordinateItem =
false;
171 if (qIsNaN(newVehicleYaw)) {
173 if (simpleItem != lastFlyThroughVI) {
182 if (lastFlyThroughVI != settingsItem || linkStartToHome) {
184 double azimuth, distance, altDifference;
190 totalHorizontalDistance += distance;
193 if (!pastLandCommand) {
195 double hoverTime = distance / _status.
hoverSpeed;
196 double cruiseTime = distance / _status.
cruiseSpeed;
213 if (!pastLandCommand) {
214 double hoverTime = distance / _status.
hoverSpeed;
215 double cruiseTime = distance / _status.
cruiseSpeed;
219 totalHorizontalDistance += distance;
223 lastFlyThroughVI = item;
231 if (!qIsNaN(newSpeed)) {
234 }
else if (controllerVehicle->
vtol()) {
247 if (simpleItem && controllerVehicle->
vtol()) {
248 switch (simpleItem->
command()) {
249 case MAV_CMD_NAV_TAKEOFF:
255 case MAV_CMD_NAV_VTOL_TAKEOFF:
256 case MAV_CMD_NAV_LAND:
259 case MAV_CMD_NAV_VTOL_LAND:
262 case MAV_CMD_DO_VTOL_TRANSITION:
265 if (transitionState == MAV_VTOL_STATE_MC) {
267 }
else if (transitionState == MAV_VTOL_STATE_FW) {
278 pastLandCommand =
true;
284 if (foundRTL && lastFlyThroughVI != settingsItem && homePositionValid) {
285 double azimuth, distance, altDifference;
288 if (!pastLandCommand) {
290 double hoverTime = distance / _status.
hoverSpeed;
291 double cruiseTime = distance / _status.
cruiseSpeed;
292 double landTime = qAbs(altDifference) / appSettings->offlineEditingDescentSpeed()->rawValue().toDouble();
303 if (linkStartToHome) {
310 double altRange = _maxAMSLAltitude - _minAMSLAltitude;
311 for (
int i=0; i<visualItems->
count(); i++) {
316 if (altRange == 0.0) {
321 item->
setAltPercent((amslAlt - _minAMSLAltitude) / altRange);
323 if (qIsNaN(terrainAltitude)) {