autosar_data_abstraction/communication/cluster/
ethernet.rs1use crate::communication::{AbstractCluster, EthernetPhysicalChannel, EthernetVlanInfo};
2use crate::{
3 AbstractionElement, ArPackage, AutosarAbstractionError, IdentifiableAbstractionElement, abstraction_element,
4};
5use autosar_data::{Element, ElementName};
6
7#[derive(Debug, Clone, PartialEq, Eq, Hash)]
10pub struct EthernetCluster(Element);
11abstraction_element!(EthernetCluster, EthernetCluster);
12impl IdentifiableAbstractionElement for EthernetCluster {}
13
14impl EthernetCluster {
15 pub(crate) fn new(cluster_name: &str, package: &ArPackage) -> Result<Self, AutosarAbstractionError> {
17 let elem_pkg_elements = package.element().get_or_create_sub_element(ElementName::Elements)?;
18 let elem_cluster = elem_pkg_elements.create_named_sub_element(ElementName::EthernetCluster, cluster_name)?;
19 if let Ok(cluster_content) = elem_cluster
20 .create_sub_element(ElementName::EthernetClusterVariants)
21 .and_then(|ecv| ecv.create_sub_element(ElementName::EthernetClusterConditional))
22 {
23 let _ = cluster_content.create_sub_element(ElementName::PhysicalChannels);
24 }
25
26 Ok(EthernetCluster(elem_cluster))
27 }
28
29 pub fn create_physical_channel(
58 &self,
59 channel_name: &str,
60 vlan_info: Option<&EthernetVlanInfo>,
61 ) -> Result<EthernetPhysicalChannel, AutosarAbstractionError> {
62 let phys_channels = self
63 .0
64 .get_or_create_sub_element(ElementName::EthernetClusterVariants)?
65 .get_or_create_sub_element(ElementName::EthernetClusterConditional)?
66 .get_or_create_sub_element(ElementName::PhysicalChannels)?;
67
68 EthernetPhysicalChannel::new(channel_name, &phys_channels, vlan_info)
69 }
70
71 pub fn physical_channels(&self) -> impl Iterator<Item = EthernetPhysicalChannel> + Send + use<> {
90 self.element()
91 .get_sub_element(ElementName::EthernetClusterVariants)
92 .and_then(|ecv| ecv.get_sub_element(ElementName::EthernetClusterConditional))
93 .and_then(|ecc| ecc.get_sub_element(ElementName::PhysicalChannels))
94 .into_iter()
95 .flat_map(|phys_channel| phys_channel.sub_elements())
96 .filter_map(|elem| EthernetPhysicalChannel::try_from(elem).ok())
97 }
98}
99
100impl AbstractCluster for EthernetCluster {}
101
102#[cfg(test)]
105mod test {
106 use crate::{
107 AutosarModelAbstraction, SystemCategory,
108 communication::{AbstractCluster, EthernetVlanInfo},
109 };
110 use autosar_data::AutosarVersion;
111
112 #[test]
113 fn cluster() {
114 let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
115 let pkg = model.get_or_create_package("/test").unwrap();
116 let system = pkg.create_system("System", SystemCategory::SystemDescription).unwrap();
117
118 let pkg2 = model.get_or_create_package("/ethernet").unwrap();
119 let result = system.create_ethernet_cluster("EthCluster", &pkg2);
121 assert!(result.is_ok());
122 let cluster = result.unwrap();
123 let result = system.create_ethernet_cluster("EthCluster", &pkg2);
125 assert!(result.is_err());
126
127 let linked_system = cluster.system().unwrap();
129 assert_eq!(linked_system, system);
130
131 let result = cluster.create_physical_channel("Channel1", None);
133 assert!(result.is_ok());
134 let result = cluster.create_physical_channel("Channel2", None);
136 assert!(result.is_err());
137
138 let vlan_info = EthernetVlanInfo {
140 vlan_name: "VLAN_1".to_string(),
141 vlan_id: 1,
142 };
143 let result = cluster.create_physical_channel("Channel3", Some(&vlan_info));
144 assert!(result.is_ok());
145
146 let vlan_info = EthernetVlanInfo {
148 vlan_name: "VLAN_2".to_string(),
149 vlan_id: 2,
150 };
151 let result = cluster.create_physical_channel("Channel3", Some(&vlan_info));
152 assert!(result.is_err());
153
154 let vlan_info = EthernetVlanInfo {
156 vlan_name: "VLAN_2".to_string(),
157 vlan_id: 2,
158 };
159 let result = cluster.create_physical_channel("Channel4", Some(&vlan_info));
160 assert!(result.is_ok());
161
162 let vlan_info = EthernetVlanInfo {
164 vlan_name: "VLAN_2".to_string(),
165 vlan_id: 2,
166 };
167 let result = cluster.create_physical_channel("Channel5", Some(&vlan_info));
168 assert!(result.is_err());
169
170 let count = cluster.physical_channels().count();
171 assert_eq!(count, 3);
172 }
173}