Skip to main content

dbc_codegen2/ir/
signal.rs

1use crate::ir::identifier::Identifier;
2use crate::ir::map_into;
3use crate::ir::signal_layout::SignalLayoutIdx;
4use crate::ir::signal_value_type::IntReprType;
5use can_dbc::MultiplexIndicator as ParsedMultiplexIndicator;
6use can_dbc::Signal as ParsedSignal;
7use crate::ir::signal_value_type::{PhysicalType, RawType};
8use crate::ir::{SignalValueEnum, ExtendedValueType};
9
10#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
11pub struct SignalIdx(pub usize);
12
13#[derive(Debug, Clone)]
14pub struct Signal {
15    pub name: Identifier,
16    pub multiplexer: MultiplexIndicator,
17    pub unit: String,
18    pub receivers: Vec<Receiver>,
19
20    pub layout: SignalLayoutIdx,
21    pub signal_value_enum: Option<SignalValueEnum>,
22    pub extended_type: ExtendedValueType,
23
24    pub raw_type: RawType,
25    pub physical_type: PhysicalType,
26}
27
28impl From<ParsedSignal> for Signal {
29    fn from(value: ParsedSignal) -> Self {
30        Signal {
31            name: Identifier(value.name),
32            multiplexer: MultiplexIndicator::from(value.multiplexer_indicator),
33            unit: value.unit,
34            receivers: map_into(value.receivers),
35
36            layout: SignalLayoutIdx(0),
37            signal_value_enum: None,
38            extended_type: ExtendedValueType::Integer,
39
40            raw_type: RawType::Integer(IntReprType::I64),
41            physical_type: PhysicalType::Integer(IntReprType::I64),
42        }
43    }
44}
45
46#[derive(Debug, Clone)]
47pub enum MultiplexIndicator {
48    Multiplexor,
49    MultiplexedSignal(u64),
50    MultiplexorAndMultiplexedSignal(u64),
51    Plain,
52}
53impl From<ParsedMultiplexIndicator> for MultiplexIndicator {
54    fn from(value: ParsedMultiplexIndicator) -> Self {
55        match value {
56            ParsedMultiplexIndicator::Multiplexor => MultiplexIndicator::Multiplexor,
57            ParsedMultiplexIndicator::MultiplexedSignal(v) => {
58                MultiplexIndicator::MultiplexedSignal(v)
59            }
60            ParsedMultiplexIndicator::MultiplexorAndMultiplexedSignal(v) => {
61                MultiplexIndicator::MultiplexorAndMultiplexedSignal(v)
62            }
63            ParsedMultiplexIndicator::Plain => MultiplexIndicator::Plain,
64        }
65    }
66}
67
68#[derive(Debug, Clone)]
69pub enum Receiver {
70    Node(Identifier),
71    VectorXXX,
72}
73impl From<String> for Receiver {
74    fn from(value: String) -> Self {
75        match value.as_str() {
76            "Vector__XXX" => Receiver::VectorXXX,
77            _ => Receiver::Node(Identifier(value)),
78        }
79    }
80}