mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-11 02:13:57 -04:00
MAVLink: make parameter send use adaptive stream rate
this makes it possible to fetch parameters with very low air data rates
This commit is contained in:
parent
1fd1a55fa6
commit
e1270401bf
@ -127,6 +127,7 @@ public:
|
|||||||
STREAM_EXTRA1,
|
STREAM_EXTRA1,
|
||||||
STREAM_EXTRA2,
|
STREAM_EXTRA2,
|
||||||
STREAM_EXTRA3,
|
STREAM_EXTRA3,
|
||||||
|
STREAM_PARAMS,
|
||||||
NUM_STREAMS};
|
NUM_STREAMS};
|
||||||
|
|
||||||
// see if we should send a stream now. Called at 50Hz
|
// see if we should send a stream now. Called at 50Hz
|
||||||
@ -186,9 +187,13 @@ private:
|
|||||||
AP_Int16 streamRateExtra1;
|
AP_Int16 streamRateExtra1;
|
||||||
AP_Int16 streamRateExtra2;
|
AP_Int16 streamRateExtra2;
|
||||||
AP_Int16 streamRateExtra3;
|
AP_Int16 streamRateExtra3;
|
||||||
|
AP_Int16 streamRateParams;
|
||||||
|
|
||||||
// number of 50Hz ticks until we next send this stream
|
// number of 50Hz ticks until we next send this stream
|
||||||
uint8_t stream_ticks[NUM_STREAMS];
|
uint8_t stream_ticks[NUM_STREAMS];
|
||||||
|
|
||||||
|
// number of extra ticks to add to slow things down for the radio
|
||||||
|
uint8_t stream_slowdown;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __GCS_H
|
#endif // __GCS_H
|
||||||
|
@ -794,6 +794,7 @@ const AP_Param::GroupInfo GCS_MAVLINK::var_info[] PROGMEM = {
|
|||||||
AP_GROUPINFO("EXTRA1", 5, GCS_MAVLINK, streamRateExtra1),
|
AP_GROUPINFO("EXTRA1", 5, GCS_MAVLINK, streamRateExtra1),
|
||||||
AP_GROUPINFO("EXTRA2", 6, GCS_MAVLINK, streamRateExtra2),
|
AP_GROUPINFO("EXTRA2", 6, GCS_MAVLINK, streamRateExtra2),
|
||||||
AP_GROUPINFO("EXTRA3", 7, GCS_MAVLINK, streamRateExtra3),
|
AP_GROUPINFO("EXTRA3", 7, GCS_MAVLINK, streamRateExtra3),
|
||||||
|
AP_GROUPINFO("PARAMS", 8, GCS_MAVLINK, streamRateParams),
|
||||||
AP_GROUPEND
|
AP_GROUPEND
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -857,11 +858,6 @@ GCS_MAVLINK::update(void)
|
|||||||
// Update packet drops counter
|
// Update packet drops counter
|
||||||
packet_drops += status.packet_rx_drop_count;
|
packet_drops += status.packet_rx_drop_count;
|
||||||
|
|
||||||
// send out queued params/ waypoints
|
|
||||||
if (NULL != _queued_parameter) {
|
|
||||||
send_message(MSG_NEXT_PARAM);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!waypoint_receiving && !waypoint_sending) {
|
if (!waypoint_receiving && !waypoint_sending) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -870,7 +866,7 @@ GCS_MAVLINK::update(void)
|
|||||||
|
|
||||||
if (waypoint_receiving &&
|
if (waypoint_receiving &&
|
||||||
waypoint_request_i <= (unsigned)g.command_total &&
|
waypoint_request_i <= (unsigned)g.command_total &&
|
||||||
tnow > waypoint_timelast_request + 500) {
|
tnow > waypoint_timelast_request + 500 + (stream_slowdown*20)) {
|
||||||
waypoint_timelast_request = tnow;
|
waypoint_timelast_request = tnow;
|
||||||
send_message(MSG_NEXT_WAYPOINT);
|
send_message(MSG_NEXT_WAYPOINT);
|
||||||
}
|
}
|
||||||
@ -901,7 +897,7 @@ bool GCS_MAVLINK::stream_trigger(enum streams stream_num)
|
|||||||
if (rate > 50) {
|
if (rate > 50) {
|
||||||
rate = 50;
|
rate = 50;
|
||||||
}
|
}
|
||||||
stream_ticks[stream_num] = 50 / rate;
|
stream_ticks[stream_num] = (50 / rate) + stream_slowdown;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -913,8 +909,19 @@ bool GCS_MAVLINK::stream_trigger(enum streams stream_num)
|
|||||||
void
|
void
|
||||||
GCS_MAVLINK::data_stream_send(void)
|
GCS_MAVLINK::data_stream_send(void)
|
||||||
{
|
{
|
||||||
if (waypoint_sending || waypoint_receiving || _queued_parameter != NULL) {
|
if (waypoint_receiving || waypoint_sending) {
|
||||||
// don't send the streams when transferring bulk data
|
// don't interfere with mission transfer
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_queued_parameter != NULL) {
|
||||||
|
if (streamRateParams.get() <= 0) {
|
||||||
|
streamRateParams.set(50);
|
||||||
|
}
|
||||||
|
if (stream_trigger(STREAM_PARAMS)) {
|
||||||
|
send_message(MSG_NEXT_PARAM);
|
||||||
|
}
|
||||||
|
// don't send anything else at the same time as parameters
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2057,6 +2064,30 @@ void GCS_MAVLINK::handleMessage(mavlink_message_t* msg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif // MOUNT == ENABLED
|
#endif // MOUNT == ENABLED
|
||||||
|
|
||||||
|
case MAVLINK_MSG_ID_RADIO:
|
||||||
|
{
|
||||||
|
mavlink_radio_t packet;
|
||||||
|
mavlink_msg_radio_decode(msg, &packet);
|
||||||
|
// use the state of the transmit buffer in the radio to
|
||||||
|
// control the stream rate, giving us adaptive software
|
||||||
|
// flow control
|
||||||
|
if (packet.txbuf < 20 && stream_slowdown < 100) {
|
||||||
|
// we are very low on space - slow down a lot
|
||||||
|
stream_slowdown += 3;
|
||||||
|
} else if (packet.txbuf < 50 && stream_slowdown < 100) {
|
||||||
|
// we are a bit low on space, slow down slightly
|
||||||
|
stream_slowdown += 1;
|
||||||
|
} else if (packet.txbuf > 95 && stream_slowdown > 10) {
|
||||||
|
// the buffer has plenty of space, speed up a lot
|
||||||
|
stream_slowdown -= 2;
|
||||||
|
} else if (packet.txbuf > 90 && stream_slowdown != 0) {
|
||||||
|
// the buffer has enough space, speed up a bit
|
||||||
|
stream_slowdown--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
} // end switch
|
} // end switch
|
||||||
} // end handle mavlink
|
} // end handle mavlink
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user