|
|
|
@ -58,6 +58,12 @@
@@ -58,6 +58,12 @@
|
|
|
|
|
#endif |
|
|
|
|
static const int ERROR = -1; |
|
|
|
|
|
|
|
|
|
int MavlinkMissionManager::_dataman_id = 0; |
|
|
|
|
bool MavlinkMissionManager::_dataman_init = false; |
|
|
|
|
unsigned MavlinkMissionManager::_count = 0; |
|
|
|
|
int MavlinkMissionManager::_current_seq = 0; |
|
|
|
|
bool MavlinkMissionManager::_transfer_in_progress = false; |
|
|
|
|
|
|
|
|
|
#define CHECK_SYSID_COMPID_MISSION(_msg) (_msg.target_system == mavlink_system.sysid && \ |
|
|
|
|
((_msg.target_component == mavlink_system.compid) || \
|
|
|
|
|
(_msg.target_component == MAV_COMP_ID_MISSIONPLANNER) || \
|
|
|
|
@ -70,14 +76,12 @@ MavlinkMissionManager::MavlinkMissionManager(Mavlink *mavlink) : MavlinkStream(m
@@ -70,14 +76,12 @@ MavlinkMissionManager::MavlinkMissionManager(Mavlink *mavlink) : MavlinkStream(m
|
|
|
|
|
_action_timeout(MAVLINK_MISSION_PROTOCOL_TIMEOUT_DEFAULT), |
|
|
|
|
_retry_timeout(MAVLINK_MISSION_RETRY_TIMEOUT_DEFAULT), |
|
|
|
|
_max_count(DM_KEY_WAYPOINTS_OFFBOARD_0_MAX), |
|
|
|
|
_dataman_id(0), |
|
|
|
|
_count(0), |
|
|
|
|
_current_seq(0), |
|
|
|
|
_my_dataman_id(0), |
|
|
|
|
_transfer_dataman_id(0), |
|
|
|
|
_transfer_count(0), |
|
|
|
|
_transfer_seq(0), |
|
|
|
|
_transfer_current_seq(0), |
|
|
|
|
_transfer_partner_sysid(0), |
|
|
|
|
_transfer_partner_sysid(255), |
|
|
|
|
_transfer_partner_compid(0), |
|
|
|
|
_offboard_mission_sub(-1), |
|
|
|
|
_mission_result_sub(-1), |
|
|
|
@ -114,17 +118,21 @@ void
@@ -114,17 +118,21 @@ void
|
|
|
|
|
MavlinkMissionManager::init_offboard_mission() |
|
|
|
|
{ |
|
|
|
|
mission_s mission_state; |
|
|
|
|
if (dm_read(DM_KEY_MISSION_STATE, 0, &mission_state, sizeof(mission_s)) == sizeof(mission_s)) { |
|
|
|
|
_dataman_id = mission_state.dataman_id; |
|
|
|
|
_count = mission_state.count; |
|
|
|
|
_current_seq = mission_state.current_seq; |
|
|
|
|
if (!_dataman_init) { |
|
|
|
|
_dataman_init = true; |
|
|
|
|
if (dm_read(DM_KEY_MISSION_STATE, 0, &mission_state, sizeof(mission_s)) == sizeof(mission_s)) { |
|
|
|
|
_dataman_id = mission_state.dataman_id; |
|
|
|
|
_count = mission_state.count; |
|
|
|
|
_current_seq = mission_state.current_seq; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
_dataman_id = 0; |
|
|
|
|
_count = 0; |
|
|
|
|
_current_seq = 0; |
|
|
|
|
warnx("offboard mission init: ERROR"); |
|
|
|
|
} else { |
|
|
|
|
_dataman_id = 0; |
|
|
|
|
_count = 0; |
|
|
|
|
_current_seq = 0; |
|
|
|
|
warnx("offboard mission init: ERROR"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
_my_dataman_id = _dataman_id; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -147,6 +155,7 @@ MavlinkMissionManager::update_active_mission(int dataman_id, unsigned count, int
@@ -147,6 +155,7 @@ MavlinkMissionManager::update_active_mission(int dataman_id, unsigned count, int
|
|
|
|
|
_dataman_id = dataman_id; |
|
|
|
|
_count = count; |
|
|
|
|
_current_seq = seq; |
|
|
|
|
_my_dataman_id = _dataman_id; |
|
|
|
|
|
|
|
|
|
/* mission state saved successfully, publish offboard_mission topic */ |
|
|
|
|
if (_offboard_mission_pub == nullptr) { |
|
|
|
@ -564,11 +573,19 @@ MavlinkMissionManager::handle_mission_count(const mavlink_message_t *msg)
@@ -564,11 +573,19 @@ MavlinkMissionManager::handle_mission_count(const mavlink_message_t *msg)
|
|
|
|
|
if (CHECK_SYSID_COMPID_MISSION(wpc)) { |
|
|
|
|
if (_state == MAVLINK_WPM_STATE_IDLE) { |
|
|
|
|
_time_last_recv = hrt_absolute_time(); |
|
|
|
|
|
|
|
|
|
if(_transfer_in_progress) |
|
|
|
|
{ |
|
|
|
|
send_mission_ack(_transfer_partner_sysid, _transfer_partner_compid, MAV_MISSION_ERROR); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
_transfer_in_progress = true; |
|
|
|
|
|
|
|
|
|
if (wpc.count > _max_count) { |
|
|
|
|
if (_verbose) { warnx("WPM: MISSION_COUNT ERROR: too many waypoints (%d), supported: %d", wpc.count, _max_count); } |
|
|
|
|
|
|
|
|
|
send_mission_ack(_transfer_partner_sysid, _transfer_partner_compid, MAV_MISSION_NO_SPACE); |
|
|
|
|
_transfer_in_progress = false; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -580,6 +597,7 @@ MavlinkMissionManager::handle_mission_count(const mavlink_message_t *msg)
@@ -580,6 +597,7 @@ MavlinkMissionManager::handle_mission_count(const mavlink_message_t *msg)
|
|
|
|
|
_mavlink->send_statustext_info("WPM: COUNT 0: CLEAR MISSION"); |
|
|
|
|
|
|
|
|
|
// TODO send ACK?
|
|
|
|
|
_transfer_in_progress = false; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -661,6 +679,7 @@ MavlinkMissionManager::handle_mission_item(const mavlink_message_t *msg)
@@ -661,6 +679,7 @@ MavlinkMissionManager::handle_mission_item(const mavlink_message_t *msg)
|
|
|
|
|
|
|
|
|
|
send_mission_ack(_transfer_partner_sysid, _transfer_partner_compid, ret); |
|
|
|
|
_state = MAVLINK_WPM_STATE_IDLE; |
|
|
|
|
_transfer_in_progress = false; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -672,6 +691,7 @@ MavlinkMissionManager::handle_mission_item(const mavlink_message_t *msg)
@@ -672,6 +691,7 @@ MavlinkMissionManager::handle_mission_item(const mavlink_message_t *msg)
|
|
|
|
|
send_mission_ack(_transfer_partner_sysid, _transfer_partner_compid, MAV_MISSION_ERROR); |
|
|
|
|
_mavlink->send_statustext_critical("Unable to write on micro SD"); |
|
|
|
|
_state = MAVLINK_WPM_STATE_IDLE; |
|
|
|
|
_transfer_in_progress = false; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -698,6 +718,7 @@ MavlinkMissionManager::handle_mission_item(const mavlink_message_t *msg)
@@ -698,6 +718,7 @@ MavlinkMissionManager::handle_mission_item(const mavlink_message_t *msg)
|
|
|
|
|
} else { |
|
|
|
|
send_mission_ack(_transfer_partner_sysid, _transfer_partner_compid, MAV_MISSION_ERROR); |
|
|
|
|
} |
|
|
|
|
_transfer_in_progress = false; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
/* request next item */ |
|
|
|
@ -832,3 +853,14 @@ MavlinkMissionManager::format_mavlink_mission_item(const struct mission_item_s *
@@ -832,3 +853,14 @@ MavlinkMissionManager::format_mavlink_mission_item(const struct mission_item_s *
|
|
|
|
|
|
|
|
|
|
return OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void MavlinkMissionManager::check_active_mission(void) |
|
|
|
|
{ |
|
|
|
|
if(!(_my_dataman_id==_dataman_id)) |
|
|
|
|
{ |
|
|
|
|
if (_verbose) { warnx("WPM: New mission detected (possibly over different Mavlink instance) Updating"); } |
|
|
|
|
_my_dataman_id=_dataman_id; |
|
|
|
|
this->send_mission_count(_transfer_partner_sysid, _transfer_partner_compid, _count); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|