autosar_data_abstraction/communication/transport_layer/
mod.rs

1use crate::{AbstractionElement, AutosarAbstractionError, IdentifiableAbstractionElement, abstraction_element};
2use autosar_data::{Element, ElementName};
3
4mod can_tp;
5mod doip_tp;
6mod flexray_ar_tp;
7mod flexray_tp;
8
9pub use can_tp::*;
10pub use doip_tp::*;
11pub use flexray_ar_tp::*;
12pub use flexray_tp::*;
13
14//##################################################################
15
16/// Represents an ECUs transport layer address on the referenced channel
17///
18/// The `TpAddress` element is used by `FlexrayArTpConfig` and `FlexrayTpConfig`
19#[derive(Debug, Clone, PartialEq, Eq, Hash)]
20pub struct TpAddress(Element);
21abstraction_element!(TpAddress, TpAddress);
22impl IdentifiableAbstractionElement for TpAddress {}
23
24impl TpAddress {
25    pub(crate) fn new(name: &str, parent: &Element, address: u32) -> Result<Self, AutosarAbstractionError> {
26        let tp_address_elem = parent.create_named_sub_element(ElementName::TpAddress, name)?;
27        let tp_address = Self(tp_address_elem);
28        tp_address.set_address(address)?;
29
30        Ok(tp_address)
31    }
32
33    /// set the value of the address
34    pub fn set_address(&self, address: u32) -> Result<(), AutosarAbstractionError> {
35        self.element()
36            .get_or_create_sub_element(ElementName::TpAddress)?
37            .set_character_data(u64::from(address))?;
38        Ok(())
39    }
40
41    /// get the value of the address
42    #[must_use]
43    pub fn address(&self) -> Option<u32> {
44        self.element()
45            .get_sub_element(ElementName::TpAddress)?
46            .character_data()?
47            .parse_integer()
48    }
49}