@ -54,7 +54,11 @@ bool MockLinkMissionItemHandler::handleMessage(const mavlink_message_t& msg)
@@ -54,7 +54,11 @@ bool MockLinkMissionItemHandler::handleMessage(const mavlink_message_t& msg)
break ;
case MAVLINK_MSG_ID_MISSION_ITEM :
_handleMissionItem ( msg ) ;
_handleMissionItem ( msg , false ) ;
break ;
case MAVLINK_MSG_ID_MISSION_ITEM_INT :
_handleMissionItem ( msg , true ) ;
break ;
case MAVLINK_MSG_ID_MISSION_COUNT :
@ -198,45 +202,63 @@ void MockLinkMissionItemHandler::_handleMissionRequest(const mavlink_message_t&
@@ -198,45 +202,63 @@ void MockLinkMissionItemHandler::_handleMissionRequest(const mavlink_message_t&
( _failureMode = = FailReadRequest1ErrorAck & & request . seq = = 1 ) ) {
_sendAck ( MAV_MISSION_ERROR ) ;
} else {
mavlink_mission_item_t item ;
mavlink_message_t responseMsg ;
MissionItemBoth_t missionItemBoth ;
switch ( request . mission_type ) {
case MAV_MISSION_TYPE_MISSION :
if ( _missionItems . count ( ) = = 0 & & _sendHomePositionOnEmptyList ) {
item . frame = MAV_FRAME_GLOBAL_RELATIVE_ALT ;
item . command = MAV_CMD_NAV_WAYPOINT ;
item . current = false ;
item . autocontinue = true ;
item . param1 = item . param2 = item . param3 = item . param4 = item . x = item . y = item . z = 0 ;
memset ( & missionItemBoth , 0 , sizeof ( missionItemBoth ) ) ;
missionItemBoth . missionItem . frame = MAV_FRAME_GLOBAL_RELATIVE_ALT ;
missionItemBoth . missionItem . command = MAV_CMD_NAV_WAYPOINT ;
missionItemBoth . missionItem . autocontinue = true ;
} else {
item = _missionItems [ request . seq ] ;
m issionI temBoth = _missionItems [ request . seq ] ;
}
break ;
case MAV_MISSION_TYPE_FENCE :
item = _fenceItems [ request . seq ] ;
m issionI temBoth = _fenceItems [ request . seq ] ;
break ;
case MAV_MISSION_TYPE_RALLY :
item = _rallyItems [ request . seq ] ;
m issionI temBoth = _rallyItems [ request . seq ] ;
break ;
default :
Q_ASSERT ( false ) ;
}
mavlink_msg_mission_item_pack_chan ( _mockLink - > vehicleId ( ) ,
MAV_COMP_ID_AUTOPILOT1 ,
_mockLink - > mavlinkChannel ( ) ,
& responseMsg , // Outgoing message
msg . sysid , // Target is original sender
msg . compid , // Target is original sender
request . seq , // Index of mission item being sent
item . frame ,
item . command ,
item . current ,
item . autocontinue ,
item . param1 , item . param2 , item . param3 , item . param4 ,
item . x , item . y , item . z ,
_requestType ) ;
mavlink_message_t responseMsg ;
if ( missionItemBoth . isIntItem ) {
mavlink_mission_item_int_t & item = missionItemBoth . missionItemInt ;
mavlink_msg_mission_item_int_pack_chan ( _mockLink - > vehicleId ( ) ,
MAV_COMP_ID_AUTOPILOT1 ,
_mockLink - > mavlinkChannel ( ) ,
& responseMsg , // Outgoing message
msg . sysid , // Target is original sender
msg . compid , // Target is original sender
request . seq , // Index of mission item being sent
item . frame ,
item . command ,
item . current ,
item . autocontinue ,
item . param1 , item . param2 , item . param3 , item . param4 ,
item . x , item . y , item . z ,
_requestType ) ;
} else {
mavlink_mission_item_t & item = missionItemBoth . missionItem ;
mavlink_msg_mission_item_pack_chan ( _mockLink - > vehicleId ( ) ,
MAV_COMP_ID_AUTOPILOT1 ,
_mockLink - > mavlinkChannel ( ) ,
& responseMsg , // Outgoing message
msg . sysid , // Target is original sender
msg . compid , // Target is original sender
request . seq , // Index of mission item being sent
item . frame ,
item . command ,
item . current ,
item . autocontinue ,
item . param1 , item . param2 , item . param3 , item . param4 ,
item . x , item . y , item . z ,
_requestType ) ;
}
_mockLink - > respondWithMavlinkMessage ( responseMsg ) ;
}
}
@ -342,27 +364,44 @@ void MockLinkMissionItemHandler::_sendAck(MAV_MISSION_RESULT ackType)
@@ -342,27 +364,44 @@ void MockLinkMissionItemHandler::_sendAck(MAV_MISSION_RESULT ackType)
_mockLink - > respondWithMavlinkMessage ( message ) ;
}
void MockLinkMissionItemHandler : : _handleMissionItem ( const mavlink_message_t & msg )
void MockLinkMissionItemHandler : : _handleMissionItem ( const mavlink_message_t & msg , bool missionItemInt )
{
qCDebug ( MockLinkMissionItemHandlerLog ) < < " _handleMissionItem write sequence " ;
_missionItemResponseTimer - > stop ( ) ;
mavlink_mission_item_t missionItem ;
mavlink_msg_mission_item_decode ( & msg , & missionItem ) ;
Q_ASSERT ( missionItem . target_system = = _mockLink - > vehicleId ( ) ) ;
MAV_MISSION_TYPE missionType ;
uint16_t seq ;
MissionItemBoth_t missionItemBoth ;
missionItemBoth . isIntItem = missionItemInt ;
if ( missionItemInt ) {
mavlink_mission_item_int_t missionItem ;
mavlink_msg_mission_item_int_decode ( & msg , & missionItem ) ;
missionItemBoth . missionItemInt = missionItem ;
missionType = static_cast < MAV_MISSION_TYPE > ( missionItem . mission_type ) ;
seq = missionItem . seq ;
} else {
mavlink_mission_item_t missionItem ;
mavlink_msg_mission_item_decode ( & msg , & missionItem ) ;
missionItemBoth . missionItem = missionItem ;
missionType = static_cast < MAV_MISSION_TYPE > ( missionItem . mission_type ) ;
seq = missionItem . seq ;
}
switch ( missionItem . mission_type ) {
switch ( missionT ype ) {
case MAV_MISSION_TYPE_MISSION :
_missionItems [ missionItem . seq ] = missionItem ;
_missionItems [ seq ] = missionItemBoth ;
break ;
case MAV_MISSION_TYPE_FENCE :
_fenceItems [ missionItem . seq ] = missionItem ;
_fenceItems [ seq ] = missionItemBoth ;
break ;
case MAV_MISSION_TYPE_RALLY :
_rallyItems [ missionItem . seq ] = missionItem ;
_rallyItems [ seq ] = missionItemBoth ;
break ;
case MAV_MISSION_TYPE_ENUM_END :
case MAV_MISSION_TYPE_ALL :
qWarning ( ) < < " Internal error " ;
break ;
}