mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-17 00:13:33 +08:00
MAVLink app: Enable protocol version handshaking
This allows the ground control station or any other communication partner to query the supported versions. The key aspect is to send the response in MAVLink 2 framing to test the link with a MAVLink 2 framed message.
This commit is contained in:
@@ -1302,6 +1302,27 @@ void Mavlink::send_autopilot_capabilites()
|
||||
}
|
||||
}
|
||||
|
||||
void Mavlink::send_protocol_version()
|
||||
{
|
||||
mavlink_protocol_version_t msg = {};
|
||||
|
||||
msg.version = _protocol_version * 100;
|
||||
msg.min_version = 100;
|
||||
msg.max_version = 200;
|
||||
uint64_t mavlink_lib_git_version_binary = px4_mavlink_lib_version_binary();
|
||||
// TODO add when available
|
||||
//memcpy(&msg.spec_version_hash, &mavlink_spec_git_version_binary, sizeof(msg.spec_version_hash));
|
||||
memcpy(&msg.library_version_hash, &mavlink_lib_git_version_binary, sizeof(msg.library_version_hash));
|
||||
|
||||
// Switch to MAVLink 2
|
||||
int curr_proto_ver = _protocol_version;
|
||||
set_proto_version(2);
|
||||
// Send response - if it passes through the link its fine to use MAVLink 2
|
||||
mavlink_msg_protocol_version_send_struct(get_channel(), &msg);
|
||||
// Reset to previous value
|
||||
set_proto_version(curr_proto_ver);
|
||||
}
|
||||
|
||||
MavlinkOrbSubscription *Mavlink::add_orb_subscription(const orb_id_t topic, int instance)
|
||||
{
|
||||
/* check if already subscribed to this topic */
|
||||
|
||||
@@ -344,8 +344,17 @@ public:
|
||||
* @param severity the log level
|
||||
*/
|
||||
void send_statustext(unsigned char severity, const char *string);
|
||||
|
||||
/**
|
||||
* Send the capabilities of this autopilot in terms of the MAVLink spec
|
||||
*/
|
||||
void send_autopilot_capabilites();
|
||||
|
||||
/**
|
||||
* Send the protocol version of MAVLink
|
||||
*/
|
||||
void send_protocol_version();
|
||||
|
||||
MavlinkStream *get_streams() const { return _streams; }
|
||||
|
||||
float get_rate_mult();
|
||||
|
||||
@@ -362,6 +362,9 @@ MavlinkReceiver::evaluate_target_ok(int command, int target_system, int target_c
|
||||
switch (command) {
|
||||
|
||||
case MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES:
|
||||
|
||||
/* fallthrough */
|
||||
case MAV_CMD_REQUEST_PROTOCOL_VERSION:
|
||||
/* broadcast and ignore component */
|
||||
target_ok = (target_system == 0) || (target_system == mavlink_system.sysid);
|
||||
break;
|
||||
@@ -406,6 +409,10 @@ MavlinkReceiver::handle_message_command_long(mavlink_message_t *msg)
|
||||
/* send autopilot version message */
|
||||
_mavlink->send_autopilot_capabilites();
|
||||
|
||||
} else if (cmd_mavlink.command == MAV_CMD_REQUEST_PROTOCOL_VERSION) {
|
||||
/* send protocol version message */
|
||||
_mavlink->send_protocol_version();
|
||||
|
||||
} else if (cmd_mavlink.command == MAV_CMD_GET_HOME_POSITION) {
|
||||
_mavlink->configure_stream_threadsafe("HOME_POSITION", 0.5f);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user