|
|
|
@ -80,6 +80,7 @@ Mission::Mission(Navigator *navigator, const char *name) :
@@ -80,6 +80,7 @@ Mission::Mission(Navigator *navigator, const char *name) :
|
|
|
|
|
_mission_type(MISSION_TYPE_NONE), |
|
|
|
|
_inited(false), |
|
|
|
|
_home_inited(false), |
|
|
|
|
_need_mission_reset(false), |
|
|
|
|
_missionFeasibilityChecker(), |
|
|
|
|
_min_current_sp_distance_xy(FLT_MAX), |
|
|
|
|
_mission_item_previous_alt(NAN), |
|
|
|
@ -111,6 +112,12 @@ Mission::on_inactive()
@@ -111,6 +112,12 @@ Mission::on_inactive()
|
|
|
|
|
update_offboard_mission(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* reset the current offboard mission if needed */ |
|
|
|
|
if (need_to_reset_mission(false)) { |
|
|
|
|
reset_offboard_mission(_offboard_mission); |
|
|
|
|
update_offboard_mission(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
/* load missions from storage */ |
|
|
|
@ -164,6 +171,13 @@ Mission::on_active()
@@ -164,6 +171,13 @@ Mission::on_active()
|
|
|
|
|
update_offboard_mission(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* reset the current offboard mission if needed */ |
|
|
|
|
if (need_to_reset_mission(true)) { |
|
|
|
|
reset_offboard_mission(_offboard_mission); |
|
|
|
|
update_offboard_mission(); |
|
|
|
|
offboard_updated = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* reset mission items if needed */ |
|
|
|
|
if (onboard_updated || offboard_updated) { |
|
|
|
|
set_mission_items(); |
|
|
|
@ -1038,3 +1052,71 @@ Mission::check_mission_valid()
@@ -1038,3 +1052,71 @@ Mission::check_mission_valid()
|
|
|
|
|
|
|
|
|
|
return _navigator->get_mission_result()->valid; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
Mission::reset_offboard_mission(struct mission_s &mission) |
|
|
|
|
{ |
|
|
|
|
dm_lock(DM_KEY_MISSION_STATE); |
|
|
|
|
|
|
|
|
|
if (dm_read(DM_KEY_MISSION_STATE, 0, &mission, sizeof(mission_s)) == sizeof(mission_s)) { |
|
|
|
|
if (mission.dataman_id >= 0 && mission.dataman_id <= 1) { |
|
|
|
|
/* set current item to 0 */ |
|
|
|
|
mission.current_seq = 0; |
|
|
|
|
|
|
|
|
|
/* reset jump counters */ |
|
|
|
|
if (mission.count > 0) { |
|
|
|
|
dm_item_t dm_current = DM_KEY_WAYPOINTS_OFFBOARD(mission.dataman_id); |
|
|
|
|
|
|
|
|
|
for (int index = 0; index < mission.count; index++) { |
|
|
|
|
struct mission_item_s item; |
|
|
|
|
const ssize_t len = sizeof(struct mission_item_s); |
|
|
|
|
|
|
|
|
|
if (dm_read(dm_current, index, &item, len) != len) { |
|
|
|
|
PX4_WARN("could not read mission item during reset"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (item.nav_cmd == NAV_CMD_DO_JUMP) { |
|
|
|
|
item.do_jump_current_count = 0; |
|
|
|
|
|
|
|
|
|
if (dm_write(dm_current, index, DM_PERSIST_POWER_ON_RESET, |
|
|
|
|
&item, len) != len) { |
|
|
|
|
PX4_WARN("could not save mission item during reset"); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
mavlink_and_console_log_critical(_navigator->get_mavlink_fd(), "ERROR: could not read mission"); |
|
|
|
|
|
|
|
|
|
/* initialize mission state in dataman */ |
|
|
|
|
mission.dataman_id = 0; |
|
|
|
|
mission.count = 0; |
|
|
|
|
mission.current_seq = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dm_write(DM_KEY_MISSION_STATE, 0, DM_PERSIST_POWER_ON_RESET, &mission, sizeof(mission_s)); |
|
|
|
|
|
|
|
|
|
mavlink_and_console_log_info(_navigator->get_mavlink_fd(), "mission reset"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dm_unlock(DM_KEY_MISSION_STATE); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
Mission::need_to_reset_mission(bool active) |
|
|
|
|
{ |
|
|
|
|
/* reset mission state when disarmed */ |
|
|
|
|
if (_navigator->get_vstatus()->arming_state != vehicle_status_s::ARMING_STATE_ARMED && _need_mission_reset) { |
|
|
|
|
_need_mission_reset = false; |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
} else if (_navigator->get_vstatus()->arming_state == vehicle_status_s::ARMING_STATE_ARMED && active) { |
|
|
|
|
/* mission is running, need reset after disarm */ |
|
|
|
|
_need_mission_reset = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|