diff --git a/mavlink_rust/Cargo.toml b/mavlink_rust/Cargo.toml index 7533590ca562b050fa597ecd00247d5b8745d428..1e3173dd75157bdf9e85b67326acfd5b71739b7c 100644 --- a/mavlink_rust/Cargo.toml +++ b/mavlink_rust/Cargo.toml @@ -1,27 +1,37 @@ [package] name = "skyward_mavlink" -version = "0.1.0" +version = "0.1.1" authors = ["Federico Lolli <federico.lolli@skywarder.eu>"] edition = "2021" license = "MIT" [dependencies] -num-traits = { version = "0.2.18", default-features = false } -num-derive = "0.4.2" -bitflags = "2.4.2" -serde = { version = "1.0.197", optional = true } -serde_arrays = { version = "0.1.0", optional = true } +num-traits = { version = "0.2", default-features = false } +num-derive = "0.4" +bitflags = "2.4" +paste = { version = "1.0", optional = true } +serde = { version = "1.0", optional = true } +serde_arrays = { version = "0.1", optional = true } [dependencies.mavlink-core] -git = "https://github.com/mavlink/rust-mavlink.git" -rev = "8d61f75ac4a5bf04cd9401d9073244118117db5f" +git = "https://git.skywarder.eu/avn/swd/mavlink/rust-mavlink.git" +rev = "b7446436b3c96ca4c40d28b54eeed346e7bf021e" + +[build-dependencies] +serde = "1.0" +serde_json = "1.0" [build-dependencies.mavlink-bindgen] -git = "https://github.com/mavlink/rust-mavlink.git" -rev = "8d61f75ac4a5bf04cd9401d9073244118117db5f" +git = "https://git.skywarder.eu/avn/swd/mavlink/rust-mavlink.git" +rev = "da4add3de8243d3b8194b9793677e4c950686ddc" +features = ["serde"] [features] -default = ["lyra"] +default = ["orion"] +# crate features +reflection = ["dep:paste"] +# dialect features +orion = [] lyra = [] gemini = [] pyxis = [] @@ -29,4 +39,5 @@ lynx = [] hermes = [] r2a = [] test = [] +# serde support serde = ["dep:serde", "dep:serde_arrays"] diff --git a/mavlink_rust/build.rs b/mavlink_rust/build.rs index 7090f512a3ebdf919faba1e10cdddf2a5256830a..9708e5ebe80dd3fdde1c1dc916b82a659aaa7678 100644 --- a/mavlink_rust/build.rs +++ b/mavlink_rust/build.rs @@ -2,12 +2,50 @@ use std::env; +#[cfg(feature = "reflection")] +use std::{collections::HashSet, path::Path}; + +const DEFINITIONS_DIR: &str = "../message_definitions"; + pub fn main() { let out_path = env::var("OUT_DIR").unwrap(); - let result = mavlink_bindgen::generate("../message_definitions", out_path) + let result = mavlink_bindgen::generate(DEFINITIONS_DIR, out_path) .expect("Failed to generate Rust MAVLink bindings"); + #[cfg(feature = "reflection")] + serialize_message_definitions(); + mavlink_bindgen::format_generated_code(&result); mavlink_bindgen::emit_cargo_build_messages(&result); } + +// Parse again definition files and serialize the result to a file +#[cfg(feature = "reflection")] +fn serialize_message_definitions() { + let out_path = env::var("OUT_DIR").unwrap(); + + // iter through files in DEFINITIONS_DIR + for entry in std::fs::read_dir(DEFINITIONS_DIR).unwrap() { + let entry = entry.unwrap(); + let path = entry.path(); + if path.is_file() { + let file_name = path.file_name().unwrap(); + let mut parsed_files = HashSet::new(); + let profile = mavlink_bindgen::parser::parse_profile( + Path::new(&DEFINITIONS_DIR), + Path::new(file_name), + &mut parsed_files, + ); + if let Ok(profile) = profile { + let serialized = serde_json::to_string(&profile).unwrap(); + let out_file = format!( + "{}/{}_profile.json", + out_path, + path.file_stem().unwrap().to_str().unwrap() + ); + std::fs::write(out_file, serialized).unwrap(); + } + } + } +} diff --git a/mavlink_rust/src/lib.rs b/mavlink_rust/src/lib.rs index 7269b9ae4c6dbeea97db4ec83f28fefbf0251567..7c7a5e9e34fb26ffb0e09e26c4ca89d691bb64f3 100644 --- a/mavlink_rust/src/lib.rs +++ b/mavlink_rust/src/lib.rs @@ -4,3 +4,27 @@ mod bindings { pub use bindings::*; pub use mavlink_core as mavlink; + +#[cfg(feature = "reflection")] +/// This module contains all the message definitions for the MAVLink dialects enabled. +/// This can be useful for reflection and parsing of definition messages. +pub mod reflection { + use paste::paste; + macro_rules! include_message_definitions { + ($name:ident, $feature:literal) => { + #[cfg(feature = $feature)] + paste! { + pub static [<$name _MAVLINK_PROFILE_SERIALIZED>]: &'static str = include_str!(concat!(env!("OUT_DIR"), "/", $feature, "_profile.json")); + } + }; + } + + include_message_definitions!(ORION, "orion"); + include_message_definitions!(LYRA, "lyra"); + include_message_definitions!(GEMINI, "gemini"); + include_message_definitions!(PYXIS, "pyxis"); + include_message_definitions!(LYNX, "lynx"); + include_message_definitions!(HERMES, "hermes"); + include_message_definitions!(R2A, "r2a"); + include_message_definitions!(TEST, "test"); +}