Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with: { submodules: 'recursive' }
- if: github.event_name != 'release' && github.event_name != 'workflow_dispatch'
uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@v2
Expand All @@ -28,6 +29,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with: { submodules: 'recursive' }
- if: github.event_name != 'release' && github.event_name != 'workflow_dispatch'
uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@v2
Expand All @@ -47,6 +49,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with: { submodules: 'recursive' }
- uses: Swatinem/rust-cache@v2
- uses: taiki-e/install-action@v2
with: { tool: 'just,cargo-llvm-cov' }
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "tests/shared-test-files"]
path = tests/shared-test-files
url = https://github.com/oxibus/shared-test-files
12 changes: 6 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,20 @@ categories = ["embedded", "no-std", "encoding", "parsing"]
edition = "2021"
rust-version = "1.74"

[features]
default = ["with-serde"]
with-serde = ["dep:serde"]

[dependencies]
derive-getters = "0.5"
nom = { version = "8.0", features = ["alloc"] }
serde = { version = "1.0", optional = true }
serde_derive = { version = "1.0", optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }

[dev-dependencies]
clap = { version = "4.5.0", features = ["cargo", "derive"] }
codegen = "0.2"
codegen = "0.2" # Used in README code block
insta = { version = "1.39", features = ["yaml"] }

[features]
with-serde = ["serde", "serde_derive"]

[lints.rust]
unsafe_code = "forbid"
unused_qualifications = "warn"
Expand Down
118 changes: 38 additions & 80 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
#![doc = include_str!("../README.md")]

#[cfg(feature = "with-serde")]
extern crate serde;
#[cfg(feature = "with-serde")]
#[macro_use]
extern crate serde_derive;

use std::convert::TryFrom;

use derive_getters::Getters;
use serde::{Deserialize, Serialize};

pub mod parser;

Expand Down Expand Up @@ -251,15 +246,13 @@ pub enum Error<'a> {
}

/// Baudrate of network in kbit/s
#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Baudrate(u64);

/// One or multiple signals are the payload of a CAN frame.
/// To determine the actual value of a signal the following fn applies:
/// `let fnvalue = |can_signal_value| -> can_signal_value * factor + offset;`
#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct Signal {
name: String,
multiplexer_indicator: MultiplexIndicator,
Expand All @@ -277,8 +270,7 @@ pub struct Signal {

/// CAN id in header of CAN frame.
/// Must be unique in DBC file.
#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum MessageId {
Standard(u16),
/// 29 bit extended identifier without the extended bit.
Expand All @@ -296,33 +288,28 @@ impl MessageId {
}
}

#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum Transmitter {
/// node transmitting the message
NodeName(String),
/// message has no sender
VectorXXX,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct MessageTransmitter {
message_id: MessageId,
transmitter: Vec<Transmitter>,
}

/// Version generated by DB editor
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Version(pub String);

#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Symbol(pub String);

#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum MultiplexIndicator {
/// Multiplexor switch
Multiplexor,
Expand All @@ -334,30 +321,26 @@ pub enum MultiplexIndicator {
Plain,
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum ByteOrder {
LittleEndian,
BigEndian,
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum ValueType {
Signed,
Unsigned,
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum EnvType {
EnvTypeFloat,
EnvTypeu64,
EnvTypeData,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct SignalType {
signal_type_name: String,
signal_size: u64,
Expand All @@ -372,31 +355,27 @@ pub struct SignalType {
value_table: String,
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum AccessType {
DummyNodeVector0,
DummyNodeVector1,
DummyNodeVector2,
DummyNodeVector3,
}

#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum AccessNode {
AccessNodeVectorXXX,
AccessNodeName(String),
}

#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum SignalAttributeValue {
Text(String),
Int(i64),
}

#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum AttributeValuedForObjectType {
RawAttributeValue(AttributeValue),
NetworkNodeAttributeValue(String, AttributeValue),
Expand All @@ -405,8 +384,7 @@ pub enum AttributeValuedForObjectType {
EnvVariableAttributeValue(String, AttributeValue),
}

#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum AttributeValueType {
AttributeValueTypeInt(i64, i64),
AttributeValueTypeHex(i64, i64),
Expand All @@ -415,22 +393,19 @@ pub enum AttributeValueType {
AttributeValueTypeEnum(Vec<String>),
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct ValDescription {
a: f64,
b: String,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct AttrDefault {
name: String,
value: AttributeValue,
}

#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq)]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum AttributeValue {
AttributeValueU64(u64),
AttributeValueI64(i64),
Expand All @@ -439,22 +414,19 @@ pub enum AttributeValue {
}

/// Global value table
#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct ValueTable {
value_table_name: String,
value_descriptions: Vec<ValDescription>,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct ExtendedMultiplexMapping {
min_value: u64,
max_value: u64,
}
/// Mapping between multiplexors and multiplexed signals
#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct ExtendedMultiplex {
message_id: MessageId,
signal_name: String,
Expand All @@ -463,8 +435,7 @@ pub struct ExtendedMultiplex {
}

/// Object comments
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum Comment {
Node {
node_name: String,
Expand All @@ -489,8 +460,7 @@ pub enum Comment {
}

/// CAN message (frame) details including signal details
#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct Message {
/// CAN id in header of CAN frame.
/// Must be unique in DBC file.
Expand All @@ -501,8 +471,7 @@ pub struct Message {
signals: Vec<Signal>,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct EnvironmentVariable {
env_var_name: String,
env_var_type: EnvType,
Expand All @@ -515,34 +484,29 @@ pub struct EnvironmentVariable {
access_nodes: Vec<AccessNode>,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct EnvironmentVariableData {
env_var_name: String,
data_size: u64,
}

/// CAN network nodes, names must be unique
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Node(pub Vec<String>);

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct AttributeDefault {
attribute_name: String,
attribute_value: AttributeValue,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct AttributeValueForObject {
attribute_name: String,
attribute_value: AttributeValuedForObjectType,
}

#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum AttributeDefinition {
// TODO add properties
Message(String),
Expand All @@ -556,8 +520,7 @@ pub enum AttributeDefinition {
}

/// Encoding for signal raw values.
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum ValueDescription {
Signal {
message_id: MessageId,
Expand All @@ -570,42 +533,37 @@ pub enum ValueDescription {
},
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct SignalTypeRef {
message_id: MessageId,
signal_name: String,
signal_type_name: String,
}

/// Signal groups define a group of signals within a message
#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct SignalGroups {
message_id: MessageId,
signal_group_name: String,
repetitions: u64,
signal_names: Vec<String>,
}

#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum SignalExtendedValueType {
SignedOrUnsignedInteger,
IEEEfloat32Bit,
IEEEdouble64bit,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct SignalExtendedValueTypeList {
message_id: MessageId,
signal_name: String,
signal_extended_value_type: SignalExtendedValueType,
}

#[derive(Clone, Debug, PartialEq, Getters)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Clone, Debug, PartialEq, Getters, Serialize, Deserialize)]
pub struct DBC {
/// Version generated by DB editor
version: Version,
Expand Down
Loading