autosar_data_abstraction/communication/network_management/
can_nm.rs1use crate::communication::{
2 AbstractNmCluster, AbstractNmClusterCoupling, AbstractNmNode, CanCluster, CanCommunicationController, NmEcu,
3};
4use crate::{AbstractionElement, AutosarAbstractionError, IdentifiableAbstractionElement, abstraction_element};
5use autosar_data::{Element, ElementName};
6
7#[derive(Debug, Clone, PartialEq, Eq, Hash)]
11pub struct CanNmCluster(Element);
12abstraction_element!(CanNmCluster, CanNmCluster);
13impl IdentifiableAbstractionElement for CanNmCluster {}
14
15impl CanNmCluster {
16 pub(crate) fn new(
17 name: &str,
18 parent: &Element,
19 settings: &CanNmClusterSettings,
20 can_cluster: &CanCluster,
21 ) -> Result<Self, AutosarAbstractionError> {
22 let can_nm_cluster_elem = parent.create_named_sub_element(ElementName::CanNmCluster, name)?;
23 let can_nm_cluster = Self(can_nm_cluster_elem);
24
25 can_nm_cluster.set_communication_cluster(can_cluster)?;
26 can_nm_cluster.set_nm_busload_reduction_active(settings.nm_busload_reduction_active)?;
27 can_nm_cluster.set_nm_immediate_nm_transmissions(settings.nm_immediate_nm_transmissions)?;
28 can_nm_cluster.set_nm_message_timeout_time(settings.nm_message_timeout_time)?;
29 can_nm_cluster.set_nm_msg_cycle_time(settings.nm_msg_cycle_time)?;
30 can_nm_cluster.set_nm_network_timeout(settings.nm_network_timeout)?;
31 can_nm_cluster.set_nm_remote_sleep_indication_time(settings.nm_remote_sleep_indication_time)?;
32 can_nm_cluster.set_nm_repeat_message_time(settings.nm_repeat_message_time)?;
33 can_nm_cluster.set_nm_wait_bus_sleep_time(settings.nm_wait_bus_sleep_time)?;
34
35 Ok(can_nm_cluster)
36 }
37
38 pub fn set_nm_busload_reduction_active(
40 &self,
41 nm_busload_reduction_active: bool,
42 ) -> Result<(), AutosarAbstractionError> {
43 self.element()
44 .get_or_create_sub_element(ElementName::NmBusloadReductionActive)?
45 .set_character_data(nm_busload_reduction_active)?;
46 Ok(())
47 }
48
49 #[must_use]
51 pub fn nm_busload_reduction_active(&self) -> Option<bool> {
52 self.element()
53 .get_sub_element(ElementName::NmBusloadReductionActive)
54 .and_then(|elem| elem.character_data())
55 .and_then(|cdata| cdata.parse_bool())
56 }
57
58 pub fn set_nm_immediate_nm_transmissions(
60 &self,
61 nm_immediate_nm_transmissions: u32,
62 ) -> Result<(), AutosarAbstractionError> {
63 self.element()
64 .get_or_create_sub_element(ElementName::NmImmediateNmTransmissions)?
65 .set_character_data(u64::from(nm_immediate_nm_transmissions))?;
66 Ok(())
67 }
68
69 #[must_use]
71 pub fn nm_immediate_nm_transmissions(&self) -> Option<u32> {
72 self.element()
73 .get_sub_element(ElementName::NmImmediateNmTransmissions)
74 .and_then(|elem| elem.character_data())
75 .and_then(|cdata| cdata.parse_integer())
76 }
77
78 pub fn set_nm_message_timeout_time(&self, nm_message_timeout_time: f64) -> Result<(), AutosarAbstractionError> {
80 self.element()
81 .get_or_create_sub_element(ElementName::NmMessageTimeoutTime)?
82 .set_character_data(nm_message_timeout_time)?;
83 Ok(())
84 }
85
86 #[must_use]
88 pub fn nm_message_timeout_time(&self) -> Option<f64> {
89 self.element()
90 .get_sub_element(ElementName::NmMessageTimeoutTime)
91 .and_then(|elem| elem.character_data())
92 .and_then(|cdata| cdata.parse_float())
93 }
94
95 pub fn set_nm_msg_cycle_time(&self, nm_msg_cycle_time: f64) -> Result<(), AutosarAbstractionError> {
97 self.element()
98 .get_or_create_sub_element(ElementName::NmMsgCycleTime)?
99 .set_character_data(nm_msg_cycle_time)?;
100 Ok(())
101 }
102
103 #[must_use]
105 pub fn nm_msg_cycle_time(&self) -> Option<f64> {
106 self.element()
107 .get_sub_element(ElementName::NmMsgCycleTime)
108 .and_then(|elem| elem.character_data())
109 .and_then(|cdata| cdata.parse_float())
110 }
111
112 pub fn set_nm_network_timeout(&self, nm_network_timeout: f64) -> Result<(), AutosarAbstractionError> {
114 self.element()
115 .get_or_create_sub_element(ElementName::NmNetworkTimeout)?
116 .set_character_data(nm_network_timeout)?;
117 Ok(())
118 }
119
120 #[must_use]
122 pub fn nm_network_timeout(&self) -> Option<f64> {
123 self.element()
124 .get_sub_element(ElementName::NmNetworkTimeout)
125 .and_then(|elem| elem.character_data())
126 .and_then(|cdata| cdata.parse_float())
127 }
128
129 pub fn set_nm_remote_sleep_indication_time(
131 &self,
132 nm_remote_sleep_indication_time: f64,
133 ) -> Result<(), AutosarAbstractionError> {
134 self.element()
135 .get_or_create_sub_element(ElementName::NmRemoteSleepIndicationTime)?
136 .set_character_data(nm_remote_sleep_indication_time)?;
137 Ok(())
138 }
139
140 #[must_use]
142 pub fn nm_remote_sleep_indication_time(&self) -> Option<f64> {
143 self.element()
144 .get_sub_element(ElementName::NmRemoteSleepIndicationTime)
145 .and_then(|elem| elem.character_data())
146 .and_then(|cdata| cdata.parse_float())
147 }
148
149 pub fn set_nm_repeat_message_time(&self, nm_repeat_message_time: f64) -> Result<(), AutosarAbstractionError> {
151 self.element()
152 .get_or_create_sub_element(ElementName::NmRepeatMessageTime)?
153 .set_character_data(nm_repeat_message_time)?;
154 Ok(())
155 }
156
157 #[must_use]
159 pub fn nm_repeat_message_time(&self) -> Option<f64> {
160 self.element()
161 .get_sub_element(ElementName::NmRepeatMessageTime)
162 .and_then(|elem| elem.character_data())
163 .and_then(|cdata| cdata.parse_float())
164 }
165
166 pub fn set_nm_wait_bus_sleep_time(&self, nm_wait_bus_sleep_time: f64) -> Result<(), AutosarAbstractionError> {
168 self.element()
169 .get_or_create_sub_element(ElementName::NmWaitBusSleepTime)?
170 .set_character_data(nm_wait_bus_sleep_time)?;
171 Ok(())
172 }
173
174 #[must_use]
176 pub fn nm_wait_bus_sleep_time(&self) -> Option<f64> {
177 self.element()
178 .get_sub_element(ElementName::NmWaitBusSleepTime)
179 .and_then(|elem| elem.character_data())
180 .and_then(|cdata| cdata.parse_float())
181 }
182
183 pub fn create_can_nm_node(
185 &self,
186 name: &str,
187 controller: &CanCommunicationController,
188 nm_ecu: &NmEcu,
189 ) -> Result<CanNmNode, AutosarAbstractionError> {
190 let nm_nodes = self.element().get_or_create_sub_element(ElementName::NmNodes)?;
191 CanNmNode::new(name, &nm_nodes, controller, nm_ecu)
192 }
193}
194
195impl AbstractNmCluster for CanNmCluster {
196 type CommunicationClusterType = CanCluster;
197 type NmNodeType = CanNmNode;
198}
199
200#[derive(Debug, Clone, PartialEq)]
207pub struct CanNmClusterSettings {
208 pub nm_busload_reduction_active: bool,
210 pub nm_immediate_nm_transmissions: u32,
213 pub nm_message_timeout_time: f64,
215 pub nm_msg_cycle_time: f64,
217 pub nm_network_timeout: f64,
219 pub nm_remote_sleep_indication_time: f64,
221 pub nm_repeat_message_time: f64,
223 pub nm_wait_bus_sleep_time: f64,
225}
226
227#[derive(Debug, Clone, PartialEq, Eq, Hash)]
231pub struct CanNmClusterCoupling(Element);
232abstraction_element!(CanNmClusterCoupling, CanNmClusterCoupling);
233
234impl CanNmClusterCoupling {
235 pub(crate) fn new(
236 parent: &Element,
237 nm_busload_reduction_enabled: bool,
238 nm_immediate_restart_enabled: bool,
239 ) -> Result<Self, AutosarAbstractionError> {
240 let nm_cluster_coupling_elem = parent.create_sub_element(ElementName::CanNmClusterCoupling)?;
241 let nm_cluster_coupling = Self(nm_cluster_coupling_elem);
242 nm_cluster_coupling.set_nm_busload_reduction_enabled(nm_busload_reduction_enabled)?;
243 nm_cluster_coupling.set_nm_immediate_restart_enabled(nm_immediate_restart_enabled)?;
244
245 Ok(nm_cluster_coupling)
246 }
247
248 pub fn set_nm_busload_reduction_enabled(
250 &self,
251 nm_busload_reduction_enabled: bool,
252 ) -> Result<(), AutosarAbstractionError> {
253 self.element()
254 .get_or_create_sub_element(ElementName::NmBusloadReductionEnabled)?
255 .set_character_data(nm_busload_reduction_enabled)?;
256 Ok(())
257 }
258
259 #[must_use]
261 pub fn nm_busload_reduction_enabled(&self) -> Option<bool> {
262 self.element()
263 .get_sub_element(ElementName::NmBusloadReductionEnabled)
264 .and_then(|elem| elem.character_data())
265 .and_then(|cdata| cdata.parse_bool())
266 }
267
268 pub fn set_nm_immediate_restart_enabled(
270 &self,
271 nm_immediate_restart_enabled: bool,
272 ) -> Result<(), AutosarAbstractionError> {
273 self.element()
274 .get_or_create_sub_element(ElementName::NmImmediateRestartEnabled)?
275 .set_character_data(nm_immediate_restart_enabled)?;
276 Ok(())
277 }
278
279 #[must_use]
281 pub fn nm_immediate_restart_enabled(&self) -> Option<bool> {
282 self.element()
283 .get_sub_element(ElementName::NmImmediateRestartEnabled)
284 .and_then(|elem| elem.character_data())
285 .and_then(|cdata| cdata.parse_bool())
286 }
287}
288
289impl AbstractNmClusterCoupling for CanNmClusterCoupling {
290 type NmClusterType = CanNmCluster;
291}
292
293#[derive(Debug, Clone, PartialEq, Eq, Hash)]
299pub struct CanNmNode(Element);
300abstraction_element!(CanNmNode, CanNmNode);
301impl IdentifiableAbstractionElement for CanNmNode {}
302
303impl CanNmNode {
304 pub(crate) fn new(
305 name: &str,
306 parent: &Element,
307 controller: &CanCommunicationController,
308 nm_ecu: &NmEcu,
309 ) -> Result<Self, AutosarAbstractionError> {
310 let can_nm_node_elem = parent.create_named_sub_element(ElementName::CanNmNode, name)?;
311 let can_nm_ecu = Self(can_nm_node_elem);
312 can_nm_ecu.set_communication_controller(controller)?;
313 can_nm_ecu.set_nm_ecu(nm_ecu)?;
314
315 Ok(can_nm_ecu)
316 }
317}
318
319impl AbstractNmNode for CanNmNode {
320 type CommunicationControllerType = CanCommunicationController;
321}