GCS_MAVLink: reserve some space when param fetch fails

this ensures we give some buffer space for parameter fetch when we are
low on buffer space

we reserve 100 bytes for 2 seconds after a param fetch fails due to
low buffer space
This commit is contained in:
Andrew Tridgell 2016-05-28 10:41:52 +10:00
parent f02c8f732c
commit 7ec513668e
3 changed files with 27 additions and 2 deletions

View File

@ -306,6 +306,9 @@ private:
uint8_t next_deferred_message;
uint8_t num_deferred_messages;
// time when we missed sending a parameter for GCS
static uint32_t reserve_param_space_start_ms;
// bitmask of what mavlink channels are active
static uint8_t mavlink_active;

View File

@ -29,6 +29,7 @@ extern const AP_HAL::HAL& hal;
uint32_t GCS_MAVLINK::last_radio_status_remrssi_ms;
uint8_t GCS_MAVLINK::mavlink_active = 0;
ObjectArray<GCS_MAVLINK::statustext_t> GCS_MAVLINK::_statustext_queue(GCS_MAVLINK_PAYLOAD_STATUS_CAPACITY);
uint32_t GCS_MAVLINK::reserve_param_space_start_ms;
GCS_MAVLINK::GCS_MAVLINK()
{
@ -579,9 +580,17 @@ void GCS_MAVLINK::handle_param_request_read(mavlink_message_t *msg)
mavlink_param_request_read_t packet;
mavlink_msg_param_request_read_decode(msg, &packet);
/*
we reserve some space for sending parameters if the client ever
fails to get a parameter due to lack of space
*/
uint32_t saved_reserve_param_space_start_ms = reserve_param_space_start_ms;
reserve_param_space_start_ms = 0;
if (!HAVE_PAYLOAD_SPACE(chan, PARAM_VALUE)) {
reserve_param_space_start_ms = AP_HAL::millis();
return;
}
reserve_param_space_start_ms = saved_reserve_param_space_start_ms;
enum ap_var_type p_type;
AP_Param *vp;

View File

@ -234,10 +234,23 @@ bool GCS_MAVLINK::signing_enabled(void) const
*/
uint8_t GCS_MAVLINK::packet_overhead_chan(mavlink_channel_t chan)
{
/*
reserve 100 bytes for parameters when a GCS fails to fetch a
parameter due to lack of buffer space. The reservation lasts 2
seconds
*/
uint8_t reserved_space = 0;
if (reserve_param_space_start_ms != 0 &&
AP_HAL::millis() - reserve_param_space_start_ms < 2000) {
reserved_space = 100;
} else {
reserve_param_space_start_ms = 0;
}
const mavlink_status_t *status = mavlink_get_channel_status(chan);
if (status->signing && (status->signing->flags & MAVLINK_SIGNING_FLAG_SIGN_OUTGOING)) {
return MAVLINK_NUM_NON_PAYLOAD_BYTES + MAVLINK_SIGNATURE_BLOCK_LEN;
return MAVLINK_NUM_NON_PAYLOAD_BYTES + MAVLINK_SIGNATURE_BLOCK_LEN + reserved_space;
}
return MAVLINK_NUM_NON_PAYLOAD_BYTES;
return MAVLINK_NUM_NON_PAYLOAD_BYTES + reserved_space;
}