From fb0f2da3c4f96b2c589952ca016195baf106108c Mon Sep 17 00:00:00 2001
From: Federico Lolli <federico.lolli@skywarder.eu>
Date: Sun, 5 May 2024 16:18:19 +0000
Subject: [PATCH] [Rust] Add Rust integration

---
 .gitignore              |  6 +++++-
 README.md               |  6 ++----
 mavlink_rust/Cargo.toml | 32 ++++++++++++++++++++++++++++++++
 mavlink_rust/build.rs   | 13 +++++++++++++
 mavlink_rust/src/lib.rs |  6 ++++++
 5 files changed, 58 insertions(+), 5 deletions(-)
 create mode 100644 mavlink_rust/Cargo.toml
 create mode 100644 mavlink_rust/build.rs
 create mode 100644 mavlink_rust/src/lib.rs

diff --git a/.gitignore b/.gitignore
index 45f7d57..1b68824 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,4 +33,8 @@
 
 # ide folder & virtual environments
 .venv/
-.vscode
\ No newline at end of file
+.vscode
+
+# rust specific
+target
+Cargo.lock
diff --git a/README.md b/README.md
index 622286b..4ba347a 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,7 @@
 # mavlink_skyward_lib
+
 Repo containing Skyward's implementation of the Mavlink protocol:
 
 * `message_definitions` - XML files describing the available messages
-
 * `mavlink_lib ` - corresponding C header files, generated with `pymavlink`
-
-
-
+* `mavlink_rust` - Rust library of the Mavlink protocol
diff --git a/mavlink_rust/Cargo.toml b/mavlink_rust/Cargo.toml
new file mode 100644
index 0000000..7533590
--- /dev/null
+++ b/mavlink_rust/Cargo.toml
@@ -0,0 +1,32 @@
+[package]
+name = "skyward_mavlink"
+version = "0.1.0"
+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 }
+
+[dependencies.mavlink-core]
+git = "https://github.com/mavlink/rust-mavlink.git"
+rev = "8d61f75ac4a5bf04cd9401d9073244118117db5f"
+
+[build-dependencies.mavlink-bindgen]
+git = "https://github.com/mavlink/rust-mavlink.git"
+rev = "8d61f75ac4a5bf04cd9401d9073244118117db5f"
+
+[features]
+default = ["lyra"]
+lyra = []
+gemini = []
+pyxis = []
+lynx = []
+hermes = []
+r2a = []
+test = []
+serde = ["dep:serde", "dep:serde_arrays"]
diff --git a/mavlink_rust/build.rs b/mavlink_rust/build.rs
new file mode 100644
index 0000000..7090f51
--- /dev/null
+++ b/mavlink_rust/build.rs
@@ -0,0 +1,13 @@
+#![recursion_limit = "256"]
+
+use std::env;
+
+pub fn main() {
+    let out_path = env::var("OUT_DIR").unwrap();
+
+    let result = mavlink_bindgen::generate("../message_definitions", out_path)
+        .expect("Failed to generate Rust MAVLink bindings");
+
+    mavlink_bindgen::format_generated_code(&result);
+    mavlink_bindgen::emit_cargo_build_messages(&result);
+}
diff --git a/mavlink_rust/src/lib.rs b/mavlink_rust/src/lib.rs
new file mode 100644
index 0000000..7269b9a
--- /dev/null
+++ b/mavlink_rust/src/lib.rs
@@ -0,0 +1,6 @@
+mod bindings {
+    include!(concat!(env!("OUT_DIR"), "/mod.rs"));
+}
+
+pub use bindings::*;
+pub use mavlink_core as mavlink;
-- 
GitLab