1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-20 14:55:18 +03:00

Load mission from vehicle

This commit is contained in:
Konstantin Sharlaimov (DigitalEntity) 2017-03-26 23:11:04 +10:00
parent 1076fc13c3
commit df83fe8d0f
4 changed files with 69 additions and 8 deletions

View file

@ -2261,6 +2261,11 @@ bool isWaypointListValid(void)
return posControl.waypointListValid; return posControl.waypointListValid;
} }
int getWaypointCount(void)
{
return posControl.waypointCount;
}
#ifdef NAV_NON_VOLATILE_WAYPOINT_STORAGE #ifdef NAV_NON_VOLATILE_WAYPOINT_STORAGE
bool loadNonVolatileWaypointList(void) bool loadNonVolatileWaypointList(void)
{ {

View file

@ -268,6 +268,7 @@ float getEstimatedActualPosition(int axis);
int32_t getTotalTravelDistance(void); int32_t getTotalTravelDistance(void);
/* Waypoint list access functions */ /* Waypoint list access functions */
int getWaypointCount(void);
bool isWaypointListValid(void); bool isWaypointListValid(void);
void getWaypoint(uint8_t wpNumber, navWaypoint_t * wpData); void getWaypoint(uint8_t wpNumber, navWaypoint_t * wpData);
void setWaypoint(uint8_t wpNumber, const navWaypoint_t * wpData); void setWaypoint(uint8_t wpNumber, const navWaypoint_t * wpData);

View file

@ -208,8 +208,8 @@
//#define USE_FAKE_BARO //#define USE_FAKE_BARO
//#define USE_FAKE_GPS //#define USE_FAKE_GPS
#undef TELEMETRY_FRSKY // #undef TELEMETRY_FRSKY
#define TELEMETRY_MAVLINK // #define TELEMETRY_MAVLINK
// IO - from schematics // IO - from schematics
#define TARGET_IO_PORTA 0xffff #define TARGET_IO_PORTA 0xffff

View file

@ -596,14 +596,14 @@ static bool handleIncoming_MISSION_ITEM(void)
return true; return true;
} }
if (msg.frame != MAV_FRAME_GLOBAL_RELATIVE_ALT) { if ((msg.autocontinue == 0) || (msg.command != MAV_CMD_NAV_WAYPOINT && msg.command != MAV_CMD_NAV_RETURN_TO_LAUNCH)) {
mavlink_msg_mission_ack_pack(mavSystemId, mavComponentId, &mavSendMsg, mavRecvMsg.sysid, mavRecvMsg.compid, MAV_MISSION_UNSUPPORTED_FRAME); mavlink_msg_mission_ack_pack(mavSystemId, mavComponentId, &mavSendMsg, mavRecvMsg.sysid, mavRecvMsg.compid, MAV_MISSION_UNSUPPORTED);
mavlinkSendMessage(); mavlinkSendMessage();
return true; return true;
} }
if ((msg.autocontinue == 0) || (msg.command != MAV_CMD_NAV_WAYPOINT && msg.command != MAV_CMD_NAV_RETURN_TO_LAUNCH)) { if ((msg.frame != MAV_FRAME_GLOBAL_RELATIVE_ALT) && !(msg.frame == MAV_FRAME_MISSION && msg.command == MAV_CMD_NAV_RETURN_TO_LAUNCH)) {
mavlink_msg_mission_ack_pack(mavSystemId, mavComponentId, &mavSendMsg, mavRecvMsg.sysid, mavRecvMsg.compid, MAV_MISSION_UNSUPPORTED); mavlink_msg_mission_ack_pack(mavSystemId, mavComponentId, &mavSendMsg, mavRecvMsg.sysid, mavRecvMsg.compid, MAV_MISSION_UNSUPPORTED_FRAME);
mavlinkSendMessage(); mavlinkSendMessage();
return true; return true;
} }
@ -615,7 +615,7 @@ static bool handleIncoming_MISSION_ITEM(void)
wp.action = (msg.command == MAV_CMD_NAV_RETURN_TO_LAUNCH) ? NAV_WP_ACTION_RTH : NAV_WP_ACTION_WAYPOINT; wp.action = (msg.command == MAV_CMD_NAV_RETURN_TO_LAUNCH) ? NAV_WP_ACTION_RTH : NAV_WP_ACTION_WAYPOINT;
wp.lat = (int32_t)(msg.x * 1e7f); wp.lat = (int32_t)(msg.x * 1e7f);
wp.lon = (int32_t)(msg.y * 1e7f); wp.lon = (int32_t)(msg.y * 1e7f);
wp.alt = msg.z * 100; wp.alt = msg.z * 100.0f;
wp.p1 = 0; wp.p1 = 0;
wp.p2 = 0; wp.p2 = 0;
wp.p3 = 0; wp.p3 = 0;
@ -650,6 +650,57 @@ static bool handleIncoming_MISSION_ITEM(void)
return false; return false;
} }
static bool handleIncoming_MISSION_REQUEST_LIST(void)
{
mavlink_mission_request_list_t msg;
mavlink_msg_mission_request_list_decode(&mavRecvMsg, &msg);
// Check if this message is for us
if (msg.target_system == mavSystemId) {
mavlink_msg_mission_count_pack(mavSystemId, mavComponentId, &mavSendMsg, mavRecvMsg.sysid, mavRecvMsg.compid, getWaypointCount());
mavlinkSendMessage();
return true;
}
return false;
}
static bool handleIncoming_MISSION_REQUEST(void)
{
mavlink_mission_request_t msg;
mavlink_msg_mission_request_decode(&mavRecvMsg, &msg);
// Check if this message is for us
if (msg.target_system == mavSystemId) {
int wpCount = getWaypointCount();
if (msg.seq < wpCount) {
navWaypoint_t wp;
getWaypoint(msg.seq + 1, &wp);
mavlink_msg_mission_item_pack(mavSystemId, mavComponentId, &mavSendMsg, mavRecvMsg.sysid, mavRecvMsg.compid,
msg.seq,
wp.action == NAV_WP_ACTION_RTH ? MAV_FRAME_MISSION : MAV_FRAME_GLOBAL_RELATIVE_ALT,
wp.action == NAV_WP_ACTION_RTH ? MAV_CMD_NAV_RETURN_TO_LAUNCH : MAV_CMD_NAV_WAYPOINT,
0,
1,
0, 0, 0, 0,
wp.lat / 1e7f,
wp.lon / 1e7f,
wp.alt / 100.0f);
mavlinkSendMessage();
}
else {
mavlink_msg_mission_ack_pack(mavSystemId, mavComponentId, &mavSendMsg, mavRecvMsg.sysid, mavRecvMsg.compid, MAV_MISSION_INVALID_SEQUENCE);
mavlinkSendMessage();
}
return true;
}
return false;
}
static bool processMAVLinkIncomingTelemetry(void) static bool processMAVLinkIncomingTelemetry(void)
{ {
while (serialRxBytesWaiting(mavlinkPort) > 0) { while (serialRxBytesWaiting(mavlinkPort) > 0) {
@ -658,7 +709,7 @@ static bool processMAVLinkIncomingTelemetry(void)
uint8_t result = mavlink_parse_char(0, c, &mavRecvMsg, &mavRecvStatus); uint8_t result = mavlink_parse_char(0, c, &mavRecvMsg, &mavRecvStatus);
if (result == MAVLINK_FRAMING_OK) { if (result == MAVLINK_FRAMING_OK) {
switch (mavRecvMsg.msgid) { switch (mavRecvMsg.msgid) {
case MAVLINK_MSG_ID_HEARTBEAT: // MAV ID: 0 case MAVLINK_MSG_ID_HEARTBEAT:
break; break;
case MAVLINK_MSG_ID_MISSION_CLEAR_ALL: case MAVLINK_MSG_ID_MISSION_CLEAR_ALL:
return handleIncoming_MISSION_CLEAR_ALL(); return handleIncoming_MISSION_CLEAR_ALL();
@ -666,6 +717,10 @@ static bool processMAVLinkIncomingTelemetry(void)
return handleIncoming_MISSION_COUNT(); return handleIncoming_MISSION_COUNT();
case MAVLINK_MSG_ID_MISSION_ITEM: case MAVLINK_MSG_ID_MISSION_ITEM:
return handleIncoming_MISSION_ITEM(); return handleIncoming_MISSION_ITEM();
case MAVLINK_MSG_ID_MISSION_REQUEST_LIST:
return handleIncoming_MISSION_REQUEST_LIST();
case MAVLINK_MSG_ID_MISSION_REQUEST:
return handleIncoming_MISSION_REQUEST();
default: default:
return false; return false;
} }