Skip to content

Commit f33764e

Browse files
committed
Implement InitEvent
- Implement InitEvent and its base class RteEvent - Add linux versions of test scripts
1 parent 63aee5f commit f33764e

12 files changed

+476
-13
lines changed

CHANGELOG.md

+12
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ Non-collectable elements are various sub-elements to collectable elements.
77

88
## [Unreleased]
99

10+
### Added
11+
12+
#### XML - Software component elements
13+
14+
* RModeInAtomicSwcInstanceRef | R-MODE-IN-ATOMIC-SWC-INSTANCE-REF
15+
16+
#### XML - SWC internal behavior elements
17+
18+
* InitEvent | INIT-EVENT
19+
* InternalBehavior | SWC-INTERNAL-BEHAVIOR (Partly implemented)
20+
* RunnableEntity | RUNNABLE-ENTITY
21+
1022
### Fixed
1123

1224
* Fixed parsing error on elements containing `ADMIN-DATA`.

run_examples.sh

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
python examples/xml/data_types/application_data_type.py
2+
python examples/xml/data_types/compu_method_rational.py
3+
python examples/xml/data_types/compu_method_value_table.py
4+
python examples/xml/data_types/implementation_data_type.py
5+
python examples/xml/data_types/sw_addr_method.py
6+
python examples/xml/data_types/sw_base_type.py
7+
python examples/xml/constant/create_constants.py
8+
python examples/xml/unit/unit.py
9+
python examples/xml/port_interface/nv_data_interface.py
10+
python examples/xml/port_interface/parameter_interface.py
11+
python examples/xml/port_interface/sender_receiver_interface.py
12+
python examples/xml/port_interface/client_server_interface.py
13+
python examples/xml/port_interface/mode_switch_interface.py
14+
python examples/xml/component/application_component.py
15+
python examples/xml/component/composition_component.py
16+
python examples/xml/reader/print_errors.py
17+
python examples/template/generate_xml_using_config.py
18+
python examples/template/generate_xml_without_config.py
19+
python examples/generator/data_types/gen_type_defs_scalar.py
20+
python examples/generator/data_types/gen_type_defs_array.py
21+
python examples/generator/data_types/gen_type_defs_record.py

run_flake.sh

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
flake8 --max-line-length=120 --ignore=D107,D200,D205,D400,D401 src
2+
flake8 --max-line-length=120 --ignore=D101,D102,D107,D200,D205,D400,D401,E402 tests
3+
flake8 --max-line-length=120 --ignore=D107,D200,D205,D400,D401 examples

run_tests.sh

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
python -m unittest discover -v tests test_*.py

src/autosar/xml/base.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def _check_and_set_reference(self, attr_name: str, value: Any, ref_type: Type["B
127127
new_value = ref_type(value.value, value.dest)
128128
else:
129129
raise TypeError(f"'{attr_name}': Reference type {str(type(value))}"
130-
f"isn't combatible with {str(ref_type)}")
130+
f"is incombatible with {str(ref_type)}")
131131
else:
132132
raise TypeError(f"'{attr_name}': Invalid type. "
133133
f"Expected one of (str, {str(ref_type)}), got '{str(type(value))}'")

src/autosar/xml/element.py

+58-11
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from autosar.xml.base import ARObject, BaseRef
1212
import autosar.xml.enumeration as ar_enum
1313
import autosar.xml.exception as ar_except
14-
from autosar.xml.reference import (SwBaseTypeRef,
14+
from autosar.xml.reference import (SwBaseTypeRef, # noqa F401
1515
PackageRef,
1616
CompuMethodRef,
1717
FunctionPtrSignatureRef,
@@ -44,6 +44,8 @@
4444
SwcImplementationRef,
4545
ExclusiveAreaRef,
4646
ExclusiveAreaNestingOrderRef,
47+
AbstractRequiredPortPrototypeRef,
48+
RunnableEntityRef,
4749
)
4850

4951

@@ -5223,6 +5225,28 @@ def _create_pass_through_connector(self,
52235225
self.connectors.append(connector)
52245226
return connector
52255227

5228+
5229+
class RModeInAtomicSwcInstanceRef(ARObject):
5230+
"""
5231+
Complex type AR:R-MODE-IN-ATOMIC-SWC-INSTANCE-REF
5232+
Tag variants: 'DISABLED-MODE-IREF' | 'MODE-IREF'
5233+
"""
5234+
5235+
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,
5239+
) -> None:
5240+
self.context_port_ref: AbstractRequiredPortPrototypeRef | None = None # .CONTEXT-PORT-REF
5241+
# .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,
5247+
ModeDeclarationGroupPrototypeRef)
5248+
self._assign_optional("target_mode_declaration_ref", target_mode_declaration_ref, ModeDeclarationRef)
5249+
52265250
# --- SWC internal behavior elements
52275251

52285252

@@ -5511,7 +5535,7 @@ def append_activation_reason(self, activation_reason: ExecutableEntityActivation
55115535

55125536
def append_can_enter_leave(self, value: ExclusiveAreaElementArgumentType) -> None:
55135537
"""
5514-
Tthe executable entity can enter/leave the referenced exclusive area through explicit API calls
5538+
The executable entity can enter/leave the referenced exclusive area through explicit API calls
55155539
"""
55165540
if isinstance(value, ExclusiveAreaRefConditional):
55175541
self.can_enter_leave.append(value)
@@ -5522,7 +5546,7 @@ def append_can_enter_leave(self, value: ExclusiveAreaElementArgumentType) -> Non
55225546

55235547
def append_exclusive_area_nesting_order(self, exclusive_area_nesting_order: ExclusiveAreaNestingOrderRef) -> None:
55245548
"""
5525-
Appends exclusive area reference to internal can_enter_leave list
5549+
Appends exclusive area reference to internal list of nesting orders
55265550
"""
55275551
if isinstance(exclusive_area_nesting_order, ExclusiveAreaNestingOrderRef):
55285552
self.exclusive_area_nesting_order.append(exclusive_area_nesting_order)
@@ -5554,19 +5578,42 @@ def __init__(self,
55545578
super().__init__(name, **kwargs)
55555579

55565580

5557-
# --- Future stuff
5558-
5559-
5560-
class RModeInAtomicSwcInstanceRef(ARObject):
5581+
class RteEvent(Identifiable):
55615582
"""
5562-
Complex type AR:R-MODE-IN-ATOMIC-SWC-INSTANCE-REF
5563-
Tag variants: 'DISABLED-MODE-IREF' | 'MODE-IREF'
5583+
Group AR:RTE-EVENT
55645584
"""
55655585

5586+
def __init__(self,
5587+
name: str,
5588+
disabled_modes: RModeInAtomicSwcInstanceRef | list[RModeInAtomicSwcInstanceRef] | None = None,
5589+
start_on_event: RunnableEntityRef | None = None,
5590+
**kwargs) -> None:
5591+
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
5594+
if disabled_modes is not None:
5595+
if isinstance(disabled_modes, RModeInAtomicSwcInstanceRef):
5596+
self.append_disabled_mode(disabled_modes)
5597+
elif isinstance(disabled_modes, list):
5598+
for disabled_mode in disabled_modes:
5599+
self.append_disabled_mode(disabled_mode)
5600+
self._assign_optional("start_on_event", start_on_event, RunnableEntityRef)
5601+
5602+
def append_disabled_mode(self, disabled_mode: RModeInAtomicSwcInstanceRef) -> None:
5603+
"""
5604+
Adds reference to the modes that disable the event
5605+
"""
5606+
if isinstance(disabled_mode, RModeInAtomicSwcInstanceRef):
5607+
self.disabled_modes.append(disabled_mode)
5608+
else:
5609+
raise TypeError("disabled_mode must be of type RModeInAtomicSwcInstanceRef")
55665610

5567-
class RTEEvent(Identifiable):
5611+
5612+
class InitEvent(RteEvent):
55685613
"""
5569-
Group AR:RTE-EVENT
5614+
Complex Type AR:INIT-EVENT
5615+
Tag variants: 'INIT-EVENT'
5616+
Reuses constructor from base-class
55705617
"""
55715618

55725619

src/autosar/xml/reader.py

+77
Original file line numberDiff line numberDiff line change
@@ -266,8 +266,10 @@ def __init__(self,
266266
'VARIABLE-ACCESS': self._read_variable_access,
267267
'EXECUTABLE-ENTITY-ACTIVATION-REASON': self._read_executable_entity_activation_reason,
268268
'EXCLUSIVE-AREA-REF-CONDITIONAL': self._read_exclusive_area_ref_conditional,
269+
'DISABLED-MODE-IREF': self._read_rmode_in_atomic_swc_instance_ref,
269270
'SWC-INTERNAL-BEHAVIOR': self._read_swc_internal_behavior,
270271
'RUNNABLE-ENTITY': self._read_runnable_entity,
272+
'INIT-EVENT': self._read_init_event,
271273
}
272274
self.switcher_all = {}
273275
self.switcher_all.update(self.switcher_collectable)
@@ -2606,6 +2608,28 @@ def _read_exclusive_area_nesting_order_ref(self,
26062608
dest_enum = ar_enum.xml_to_enum('IdentifiableSubTypes', data['dest'], self.schema_version)
26072609
return ar_element.ExclusiveAreaNestingOrderRef(xml_elem.text, dest_enum)
26082610

2611+
def _read_abstract_required_port_prototype_ref(self,
2612+
xml_elem: ElementTree.Element
2613+
) -> ar_element.AbstractRequiredPortPrototypeRef:
2614+
"""
2615+
Reads references to AR:ABSTRACT-REQUIRED-PORT-PROTOTYPE--SUBTYPES-ENUM
2616+
"""
2617+
data = {}
2618+
self._read_base_ref_attributes(xml_elem.attrib, data)
2619+
dest_enum = ar_enum.xml_to_enum('IdentifiableSubTypes', data['dest'], self.schema_version)
2620+
return ar_element.AbstractRequiredPortPrototypeRef(xml_elem.text, dest_enum)
2621+
2622+
def _read_runnable_entity_ref(self,
2623+
xml_elem: ElementTree.Element
2624+
) -> ar_element.RunnableEntityRef:
2625+
"""
2626+
Reads references to RUNNABLE-ENTITY--SUBTYPES-ENUM
2627+
"""
2628+
data = {}
2629+
self._read_base_ref_attributes(xml_elem.attrib, data)
2630+
dest_enum = ar_enum.xml_to_enum('IdentifiableSubTypes', data['dest'], self.schema_version)
2631+
return ar_element.RunnableEntityRef(xml_elem.text, dest_enum)
2632+
26092633
# --- Constant and value specifications
26102634

26112635
def _read_text_value_specification(self,
@@ -4252,6 +4276,28 @@ def _read_swc_implementation_group(self, child_elements: ChildElementMap, data:
42524276
if xml_child is not None:
42534277
data["required_rte_vendor"] = xml_child.text
42544278

4279+
def _read_rmode_in_atomic_swc_instance_ref(self,
4280+
xml_element: ElementTree.Element
4281+
) -> ar_element.RModeInAtomicSwcInstanceRef:
4282+
"""
4283+
Reads complex type AR:R-MODE-IN-ATOMIC-SWC-INSTANCE-REF
4284+
Tag variants: 'DISABLED-MODE-IREF' | 'MODE-IREF'
4285+
"""
4286+
data = {}
4287+
child_elements = ChildElementMap(xml_element)
4288+
xml_child = child_elements.get("CONTEXT-PORT-REF")
4289+
if xml_child is not None:
4290+
data["context_port_ref"] = self._read_abstract_required_port_prototype_ref(xml_child)
4291+
xml_child = child_elements.get("CONTEXT-MODE-DECLARATION-GROUP-PROTOTYPE-REF")
4292+
if xml_child is not None:
4293+
child_element = self._read_mode_declaration_group_prototype_ref(xml_child)
4294+
data["context_mode_declaration_group_prototype_ref"] = child_element
4295+
xml_child = child_elements.get("TARGET-MODE-DECLARATION-REF")
4296+
if xml_child is not None:
4297+
data["target_mode_declaration_ref"] = self._read_mode_declaration_ref(xml_child)
4298+
self._report_unprocessed_elements(child_elements)
4299+
return ar_element.RModeInAtomicSwcInstanceRef(**data)
4300+
42554301
# --- Internal Behavior elements
42564302

42574303
def _read_variable_in_impl_data_instance_ref(self,
@@ -4502,6 +4548,37 @@ def _read_runnable_entity_group(self, child_elements: ChildElementMap, data: dic
45024548
child_elements.skip("WRITTEN-LOCAL-VARIABLES")
45034549
child_elements.skip("VARIATION-POINT")
45044550

4551+
def _read_rte_event(self, child_elements: ChildElementMap, data: dict) -> None:
4552+
"""
4553+
Reads group AR:RTE-EVENT
4554+
"""
4555+
xml_child = child_elements.get("DISABLED-MODE-IREFS")
4556+
if xml_child is not None:
4557+
disabled_modes = []
4558+
for xml_grand_child in xml_child.findall("./DISABLED-MODE-IREF"):
4559+
disabled_modes.append(self._read_rmode_in_atomic_swc_instance_ref(xml_grand_child))
4560+
data["disabled_modes"] = disabled_modes
4561+
xml_child = child_elements.get("START-ON-EVENT-REF")
4562+
if xml_child is not None:
4563+
data["start_on_event"] = self._read_runnable_entity_ref(xml_child)
4564+
child_elements.skip("VARIATION-POINT") # Not supported
4565+
4566+
def _read_init_event(self,
4567+
xml_element: ElementTree.Element
4568+
) -> ar_element.InitEvent:
4569+
"""
4570+
Reads complex Type AR:INIT-EVENT
4571+
Tag variants: 'INIT-EVENT''
4572+
"""
4573+
data = {}
4574+
child_elements = ChildElementMap(xml_element)
4575+
self._read_referrable(child_elements, data)
4576+
self._read_multi_language_referrable(child_elements, data)
4577+
self._read_identifiable(child_elements, xml_element.attrib, data)
4578+
self._read_rte_event(child_elements, data)
4579+
self._report_unprocessed_elements(child_elements)
4580+
return ar_element.InitEvent(**data)
4581+
45054582
def _read_swc_internal_behavior(self, xml_element: ElementTree.Element) -> ar_element.SwcInternalBehavior:
45064583
"""
45074584
Reads complex type AR:SWC-INTERNAL-BEHAVIOR

src/autosar/xml/reference.py

+16
Original file line numberDiff line numberDiff line change
@@ -568,3 +568,19 @@ def accepted_sub_types(cls) -> set[ar_enum.IdentifiableSubTypes]:
568568
return {ar_enum.IdentifiableSubTypes.ABSTRACT_REQUIRED_PORT_PROTOTYPE,
569569
ar_enum.IdentifiableSubTypes.PR_PORT_PROTOTYPE,
570570
ar_enum.IdentifiableSubTypes.R_PORT_PROTOTYPE}
571+
572+
573+
class RunnableEntityRef(BaseRef):
574+
"""
575+
RUNNABLE-ENTITY--SUBTYPES-ENUM
576+
"""
577+
578+
def __init__(self, value: str,
579+
dest: ar_enum.IdentifiableSubTypes = ar_enum.IdentifiableSubTypes.RUNNABLE_ENTITY
580+
) -> None:
581+
super().__init__(value, dest)
582+
583+
@classmethod
584+
def accepted_sub_types(cls) -> set[ar_enum.IdentifiableSubTypes]:
585+
"""Acceptable values for dest"""
586+
return {ar_enum.IdentifiableSubTypes.RUNNABLE_ENTITY}

0 commit comments

Comments
 (0)