6 个版本

0.2.4 2018年12月26日
0.2.3 2018年12月3日
0.1.0 2018年11月30日

#22 in #subscribe

BSD-2-Clause

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