Skip to content

Commit e6e0056

Browse files
committed
Implement DataReceivedEvent
- Implement DataReceivedEvent - Fixed element names in RModeInAtomicSwcInstanceRef
1 parent f33764e commit e6e0056

6 files changed

+246
-44
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ Non-collectable elements are various sub-elements to collectable elements.
1212
#### XML - Software component elements
1313

1414
* RModeInAtomicSwcInstanceRef | R-MODE-IN-ATOMIC-SWC-INSTANCE-REF
15+
* RVariableInAtomicSwcInstanceRef | R-VARIABLE-IN-ATOMIC-SWC-INSTANCE-REF
1516

1617
#### XML - SWC internal behavior elements
1718

19+
* DataReceivedEvent | DATA-RECEIVED-EVENT
1820
* InitEvent | INIT-EVENT
1921
* InternalBehavior | SWC-INTERNAL-BEHAVIOR (Partly implemented)
2022
* RunnableEntity | RUNNABLE-ENTITY

src/autosar/xml/element.py

+69-13
Original file line numberDiff line numberDiff line change
@@ -5233,19 +5233,40 @@ class RModeInAtomicSwcInstanceRef(ARObject):
52335233
"""
52345234

52355235
def __init__(self,
5236-
context_port_ref: AbstractRequiredPortPrototypeRef | None = None,
5237-
context_mode_declaration_group_prototype_ref: ModeDeclarationGroupPrototypeRef | None = None,
5238-
target_mode_declaration_ref: ModeDeclarationRef | None = None,
5236+
context_port: AbstractRequiredPortPrototypeRef | None = None,
5237+
context_mode_declaration_group_prototype: ModeDeclarationGroupPrototypeRef | None = None,
5238+
target_mode_declaration: ModeDeclarationRef | None = None,
52395239
) -> None:
5240-
self.context_port_ref: AbstractRequiredPortPrototypeRef | None = None # .CONTEXT-PORT-REF
5240+
# .CONTEXT-PORT-REF
5241+
self.context_port: AbstractRequiredPortPrototypeRef | None = None
52415242
# .CONTEXT-MODE-DECLARATION-GROUP-PROTOTYPE-REF
5242-
self.context_mode_declaration_group_prototype_ref: ModeDeclarationGroupPrototypeRef | None = None
5243-
self.target_mode_declaration_ref: ModeDeclarationRef | None = None # .TARGET-MODE-DECLARATION-REF
5244-
self._assign_optional("context_port_ref", context_port_ref, AbstractRequiredPortPrototypeRef)
5245-
self._assign_optional("context_mode_declaration_group_prototype_ref",
5246-
context_mode_declaration_group_prototype_ref,
5243+
self.context_mode_declaration_group_prototype: ModeDeclarationGroupPrototypeRef | None = None
5244+
# .TARGET-MODE-DECLARATION-REF
5245+
self.target_mode_declaration: ModeDeclarationRef | None = None
5246+
self._assign_optional("context_port", context_port, AbstractRequiredPortPrototypeRef)
5247+
self._assign_optional("context_mode_declaration_group_prototype",
5248+
context_mode_declaration_group_prototype,
52475249
ModeDeclarationGroupPrototypeRef)
5248-
self._assign_optional("target_mode_declaration_ref", target_mode_declaration_ref, ModeDeclarationRef)
5250+
self._assign_optional("target_mode_declaration", target_mode_declaration, ModeDeclarationRef)
5251+
5252+
5253+
class RVariableInAtomicSwcInstanceRef(ARObject):
5254+
"""
5255+
Complex type AR:R-VARIABLE-IN-ATOMIC-SWC-INSTANCE-REF
5256+
Tag variants: 'DATA-IREF'
5257+
"""
5258+
5259+
def __init__(self,
5260+
context_port: AbstractRequiredPortPrototypeRef | None = None,
5261+
target_data_element: VariableDataPrototypeRef | str | None = None,
5262+
) -> None:
5263+
# .CONTEXT-R-PORT-REF (Use same name as in RModeInAtomicSwcInstanceRef for consistency)
5264+
self.context_port: AbstractRequiredPortPrototypeRef | None = None
5265+
# .TARGET-DATA-ELEMENT-REF
5266+
self.target_data_element: VariableDataPrototypeRef | None = None
5267+
self._assign_optional("context_port", context_port, AbstractRequiredPortPrototypeRef)
5268+
self._assign_optional("target_data_element", target_data_element, VariableDataPrototypeRef)
5269+
52495270

52505271
# --- SWC internal behavior elements
52515272

@@ -5585,12 +5606,14 @@ class RteEvent(Identifiable):
55855606

55865607
def __init__(self,
55875608
name: str,
5588-
disabled_modes: RModeInAtomicSwcInstanceRef | list[RModeInAtomicSwcInstanceRef] | None = None,
55895609
start_on_event: RunnableEntityRef | None = None,
5610+
disabled_modes: RModeInAtomicSwcInstanceRef | list[RModeInAtomicSwcInstanceRef] | None = None,
55905611
**kwargs) -> None:
55915612
super().__init__(name, **kwargs)
5592-
self.disabled_modes: list[RModeInAtomicSwcInstanceRef] = [] # .DISABLED-MODE-IREFS
5593-
self.start_on_event: RunnableEntityRef | None = None # .START-ON-EVENT-REF
5613+
# .DISABLED-MODE-IREFS
5614+
self.disabled_modes: list[RModeInAtomicSwcInstanceRef] = []
5615+
# .START-ON-EVENT-REF
5616+
self.start_on_event: RunnableEntityRef | None = None
55945617
if disabled_modes is not None:
55955618
if isinstance(disabled_modes, RModeInAtomicSwcInstanceRef):
55965619
self.append_disabled_mode(disabled_modes)
@@ -5609,6 +5632,39 @@ def append_disabled_mode(self, disabled_mode: RModeInAtomicSwcInstanceRef) -> No
56095632
raise TypeError("disabled_mode must be of type RModeInAtomicSwcInstanceRef")
56105633

56115634

5635+
class DataReceivedEvent(RteEvent):
5636+
"""
5637+
Complex Type AR:DATA-RECEIVED-EVENT
5638+
Tag variants: 'DATA-RECEIVED-EVENT'
5639+
"""
5640+
5641+
def __init__(self,
5642+
name: str,
5643+
start_on_event: RunnableEntityRef | str | None = None,
5644+
data: RVariableInAtomicSwcInstanceRef | None = None,
5645+
**kwargs) -> None:
5646+
super().__init__(name, start_on_event, **kwargs)
5647+
# .DATA-IREF
5648+
self.data: RVariableInAtomicSwcInstanceRef | None = None
5649+
self._assign_optional_strict("data", data, RVariableInAtomicSwcInstanceRef)
5650+
5651+
@classmethod
5652+
def make(cls,
5653+
name: str,
5654+
start_on_event: RunnableEntityRef | str | None = None,
5655+
context_port: AbstractRequiredPortPrototypeRef | None = None,
5656+
target_data_element: VariableDataPrototypeRef | str | None = None,
5657+
**kwargs) -> "DataReceivedEvent":
5658+
"""
5659+
#convenience-method
5660+
5661+
Simplified creation method that automatically creates
5662+
and uses the necessary RVariableInAtomicSwcInstanceRef object
5663+
"""
5664+
data = RVariableInAtomicSwcInstanceRef(context_port, target_data_element)
5665+
return cls(name, start_on_event, data, **kwargs)
5666+
5667+
56125668
class InitEvent(RteEvent):
56135669
"""
56145670
Complex Type AR:INIT-EVENT

src/autosar/xml/reader.py

+42-3
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,9 @@ def __init__(self,
269269
'DISABLED-MODE-IREF': self._read_rmode_in_atomic_swc_instance_ref,
270270
'SWC-INTERNAL-BEHAVIOR': self._read_swc_internal_behavior,
271271
'RUNNABLE-ENTITY': self._read_runnable_entity,
272+
'DATA-RECEIVED-EVENT': self._read_data_received_event,
272273
'INIT-EVENT': self._read_init_event,
274+
273275
}
274276
self.switcher_all = {}
275277
self.switcher_all.update(self.switcher_collectable)
@@ -4287,17 +4289,35 @@ def _read_rmode_in_atomic_swc_instance_ref(self,
42874289
child_elements = ChildElementMap(xml_element)
42884290
xml_child = child_elements.get("CONTEXT-PORT-REF")
42894291
if xml_child is not None:
4290-
data["context_port_ref"] = self._read_abstract_required_port_prototype_ref(xml_child)
4292+
data["context_port"] = self._read_abstract_required_port_prototype_ref(xml_child)
42914293
xml_child = child_elements.get("CONTEXT-MODE-DECLARATION-GROUP-PROTOTYPE-REF")
42924294
if xml_child is not None:
42934295
child_element = self._read_mode_declaration_group_prototype_ref(xml_child)
4294-
data["context_mode_declaration_group_prototype_ref"] = child_element
4296+
data["context_mode_declaration_group_prototype"] = child_element
42954297
xml_child = child_elements.get("TARGET-MODE-DECLARATION-REF")
42964298
if xml_child is not None:
4297-
data["target_mode_declaration_ref"] = self._read_mode_declaration_ref(xml_child)
4299+
data["target_mode_declaration"] = self._read_mode_declaration_ref(xml_child)
42984300
self._report_unprocessed_elements(child_elements)
42994301
return ar_element.RModeInAtomicSwcInstanceRef(**data)
43004302

4303+
def _read_rvariable_in_atomic_swc_instance_ref(self,
4304+
xml_element: ElementTree.Element
4305+
) -> ar_element.RVariableInAtomicSwcInstanceRef:
4306+
"""
4307+
Reads complex type AR:R-VARIABLE-IN-ATOMIC-SWC-INSTANCE-REF
4308+
Tag variants: 'DATA-IREF'
4309+
"""
4310+
data = {}
4311+
child_elements = ChildElementMap(xml_element)
4312+
xml_child = child_elements.get("CONTEXT-R-PORT-REF")
4313+
if xml_child is not None:
4314+
data["context_port"] = self._read_abstract_required_port_prototype_ref(xml_child)
4315+
xml_child = child_elements.get("TARGET-DATA-ELEMENT-REF")
4316+
if xml_child is not None:
4317+
data["target_data_element"] = self._read_variable_data_prototype_ref(xml_child)
4318+
self._report_unprocessed_elements(child_elements)
4319+
return ar_element.RVariableInAtomicSwcInstanceRef(**data)
4320+
43014321
# --- Internal Behavior elements
43024322

43034323
def _read_variable_in_impl_data_instance_ref(self,
@@ -4563,6 +4583,25 @@ def _read_rte_event(self, child_elements: ChildElementMap, data: dict) -> None:
45634583
data["start_on_event"] = self._read_runnable_entity_ref(xml_child)
45644584
child_elements.skip("VARIATION-POINT") # Not supported
45654585

4586+
def _read_data_received_event(self,
4587+
xml_element: ElementTree.Element
4588+
) -> ar_element.DataReceivedEvent:
4589+
"""
4590+
Reads complex Type AR:DATA-RECEIVED-EVENT
4591+
Tag variants: 'DATA-RECEIVED-EVENT'
4592+
"""
4593+
data = {}
4594+
child_elements = ChildElementMap(xml_element)
4595+
self._read_referrable(child_elements, data)
4596+
self._read_multi_language_referrable(child_elements, data)
4597+
self._read_identifiable(child_elements, xml_element.attrib, data)
4598+
self._read_rte_event(child_elements, data)
4599+
xml_child = child_elements.get("DATA-IREF")
4600+
if xml_child is not None:
4601+
data["data"] = self._read_rvariable_in_atomic_swc_instance_ref(xml_child)
4602+
self._report_unprocessed_elements(child_elements)
4603+
return ar_element.DataReceivedEvent(**data)
4604+
45664605
def _read_init_event(self,
45674606
xml_element: ElementTree.Element
45684607
) -> ar_element.InitEvent:

src/autosar/xml/writer.py

+43-8
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ def __init__(self,
340340
'ExecutableEntityActivationReason': self._write_executable_entity_activation_reason,
341341
'ExclusiveAreaRefConditional': self._write_exclusive_area_ref_conditional,
342342
'RunnableEntity': self._write_runnable_entity,
343+
'DataReceivedEvent': self._write_data_received_event,
343344
'InitEvent': self._write_init_event,
344345

345346
}
@@ -3692,24 +3693,43 @@ def _write_swc_implementation_group(self, elem: ar_element.SwcImplementation) ->
36923693

36933694
def _write_rmode_in_atomic_swc_instance_ref(self, elem: ar_element.RModeInAtomicSwcInstanceRef, tag: str) -> None:
36943695
"""
3695-
Complex type AR:R-MODE-IN-ATOMIC-SWC-INSTANCE-REF
3696+
Writes complex type AR:R-MODE-IN-ATOMIC-SWC-INSTANCE-REF
36963697
Tag variants: 'DISABLED-MODE-IREF' | 'MODE-IREF'
36973698
"""
36983699
assert isinstance(elem, ar_element.RModeInAtomicSwcInstanceRef)
36993700
if elem.is_empty:
37003701
self._add_content(tag)
37013702
else:
37023703
self._add_child(tag)
3703-
if elem.context_port_ref is not None:
3704-
self._write_abstract_required_port_prototype_ref(elem.context_port_ref, "CONTEXT-PORT-REF")
3705-
if elem.context_mode_declaration_group_prototype_ref is not None:
3706-
self._write_mode_declaration_group_prototype_ref(elem.context_mode_declaration_group_prototype_ref,
3704+
if elem.context_port is not None:
3705+
self._write_abstract_required_port_prototype_ref(elem.context_port, "CONTEXT-PORT-REF")
3706+
if elem.context_mode_declaration_group_prototype is not None:
3707+
self._write_mode_declaration_group_prototype_ref(elem.context_mode_declaration_group_prototype,
37073708
"CONTEXT-MODE-DECLARATION-GROUP-PROTOTYPE-REF")
3708-
if elem.target_mode_declaration_ref is not None:
3709-
self._write_mode_declaration_ref(elem.target_mode_declaration_ref, "TARGET-MODE-DECLARATION-REF")
3709+
if elem.target_mode_declaration is not None:
3710+
self._write_mode_declaration_ref(elem.target_mode_declaration, "TARGET-MODE-DECLARATION-REF")
37103711
self._leave_child()
37113712

3712-
# SWC Internal behavior elements
3713+
def _write_rvariable_in_atomic_swc_instance_ref(self,
3714+
elem: ar_element.RVariableInAtomicSwcInstanceRef
3715+
) -> None:
3716+
"""
3717+
Writes complex type AR:R-VARIABLE-IN-ATOMIC-SWC-INSTANCE-REF
3718+
Tag variants: 'DATA-IREF'
3719+
"""
3720+
assert isinstance(elem, ar_element.RVariableInAtomicSwcInstanceRef)
3721+
tag = "DATA-IREF"
3722+
if elem.is_empty:
3723+
self._add_content(tag)
3724+
else:
3725+
self._add_child(tag)
3726+
if elem.context_port is not None:
3727+
self._write_abstract_required_port_prototype_ref(elem.context_port, "CONTEXT-R-PORT-REF")
3728+
if elem.target_data_element is not None:
3729+
self._write_variable_data_prototype_ref(elem.target_data_element, "TARGET-DATA-ELEMENT-REF")
3730+
self._leave_child()
3731+
3732+
# --- SWC Internal behavior elements
37133733

37143734
def _write_variable_in_impl_data_instance_ref(self,
37153735
elem: ar_element.ArVariableInImplementationDataInstanceRef,
@@ -3917,6 +3937,21 @@ def _write_rte_event(self, elem: ar_element.RteEvent) -> None:
39173937
if elem.start_on_event is not None:
39183938
self._write_runnable_entity_ref(elem.start_on_event, "START-ON-EVENT-REF")
39193939

3940+
def _write_data_received_event(self, elem: ar_element.DataReceivedEvent) -> None:
3941+
"""
3942+
Writes complex Type AR:DATA-RECEIVED-EVENT
3943+
Tag variants: 'DATA-RECEIVED-EVENT'
3944+
"""
3945+
assert isinstance(elem, ar_element.DataReceivedEvent)
3946+
self._add_child("DATA-RECEIVED-EVENT")
3947+
self._write_referrable(elem)
3948+
self._write_multilanguage_referrable(elem)
3949+
self._write_identifiable(elem)
3950+
self._write_rte_event(elem)
3951+
if elem.data is not None:
3952+
self._write_rvariable_in_atomic_swc_instance_ref(elem.data)
3953+
self._leave_child()
3954+
39203955
def _write_init_event(self, elem: ar_element.InitEvent) -> None:
39213956
"""
39223957
Writes complex type AR:INIT-EVENT

tests/xml/test_software_component_elements.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -2066,10 +2066,10 @@ def test_empty(self):
20662066
elem: ar_element.RModeInAtomicSwcInstanceRef = reader.read_str_elem(xml)
20672067
self.assertIsInstance(elem, ar_element.RModeInAtomicSwcInstanceRef)
20682068

2069-
def test_context_port_ref(self):
2069+
def test_context_port(self):
20702070
ref_str = "/Components/ComponentName/RequirePortName"
20712071
port_ref = ar_element.PortPrototypeRef(ref_str, ar_enum.IdentifiableSubTypes.R_PORT_PROTOTYPE)
2072-
element = ar_element.RModeInAtomicSwcInstanceRef(context_port_ref=port_ref)
2072+
element = ar_element.RModeInAtomicSwcInstanceRef(context_port=port_ref)
20732073
writer = autosar.xml.Writer()
20742074
xml = f'''<DISABLED-MODE-IREF>
20752075
<CONTEXT-PORT-REF DEST="R-PORT-PROTOTYPE">{ref_str}</CONTEXT-PORT-REF>
@@ -2078,13 +2078,13 @@ def test_context_port_ref(self):
20782078
reader = autosar.xml.Reader()
20792079
elem: ar_element.RModeInAtomicSwcInstanceRef = reader.read_str_elem(xml)
20802080
self.assertIsInstance(elem, ar_element.RModeInAtomicSwcInstanceRef)
2081-
self.assertEqual(str(elem.context_port_ref), ref_str)
2082-
self.assertEqual(elem.context_port_ref.dest, ar_enum.IdentifiableSubTypes.R_PORT_PROTOTYPE)
2081+
self.assertEqual(str(elem.context_port), ref_str)
2082+
self.assertEqual(elem.context_port.dest, ar_enum.IdentifiableSubTypes.R_PORT_PROTOTYPE)
20832083

2084-
def test_context_mode_declaration_group_prototype_ref(self):
2084+
def test_context_mode_declaration_group_prototype(self):
20852085
ref_str = "/ModeDeclarationGroups/ModeDeclarationGroupName"
20862086
mode_decl_ref = ar_element.ModeDeclarationGroupPrototypeRef(ref_str)
2087-
element = ar_element.RModeInAtomicSwcInstanceRef(context_mode_declaration_group_prototype_ref=mode_decl_ref)
2087+
element = ar_element.RModeInAtomicSwcInstanceRef(context_mode_declaration_group_prototype=mode_decl_ref)
20882088
writer = autosar.xml.Writer()
20892089
tag = "CONTEXT-MODE-DECLARATION-GROUP-PROTOTYPE-REF"
20902090
xml = f'''<DISABLED-MODE-IREF>
@@ -2094,12 +2094,12 @@ def test_context_mode_declaration_group_prototype_ref(self):
20942094
reader = autosar.xml.Reader()
20952095
elem: ar_element.RModeInAtomicSwcInstanceRef = reader.read_str_elem(xml)
20962096
self.assertIsInstance(elem, ar_element.RModeInAtomicSwcInstanceRef)
2097-
self.assertEqual(str(elem.context_mode_declaration_group_prototype_ref), ref_str)
2097+
self.assertEqual(str(elem.context_mode_declaration_group_prototype), ref_str)
20982098

2099-
def test_target_mode_declaration_ref(self):
2099+
def test_target_mode_declaration(self):
21002100
ref_str = "/ModeDeclarationGroups/ModeDeclarationGroupName/ModeName"
21012101
mode_ref = ar_element.ModeDeclarationRef(ref_str)
2102-
element = ar_element.RModeInAtomicSwcInstanceRef(target_mode_declaration_ref=mode_ref)
2102+
element = ar_element.RModeInAtomicSwcInstanceRef(target_mode_declaration=mode_ref)
21032103
writer = autosar.xml.Writer()
21042104
xml = f'''<DISABLED-MODE-IREF>
21052105
<TARGET-MODE-DECLARATION-REF DEST="MODE-DECLARATION">{ref_str}</TARGET-MODE-DECLARATION-REF>
@@ -2108,7 +2108,7 @@ def test_target_mode_declaration_ref(self):
21082108
reader = autosar.xml.Reader()
21092109
elem: ar_element.RModeInAtomicSwcInstanceRef = reader.read_str_elem(xml)
21102110
self.assertIsInstance(elem, ar_element.RModeInAtomicSwcInstanceRef)
2111-
self.assertEqual(str(elem.target_mode_declaration_ref), ref_str)
2111+
self.assertEqual(str(elem.target_mode_declaration), ref_str)
21122112

21132113

21142114
if __name__ == '__main__':

0 commit comments

Comments
 (0)