3 个版本 (重大更新)

0.3.0 2023年10月31日
0.2.0 2022年5月23日
0.1.0 2021年3月18日

#689 in 开发工具

MIT/Apache

55KB
1K SLoC

Rust CAN DBC 代码生成器

dbc 文件生成 Rust 消息。

⚠️ 这是个实验性功能 - 请谨慎使用。⚠️

安装

使用 cargo 安装已发布的版本

cargo install dbc-codegen-cli

从 git 仓库安装最新版本

cargo install dbc-codegen-cli --git https://github.com/technocreatives/dbc-codegen --branch main

使用 dbc-codegen

使用 CLI 从 example.dbc 生成 messages.rs

dbc-codegen testing/dbc-examples/example.dbc dir/where/messages_rs/file/is/written

或者将以下内容放入你的 build.rs 文件中

fn main() {
    let dbc_path = "../dbc-examples/example.dbc";
    let dbc_file = std::fs::read(dbc_path).unwrap();
    println!("cargo:rerun-if-changed={}", dbc_path);

    let mut out = std::io::BufWriter::new(std::fs::File::create("src/messages.rs").unwrap());
    dbc_codegen::codegen("example.dbc", &dbc_file, &mut out, true).unwrap();
}

使用生成的 Rust 代码

dbc-codegen 生成一个预期位于 cargo 项目中的 Rust 文件。以下是一个示例 testing/can-messages/Cargo.toml,它定义了在生成的消息文件中使用的依赖项和功能。

项目设置

为此,你需要在 Cargo.toml 中添加以下依赖项

bitvec = { version = "1.0", default-features = false }
arbitrary = { version = "1.0", optional = true } # Enable with `arb` feature

要使用此代码,将 mod messages 添加到你的 lib.rs(或 main.rs)。你很可能需要与生成的 Messages 枚举交互,并调用 Messages::from_can_message(id, &payload)

注意:生成的代码包含大量文档。请尝试一下

cargo doc --open

特性标志

以下(可选)特性可以指定

  • debug:为消息启用 #[derive(Debug)
  • range_checked:在设置器中添加范围检查
  • arb:启用实现Arbitrary特质。还需要您将arbitrary包(版本1.x)添加为功能的依赖项,使用arb = [""arbitrary""]Arbitrary:[https://docs.rs/arbitrary/1.0.0/arbitrary/trait.Arbitrary.html](https://docs.rs/arbitrary/1.0.0/arbitrary/trait.Arbitrary.html)
  • std:为std::error::Error实现CanError。这使得使用anyhow进行错误处理变得简单。

要启用所有功能,请将以下内容添加到您的Cargo.toml

# features for dbc-codegen `messages.rs` file
[features]
default = ["debug", "arb", "range_checked", "std"]
arb = ["arbitrary"]
debug = []
range_checked = []
std = []

字段/变体重命名规则

如果某个字段名称以非字母字符开头或是一个Rust关键字,则它会以x为前缀。

例如

VAL_ 512 Five 0 "0Off" 1 "1On" 2 "2Oner" 3 "3Onest";

…被生成为

pub enum BarFive {
    X0off,
    X1on,
    X2oner,
    X3onest,
    _Other(bool),
}

Type在这里

SG_ Type : 30|1@0+ (1,0) [0|1] "boolean" Dolor

…与Rust关键字type冲突。因此我们使用x作为前缀。

pub fn xtype(&self) -> BarType {
    match self.xtype_raw() {
        false => BarType::X0off,
        true => BarType::X1on,
        x => BarType::_Other(x),
    }
}

许可证

在以下任一许可证下获得许可:

任选其一。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交的任何贡献,均应按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~2.3–3MB
~58K SLoC