From 14f6b819ba3d477966ca115d324c3b304e284871 Mon Sep 17 00:00:00 2001 From: Ultra Date: Wed, 6 Aug 2025 17:59:10 -0400 Subject: [PATCH 1/7] Move mission-planner-c to mission-planner --- .../Cargo.lock => Cargo.lock | 33 +- Cargo.toml | 6 + src/mission-planner-c/Cargo.toml | 13 - src/mission-planner-c/src/cmission_example.h | 2 - src/mission-planner-c/src/main.rs | 29 - src/mission-planner/Cargo.lock | 656 +++++++++++++++++- src/mission-planner/Cargo.toml | 8 +- .../bindings.h | 0 .../build.rs | 1 + .../src/cmission.rs} | 2 +- .../src/cmission_example.c | 1 + src/mission-planner/src/cmission_example.h | 2 + src/mission-planner/src/lib.rs | 2 - src/mission-planner/src/main.rs | 15 +- 14 files changed, 689 insertions(+), 81 deletions(-) rename src/mission-planner-c/Cargo.lock => Cargo.lock (97%) create mode 100644 Cargo.toml delete mode 100644 src/mission-planner-c/Cargo.toml delete mode 100644 src/mission-planner-c/src/cmission_example.h delete mode 100644 src/mission-planner-c/src/main.rs rename src/{mission-planner-c => mission-planner}/bindings.h (100%) rename src/{mission-planner-c => mission-planner}/build.rs (96%) rename src/{mission-planner-c/src/lib.rs => mission-planner/src/cmission.rs} (97%) rename src/{mission-planner-c => mission-planner}/src/cmission_example.c (99%) create mode 100644 src/mission-planner/src/cmission_example.h delete mode 100644 src/mission-planner/src/lib.rs diff --git a/src/mission-planner-c/Cargo.lock b/Cargo.lock similarity index 97% rename from src/mission-planner-c/Cargo.lock rename to Cargo.lock index 9abe928..e39852f 100644 --- a/src/mission-planner-c/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -43,22 +43,22 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -149,18 +149,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.42" +version = "4.5.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" +checksum = "50fd97c9dc2399518aa331917ac6f274280ec5eb34e555dd291899745c48ec6f" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.42" +version = "4.5.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" +checksum = "c35b5830294e1fa0462034af85cc95225a4cb07092c088c55bda3147cfcd8f65" dependencies = [ "anstream", "anstyle", @@ -346,19 +346,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "mission-planner-c" +name = "mission_planner" version = "0.1.0" dependencies = [ "bindgen", "cbindgen", "cc", - "mission_planner", -] - -[[package]] -name = "mission_planner" -version = "0.1.0" -dependencies = [ "dashmap", ] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..6545900 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[workspace] +resolver = "3" + +members = [ + "src/mission-planner" +] diff --git a/src/mission-planner-c/Cargo.toml b/src/mission-planner-c/Cargo.toml deleted file mode 100644 index bb5a254..0000000 --- a/src/mission-planner-c/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "mission-planner-c" -version = "0.1.0" -edition = "2024" -crate-type = ["staticlib"] - -[dependencies] -mission_planner = {path = "../mission-planner" } - -[build-dependencies] -bindgen = "0.72.0" -cbindgen = "0.29.0" -cc = "1.2.31" diff --git a/src/mission-planner-c/src/cmission_example.h b/src/mission-planner-c/src/cmission_example.h deleted file mode 100644 index ecaa4c0..0000000 --- a/src/mission-planner-c/src/cmission_example.h +++ /dev/null @@ -1,2 +0,0 @@ -typedef struct CMissionPtr CMissionPtr; -CMissionPtr* cmission_example_create(); diff --git a/src/mission-planner-c/src/main.rs b/src/mission-planner-c/src/main.rs deleted file mode 100644 index c018bd2..0000000 --- a/src/mission-planner-c/src/main.rs +++ /dev/null @@ -1,29 +0,0 @@ -#![allow(non_upper_case_globals)] -#![allow(non_camel_case_types)] -#![allow(non_snake_case)] - - -use std::thread::sleep; - -use mission_planner_c::{CMission}; -use mission_planner::mission_scheduler::{MissionScheduler}; -use mission_planner::mission::Mission; - -include!(concat!(env!("OUT_DIR"), "/bindings.rs")); - -fn main() { - let mission: Box; - unsafe { - let mission_ptr = cmission_example_create(); - let mission_box = Box::from_raw(mission_ptr as *mut CMission); - mission = mission_box; - } - - let scheduler = MissionScheduler::start(); - scheduler.push_back(mission); - scheduler.run(); - while ! scheduler.is_waiting() { - sleep(std::time::Duration::from_millis(100)); - } - scheduler.stop(); -} diff --git a/src/mission-planner/Cargo.lock b/src/mission-planner/Cargo.lock index fb996dc..ccc4742 100644 --- a/src/mission-planner/Cargo.lock +++ b/src/mission-planner/Cargo.lock @@ -2,24 +2,184 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anstream" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" + +[[package]] +name = "anstyle-parse" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +dependencies = [ + "windows-sys 0.60.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.60.2", +] + [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "bindgen" +version = "0.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f72209734318d0b619a5e0f5129918b848c416e122a3c4ce054e03cb87b726f" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", +] + [[package]] name = "bitflags" version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +[[package]] +name = "cbindgen" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975982cdb7ad6a142be15bdf84aea7ec6a9e5d4d797c004d43185b24cfe4e684" +dependencies = [ + "clap", + "heck", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", + "tempfile", + "toml", +] + +[[package]] +name = "cc" +version = "1.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +dependencies = [ + "shlex", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed87a9d530bb41a67537289bafcac159cb3ee28460e0a4571123d2a778a6a882" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.5.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f4f3f3c77c94aff3c7e9aac9a2ca1974a5adf392a8bb751e827d6d127ab966" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -34,24 +194,129 @@ checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if", "crossbeam-utils", - "hashbrown", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", ] +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "indexmap" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +dependencies = [ + "equivalent", + "hashbrown 0.15.4", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + [[package]] name = "libc" version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + [[package]] name = "lock_api" version = "0.4.13" @@ -62,19 +327,56 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "mission_planner" version = "0.1.0" dependencies = [ + "bindgen", + "cbindgen", + "cc", "dashmap", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "once_cell" version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "parking_lot_core" version = "0.9.11" @@ -85,9 +387,43 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-targets 0.52.6", +] + +[[package]] +name = "prettyplease" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" +dependencies = [ + "proc-macro2", + "syn", ] +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + [[package]] name = "redox_syscall" version = "0.5.17" @@ -97,32 +433,266 @@ dependencies = [ "bitflags", ] +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustix" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.142" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + [[package]] name = "windows-targets" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -131,44 +701,110 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] diff --git a/src/mission-planner/Cargo.toml b/src/mission-planner/Cargo.toml index f20880f..7a146cb 100644 --- a/src/mission-planner/Cargo.toml +++ b/src/mission-planner/Cargo.toml @@ -3,8 +3,10 @@ name = "mission_planner" version = "0.1.0" edition = "2024" -[lib] -name = "mission_planner" - [dependencies] dashmap = "6.1.0" + +[build-dependencies] +bindgen = "0.72.0" +cbindgen = "0.29.0" +cc = "1.2.31" diff --git a/src/mission-planner-c/bindings.h b/src/mission-planner/bindings.h similarity index 100% rename from src/mission-planner-c/bindings.h rename to src/mission-planner/bindings.h diff --git a/src/mission-planner-c/build.rs b/src/mission-planner/build.rs similarity index 96% rename from src/mission-planner-c/build.rs rename to src/mission-planner/build.rs index 2190159..7f5ef66 100644 --- a/src/mission-planner-c/build.rs +++ b/src/mission-planner/build.rs @@ -11,6 +11,7 @@ fn main() { cbindgen::Builder::new() .with_crate(crate_dir) + .with_src("src/cmission.rs") .with_config(config) .generate() .expect("Unable to generate bindings") diff --git a/src/mission-planner-c/src/lib.rs b/src/mission-planner/src/cmission.rs similarity index 97% rename from src/mission-planner-c/src/lib.rs rename to src/mission-planner/src/cmission.rs index c953231..acfa9d3 100644 --- a/src/mission-planner-c/src/lib.rs +++ b/src/mission-planner/src/cmission.rs @@ -1,4 +1,4 @@ -use mission_planner::mission::{Mission, MissionResult, MissionHashMap}; +use crate::mission::{Mission, MissionResult, MissionHashMap}; use std::ffi::{c_char, CStr}; #[repr(C)] diff --git a/src/mission-planner-c/src/cmission_example.c b/src/mission-planner/src/cmission_example.c similarity index 99% rename from src/mission-planner-c/src/cmission_example.c rename to src/mission-planner/src/cmission_example.c index 6c8a81c..62bb81c 100644 --- a/src/mission-planner-c/src/cmission_example.c +++ b/src/mission-planner/src/cmission_example.c @@ -23,5 +23,6 @@ CMissionPtr* cmission_example_create() { struct CMissionPtr *mission = cmission_create("mission_example", *task_array, 1); + return mission; } diff --git a/src/mission-planner/src/cmission_example.h b/src/mission-planner/src/cmission_example.h new file mode 100644 index 0000000..8c671cf --- /dev/null +++ b/src/mission-planner/src/cmission_example.h @@ -0,0 +1,2 @@ +typedef struct CMissionPtr CMissionPtr; +extern CMissionPtr* cmission_example_create(); \ No newline at end of file diff --git a/src/mission-planner/src/lib.rs b/src/mission-planner/src/lib.rs deleted file mode 100644 index 5029971..0000000 --- a/src/mission-planner/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod mission; -pub mod mission_scheduler; diff --git a/src/mission-planner/src/main.rs b/src/mission-planner/src/main.rs index 1d634be..9acd44a 100644 --- a/src/mission-planner/src/main.rs +++ b/src/mission-planner/src/main.rs @@ -1,22 +1,35 @@ mod mission; -mod mission_example; mod mission_scheduler; +mod cmission; +mod mission_example; mod concurrent_mission_example; +include!(concat!(env!("OUT_DIR"), "/bindings.rs")); + use std::collections::VecDeque; use std::time::Duration; + use crate::{ + mission::Mission, + cmission::CMission, mission_scheduler::{MissionScheduler, MissionBox}, mission_example::ExampleMission, concurrent_mission_example::ConcExampleMission, }; fn main() { + let cmission_example: Box; + unsafe { + let cmission_ptr = cmission_example_create(); + cmission_example = Box::from_raw(cmission_ptr as *mut CMission); + } + let foo: MissionBox = Box::new(ExampleMission::new()); let bar: MissionBox = Box::new(ConcExampleMission::new()); let mission_list = VecDeque::from(vec![ + cmission_example, foo ]); let conc_mission_list = VecDeque::from(vec![ From dddc060b5f80eba1d87bbacc9c9f44f9107ce022 Mon Sep 17 00:00:00 2001 From: Ultra Date: Wed, 6 Aug 2025 18:00:47 -0400 Subject: [PATCH 2/7] Make Task a trait instead, and refactor CommonMission into a Mission implementation --- src/mission-planner/src/cmission.rs | 91 +++++++------------ .../src/concurrent_mission_example.rs | 33 ++----- src/mission-planner/src/main.rs | 12 +-- src/mission-planner/src/mission.rs | 60 +++++++----- src/mission-planner/src/mission_example.rs | 38 ++------ 5 files changed, 91 insertions(+), 143 deletions(-) diff --git a/src/mission-planner/src/cmission.rs b/src/mission-planner/src/cmission.rs index acfa9d3..f35ef63 100644 --- a/src/mission-planner/src/cmission.rs +++ b/src/mission-planner/src/cmission.rs @@ -1,4 +1,4 @@ -use crate::mission::{Mission, MissionResult, MissionHashMap}; +use crate::mission::{CommonMission, Mission, MissionHashMap, MissionResult, Task}; use std::ffi::{c_char, CStr}; #[repr(C)] @@ -25,6 +25,33 @@ pub struct CTask { repair_task_func: OptionFunction, } +fn run_with(func: &OptionFunction, data: &MissionHashMap) -> MissionResult { + let OptionFunction::Some(func) = func else { + return Err(false) + }; + let data_ptr = Box::new(data); + let data_ptr = Box::into_raw(data_ptr) as *mut MissionMapPtr; + let res = unsafe { func(data_ptr) }; + match res { + CMissionResult::Ok => Ok(()), + CMissionResult::Err => Err(false), + CMissionResult::ErrSkip => Err(true), + } +} + +impl Task for CTask { + fn run(&self, data: &MissionHashMap) -> MissionResult { + run_with(&self.task_func, data) + } + fn repair_run(&self, data: &MissionHashMap) -> MissionResult { + run_with(&self.repair_task_func, data) + } + fn name(&self) -> &String { + &self.name + } + +} + #[unsafe(no_mangle)] pub extern "C" fn ctask_create(name_ptr: *const c_char, task_func: OptionFunction, repair_task_func: OptionFunction) -> *mut CTask { @@ -44,64 +71,12 @@ pub extern "C" fn ctask_create(name_ptr: *const c_char, task_func: OptionFunctio } -fn run_with(func: &OptionFunction, data: &MissionHashMap) -> CMissionResult { - let OptionFunction::Some(func) = func else { - return CMissionResult::Err - }; - let data_ptr = Box::new(data); - let data_ptr = Box::into_raw(data_ptr) as *mut MissionMapPtr; - unsafe { func(data_ptr) } -} - -pub struct CMission { - name: String, - task_list: Vec>, -} - -impl CMission { - fn new(name: String, task_list: Vec>) -> Self { - CMission { - name: name, - task_list - } - } -} - -impl Mission for CMission { - fn run(&self, data: &MissionHashMap) -> MissionResult { - let mut res = CMissionResult::Err; - for task in &self.task_list { - let task_res = run_with(&task.task_func, data); - res = match task_res { - CMissionResult::Ok | CMissionResult::ErrSkip => task_res, - CMissionResult::Err => { - let task_res = run_with(&task.repair_task_func, data); - task_res - } - }; - if let CMissionResult::Err = res { - break - } - } - match res { - CMissionResult::Ok => Ok(()), - CMissionResult::Err => Err(false), - CMissionResult::ErrSkip => Err(true), - } - } - - fn name(&self) -> &String { - &self.name - } - -} - pub struct CMissionPtr; #[unsafe(no_mangle)] //TODO: Change to array pub extern "C" fn cmission_create(name_ptr: *const c_char, task_array: *mut CTask, size: isize) -> *mut CMissionPtr { - let mut task_list = Vec::new(); + let mut task_list: Vec> = Vec::new(); for i in 0..size { unsafe { let task = task_array.offset(i); @@ -116,8 +91,12 @@ pub extern "C" fn cmission_create(name_ptr: *const c_char, task_array: *mut CTas let temp = CStr::from_ptr(name_ptr); name = temp.to_str().expect("Failed to get string literal!"); }; - let c_mission = CMission::new(name.to_string(), task_list); - let mission_box = Box::new(c_mission); + let name = name.to_string(); + let mission = CommonMission { + name, + task_list + }; + let mission_box = Box::new(mission); Box::into_raw(mission_box) as *mut CMissionPtr } diff --git a/src/mission-planner/src/concurrent_mission_example.rs b/src/mission-planner/src/concurrent_mission_example.rs index 4b862f3..ba32293 100644 --- a/src/mission-planner/src/concurrent_mission_example.rs +++ b/src/mission-planner/src/concurrent_mission_example.rs @@ -1,8 +1,4 @@ -use crate::mission::{CommonMission, MissionResult, Mission, MissionHashMap, Task}; - -pub struct ConcExampleMission { - common: CommonMission, -} +use crate::mission::{CommonMission, MissionResult, Mission, MissionHashMap, RustTask, Task}; fn conc_example(data: &MissionHashMap) -> MissionResult { if data.contains_key("flag_request") { @@ -12,25 +8,12 @@ fn conc_example(data: &MissionHashMap) -> MissionResult { Ok(()) } -impl ConcExampleMission { - pub fn new() -> Self { - let name = "example-mission"; - let task = Task::new("conc-example-task".to_string(), Some(conc_example), None); - let mut task_list: Vec = Vec::new(); - task_list.push(task); - let mut repair_task_list: Vec = Vec::new(); - Self { - common: CommonMission::new(name.to_string(), &mut task_list, &mut repair_task_list) - } - } +pub fn new() -> CommonMission { + let name = "concurrent-mission-example".to_string(); + let task = RustTask::new("conc-example-task".to_string(), Some(conc_example), None); + let task_list: Vec> = vec![ + Box::new(task) + ]; + CommonMission { name, task_list } } -impl Mission for ConcExampleMission { - fn run(&self, data: &MissionHashMap) -> MissionResult { - self.common.run(data) - } - - fn name(&self) -> &String { - &self.common.name - } -} diff --git a/src/mission-planner/src/main.rs b/src/mission-planner/src/main.rs index 9acd44a..4a99ab8 100644 --- a/src/mission-planner/src/main.rs +++ b/src/mission-planner/src/main.rs @@ -11,22 +11,18 @@ use std::time::Duration; use crate::{ - mission::Mission, - cmission::CMission, - mission_scheduler::{MissionScheduler, MissionBox}, - mission_example::ExampleMission, - concurrent_mission_example::ConcExampleMission, + mission::{CommonMission, Mission}, mission_scheduler::{MissionBox, MissionScheduler} }; fn main() { let cmission_example: Box; unsafe { let cmission_ptr = cmission_example_create(); - cmission_example = Box::from_raw(cmission_ptr as *mut CMission); + cmission_example = Box::from_raw(cmission_ptr as *mut CommonMission); } - let foo: MissionBox = Box::new(ExampleMission::new()); - let bar: MissionBox = Box::new(ConcExampleMission::new()); + let foo: MissionBox = Box::new(mission_example::new()); + let bar: MissionBox = Box::new(concurrent_mission_example::new()); let mission_list = VecDeque::from(vec![ cmission_example, diff --git a/src/mission-planner/src/mission.rs b/src/mission-planner/src/mission.rs index b8a5a13..d73c0e3 100644 --- a/src/mission-planner/src/mission.rs +++ b/src/mission-planner/src/mission.rs @@ -3,7 +3,13 @@ use dashmap::DashMap; pub type MissionHashMap = DashMap; pub type MissionResult = Result<(), bool>; -pub struct Task { +pub trait Task : Send + Sync { + fn run(&self, data: &MissionHashMap) -> MissionResult; + fn repair_run(&self, data: &MissionHashMap) -> MissionResult; + fn name(&self) -> &String; +} + +pub struct RustTask { pub name: String, func: Option MissionResult>, repair_func: Option MissionResult> @@ -16,10 +22,10 @@ fn run_with(func: Option MissionResult>, data: &MissionHa func(data) } -impl Task { +impl RustTask { pub fn new(name: String, func: Option< fn(&MissionHashMap) -> MissionResult>, - repair_func: Option MissionResult>) -> Task { - Task { + repair_func: Option MissionResult>) -> RustTask { + RustTask { name, func, repair_func, @@ -27,39 +33,44 @@ impl Task { } } +impl Task for RustTask { + fn run(&self, data: &MissionHashMap) -> MissionResult { + run_with(self.func, data) + } + fn repair_run(&self, data: &MissionHashMap) -> MissionResult { + run_with(self.repair_func, data) + } + fn name(&self) -> &String { + &self.name + } +} + +pub trait Mission : Send + Sync { + fn run(&self, data: &DashMap) -> MissionResult; + fn name(&self) -> &String; +} + pub struct CommonMission { pub name: String, - task_list: Vec, - safety_task_list: Vec, + pub task_list: Vec>, } -impl CommonMission { - pub fn new(name: String, task_list: &mut Vec, repair_task_list: &mut Vec) -> Self { - let mut common = CommonMission { - name, - task_list: Vec::new(), - safety_task_list: Vec::new(), - }; - common.task_list.append(task_list); - common.safety_task_list.append(repair_task_list); - common - } - - pub fn run(&self, data: &DashMap) -> MissionResult { +impl Mission for CommonMission { + fn run(&self, data: &DashMap) -> MissionResult { if self.task_list.is_empty() { return Ok(()) } let mut res = Ok(()); for task in &self.task_list { - let task_res = run_with(task.func, data); + let task_res = task.run(data); res = match task_res { Ok(_) => task_res, Err(skip) => { if skip { task_res } else { - run_with(task.repair_func, data) + task.repair_run(data) } }, @@ -72,9 +83,8 @@ impl CommonMission { } res } -} -pub trait Mission : Send + Sync { - fn run(&self, data: &DashMap) -> MissionResult; - fn name(&self) -> &String; + fn name(&self) -> &String { + &self.name + } } diff --git a/src/mission-planner/src/mission_example.rs b/src/mission-planner/src/mission_example.rs index 6bff693..8a843c4 100644 --- a/src/mission-planner/src/mission_example.rs +++ b/src/mission-planner/src/mission_example.rs @@ -1,13 +1,7 @@ -use dashmap::DashMap; - use std::thread::sleep; -use crate::mission::{CommonMission, MissionResult, Mission, MissionHashMap, Task}; - -pub struct ExampleMission { - common: CommonMission, -} +use crate::mission::{CommonMission, Task, MissionResult, MissionHashMap, RustTask}; -fn example(data: &MissionHashMap) -> MissionResult { +fn example(_data: &MissionHashMap) -> MissionResult { println!("Hello world!"); Err(false) } @@ -24,26 +18,12 @@ fn repair_example(data: &MissionHashMap) -> MissionResult { Ok(()) } -impl ExampleMission { - pub fn new() -> Self { - let name = "example-mission"; - let task = Task::new("example-task".to_string(), Some(example), Some(repair_example)); - let mut task_list: Vec = Vec::new(); - task_list.push(task); - let mut repair_task_list: Vec = Vec::new(); - Self { - common: CommonMission::new(name.to_string(), &mut task_list, &mut repair_task_list) - } - } -} - -impl Mission for ExampleMission { - fn run(&self, data: &DashMap) -> MissionResult { - self.common.run(data) - } - - fn name(&self) -> &String { - &self.common.name - } +pub fn new() -> CommonMission { + let name = "example-mission".to_string(); + let task = RustTask::new("example-task".to_string(), Some(example), Some(repair_example)); + let task_list: Vec> = vec![ + Box::new(task) + ]; + CommonMission { name, task_list } } From 3c4b5bc1e92d49a082ce47148486970cfdf886e6 Mon Sep 17 00:00:00 2001 From: Ultra Date: Wed, 6 Aug 2025 18:02:37 -0400 Subject: [PATCH 3/7] A few error fixes --- src/mission-planner/src/cmission.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/mission-planner/src/cmission.rs b/src/mission-planner/src/cmission.rs index f35ef63..258fb03 100644 --- a/src/mission-planner/src/cmission.rs +++ b/src/mission-planner/src/cmission.rs @@ -1,7 +1,8 @@ -use crate::mission::{CommonMission, Mission, MissionHashMap, MissionResult, Task}; +use crate::mission::{CommonMission, MissionHashMap, MissionResult, Task}; use std::ffi::{c_char, CStr}; #[repr(C)] +#[allow(unused)] pub enum CMissionResult { Ok, Err, @@ -9,6 +10,7 @@ pub enum CMissionResult { } #[repr(C)] +#[allow(unused)] pub enum OptionFunction { Some(T), None From 8a783efcff2162c1eb243ea238ae6b7845a0ec9e Mon Sep 17 00:00:00 2001 From: Ultra Date: Thu, 7 Aug 2025 13:00:01 -0400 Subject: [PATCH 4/7] Add python bindings to mission-planner --- Cargo.lock | 96 ++++++++++++++++++++ src/mission-planner/Cargo.toml | 4 + src/mission-planner/src/cmission.rs | 3 +- src/mission-planner/src/main.rs | 13 ++- src/mission-planner/src/pymission.py | 22 +++++ src/mission-planner/src/pymission.rs | 95 +++++++++++++++++++ src/mission-planner/src/pymission_example.py | 10 ++ 7 files changed, 240 insertions(+), 3 deletions(-) create mode 100644 src/mission-planner/src/pymission.py create mode 100644 src/mission-planner/src/pymission.rs create mode 100644 src/mission-planner/src/pymission_example.py diff --git a/Cargo.lock b/Cargo.lock index e39852f..4d4e8a8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -274,6 +274,12 @@ dependencies = [ "hashbrown 0.15.4", ] +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -339,6 +345,15 @@ version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -353,6 +368,7 @@ dependencies = [ "cbindgen", "cc", "dashmap", + "pyo3", ] [[package]] @@ -390,6 +406,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + [[package]] name = "prettyplease" version = "0.2.36" @@ -409,6 +431,68 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "pyo3" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a" +dependencies = [ + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.40" @@ -563,6 +647,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "target-lexicon" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" + [[package]] name = "tempfile" version = "3.20.0" @@ -623,6 +713,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + [[package]] name = "utf8parse" version = "0.2.2" diff --git a/src/mission-planner/Cargo.toml b/src/mission-planner/Cargo.toml index 7a146cb..dc5b343 100644 --- a/src/mission-planner/Cargo.toml +++ b/src/mission-planner/Cargo.toml @@ -6,6 +6,10 @@ edition = "2024" [dependencies] dashmap = "6.1.0" +[dependencies.pyo3] +version = "0.25.1" +features = ["auto-initialize"] + [build-dependencies] bindgen = "0.72.0" cbindgen = "0.29.0" diff --git a/src/mission-planner/src/cmission.rs b/src/mission-planner/src/cmission.rs index 258fb03..3ab4304 100644 --- a/src/mission-planner/src/cmission.rs +++ b/src/mission-planner/src/cmission.rs @@ -76,7 +76,8 @@ pub extern "C" fn ctask_create(name_ptr: *const c_char, task_func: OptionFunctio pub struct CMissionPtr; #[unsafe(no_mangle)] -//TODO: Change to array +/* It is also possible to create the Mission in Rust using CTasks, but this was made for ease of use, especially + if there are a lot of CTasks */ pub extern "C" fn cmission_create(name_ptr: *const c_char, task_array: *mut CTask, size: isize) -> *mut CMissionPtr { let mut task_list: Vec> = Vec::new(); for i in 0..size { diff --git a/src/mission-planner/src/main.rs b/src/mission-planner/src/main.rs index 4a99ab8..c4e7970 100644 --- a/src/mission-planner/src/main.rs +++ b/src/mission-planner/src/main.rs @@ -1,21 +1,29 @@ mod mission; mod mission_scheduler; mod cmission; +mod pymission; mod mission_example; mod concurrent_mission_example; include!(concat!(env!("OUT_DIR"), "/bindings.rs")); -use std::collections::VecDeque; +use std::vec; +use std::{collections::VecDeque}; use std::time::Duration; +use pyo3::{ffi::c_str}; + use crate::{ mission::{CommonMission, Mission}, mission_scheduler::{MissionBox, MissionScheduler} }; fn main() { - let cmission_example: Box; + let pytest = c_str!(include_str!("pymission_example.py")); + let pymision_example = pymission::get_mission_from(pytest, c_str!("pymission_example.py")); + let pymission_example = Box::new(pymision_example); + + let cmission_example: MissionBox; unsafe { let cmission_ptr = cmission_example_create(); cmission_example = Box::from_raw(cmission_ptr as *mut CommonMission); @@ -25,6 +33,7 @@ fn main() { let bar: MissionBox = Box::new(concurrent_mission_example::new()); let mission_list = VecDeque::from(vec![ + pymission_example, cmission_example, foo ]); diff --git a/src/mission-planner/src/pymission.py b/src/mission-planner/src/pymission.py new file mode 100644 index 0000000..1cb9166 --- /dev/null +++ b/src/mission-planner/src/pymission.py @@ -0,0 +1,22 @@ +class PyTask: + func = None + repair_func = None + def __init__(self, name, func, repair_func): + self.name = name + self.func = func + self.repair_func = repair_func + + def run(self, *data): + if self.func: + self.func(data[0]) + + def repair_run(self, *data): + if self.repair_func: + self.repair_func(data[0]) + +class PyMission: + name = "" + task_list = [] + def __init__(self, name, task_list): + self.name = name + self.task_list = task_list diff --git a/src/mission-planner/src/pymission.rs b/src/mission-planner/src/pymission.rs new file mode 100644 index 0000000..fde87ab --- /dev/null +++ b/src/mission-planner/src/pymission.rs @@ -0,0 +1,95 @@ +use std::ffi::CStr; + +use crate::mission::{CommonMission, Task, MissionHashMap, MissionResult}; + +use pyo3::{ffi::c_str, prelude::*, types::IntoPyDict, PyResult, Python}; + +pub struct PyTask { + name: String, + pytask_obj: PyObject +} + +impl PyTask { + //Assume pytask + pub fn new(pytask_obj: PyObject) -> Self { + let res = Python::with_gil(|py| -> PyResult { + let name = pytask_obj.getattr(py, "name")?.to_string(); + Ok(name) + }); + let Ok(name) = res else { + panic!("Failed to get name. Error:\n{:#?}", res); + }; + Self { + name, + pytask_obj + } + } + + fn run_with(&self, option: &str, data: &MissionHashMap) -> MissionResult { + let res = Python::with_gil(|py| -> PyResult<()> { + let task_obj = self.pytask_obj.as_ref(); + //TODO: This implies read-only access + let dict = data.clone().into_py_dict(py)?; + let args = (dict, ); + task_obj.call_method1(py, option, args)?; + Ok(()) + }); + match res { + Ok(_) => Ok(()), + Err(pyerr) => { + println!("Python error: {:#?}", pyerr); + Err(false) + } + } + + } +} + +impl Task for PyTask { + fn run(&self, data: &MissionHashMap) -> MissionResult { + //TODO: Handle errors from Python and not simply assume everything is fine + self.run_with("run", data) + } + + fn repair_run(&self, data: &MissionHashMap) -> MissionResult { + self.run_with("repair_run", data) + } + + fn name(&self) -> &String { + &self.name + } + +} + +pub fn get_mission_from(file: &CStr, file_name: &CStr) -> CommonMission { + let pytask = c_str!(include_str!("pymission.py")); + + let res = Python::with_gil(|py| -> PyResult<(String, Vec)> { + PyModule::from_code(py, pytask, c_str!("pymission.py"), c_str!("pymission"))?; + let pymission: PyObject = PyModule::from_code(py, file, file_name, c_str!(""))? + .getattr("new")? + .into(); + let pymission = pymission.call0(py)?; + let name = pymission.getattr(py, "name")?.to_string(); + let task_list: PyObject = pymission.getattr(py, "task_list")?.into(); + let task_list: Vec = task_list.extract(py)?; + Ok((name, task_list)) + }); + + let Ok((name, task_list_py)) = res else { + let file_name = file_name.to_str().expect("Failed to get string literal from filename"); + panic!("Failed to load mission from {}, error:\n {:#?}", file_name, res); + + }; + + let mut task_list: Vec> = Vec::new(); + for pytask in task_list_py { + let task = PyTask::new(pytask); + task_list.push(Box::new(task)); + } + + CommonMission { + name, + task_list + } +} diff --git a/src/mission-planner/src/pymission_example.py b/src/mission-planner/src/pymission_example.py new file mode 100644 index 0000000..f4841ab --- /dev/null +++ b/src/mission-planner/src/pymission_example.py @@ -0,0 +1,10 @@ +import pymission + +def hello(data): + print("Hello from Python!") + +def new(): + task = pymission.PyTask("pytask-example", hello, None) + task_list = [task] + mission = pymission.PyMission("pymission-example", task_list) + return mission \ No newline at end of file From cdb005099d6abfc88d27cc9b01997e98ccdb09fa Mon Sep 17 00:00:00 2001 From: Ultra Date: Thu, 7 Aug 2025 13:59:55 -0400 Subject: [PATCH 5/7] Delete Mission trait and rename CommonMission to Mission --- src/mission-planner/src/cmission.rs | 4 ++-- .../src/concurrent_mission_example.rs | 6 +++--- src/mission-planner/src/main.rs | 13 ++++++------- src/mission-planner/src/mission.rs | 13 ++++--------- src/mission-planner/src/mission_example.rs | 6 +++--- src/mission-planner/src/mission_scheduler.rs | 13 ++++++------- src/mission-planner/src/pymission.rs | 6 +++--- 7 files changed, 27 insertions(+), 34 deletions(-) diff --git a/src/mission-planner/src/cmission.rs b/src/mission-planner/src/cmission.rs index 3ab4304..c55e687 100644 --- a/src/mission-planner/src/cmission.rs +++ b/src/mission-planner/src/cmission.rs @@ -1,4 +1,4 @@ -use crate::mission::{CommonMission, MissionHashMap, MissionResult, Task}; +use crate::mission::{Mission, MissionHashMap, MissionResult, Task}; use std::ffi::{c_char, CStr}; #[repr(C)] @@ -95,7 +95,7 @@ pub extern "C" fn cmission_create(name_ptr: *const c_char, task_array: *mut CTas name = temp.to_str().expect("Failed to get string literal!"); }; let name = name.to_string(); - let mission = CommonMission { + let mission = Mission { name, task_list }; diff --git a/src/mission-planner/src/concurrent_mission_example.rs b/src/mission-planner/src/concurrent_mission_example.rs index ba32293..fec3063 100644 --- a/src/mission-planner/src/concurrent_mission_example.rs +++ b/src/mission-planner/src/concurrent_mission_example.rs @@ -1,4 +1,4 @@ -use crate::mission::{CommonMission, MissionResult, Mission, MissionHashMap, RustTask, Task}; +use crate::mission::{Mission, MissionResult, MissionHashMap, RustTask, Task}; fn conc_example(data: &MissionHashMap) -> MissionResult { if data.contains_key("flag_request") { @@ -8,12 +8,12 @@ fn conc_example(data: &MissionHashMap) -> MissionResult { Ok(()) } -pub fn new() -> CommonMission { +pub fn new() -> Mission { let name = "concurrent-mission-example".to_string(); let task = RustTask::new("conc-example-task".to_string(), Some(conc_example), None); let task_list: Vec> = vec![ Box::new(task) ]; - CommonMission { name, task_list } + Mission { name, task_list } } diff --git a/src/mission-planner/src/main.rs b/src/mission-planner/src/main.rs index c4e7970..4197d12 100644 --- a/src/mission-planner/src/main.rs +++ b/src/mission-planner/src/main.rs @@ -15,22 +15,21 @@ use std::time::Duration; use pyo3::{ffi::c_str}; use crate::{ - mission::{CommonMission, Mission}, mission_scheduler::{MissionBox, MissionScheduler} + mission::{Mission}, mission_scheduler::MissionScheduler }; fn main() { let pytest = c_str!(include_str!("pymission_example.py")); - let pymision_example = pymission::get_mission_from(pytest, c_str!("pymission_example.py")); - let pymission_example = Box::new(pymision_example); + let pymission_example = pymission::get_mission_from(pytest, c_str!("pymission_example.py")); - let cmission_example: MissionBox; + let cmission_example; unsafe { let cmission_ptr = cmission_example_create(); - cmission_example = Box::from_raw(cmission_ptr as *mut CommonMission); + cmission_example = *Box::from_raw(cmission_ptr as *mut Mission); } - let foo: MissionBox = Box::new(mission_example::new()); - let bar: MissionBox = Box::new(concurrent_mission_example::new()); + let foo = mission_example::new(); + let bar = concurrent_mission_example::new(); let mission_list = VecDeque::from(vec![ pymission_example, diff --git a/src/mission-planner/src/mission.rs b/src/mission-planner/src/mission.rs index d73c0e3..eb19c1c 100644 --- a/src/mission-planner/src/mission.rs +++ b/src/mission-planner/src/mission.rs @@ -45,18 +45,13 @@ impl Task for RustTask { } } -pub trait Mission : Send + Sync { - fn run(&self, data: &DashMap) -> MissionResult; - fn name(&self) -> &String; -} - -pub struct CommonMission { +pub struct Mission { pub name: String, pub task_list: Vec>, } -impl Mission for CommonMission { - fn run(&self, data: &DashMap) -> MissionResult { +impl Mission { + pub fn run(&self, data: &DashMap) -> MissionResult { if self.task_list.is_empty() { return Ok(()) } @@ -84,7 +79,7 @@ impl Mission for CommonMission { res } - fn name(&self) -> &String { + pub fn name(&self) -> &String { &self.name } } diff --git a/src/mission-planner/src/mission_example.rs b/src/mission-planner/src/mission_example.rs index 8a843c4..d7de448 100644 --- a/src/mission-planner/src/mission_example.rs +++ b/src/mission-planner/src/mission_example.rs @@ -1,5 +1,5 @@ use std::thread::sleep; -use crate::mission::{CommonMission, Task, MissionResult, MissionHashMap, RustTask}; +use crate::mission::{Mission, Task, MissionResult, MissionHashMap, RustTask}; fn example(_data: &MissionHashMap) -> MissionResult { println!("Hello world!"); @@ -18,12 +18,12 @@ fn repair_example(data: &MissionHashMap) -> MissionResult { Ok(()) } -pub fn new() -> CommonMission { +pub fn new() -> Mission { let name = "example-mission".to_string(); let task = RustTask::new("example-task".to_string(), Some(example), Some(repair_example)); let task_list: Vec> = vec![ Box::new(task) ]; - CommonMission { name, task_list } + Mission { name, task_list } } diff --git a/src/mission-planner/src/mission_scheduler.rs b/src/mission-planner/src/mission_scheduler.rs index bf094a5..342891f 100644 --- a/src/mission-planner/src/mission_scheduler.rs +++ b/src/mission-planner/src/mission_scheduler.rs @@ -5,8 +5,7 @@ use std::sync::{Arc, Mutex}; use std::sync::atomic::{AtomicBool, Ordering}; use std::thread::{self, sleep}; -pub type MissionBox = Box; -pub type MissionVec = VecDeque; +pub type MissionVec = VecDeque; struct MissionThreadData { mission_list: Arc>, conc_mission_list: Arc>, @@ -29,11 +28,11 @@ impl MissionThreadData { } } - fn pop_front(&self) -> Option { + fn pop_front(&self) -> Option { self.mission_list.lock().unwrap().pop_front() } - fn push_back(&self, mission: MissionBox) { + fn push_back(&self, mission: Mission) { self.mission_list.lock().unwrap().push_back(mission); } @@ -41,7 +40,7 @@ impl MissionThreadData { self.mission_list.lock().unwrap().append(&mut mission_vec); } - fn conc_push_back(&self, mission: MissionBox) { + fn conc_push_back(&self, mission: Mission) { self.conc_mission_list.lock().unwrap().push_back(mission); } @@ -64,11 +63,11 @@ impl MissionScheduler { } } - pub fn push_back(&self, mission: MissionBox) { + pub fn push_back(&self, mission: Mission) { self.scheduler_data.push_back(mission); } - pub fn conc_push_back(&self, mission: MissionBox) { + pub fn conc_push_back(&self, mission: Mission) { self.scheduler_data.conc_push_back(mission); } diff --git a/src/mission-planner/src/pymission.rs b/src/mission-planner/src/pymission.rs index fde87ab..c425cb0 100644 --- a/src/mission-planner/src/pymission.rs +++ b/src/mission-planner/src/pymission.rs @@ -1,6 +1,6 @@ use std::ffi::CStr; -use crate::mission::{CommonMission, Task, MissionHashMap, MissionResult}; +use crate::mission::{Mission, Task, MissionHashMap, MissionResult}; use pyo3::{ffi::c_str, prelude::*, types::IntoPyDict, PyResult, Python}; @@ -61,7 +61,7 @@ impl Task for PyTask { } -pub fn get_mission_from(file: &CStr, file_name: &CStr) -> CommonMission { +pub fn get_mission_from(file: &CStr, file_name: &CStr) -> Mission { let pytask = c_str!(include_str!("pymission.py")); let res = Python::with_gil(|py| -> PyResult<(String, Vec)> { @@ -88,7 +88,7 @@ pub fn get_mission_from(file: &CStr, file_name: &CStr) -> CommonMission { task_list.push(Box::new(task)); } - CommonMission { + Mission { name, task_list } From 3c754c40c9230a5096695ee4f61133942fd177b7 Mon Sep 17 00:00:00 2001 From: Ultra Date: Thu, 7 Aug 2025 14:35:58 -0400 Subject: [PATCH 6/7] A bit of refactoring regarding modifying the vectors --- src/mission-planner/src/mission_scheduler.rs | 64 +++++++++++++------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/src/mission-planner/src/mission_scheduler.rs b/src/mission-planner/src/mission_scheduler.rs index 342891f..ed9e0f2 100644 --- a/src/mission-planner/src/mission_scheduler.rs +++ b/src/mission-planner/src/mission_scheduler.rs @@ -28,24 +28,20 @@ impl MissionThreadData { } } - fn pop_front(&self) -> Option { - self.mission_list.lock().unwrap().pop_front() - } - - fn push_back(&self, mission: Mission) { - self.mission_list.lock().unwrap().push_back(mission); - } - - fn append(&self, mut mission_vec: MissionVec) { - self.mission_list.lock().unwrap().append(&mut mission_vec); - } - - fn conc_push_back(&self, mission: Mission) { - self.conc_mission_list.lock().unwrap().push_back(mission); + fn with_mission_list(&self, func: impl FnOnce(&mut MissionVec) -> Option, is_concurrent: bool) -> Option { + let mut guard = if is_concurrent { + self.conc_mission_list.try_lock().expect("Concurrent mission lock is poisoned!") + } else { + self.mission_list.try_lock().expect("Mission lock is poisoned!") + }; + func(&mut guard) } - fn conc_append(&self, mut mission_vec: MissionVec) { - self.conc_mission_list.lock().unwrap().append(&mut mission_vec); + pub fn pop_front(&self) -> Option { + let func = move |mission_list: &mut VecDeque| { + mission_list.pop_front() + }; + self.with_mission_list(func, false) } } pub struct MissionScheduler { @@ -63,20 +59,40 @@ impl MissionScheduler { } } + #[allow(unused)] pub fn push_back(&self, mission: Mission) { - self.scheduler_data.push_back(mission); + let func = move |mission_list: &mut VecDeque| { + mission_list.push_back(mission); + None + }; + self.scheduler_data.with_mission_list(func, false); } + #[allow(unused)] pub fn conc_push_back(&self, mission: Mission) { - self.scheduler_data.conc_push_back(mission); + let func = move |mission_list: &mut VecDeque| { + mission_list.push_back(mission); + None + }; + self.scheduler_data.with_mission_list(func, true); } - pub fn append(&self, mission_vec: MissionVec) { - self.scheduler_data.append(mission_vec); + #[allow(unused)] + pub fn append(&self, mut mission_vec: MissionVec) { + let func = move |mission_list: &mut VecDeque| { + mission_list.append(&mut mission_vec); + None + }; + self.scheduler_data.with_mission_list(func, false); } - pub fn conc_append(&self, mission_vec: MissionVec) { - self.scheduler_data.conc_append(mission_vec); + #[allow(unused)] + pub fn conc_append(&self, mut mission_vec: MissionVec) { + let func = move |mission_list: &mut VecDeque| { + mission_list.append(&mut mission_vec); + None + }; + self.scheduler_data.with_mission_list(func, true); } pub fn get_data(&self) -> Arc { @@ -148,7 +164,9 @@ impl MissionScheduler { continue } - let getter = conc_mission_list.lock().unwrap(); + let getter = conc_mission_list + .try_lock() + .expect("Concurrent mission lock is poisoned!"); for mission in &*getter { let res = mission.run(data); match res { From adeb739e1a99345972eb84f48840dd3ef9285500 Mon Sep 17 00:00:00 2001 From: Ultra Date: Fri, 8 Aug 2025 10:00:51 -0400 Subject: [PATCH 7/7] Fix memory leak on cmission --- src/mission-planner/src/cmission.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/mission-planner/src/cmission.rs b/src/mission-planner/src/cmission.rs index c55e687..6575e3f 100644 --- a/src/mission-planner/src/cmission.rs +++ b/src/mission-planner/src/cmission.rs @@ -34,6 +34,8 @@ fn run_with(func: &OptionFunction, data: &MissionHashMap) -> MissionR let data_ptr = Box::new(data); let data_ptr = Box::into_raw(data_ptr) as *mut MissionMapPtr; let res = unsafe { func(data_ptr) }; + //Deallocate pointer + let _ = unsafe { Box::from_raw(data_ptr as *mut MissionHashMap)}; match res { CMissionResult::Ok => Ok(()), CMissionResult::Err => Err(false),