6 个版本
0.2.4 | 2018年12月26日 |
---|---|
0.2.3 | 2018年12月3日 |
0.1.0 | 2018年11月30日 |
#22 in #subscribe
23KB
497 行代码(不含注释)
PX4 的 Rust 绑定
此包提供框架以在 Rust 中动态加载 PX4 模块。目前,它提供了对两个最重要的 API 的绑定:日志记录和 uORB。它还提供了您模块的入口点,并处理模块主线程上的恐慌。
请参阅 example
目录 以获取示例模块。
编译和运行
要在 Rust 中构建 PX4 模块,创建一个类似于任何其他应用程序的二进制文件的包,然后在 Cargo.toml 中添加以下内容
[lib]
crate-type = ["cdylib"]
path = "src/module.rs"
这将使您的程序成为一个可加载的模块而不是独立的应用程序。生成的文件将被称为 lib<name>.so
,如果您想的话,可以手动重命名为 <name>.px4mod
。
要运行您的模块,请使用 dyn
PX4 命令。提供完整的路径名称,然后是传递给模块的任何参数。请注意,dyn
在再次运行时不会重新加载您的文件。如果您想运行模块的更改版本,您可能需要重新启动 PX4 或移动/重命名文件。
入口点
使用 #[px4_module_main]
标记您的入口函数。然后自动插入设置环境和在正确名称下导出函数所需的样板代码。
您的 main 函数应接受一个 &[&str]
作为参数。它 可能 返回一个 i32
状态代码,直接返回或作为 Result
的错误类型。主线程上的恐慌会被捕获并导致状态代码为 -1。
示例
use px4::px4_module_main;
#[px4_module_main]
fn my_module(args: &[&str]) -> i32 {
0
}
日志记录
一旦进入 main 函数,就会使用标准的 log
包 进行日志设置。您可以使用标准的日志宏,如 info!
、warn!
和 error!
来记录消息,相当于 C 和 C++ 中的 PX4_INFO
(等等)。
使用 info_raw!
宏发送原始输出,相当于 C 和 C++ 中的 PX4_INFO_RAW
宏。请勿使用标准输出或标准错误,因为 PX4 进程的标准流通常不是用户正在查看的终端连接的流。
示例
use log::{info, warn};
use px4::px4_module_main;
#[px4_module_main]
fn my_module(args: &[&str]) {
info!("Hello World!");
warn!("A warning!");
panic!("Bye!");
}
uORB
消息定义可以从 .msg
文件中导入,然后进行订阅或发布。请参阅uorb
模块的文档,了解如何使用uORB绑定。
示例
use log::info;
use px4::{px4_module_main, px4_message};
use px4::uorb::{Publish, Subscribe};
#[px4_message("../example/msg/debug_value.msg")]
pub struct debug_value;
#[px4_module_main]
fn my_module(args: &[&str]) {
let mut publ = debug_value::advertise();
publ.publish(&debug_value { timestamp: 0, value: 1.0, ind: 3 }).unwrap();
let sub = debug_value::subscribe().unwrap();
info!("Latest debug message: {:?}", sub.get().unwrap());
}
依赖项
~2MB
~48K SLoC