mirror of https://github.com/ArduPilot/ardupilot
GCS_MAVLink: add support for `AVAILABLE_MODES` msg
This commit is contained in:
parent
88a80993dc
commit
26152416ab
|
@ -412,6 +412,10 @@ public:
|
|||
void send_uavionix_adsb_out_status() const;
|
||||
void send_autopilot_state_for_gimbal_device() const;
|
||||
|
||||
// Send the mode with the given index (not mode number!) return the total number of modes
|
||||
// Index starts at 1
|
||||
virtual uint8_t send_available_mode(uint8_t index) const = 0;
|
||||
|
||||
// lock a channel, preventing use by MAVLink
|
||||
void lock(bool _lock) {
|
||||
_locked = _lock;
|
||||
|
@ -1126,6 +1130,16 @@ private:
|
|||
// true if we should NOT do MAVLink on this port (usually because
|
||||
// someone's doing SERIAL_CONTROL over mavlink)
|
||||
bool _locked;
|
||||
|
||||
// Handling of AVAILABLE_MODES
|
||||
struct {
|
||||
bool should_send;
|
||||
// Note these start at 1
|
||||
uint8_t requested_index;
|
||||
uint8_t next_index;
|
||||
} available_modes;
|
||||
bool send_available_modes();
|
||||
|
||||
};
|
||||
|
||||
/// @class GCS
|
||||
|
|
|
@ -1152,6 +1152,7 @@ ap_message GCS_MAVLINK::mavlink_id_to_ap_message_id(const uint32_t mavlink_id) c
|
|||
#if AP_AIRSPEED_ENABLED
|
||||
{ MAVLINK_MSG_ID_AIRSPEED, MSG_AIRSPEED},
|
||||
#endif
|
||||
{ MAVLINK_MSG_ID_AVAILABLE_MODES, MSG_AVAILABLE_MODES},
|
||||
};
|
||||
|
||||
for (uint8_t i=0; i<ARRAY_SIZE(map); i++) {
|
||||
|
@ -3203,6 +3204,18 @@ MAV_RESULT GCS_MAVLINK::handle_command_request_message(const mavlink_command_int
|
|||
if (id == MSG_LAST) {
|
||||
return MAV_RESULT_FAILED;
|
||||
}
|
||||
|
||||
switch(id) {
|
||||
case MSG_AVAILABLE_MODES:
|
||||
available_modes.should_send = true;
|
||||
available_modes.next_index = 1;
|
||||
available_modes.requested_index = (uint8_t)packet.param2;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
send_message(id);
|
||||
return MAV_RESULT_ACCEPTED;
|
||||
}
|
||||
|
@ -6091,6 +6104,39 @@ void GCS_MAVLINK::send_received_message_deprecation_warning(const char * message
|
|||
send_text(MAV_SEVERITY_INFO, "Received message (%s) is deprecated", message);
|
||||
}
|
||||
|
||||
bool GCS_MAVLINK::send_available_modes()
|
||||
{
|
||||
if (!available_modes.should_send) {
|
||||
// must only return false if out of space
|
||||
return true;
|
||||
}
|
||||
|
||||
CHECK_PAYLOAD_SIZE(AVAILABLE_MODES);
|
||||
|
||||
// Zero is a special case for send all.
|
||||
const bool send_all = available_modes.requested_index == 0;
|
||||
uint8_t request_index;
|
||||
if (!send_all) {
|
||||
// Single request
|
||||
request_index = available_modes.requested_index;
|
||||
available_modes.should_send = false;
|
||||
|
||||
} else {
|
||||
// Request all modes
|
||||
request_index = available_modes.next_index;
|
||||
available_modes.next_index += 1;
|
||||
}
|
||||
|
||||
const uint8_t mode_count = send_available_mode(request_index);
|
||||
|
||||
if (send_all && (available_modes.next_index > mode_count)) {
|
||||
// Sending all and just sent the last
|
||||
available_modes.should_send = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool GCS_MAVLINK::try_send_message(const enum ap_message id)
|
||||
{
|
||||
bool ret = true;
|
||||
|
@ -6521,6 +6567,10 @@ bool GCS_MAVLINK::try_send_message(const enum ap_message id)
|
|||
break;
|
||||
#endif
|
||||
|
||||
case MSG_AVAILABLE_MODES:
|
||||
ret = send_available_modes();
|
||||
break;
|
||||
|
||||
default:
|
||||
// try_send_message must always at some stage return true for
|
||||
// a message, or we will attempt to infinitely retry the
|
||||
|
|
|
@ -35,6 +35,7 @@ protected:
|
|||
|
||||
void send_nav_controller_output() const override {};
|
||||
void send_pid_tuning() override {};
|
||||
uint8_t send_available_mode(uint8_t index) const override { return 0; }
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -103,5 +103,6 @@ enum ap_message : uint8_t {
|
|||
MSG_HIGHRES_IMU,
|
||||
#endif
|
||||
MSG_AIRSPEED,
|
||||
MSG_AVAILABLE_MODES,
|
||||
MSG_LAST // MSG_LAST must be the last entry in this enum
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue