3 个版本 (破坏性更新)
0.3.0 | 2023 年 10 月 31 日 |
---|---|
0.2.0 | 2022 年 5 月 23 日 |
0.1.0 | 2021 年 3 月 18 日 |
#290 in 开发工具
1,708 每月下载量
用于 dbc-codegen-cli
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"]
。Arbitrary
: https://docs.rs/arbitrary/1.0.0/arbitrary/trait.Arbitrary.htmlstd
:为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,(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您提交给作品包含的任何贡献,都将按上述方式双许可,不附加任何额外条款或条件。
依赖项
~3MB
~60K SLoC