#messages #dbc #file #generate #codegen #bus #definition

无 std dbc-codegen

CAN DBC 代码生成器,适用于嵌入式 Rust

3 个版本 (破坏性更新)

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

#290 in 开发工具

Download history 230/week @ 2024-03-13 140/week @ 2024-03-20 195/week @ 2024-03-27 290/week @ 2024-04-03 321/week @ 2024-04-10 316/week @ 2024-04-17 410/week @ 2024-04-24 405/week @ 2024-05-01 476/week @ 2024-05-08 358/week @ 2024-05-15 272/week @ 2024-05-22 263/week @ 2024-05-29 303/week @ 2024-06-05 441/week @ 2024-06-12 470/week @ 2024-06-19 441/week @ 2024-06-26

1,708 每月下载量
用于 dbc-codegen-cli

MIT/Apache 许可

48KB
1K SLoC

CAN DBC 代码生成器,适用于 Rust

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 生成的 Rust 文件预期将在 cargo 项目中使用。以下是一个示例 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"]Arbitraryhttps://docs.rs/arbitrary/1.0.0/arbitrary/trait.Arbitrary.html
  • std:为 CanError 实现 std::error::Error。这使得使用 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 许可证定义的,您提交给作品包含的任何贡献,都将按上述方式双许可,不附加任何额外条款或条件。

依赖项

~3MB
~60K SLoC