Skip to content
Snippets Groups Projects
Select Git revision
3 results

obsw

  • Clone with SSH
  • Clone with HTTPS
  • Forked from Avionics / Software Development / Old Rockets / R2A On-Board Software
    Source project has a limited visibility.

    mavlink-bindgen

    Build status Crate info Documentation

    Library and CLI for generating code for the Rust implementation of the MAVLink UAV messaging protocol.

    mavlink-bindgen can be used to create MAVLink bindings for Rust. This is used from build.rs in the mavlink crate to create bindings from the standard MAVLink dialects in https://github.com/mavlink/mavlink.

    Usage

    mavlink-bindgen can be used as a code generator from build.rs as done is the mavlink crate for a custom MAVLink dialect or as a CLI tool to generate rust binding from XML dialect definitions. The generated code will depend on the mavlink-core crate in both use cases. Each dialect generated will be locked behind a feature flag of the same name, that must be enabled when using the generated code.

    CLI

    Build the binary using cargo with cli feature enabled:

    cd mavlink-bindgen
    cargo build --features cli

    Alternatively you can build and install mavlink-bindgen to your locally installed crates:

    cargo install mavlink-bindgen --features cli

    To generate code using the resulting binary:

    mavlink-bindgen --format-generated-code message_definitions mavlink_dialects

    The full command line options are shown below.

    Usage: mavlink-bindgen [OPTIONS] <DEFINITIONS_DIR> <DESTINATION_DIR>
    
    Arguments:
      <DEFINITIONS_DIR>  Path to the directory containing the MAVLink dialect definitions
      <DESTINATION_DIR>  Path to the directory where the code is generated into, must already exist
    
    Options:
          --format-generated-code      format code generated code
          --emit-cargo-build-messages  prints cargo build message indicating when the code has to be rebuild
      -h, --help                       Print help

    The output dir will contain a mod.rs file with each dialect in its own file locked behind a feature flag.

    Library as build dependency

    Add to your Cargo.toml:

    mavlink-bindgen = "0.13.1"

    Add a build/main.rs or build.rs to your project if it does not already exist. Then add the following to the main function to generate the code:

    let out_dir = env::var("OUT_DIR").unwrap();
    let result = match mavlink_bindgen::generate(definitions_dir, out_dir) {
        Ok(r) => r,
        Err(e) => {
            eprintln!("{e}");
            return ExitCode::FAILURE;
        }
    };

    If the generated code should be formated use

        mavlink_bindgen::format_generated_code(&result);

    To tell cargo when to regenerate code from the definitions use:

        mavlink_bindgen::emit_cargo_build_messages(&result);

    Finally include the generated code into the lib.rs or main.rs :

    #![cfg_attr(not(feature = "std"), no_std)]
    // include generate definitions
    include!(concat!(env!("OUT_DIR"), "/mod.rs"));
    
    pub use mavlink_core::*;

    Since each dialect is locked behind a feature flag these need to be enabled for the dialects to become available when using the generated code.

    This approach is used by the mavlink crate see its build script for an example.