Skip to main content

dbc_codegen2/ir/
signal_layout.rs

1use can_dbc::ByteOrder as ParsedByteOrder;
2use can_dbc::ValueType as ParsedValueType;
3use can_dbc::Signal as ParsedSignal;
4
5#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
6pub struct SignalLayoutIdx(pub usize);
7
8#[derive(Debug, Clone, Copy)]
9pub struct SignalLayout {
10    pub start_bit: u64,
11    pub size: u64,
12    pub byte_order: ByteOrder,
13    pub value_type: ValueType,
14    pub factor: f64,
15    pub offset: f64,
16    pub min: f64,
17    pub max: f64,
18}
19
20impl From<&ParsedSignal> for SignalLayout {
21    fn from(value: &ParsedSignal) -> Self {
22        Self {
23            start_bit: value.start_bit,
24            size: value.size,
25            byte_order: ByteOrder::from(value.byte_order),
26            value_type: ValueType::from(value.value_type),
27            factor: value.factor,
28            offset: value.offset,
29            min: value.min,
30            max: value.max,
31        }
32    }
33}
34
35use std::hash::{Hash, Hasher};
36
37impl PartialEq for SignalLayout {
38    fn eq(&self, other: &Self) -> bool {
39        self.start_bit == other.start_bit
40            && self.size == other.size
41            && self.byte_order == other.byte_order
42            && self.value_type == other.value_type
43            && self.factor.to_bits() == other.factor.to_bits()
44            && self.offset.to_bits() == other.offset.to_bits()
45            && self.min.to_bits() == other.min.to_bits()
46            && self.max.to_bits() == other.max.to_bits()
47    }
48}
49
50impl Eq for SignalLayout {}
51
52impl Hash for SignalLayout {
53    fn hash<H: Hasher>(&self, state: &mut H) {
54        self.start_bit.hash(state);
55        self.size.hash(state);
56        self.byte_order.hash(state);
57        self.value_type.hash(state);
58
59        self.factor.to_bits().hash(state);
60        self.offset.to_bits().hash(state);
61        self.min.to_bits().hash(state);
62        self.max.to_bits().hash(state);
63    }
64}
65
66#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
67pub enum ByteOrder {
68    BigEndian,
69    LittleEndian,
70}
71impl From<ParsedByteOrder> for ByteOrder {
72    fn from(value: ParsedByteOrder) -> Self {
73        match value {
74            ParsedByteOrder::BigEndian => ByteOrder::BigEndian,
75            ParsedByteOrder::LittleEndian => ByteOrder::LittleEndian,
76        }
77    }
78}
79
80#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
81pub enum ValueType {
82    Unsigned,
83    Signed,
84}
85impl From<ParsedValueType> for ValueType {
86    fn from(value: ParsedValueType) -> Self {
87        match value {
88            ParsedValueType::Signed => ValueType::Signed,
89            ParsedValueType::Unsigned => ValueType::Unsigned,
90        }
91    }
92}