From 03d37888f7b5a84b5032ca1af392a16da7f39df2 Mon Sep 17 00:00:00 2001
From: Federico Lolli <federico.lolli@skywarder.eu>
Date: Mon, 10 Mar 2025 16:02:23 +0000
Subject: [PATCH] Merge recent updates to Rust crate (for SEGS)

---
 mavlink_rust/Cargo.toml | 33 ++++++++++++++++++++++-----------
 mavlink_rust/build.rs   | 40 +++++++++++++++++++++++++++++++++++++++-
 mavlink_rust/src/lib.rs | 24 ++++++++++++++++++++++++
 3 files changed, 85 insertions(+), 12 deletions(-)

diff --git a/mavlink_rust/Cargo.toml b/mavlink_rust/Cargo.toml
index 7533590..1e3173d 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 7090f51..9708e5e 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 7269b9a..7c7a5e9 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");
+}
-- 
GitLab