aboutsummaryrefslogtreecommitdiff
path: root/src/modules/navigator/mission_block.cpp
diff options
context:
space:
mode:
authorAnton Babushkin <anton.babushkin@me.com>2014-06-26 00:17:25 +0200
committerAnton Babushkin <anton.babushkin@me.com>2014-06-26 00:17:25 +0200
commitc5a5604ae975294347f1571258a633c11ef61261 (patch)
tree3aa382490d7cc977ff3ee6be284a6494c9cdd039 /src/modules/navigator/mission_block.cpp
parent39454ca99d984698983404b2c82bbd61f93be3fc (diff)
downloadpx4-firmware-c5a5604ae975294347f1571258a633c11ef61261.tar.gz
px4-firmware-c5a5604ae975294347f1571258a633c11ef61261.tar.bz2
px4-firmware-c5a5604ae975294347f1571258a633c11ef61261.zip
navigator: loiter fixes
Diffstat (limited to 'src/modules/navigator/mission_block.cpp')
-rw-r--r--src/modules/navigator/mission_block.cpp40
1 files changed, 22 insertions, 18 deletions
diff --git a/src/modules/navigator/mission_block.cpp b/src/modules/navigator/mission_block.cpp
index a8eec92ca..41d81ad9b 100644
--- a/src/modules/navigator/mission_block.cpp
+++ b/src/modules/navigator/mission_block.cpp
@@ -204,31 +204,35 @@ MissionBlock::set_previous_pos_setpoint(struct position_setpoint_triplet_s *pos_
}
bool
-MissionBlock::set_loiter_item(bool reuse_current_pos_sp, struct position_setpoint_triplet_s *pos_sp_triplet)
+MissionBlock::set_loiter_item(struct position_setpoint_triplet_s *pos_sp_triplet)
{
- if (_navigator_priv->get_is_in_loiter()) {
- /* already loitering, bail out */
- return false;
- }
-
- if (reuse_current_pos_sp && pos_sp_triplet->current.valid) {
- /* leave position setpoint as is */
- } else {
+ /* don't change setpoint if 'can_loiter_at_sp' flag set */
+ if (!(_navigator_priv->get_can_loiter_at_sp() && pos_sp_triplet->current.valid)) {
/* use current position */
pos_sp_triplet->current.lat = _navigator_priv->get_global_position()->lat;
pos_sp_triplet->current.lon = _navigator_priv->get_global_position()->lon;
pos_sp_triplet->current.alt = _navigator_priv->get_global_position()->alt;
pos_sp_triplet->current.yaw = NAN; /* NAN means to use current yaw */
+
+ _navigator_priv->set_can_loiter_at_sp(true);
}
- pos_sp_triplet->current.type = SETPOINT_TYPE_LOITER;
- pos_sp_triplet->current.loiter_radius = _navigator_priv->get_loiter_radius();
- pos_sp_triplet->current.loiter_direction = 1;
- pos_sp_triplet->previous.valid = false;
- pos_sp_triplet->current.valid = true;
- pos_sp_triplet->next.valid = false;
+ if (pos_sp_triplet->current.type != SETPOINT_TYPE_LOITER
+ || pos_sp_triplet->current.loiter_radius != _navigator_priv->get_loiter_radius()
+ || pos_sp_triplet->current.loiter_direction != 1
+ || pos_sp_triplet->previous.valid
+ || !pos_sp_triplet->current.valid
+ || pos_sp_triplet->next.valid) {
+ /* position setpoint triplet should be updated */
+ pos_sp_triplet->current.type = SETPOINT_TYPE_LOITER;
+ pos_sp_triplet->current.loiter_radius = _navigator_priv->get_loiter_radius();
+ pos_sp_triplet->current.loiter_direction = 1;
+
+ pos_sp_triplet->previous.valid = false;
+ pos_sp_triplet->current.valid = true;
+ pos_sp_triplet->next.valid = false;
+ return true;
+ }
- _navigator_priv->set_is_in_loiter(true);
- return true;
+ return false;
}
-