3 个版本 (重大更新)
0.3.0 | 2023年10月31日 |
---|---|
0.2.0 | 2022年5月23日 |
0.1.0 | 2021年3月18日 |
#689 in 开发工具
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,[LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0]
- MIT许可证 ([LICENSE-MIT 或 http://opensource.org/licenses/MIT])
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交的任何贡献,均应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~2.3–3MB
~58K SLoC