armodel 1.4.0__py3-none-any.whl → 1.4.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. armodel/__init__.py +2 -1
  2. armodel/cli/arxml_dump_cli.py +8 -6
  3. armodel/cli/arxml_format_cli.py +72 -0
  4. armodel/cli/connector_update_cli.py +11 -4
  5. armodel/data_models/__init__.py +0 -0
  6. armodel/data_models/sw_connector.py +22 -0
  7. armodel/lib/data_analyzer.py +1 -1
  8. armodel/models/__init__.py +3 -2
  9. armodel/models/annotation.py +20 -0
  10. armodel/models/ar_object.py +163 -18
  11. armodel/models/ar_package.py +110 -14
  12. armodel/models/ar_ref.py +62 -6
  13. armodel/models/bsw_module_template.py +97 -26
  14. armodel/models/calibration.py +107 -4
  15. armodel/models/common_structure.py +112 -37
  16. armodel/models/communication.py +10 -1
  17. armodel/models/data_def_properties.py +16 -0
  18. armodel/models/data_dictionary.py +46 -9
  19. armodel/models/data_prototype.py +24 -5
  20. armodel/models/datatype.py +69 -20
  21. armodel/models/end_to_end_protection.py +67 -0
  22. armodel/models/general_structure.py +25 -15
  23. armodel/models/global_constraints.py +4 -4
  24. armodel/models/implementation.py +80 -32
  25. armodel/models/m2_msr.py +6 -4
  26. armodel/models/multilanguage_data.py +42 -0
  27. armodel/models/per_instance_memory.py +14 -0
  28. armodel/models/port_interface.py +27 -4
  29. armodel/models/port_prototype.py +37 -17
  30. armodel/models/record_layout.py +118 -0
  31. armodel/models/service_mapping.py +11 -0
  32. armodel/models/service_needs.py +48 -0
  33. armodel/models/sw_component.py +224 -39
  34. armodel/parser/abstract_arxml_parser.py +248 -0
  35. armodel/parser/arxml_parser.py +1280 -810
  36. armodel/parser/connector_xlsx_parser.py +190 -0
  37. armodel/parser/excel_parser.py +18 -0
  38. armodel/tests/test_armodel/models/test_ar_object.py +152 -0
  39. armodel/tests/test_armodel/models/test_ar_package.py +1 -1
  40. armodel/tests/test_armodel/models/test_common_structure.py +2 -2
  41. armodel/tests/test_armodel/models/test_data_dictionary.py +7 -7
  42. armodel/tests/test_armodel/models/test_data_prototype.py +2 -2
  43. armodel/tests/test_armodel/models/test_datatype.py +4 -4
  44. armodel/tests/test_armodel/models/test_general_structure.py +1 -1
  45. armodel/tests/test_armodel/models/test_implementation.py +26 -0
  46. armodel/tests/test_armodel/models/test_m2_msr.py +4 -4
  47. armodel/tests/test_armodel/parser/test_arxml_parser.py +15 -0
  48. armodel/tests/test_armodel/parser/test_parse_bswmd.py +70 -46
  49. armodel/tests/test_armodel/parser/test_sw_components.py +93 -0
  50. armodel/writer/abstract_arxml_writer.py +123 -0
  51. armodel/writer/arxml_writer.py +1464 -350
  52. {armodel-1.4.0.dist-info → armodel-1.4.3.dist-info}/METADATA +90 -3
  53. armodel-1.4.3.dist-info/RECORD +78 -0
  54. {armodel-1.4.0.dist-info → armodel-1.4.3.dist-info}/WHEEL +1 -1
  55. {armodel-1.4.0.dist-info → armodel-1.4.3.dist-info}/entry_points.txt +2 -0
  56. armodel-1.4.0.dist-info/RECORD +0 -60
  57. {armodel-1.4.0.dist-info → armodel-1.4.3.dist-info}/LICENSE +0 -0
  58. {armodel-1.4.0.dist-info → armodel-1.4.3.dist-info}/top_level.txt +0 -0
@@ -1,102 +1,45 @@
1
- import logging
2
1
  import xml.etree.cElementTree as ET
3
2
 
4
- from xml.dom import minidom
5
3
  from typing import List
6
4
 
5
+ from armodel.writer.abstract_arxml_writer import AbstractARXMLWriter
6
+
7
+ from ..models.data_def_properties import ValueList
8
+ from ..models.multilanguage_data import MultiLanguageOverviewParagraph, MultilanguageLongName
9
+ from ..models.record_layout import SwRecordLayout, SwRecordLayoutGroup, SwRecordLayoutV
10
+ from ..models.service_mapping import RoleBasedPortAssignment
11
+ from ..models.service_needs import NvBlockNeeds, RoleBasedDataAssignment
12
+ from ..models.data_prototype import ApplicationArrayElement, ApplicationCompositeElementDataPrototype, ApplicationRecordElement, AutosarDataPrototype, DataPrototype, ParameterDataPrototype, VariableDataPrototype
13
+ from ..models.bsw_module_template import BswCalledEntity, BswEvent, BswInternalBehavior, BswModeSenderPolicy, BswModuleDescription, BswModuleEntity, BswModuleEntry, BswSchedulableEntity, BswScheduleEvent, BswTimingEvent
14
+ from ..models.ar_package import AUTOSAR
15
+ from ..models.sw_component import ApplicationSwComponentType, AtomicSwComponentType, ComplexDeviceDriverSwComponentType, DataReceivedEvent, EcuAbstractionSwComponentType, InternalTriggerOccurredEvent, OperationInvokedEvent, ParameterAccess, PortAPIOption, PortGroup, RTEEvent, ServerCallPoint, ServiceDependency, ServiceSwComponentType, SwcModeSwitchEvent, SwcServiceDependency, SynchronousServerCallPoint, VariableAccess
16
+ from ..models.ar_package import ARPackage
17
+ from ..models.ar_ref import ApplicationCompositeElementInPortInterfaceInstanceRef, AutosarParameterRef, AutosarVariableRef, InnerPortGroupInCompositionInstanceRef, POperationInAtomicSwcInstanceRef, PPortInCompositionInstanceRef, RModeInAtomicSwcInstanceRef, ROperationInAtomicSwcInstanceRef, RPortInCompositionInstanceRef, RVariableInAtomicSwcInstanceRef, VariableDataPrototypeInSystemInstanceRef
18
+ from ..models.calibration import SwAxisGrouped, SwAxisIndividual, SwCalprmAxis, SwCalprmAxisSet, SwValueCont, SwValues
19
+ from ..models.common_structure import ApplicationValueSpecification, ArrayValueSpecification, ConstantReference, ModeDeclaration, ModeDeclarationGroup, ModeDeclarationGroupPrototype, NumericalValueSpecification, RecordValueSpecification, TextValueSpecification, ValueSpecification
20
+ from ..models.communication import CompositeNetworkRepresentation, TransmissionAcknowledgementRequest
21
+ from ..models.data_dictionary import SwAddrMethod, SwDataDefProps
22
+ from ..models.datatype import ApplicationArrayDataType, ApplicationCompositeDataType, ApplicationDataType, ApplicationPrimitiveDataType, ApplicationRecordDataType, AutosarDataType, BaseTypeDirectDefinition, DataTypeMappingSet, ImplementationDataType, SwBaseType
23
+ from ..models.general_structure import ARElement, AdminData, Identifiable, Limit, MultilanguageReferrable, Referrable, Sdg, SwcBswMapping, SwcBswRunnableMapping
24
+ from ..models.m2_msr import CompuConstTextContent, CompuMethod, CompuNominatorDenominator, CompuScale, CompuScaleConstantContents, CompuScaleRationalFormula, CompuScales
25
+ from ..models.port_prototype import ClientComSpec, NonqueuedReceiverComSpec, NonqueuedSenderComSpec, PPortComSpec, PPortPrototype, PortPrototype, QueuedReceiverComSpec, RPortComSpec, RPortPrototype, ReceiverComSpec, SenderComSpec, ServerComSpec
26
+ from ..models.sw_component import AssemblySwConnector, CompositionSwComponentType, DelegationSwConnector, SwComponentPrototype, SwComponentType, SwConnector
27
+ from ..models.annotation import Annotation
28
+ from ..models.end_to_end_protection import EndToEndDescription, EndToEndProtection, EndToEndProtectionSet, EndToEndProtectionVariablePrototype
29
+ from ..models.port_interface import ApplicationError, ClientServerInterface, ClientServerOperation, ModeSwitchInterface, PortInterface, SenderReceiverInterface, TriggerInterface
30
+ from ..models.unit import Unit
31
+ from ..models.implementation import AutosarEngineeringObject, BswImplementation, Code, EngineeringObject, Implementation, SwcImplementation
32
+ from ..models.common_structure import ConstantSpecification, ExecutableEntity, InternalBehavior, ResourceConsumption
33
+ from ..models.sw_component import RunnableEntity, SwcInternalBehavior, TimingEvent
7
34
  from ..models.ar_object import ARLiteral
8
- from ..models import AUTOSAR, ARPackage, ARObject, Identifiable, MultilanguageReferrable, Referrable, AdminData, Sdg, ARElement, SwDataDefProps, MultilanguageLongName
9
- from ..models import CompositionSwComponentType, SwComponentType, SwComponentPrototype
10
- from ..models import PortPrototype, PPortPrototype, RPortPrototype
11
- from ..models import NonqueuedReceiverComSpec, NonqueuedSenderComSpec, ClientComSpec
12
- from ..models import TRefType
13
- from ..models import PPortComSpec, RPortComSpec, SenderComSpec, ReceiverComSpec
14
- from ..models import TransmissionAcknowledgementRequest
15
- from ..models import ValueSpecification, ApplicationValueSpecification, TextValueSpecification, NumericalValueSpecification, ArrayValueSpecification
16
- from ..models import ConstantSpecification, RecordValueSpecification, ConstantReference
17
- from ..models import SwValueCont, SwValues
18
- from ..models import SwConnector, AssemblySwConnector, DelegationSwConnector, PPortInCompositionInstanceRef, RPortInCompositionInstanceRef
19
- from ..models import ARBoolean
20
- from ..models import ApplicationPrimitiveDataType, AutosarDataType, ApplicationDataType, ApplicationRecordDataType, BaseType
21
- from ..models import CompuMethod, CompuScales, CompuScale, Limit, CompuScaleConstantContents, CompuConstTextContent, CompuScaleRationalFormula, CompuNominatorDenominator
22
-
23
- from ..models.global_constraints import DataConstr, DataConstrRule, InternalConstrs, PhysConstrs
24
-
25
- from colorama import Fore
26
-
27
- class ARXMLWriter:
28
- def __init__(self, options = None) -> None:
29
- self.options = {}
30
- self.options['warning'] = False
31
- self.options['version'] = "4.2.2"
32
- self.logger = logging.getLogger()
33
-
34
- self._processOptions(options=options)
35
-
36
- self.nsmap = {
37
- "xmlns": "http://autosar.org/schema/r4.0",
38
- }
39
-
40
- def _processOptions(self, options):
41
- if options:
42
- if 'warning' in options:
43
- self.options['warning'] = options['warning']
35
+ from ..models.global_constraints import DataConstr, InternalConstrs, PhysConstrs
44
36
 
45
- def _raiseError(self, error_msg):
46
- if (self.options['warning'] == True):
47
- self.logger.error(Fore.RED + error_msg + Fore.WHITE)
48
- else:
49
- raise ValueError(error_msg)
50
-
51
- def writeElementAttributes(self, element: ET.Element, ar_obj: ARObject):
52
- if ar_obj.timestamp is not None:
53
- self.logger.debug("Timestamp: %s" % ar_obj.timestamp)
54
- element.attrib['T'] = ar_obj.timestamp
55
- if ar_obj.uuid is not None:
56
- self.logger.debug("UUID: %s" % ar_obj.uuid)
57
- element.attrib['UUID'] = ar_obj.uuid
58
-
59
- def writeChildOptionalElement(self, element: ET.Element, key: str, value: str):
60
- if value is not None:
61
- child_element = ET.SubElement(element, key)
62
- child_element.text = value
63
37
 
64
- def writeChildOptionalRefElement(self, parent: ET.Element, child_tag_name: str, ref: TRefType):
65
- if ref is not None:
66
- child_tag = ET.SubElement(parent, child_tag_name)
67
- if ref.dest is not None:
68
- child_tag.attrib['DEST'] = ref.dest
69
- if ref.value is not None:
70
- child_tag.text = ref.value
71
-
72
- def writeChildOptionalElementFloatValue(self, element: ET.Element, key: str, value: float):
73
- if value is not None:
74
- child_element = ET.SubElement(element, key)
75
- literal = "%g" % value
76
- if literal == '0':
77
- literal = "0.0"
78
- child_element.text = literal
79
-
80
- def writeChildOptionalElementBooleanValue(self, element: ET.Element, key: str, value: ARBoolean) -> ET.Element:
81
- child_element = None
82
- if value is not None:
83
- child_element = ET.SubElement(element, key)
84
- self.writeElementAttributes(child_element, value)
85
- if value.value:
86
- child_element.text = "true"
87
- else:
88
- child_element.text = "false"
89
- return child_element
38
+ class ARXMLWriter(AbstractARXMLWriter):
39
+ def __init__(self, options=None) -> None:
40
+ super().__init__(options)
90
41
 
91
- def writeChildOptionalElementLiteral(self, element: ET.Element, key: str, value: ARLiteral) -> ET.Element:
92
- child_element = None
93
- if value is not None:
94
- child_element = ET.SubElement(element, key)
95
- self.writeElementAttributes(child_element, value)
96
- child_element.text = value.value
97
- return child_element
98
-
99
- def writeShortName(self, parent: ET.Element, name: str) -> ET.Element:
42
+ def setShortName(self, parent: ET.Element, name: str) -> ET.Element:
100
43
  sub_element = ET.SubElement(parent, "SHORT-NAME")
101
44
  sub_element.text = name
102
45
 
@@ -120,27 +63,41 @@ class ARXMLWriter:
120
63
  def writeChildLimitElement(self, element: ET.Element, key: str, limit: Limit):
121
64
  if limit is not None:
122
65
  limit_tag = ET.SubElement(element, key)
123
- limit_tag.attrib['INTERVAL-TYPE'] = limit.interval_type
66
+ self.setARObjectAttributes(limit_tag, limit)
67
+ if limit.intervalType is not None:
68
+ limit_tag.attrib['INTERVAL-TYPE'] = limit.intervalType
124
69
  limit_tag.text = limit.value
125
70
 
126
71
  def writeReferable(self, element: ET.Element, referrable: Referrable):
127
- self.writeElementAttributes(element, referrable)
128
- self.writeShortName(element, referrable.short_name)
129
-
130
- def writeMultiLongName(self, element: ET.Element, long_name: MultilanguageLongName):
131
- self.writeElementAttributes(element, long_name)
132
- for l4 in long_name.get_l4s():
133
- l4_tag = ET.SubElement(element, "L-4")
134
- self.writeElementAttributes(l4_tag, l4)
135
- if l4.l is not None:
136
- l4_tag.attrib['L'] = l4.l
137
- l4_tag.text = l4.value
72
+ self.setARObjectAttributes(element, referrable)
73
+ self.setShortName(element, referrable.short_name)
74
+
75
+ def setMultiLongName(self, element: ET.Element, key: str, long_name: MultilanguageLongName):
76
+ if long_name is not None:
77
+ long_name_tag = ET.SubElement(element, key)
78
+ self.setARObjectAttributes(long_name_tag, long_name)
79
+ for l4 in long_name.getL4s():
80
+ l4_tag = ET.SubElement(long_name_tag, "L-4")
81
+ self.setARObjectAttributes(l4_tag, l4)
82
+ if l4.l is not None:
83
+ l4_tag.attrib['L'] = l4.l
84
+ l4_tag.text = l4.value
85
+
86
+ def setMultiLanguageOverviewParagraph(self, element: ET.Element, key: str, paragraph: MultiLanguageOverviewParagraph):
87
+ if paragraph is not None:
88
+ long_name_tag = ET.SubElement(element, key)
89
+ self.setARObjectAttributes(long_name_tag, paragraph)
90
+ for l2 in paragraph.getL2s():
91
+ l2_tag = ET.SubElement(long_name_tag, "L-2")
92
+ self.setARObjectAttributes(l2_tag, l2)
93
+ if l2.l is not None:
94
+ l2_tag.attrib['L'] = l2.l
95
+ l2_tag.text = l2.value
138
96
 
139
97
  def writeMultilanguageReferrable(self, element: ET.Element, referrable: MultilanguageReferrable):
140
98
  self.writeReferable(element, referrable)
141
99
  if referrable.long_name is not None:
142
- long_name_tag = ET.SubElement(element, "LONG-NAME")
143
- self.writeMultiLongName(long_name_tag, referrable.long_name)
100
+ self.setMultiLongName(element, "LONG-NAME", referrable.long_name)
144
101
 
145
102
  def writeAdminData(self, element: ET.Element, admin_data: AdminData):
146
103
  element = ET.SubElement(element, "ADMIN-DATA")
@@ -148,7 +105,8 @@ class ARXMLWriter:
148
105
 
149
106
  def writeIdentifiable(self, element: ET.Element, identifiable: Identifiable):
150
107
  self.writeMultilanguageReferrable(element, identifiable)
151
- self.writeChildOptionalElement(element, "CATEGORY", identifiable.category)
108
+ self.setMultiLanguageOverviewParagraph(element, "DESC", identifiable.desc)
109
+ self.setChildElementOptionalLiteral(element, "CATEGORY", identifiable.category)
152
110
  if identifiable.admin_data is not None:
153
111
  self.writeAdminData(element, identifiable.admin_data)
154
112
 
@@ -158,79 +116,110 @@ class ARXMLWriter:
158
116
  def writeTransmissionAcknowledgementRequest(self, element: ET.Element, acknowledge: TransmissionAcknowledgementRequest):
159
117
  if (acknowledge != None):
160
118
  child_element = ET.SubElement(element, "TRANSMISSION-ACKNOWLEDGE")
161
- self.writeElementAttributes(child_element, acknowledge)
119
+ self.setARObjectAttributes(child_element, acknowledge)
162
120
  if acknowledge.timeout != None:
163
- self.writeChildOptionalElementFloatValue(child_element, "TIMEOUT", acknowledge.timeout)
164
-
165
- def writeSenderComSpec(self, com_spec_tag: ET.Element, com_spec: SenderComSpec):
166
- self.writeChildOptionalRefElement(com_spec_tag, "DATA-ELEMENT-REF", com_spec.data_element_ref)
167
- if com_spec.network_representation is not None:
168
- network_representation_tag = ET.SubElement(com_spec_tag, "NETWORK-REPRESENTATION")
169
- self.writeSwDataDefProps(network_representation_tag, com_spec.network_representation)
170
- self.writeChildOptionalElement(com_spec_tag, "HANDLE-OUT-OF-RANGE", com_spec.handle_out_of_range)
171
- self.writeTransmissionAcknowledgementRequest(com_spec_tag, com_spec.transmission_acknowledge)
172
- self.writeChildOptionalElementBooleanValue(com_spec_tag, "USES-END-TO-END-PROTECTION", com_spec.uses_end_to_end_protection)
121
+ self.setChildElementOptionalFloatValue(child_element, "TIMEOUT", acknowledge.timeout)
122
+
123
+ def writeSenderComSpec(self, element: ET.Element, com_spec: SenderComSpec):
124
+ representations = com_spec.getCompositeNetworkRepresentations()
125
+ if len(representations) > 0:
126
+ child_element = ET.SubElement(element, "COMPOSITE-NETWORK-REPRESENTATIONS")
127
+ for representation in representations:
128
+ self.setCompositeNetworkRepresentation(child_element, representation)
129
+ self.setChildElementOptionalRefType(element, "DATA-ELEMENT-REF", com_spec.data_element_ref)
130
+ self.setSwDataDefProps(element, "NETWORK-REPRESENTATION", com_spec.network_representation)
131
+ self.setChildElementOptionalLiteral(element, "HANDLE-OUT-OF-RANGE", com_spec.handle_out_of_range)
132
+ self.writeTransmissionAcknowledgementRequest(element, com_spec.transmission_acknowledge)
133
+ self.setChildElementOptionalBooleanValue(element, "USES-END-TO-END-PROTECTION", com_spec.uses_end_to_end_protection)
173
134
 
174
135
  def writeNonqueuedSenderComSpec(self, com_specs_tag: ET.Element, com_spec: NonqueuedSenderComSpec):
175
136
  com_spec_tag = ET.SubElement(com_specs_tag, "NONQUEUED-SENDER-COM-SPEC")
176
- self.writeElementAttributes(com_spec_tag, com_spec)
137
+ self.setARObjectAttributes(com_spec_tag, com_spec)
177
138
  self.writeSenderComSpec(com_spec_tag, com_spec)
178
-
179
- if com_spec.init_value is not None:
180
- init_value_tag = ET.SubElement(com_spec_tag, "INIT-VALUE")
181
- if isinstance(com_spec.init_value, NumericalValueSpecification):
182
- self.writeNumberValueSpecification(init_value_tag, com_spec.init_value)
183
- elif isinstance(com_spec.init_value, ArrayValueSpecification):
184
- self.writeArrayValueSpecification(init_value_tag, com_spec.init_value)
185
- elif isinstance(com_spec.init_value, ConstantReference):
186
- self.writeConstantReference(init_value_tag, com_spec.init_value)
187
- else:
188
- raise NotImplementedError("Unsupported ValueSpecification %s" % type(com_spec.init_value))
139
+ self.setInitValue(com_spec_tag, com_spec.init_value)
140
+
141
+ def writeServerComSpec(self, com_specs_tag: ET.Element, com_spec: ServerComSpec):
142
+ com_spec_tag = ET.SubElement(com_specs_tag, "SERVER-COM-SPEC")
143
+ self.setARObjectAttributes(com_spec_tag, com_spec)
144
+ self.setChildElementOptionalRefType(com_spec_tag, "OPERATION-REF", com_spec.operation_ref)
145
+ self.setChildElementOptionalNumericalValue(com_spec_tag, "QUEUE-LENGTH", com_spec.queue_length)
189
146
 
190
147
  def writePPortComSpec(self, com_specs_tag: ET.Element, com_spec: PPortComSpec):
191
148
  if isinstance(com_spec, NonqueuedSenderComSpec):
192
149
  self.writeNonqueuedSenderComSpec(com_specs_tag, com_spec)
150
+ elif isinstance(com_spec, ServerComSpec):
151
+ self.writeServerComSpec(com_specs_tag, com_spec)
193
152
  else:
194
- raise NotImplementedError("Unsupported PPortComSpec")
153
+ raise NotImplementedError("Unsupported PPortComSpec %s" % type(com_spec))
154
+
155
+ def setApplicationCompositeElementInPortInterfaceInstanceRef(self, element: ET.Element, key:str, iref: ApplicationCompositeElementInPortInterfaceInstanceRef):
156
+ if iref is not None:
157
+ child_element = ET.SubElement(element, key)
158
+ self.setChildElementOptionalRefType(child_element, "ROOT-DATA-PROTOTYPE-REF", iref.root_data_prototype_ref)
159
+ self.setChildElementOptionalRefType(child_element, "TARGET-DATA-PROTOTYPE-REF", iref.target_data_prototype_ref)
160
+ return iref
161
+
162
+ def setCompositeNetworkRepresentation(self, element: ET.Element, representation: CompositeNetworkRepresentation):
163
+ if representation is not None:
164
+ self.logger.debug("setCompositeNetworkRepresentation")
165
+ child_element = ET.SubElement(element, "COMPOSITE-NETWORK-REPRESENTATION")
166
+ self.setApplicationCompositeElementInPortInterfaceInstanceRef(child_element, "LEAF-ELEMENT-IREF", representation.leaf_element_iref)
167
+ self.setSwDataDefProps(child_element, "NETWORK-REPRESENTATION", representation.network_representation)
195
168
 
196
- def writeReceiverComSpec(self, com_spec_tag: ET.Element, com_spec: ReceiverComSpec):
197
- self.writeChildOptionalRefElement(com_spec_tag, "DATA-ELEMENT-REF", com_spec.data_element_ref)
198
- self.writeChildOptionalElement(com_spec_tag, "HANDLE-OUT-OF-RANGE", com_spec.handle_out_of_range)
199
- self.writeChildOptionalElementBooleanValue(com_spec_tag, "USES-END-TO-END-PROTECTION", com_spec.uses_end_to_end_protection)
169
+ def writeReceiverComSpec(self, element: ET.Element, com_spec: ReceiverComSpec):
170
+ representations = com_spec.getCompositeNetworkRepresentations()
171
+ if len(representations) > 0:
172
+ child_element = ET.SubElement(element, "COMPOSITE-NETWORK-REPRESENTATIONS")
173
+ for representation in representations:
174
+ self.setCompositeNetworkRepresentation(child_element, representation)
175
+ self.setChildElementOptionalRefType(element, "DATA-ELEMENT-REF", com_spec.data_element_ref)
176
+ self.setSwDataDefProps(element, "NETWORK-REPRESENTATION", com_spec.network_representation)
177
+ self.setChildElementOptionalLiteral(element, "HANDLE-OUT-OF-RANGE", com_spec.handle_out_of_range)
178
+ self.setChildElementOptionalBooleanValue(element, "USES-END-TO-END-PROTECTION", com_spec.uses_end_to_end_protection)
179
+
180
+ def setSwValues(self, element: ET.Element, key: str, sw_values: SwValues):
181
+ if sw_values is not None:
182
+ child_element = ET.SubElement(element, key)
183
+ self.setARObjectAttributes(child_element, sw_values)
184
+ for v in sw_values.getVs():
185
+ self.setChildElementOptionalFloatValue(child_element, "V", v)
186
+ self.setChildElementOptionalLiteral(child_element, "VT", sw_values.vt)
200
187
 
201
- def writeSwValues(self, element: ET.Element, values: SwValues):
202
- if values.v is not None:
203
- self.writeChildOptionalElement(element, "V", values.v)
188
+ def setValueList(self, element: ET.Element, key: str, value_list: ValueList):
189
+ if value_list is not None:
190
+ child_element = ET.SubElement(element, key)
191
+ self.setARObjectAttributes(child_element, value_list)
192
+ self.setChildElementOptionalFloatValue(child_element, "V", value_list.v)
204
193
 
205
194
  def writeSwValueCont(self, element: ET.Element, cont: SwValueCont):
206
195
  child_element = ET.SubElement(element, "SW-VALUE-CONT")
207
- self.writeChildOptionalRefElement(child_element, "UNIT-REF", cont.unit_ref)
208
- if cont.sw_values_phys is not None:
209
- sw_values_phys_tag = ET.SubElement(child_element, "SW-VALUES-PHYS")
210
- self.writeSwValues(sw_values_phys_tag, cont.sw_values_phys)
196
+ self.setARObjectAttributes(child_element, cont)
197
+ self.setChildElementOptionalRefType(child_element, "UNIT-REF", cont.unit_ref)
198
+ self.setValueList(child_element, "SW-ARRAYSIZE", cont.sw_arraysize)
199
+ self.setSwValues(child_element, "SW-VALUES-PHYS", cont.sw_values_phys)
211
200
 
212
201
  def writeValueSpecification(self, element: ET.Element, value_spec: ValueSpecification):
213
- self.writeElementAttributes(element, value_spec)
202
+ self.setARObjectAttributes(element, value_spec)
214
203
  if value_spec.short_label is not None:
215
- self.writeChildOptionalElement(element, "SHORT-LABEL", value_spec.short_label)
204
+ self.setChildElementOptionalLiteral(element, "SHORT-LABEL", value_spec.short_label)
216
205
 
217
- def writeApplicationValueSpecification(self, element: ET.Element, value_spec: ApplicationValueSpecification):
206
+ def setApplicationValueSpecification(self, element: ET.Element, value_spec: ApplicationValueSpecification):
218
207
  value_spec_tag = ET.SubElement(element, "APPLICATION-VALUE-SPECIFICATION")
219
208
  self.writeValueSpecification(value_spec_tag, value_spec)
220
- self.writeChildOptionalElement(value_spec_tag, "CATEGORY", value_spec.category)
209
+ self.setChildElementOptionalLiteral(value_spec_tag, "CATEGORY", value_spec.category)
221
210
  self.writeSwValueCont(value_spec_tag, value_spec.sw_value_cont)
222
211
 
223
- def writeTextValueSpecification(self, element: ET.Element, value_spec: TextValueSpecification):
212
+ def setTextValueSpecification(self, element: ET.Element, value_spec: TextValueSpecification):
224
213
  value_spec_tag = ET.SubElement(element, "TEXT-VALUE-SPECIFICATION")
225
214
  self.writeValueSpecification(value_spec_tag, value_spec)
226
- self.writeChildOptionalElement(value_spec_tag, "VALUE", value_spec.value)
215
+ self.setChildElementOptionalLiteral(value_spec_tag, "VALUE", value_spec.value)
227
216
 
228
- def writeNumberValueSpecification(self, element: ET.Element, value_spec: NumericalValueSpecification):
217
+ def setNumericalValueSpecification(self, element: ET.Element, value_spec: NumericalValueSpecification):
229
218
  value_spec_tag = ET.SubElement(element, "NUMERICAL-VALUE-SPECIFICATION")
230
219
  self.writeValueSpecification(value_spec_tag, value_spec)
231
- self.writeChildOptionalElement(value_spec_tag, "VALUE", value_spec.value)
220
+ self.setChildElementOptionalFloatValue(value_spec_tag, "VALUE", value_spec.value)
232
221
 
233
- def writeArrayValueSpecification(self, element: ET.Element, value_spec: ArrayValueSpecification):
222
+ def setArrayValueSpecification(self, element: ET.Element, value_spec: ArrayValueSpecification):
234
223
  value_spec_tag = ET.SubElement(element, "ARRAY-VALUE-SPECIFICATION")
235
224
  self.writeValueSpecification(value_spec_tag, value_spec)
236
225
  sub_elements = value_spec.get_elements()
@@ -238,55 +227,75 @@ class ARXMLWriter:
238
227
  elements_tag = ET.SubElement(value_spec_tag, "ELEMENTS")
239
228
  for sub_element in sub_elements:
240
229
  if isinstance(sub_element, NumericalValueSpecification):
241
- self.writeNumberValueSpecification(elements_tag, sub_element)
230
+ self.setNumericalValueSpecification(elements_tag, sub_element)
231
+ elif isinstance(sub_element, ApplicationValueSpecification):
232
+ self.setApplicationValueSpecification(elements_tag, sub_element)
242
233
  else:
243
234
  raise NotImplementedError("Unsupported element type of <%s> of ArrayValueSpecification" % type(sub_element))
244
235
 
245
- def writeConstantReference(self, element: ET.Element, value_spec: ConstantReference):
236
+ def setConstantReference(self, element: ET.Element, value_spec: ConstantReference):
246
237
  value_spec_tag = ET.SubElement(element, "CONSTANT-REFERENCE")
247
238
  self.writeValueSpecification(value_spec_tag, value_spec)
248
- self.writeChildOptionalRefElement(value_spec_tag, "CONSTANT-REF", value_spec.constant_ref)
249
-
250
- def writeNonqueuedReceiverComSpec(self, com_specs_tag: ET.Element, com_spec: NonqueuedReceiverComSpec):
251
- com_spec_tag = ET.SubElement(com_specs_tag, "NONQUEUED-RECEIVER-COM-SPEC")
252
- self.writeElementAttributes(com_spec_tag, com_spec)
253
- self.writeReceiverComSpec(com_spec_tag, com_spec)
254
- self.writeChildOptionalElementFloatValue(com_spec_tag, "ALIVE-TIMEOUT", com_spec.alive_timeout)
255
- self.writeChildOptionalElementBooleanValue(com_spec_tag, "ENABLE-UPDATE", com_spec.enable_updated)
256
- self.writeChildOptionalElementBooleanValue(com_spec_tag, "HANDLE-NEVER-RECEIVED", com_spec.handle_never_received)
257
- self.writeChildOptionalElement(com_spec_tag, "HANDLE-TIMEOUT-TYPE", com_spec.handel_timeout_type)
258
- if com_spec.init_value is not None:
259
- init_value_tag = ET.SubElement(com_spec_tag, "INIT-VALUE")
260
- if isinstance(com_spec.init_value, ApplicationValueSpecification):
261
- self.writeApplicationValueSpecification(init_value_tag, com_spec.init_value)
262
- elif isinstance(com_spec.init_value, TextValueSpecification):
263
- self.writeTextValueSpecification(init_value_tag, com_spec.init_value)
264
- elif isinstance(com_spec.init_value, ConstantReference):
265
- self.writeConstantReference(init_value_tag, com_spec.init_value)
239
+ self.setChildElementOptionalRefType(value_spec_tag, "CONSTANT-REF", value_spec.constant_ref)
240
+
241
+ def setValueSpecification(self, element: ET.Element, value_spec: ValueSpecification):
242
+ if value_spec is not None:
243
+ if isinstance(value_spec, ApplicationValueSpecification):
244
+ self.setApplicationValueSpecification(element, value_spec)
245
+ elif isinstance(value_spec, TextValueSpecification):
246
+ self.setTextValueSpecification(element, value_spec)
247
+ elif isinstance(value_spec, ConstantReference):
248
+ self.setConstantReference(element, value_spec)
249
+ elif isinstance(value_spec, NumericalValueSpecification):
250
+ self.setNumericalValueSpecification(element, value_spec)
251
+ elif isinstance(value_spec, ArrayValueSpecification):
252
+ self.setArrayValueSpecification(element, value_spec)
253
+ elif isinstance(value_spec, RecordValueSpecification):
254
+ self.setRecordValueSpecification(element, value_spec)
266
255
  else:
267
- raise NotImplementedError("Unsupported ValueSpecification %s" % type(com_spec.init_value))
256
+ raise NotImplementedError("Unsupported ValueSpecification %s" % type(value_spec))
257
+
258
+ def setInitValue(self, element: ET.Element, init_value: ValueSpecification):
259
+ if init_value is not None:
260
+ child_element = ET.SubElement(element, "INIT-VALUE")
261
+ self.setValueSpecification(child_element, init_value)
262
+
263
+ def writeNonqueuedReceiverComSpec(self, element: ET.Element, com_spec: NonqueuedReceiverComSpec):
264
+ child_element = ET.SubElement(element, "NONQUEUED-RECEIVER-COM-SPEC")
265
+ self.setARObjectAttributes(child_element, com_spec)
266
+ self.writeReceiverComSpec(child_element, com_spec)
267
+ self.setChildElementOptionalFloatValue(child_element, "ALIVE-TIMEOUT", com_spec.alive_timeout)
268
+ self.setChildElementOptionalBooleanValue(child_element, "ENABLE-UPDATE", com_spec.enable_updated)
269
+ self.setChildElementOptionalBooleanValue(child_element, "HANDLE-NEVER-RECEIVED", com_spec.handle_never_received)
270
+ self.setChildElementOptionalLiteral(child_element, "HANDLE-TIMEOUT-TYPE", com_spec.handel_timeout_type)
271
+ self.setInitValue(child_element, com_spec.init_value)
272
+
273
+ def writeQueuedReceiverComSpec(self, element: ET.Element, com_spec: QueuedReceiverComSpec):
274
+ child_element = ET.SubElement(element, "QUEUED-RECEIVER-COM-SPEC")
275
+ self.setARObjectAttributes(child_element, com_spec)
276
+ self.writeReceiverComSpec(child_element, com_spec)
277
+ self.setChildElementOptionalNumericalValue(child_element, "QUEUE-LENGTH", com_spec.queue_length)
268
278
 
269
- def writeClientComSpec(self, com_specs_tag: ET.Element, com_spec: ClientComSpec):
279
+ def writeClientComSpec(self, element: ET.Element, com_spec: ClientComSpec):
270
280
  self.logger.debug("writeClientComSpec")
281
+ child_element = ET.SubElement(element, "CLIENT-COM-SPEC")
282
+ self.setARObjectAttributes(child_element, com_spec)
283
+ self.setChildElementOptionalRefType(child_element, "OPERATION-REF", com_spec.operation_ref)
271
284
 
272
- com_spec_tag = ET.SubElement(com_specs_tag, "CLIENT-COM-SPEC")
273
- self.writeElementAttributes(com_spec_tag, com_spec)
274
- self.writeChildOptionalRefElement(com_spec_tag, "OPERATION-REF", com_spec.operation_ref)
275
-
276
- def writeRPortComSpec(self, com_specs_tag: ET.Element, com_spec: RPortComSpec):
285
+ def writeRPortComSpec(self, element: ET.Element, com_spec: RPortComSpec):
277
286
  if isinstance(com_spec, NonqueuedReceiverComSpec):
278
- self.writeNonqueuedReceiverComSpec(com_specs_tag, com_spec)
287
+ self.writeNonqueuedReceiverComSpec(element, com_spec)
288
+ elif isinstance(com_spec, QueuedReceiverComSpec):
289
+ self.writeQueuedReceiverComSpec(element, com_spec)
279
290
  elif isinstance(com_spec, ClientComSpec):
280
- self.writeClientComSpec(com_specs_tag, com_spec)
291
+ self.writeClientComSpec(element, com_spec)
281
292
  else:
282
293
  raise ValueError("Unsupported RPortComSpec %s" % type(com_spec))
283
294
 
284
295
  def writePPortPrototype(self, ports_tag: ET.Element, prototype: PPortPrototype):
285
296
  prototype_tag = ET.SubElement(ports_tag, "P-PORT-PROTOTYPE")
286
297
 
287
- self.writeElementAttributes(prototype_tag, prototype)
288
- self.writeShortName(prototype_tag, prototype.short_name)
289
-
298
+ self.writeIdentifiable(prototype_tag, prototype)
290
299
  self.logger.debug("writePPortPrototype %s" % prototype.short_name)
291
300
 
292
301
  com_specs = prototype.getProvidedComSpecs()
@@ -295,23 +304,18 @@ class ARXMLWriter:
295
304
  for com_spec in com_specs:
296
305
  self.writePPortComSpec(com_specs_tag, com_spec)
297
306
 
298
- self.writeChildOptionalRefElement(prototype_tag, "PROVIDED-INTERFACE-TREF", prototype.provided_interface_tref)
307
+ self.setChildElementOptionalRefType(prototype_tag, "PROVIDED-INTERFACE-TREF", prototype.provided_interface_tref)
299
308
 
300
309
  def writeRPortPrototype(self, ports_tag: ET.Element, prototype: RPortPrototype):
301
- prototype_tag = ET.SubElement(ports_tag, "R-PORT-PROTOTYPE")
302
-
303
- self.writeElementAttributes(prototype_tag, prototype)
304
- self.writeShortName(prototype_tag, prototype.short_name)
305
-
306
310
  self.logger.debug("writeRPortPrototype %s" % prototype.short_name)
307
-
311
+ prototype_tag = ET.SubElement(ports_tag, "R-PORT-PROTOTYPE")
312
+ self.writeIdentifiable(prototype_tag, prototype)
308
313
  com_specs = prototype.getRequiredComSpecs()
309
314
  if len(com_specs) > 0:
310
315
  com_specs_tag = ET.SubElement(prototype_tag, "REQUIRED-COM-SPECS")
311
316
  for com_spec in com_specs:
312
317
  self.writeRPortComSpec(com_specs_tag, com_spec)
313
-
314
- self.writeChildOptionalRefElement(prototype_tag, "REQUIRED-INTERFACE-TREF", prototype.required_interface_tref)
318
+ self.setChildElementOptionalRefType(prototype_tag, "REQUIRED-INTERFACE-TREF", prototype.required_interface_tref)
315
319
 
316
320
  def writePortPrototypes(self, ports_tag: ET.Element, port_prototypes: List[PortPrototype]):
317
321
  for port_prototype in port_prototypes:
@@ -321,16 +325,53 @@ class ARXMLWriter:
321
325
  self.writeRPortPrototype(ports_tag, port_prototype)
322
326
  else:
323
327
  self._raiseError("Invalid PortPrototype")
328
+
329
+ def writeInnerGroupIRef(self, element: ET.Element, inner_group_iref: InnerPortGroupInCompositionInstanceRef):
330
+ child_element = ET.SubElement(element, "INNER-GROUP-IREF")
331
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-REF", inner_group_iref.contextRef)
332
+ self.setChildElementOptionalRefType(child_element, "TARGET-REF", inner_group_iref.targetRef)
333
+
334
+ def writePortGroupInnerGroupIRefs(self, element: ET.Element, parent: PortGroup):
335
+ irefs = parent.getInnerGroupIRefs()
336
+ if len(irefs) > 0:
337
+ child_element = ET.SubElement(element, "INNER-GROUP-IREFS")
338
+ for iref in irefs:
339
+ self.writeInnerGroupIRef(child_element, iref)
340
+
341
+ def writePortGroupOuterPortRefs(self, element: ET.Element, parent: PortGroup):
342
+ refs = parent.getOuterPortRefs()
343
+ if len(refs) > 0:
344
+ outer_ports_element = ET.SubElement(element, "OUTER-PORTS")
345
+ for ref in refs:
346
+ child_element = ET.SubElement(outer_ports_element, "PORT-PROTOTYPE-REF-CONDITIONAL")
347
+ self.setChildElementOptionalRefType(child_element, "PORT-PROTOTYPE-REF", ref)
348
+
349
+ def writePortGroup(self, element: ET.Element, port_group: PortGroup):
350
+ self.logger.debug("writePortGroup %s" % port_group.short_name)
351
+ child_element = ET.SubElement(element, "PORT-GROUP")
352
+ self.writeIdentifiable(child_element, port_group)
353
+ self.writePortGroupInnerGroupIRefs(child_element, port_group)
354
+ self.writePortGroupOuterPortRefs(child_element, port_group)
355
+
356
+ def writeSwComponentTypePortGroups(self, element: ET.Element, parent: SwComponentType):
357
+ port_groups = parent.getPortGroups()
358
+ if len(port_groups) > 0:
359
+ child_element = ET.SubElement(element, "PORT-GROUPS")
360
+ for port_group in port_groups:
361
+ self.writePortGroup(child_element, port_group)
324
362
 
325
363
  def writeSwComponentType(self, element: ET.Element, sw_component: SwComponentType):
326
- ports_tag = ET.SubElement(element, "PORTS")
327
- self.writePortPrototypes(ports_tag, sw_component.getPortPrototype())
364
+ self.writeIdentifiable(element, sw_component)
365
+ port_prototypes = sw_component.getPortPrototypes()
366
+ if len(port_prototypes) > 0:
367
+ ports_tag = ET.SubElement(element, "PORTS")
368
+ self.writePortPrototypes(ports_tag, port_prototypes)
369
+ self.writeSwComponentTypePortGroups(element, sw_component)
328
370
 
329
371
  def writeSwComponentPrototype(self, element: ET.Element, prototype: SwComponentPrototype):
330
372
  prototype_tag = ET.SubElement(element, "SW-COMPONENT-PROTOTYPE")
331
- self.writeElementAttributes(prototype_tag, prototype)
332
- self.writeShortName(prototype_tag, prototype.short_name)
333
- self.writeChildOptionalRefElement(prototype_tag, "TYPE-TREF", prototype.type_tref)
373
+ self.writeIdentifiable(prototype_tag, prototype)
374
+ self.setChildElementOptionalRefType(prototype_tag, "TYPE-TREF", prototype.type_tref)
334
375
 
335
376
  def writeSwComponentPrototypes(self, element: ET.Element, sw_component: CompositionSwComponentType):
336
377
  components_tag = ET.SubElement(element, "COMPONENTS")
@@ -339,41 +380,39 @@ class ARXMLWriter:
339
380
 
340
381
  def writeAssemblySwConnector(self, element: ET.Element, sw_connector: AssemblySwConnector):
341
382
  connector_tag = ET.SubElement(element, "ASSEMBLY-SW-CONNECTOR")
342
- self.writeElementAttributes(connector_tag, sw_connector)
343
- self.writeShortName(connector_tag, sw_connector.short_name)
383
+ self.writeIdentifiable(connector_tag, sw_connector)
344
384
 
345
385
  if sw_connector.provider_iref is not None:
346
386
  provider_iref_tag = ET.SubElement(connector_tag, "PROVIDER-IREF")
347
- self.writeElementAttributes(provider_iref_tag, sw_connector.provider_iref)
348
- self.writeChildOptionalRefElement(provider_iref_tag, "CONTEXT-COMPONENT-REF", sw_connector.provider_iref.context_component_ref)
349
- self.writeChildOptionalRefElement(provider_iref_tag, "TARGET-P-PORT-REF", sw_connector.provider_iref.target_p_port_ref)
387
+ self.setARObjectAttributes(provider_iref_tag, sw_connector.provider_iref)
388
+ self.setChildElementOptionalRefType(provider_iref_tag, "CONTEXT-COMPONENT-REF", sw_connector.provider_iref.context_component_ref)
389
+ self.setChildElementOptionalRefType(provider_iref_tag, "TARGET-P-PORT-REF", sw_connector.provider_iref.target_p_port_ref)
350
390
 
351
391
  if sw_connector.requester_iref is not None:
352
392
  requester_iref_tag = ET.SubElement(connector_tag, "REQUESTER-IREF")
353
- self.writeElementAttributes(requester_iref_tag, sw_connector.requester_iref)
354
- self.writeChildOptionalRefElement(requester_iref_tag, "CONTEXT-COMPONENT-REF", sw_connector.requester_iref.context_component_ref)
355
- self.writeChildOptionalRefElement(requester_iref_tag, "TARGET-R-PORT-REF", sw_connector.requester_iref.target_r_port_ref)
393
+ self.setARObjectAttributes(requester_iref_tag, sw_connector.requester_iref)
394
+ self.setChildElementOptionalRefType(requester_iref_tag, "CONTEXT-COMPONENT-REF", sw_connector.requester_iref.context_component_ref)
395
+ self.setChildElementOptionalRefType(requester_iref_tag, "TARGET-R-PORT-REF", sw_connector.requester_iref.target_r_port_ref)
356
396
 
357
397
  def writeDelegationSwConnector(self, element: ET.Element, sw_connector: DelegationSwConnector):
358
398
  connector_tag = ET.SubElement(element, "DELEGATION-SW-CONNECTOR")
359
- self.writeElementAttributes(connector_tag, sw_connector)
360
- self.writeShortName(connector_tag, sw_connector.short_name)
399
+ self.writeIdentifiable(connector_tag, sw_connector)
361
400
 
362
401
  if sw_connector.inner_port_iref is not None:
363
402
  inner_port_iref_tag = ET.SubElement(connector_tag, "INNER-PORT-IREF")
364
403
  if isinstance(sw_connector.inner_port_iref, PPortInCompositionInstanceRef):
365
404
  instance_ref_tag = ET.SubElement(inner_port_iref_tag, "P-PORT-IN-COMPOSITION-INSTANCE-REF")
366
- self.writeChildOptionalRefElement(instance_ref_tag, "CONTEXT-COMPONENT-REF", sw_connector.inner_port_iref.context_component_ref)
367
- self.writeChildOptionalRefElement(instance_ref_tag, "TARGET-P-PORT-REF", sw_connector.inner_port_iref.target_p_port_ref)
405
+ self.setChildElementOptionalRefType(instance_ref_tag, "CONTEXT-COMPONENT-REF", sw_connector.inner_port_iref.context_component_ref)
406
+ self.setChildElementOptionalRefType(instance_ref_tag, "TARGET-P-PORT-REF", sw_connector.inner_port_iref.target_p_port_ref)
368
407
  elif isinstance(sw_connector.inner_port_iref, RPortInCompositionInstanceRef):
369
408
  instance_ref_tag = ET.SubElement(inner_port_iref_tag, "R-PORT-IN-COMPOSITION-INSTANCE-REF")
370
- self.writeChildOptionalRefElement(instance_ref_tag, "CONTEXT-COMPONENT-REF", sw_connector.inner_port_iref.context_component_ref)
371
- self.writeChildOptionalRefElement(instance_ref_tag, "TARGET-R-PORT-REF", sw_connector.inner_port_iref.target_r_port_ref)
409
+ self.setChildElementOptionalRefType(instance_ref_tag, "CONTEXT-COMPONENT-REF", sw_connector.inner_port_iref.context_component_ref)
410
+ self.setChildElementOptionalRefType(instance_ref_tag, "TARGET-R-PORT-REF", sw_connector.inner_port_iref.target_r_port_ref)
372
411
  else:
373
412
  self._raiseError("Invalid inner port of DelegationSwConnector <%s>" % sw_connector.short_name)
374
413
 
375
414
  if sw_connector.outer_port_ref is not None:
376
- self.writeChildOptionalRefElement(connector_tag, "OUTER-PORT-REF", sw_connector.outer_port_ref)
415
+ self.setChildElementOptionalRefType(connector_tag, "OUTER-PORT-REF", sw_connector.outer_port_ref)
377
416
  #self.writeChildOptionalRefElement(requester_iref_tag, "TARGET-R-PORT-REF", sw_connector.requester_iref.target_r_port_ref)
378
417
 
379
418
  def writeSwConnector(self, element: ET.Element, sw_connector: SwConnector):
@@ -385,62 +424,129 @@ class ARXMLWriter:
385
424
  raise NotImplementedError("Unsupported Sw Connector %s")
386
425
 
387
426
  def writeSwConnectors(self, element: ET.Element, sw_component: CompositionSwComponentType):
388
- connectors_tag = ET.SubElement(element, "CONNECTORS")
389
- for sw_connector in sw_component.getSwConnectors():
390
- self.writeSwConnector(connectors_tag, sw_connector)
427
+ sw_connectors = sw_component.getSwConnectors()
428
+ if len(sw_connectors) > 0:
429
+ connectors_tag = ET.SubElement(element, "CONNECTORS")
430
+ for sw_connector in sw_connectors:
431
+ self.writeSwConnector(connectors_tag, sw_connector)
391
432
 
392
- def writeDataTypeMappingSet(self, element: ET.Element, parent: CompositionSwComponentType):
433
+ def writeCompositionSwComponentTypeDataTypeMappingSet(self, element: ET.Element, parent: CompositionSwComponentType):
393
434
  data_type_mappings = parent.getDataTypeMappings()
394
435
  if len(data_type_mappings) > 0:
395
436
  child_element = ET.SubElement(element, "DATA-TYPE-MAPPING-REFS")
396
437
  self.logger.debug("writeDataTypeMappingSet")
397
438
  for data_type_mapping in data_type_mappings:
398
- self.writeChildOptionalRefElement(child_element, "DATA-TYPE-MAPPING-REF", data_type_mapping)
439
+ self.setChildElementOptionalRefType(child_element, "DATA-TYPE-MAPPING-REF", data_type_mapping)
399
440
 
400
441
  def writeCompositionSwComponentType(self, parent: ET.Element, sw_component: CompositionSwComponentType):
401
442
  child_element = ET.SubElement(parent, "COMPOSITION-SW-COMPONENT-TYPE")
402
443
 
403
- self.writeIdentifiable(child_element, sw_component)
404
444
  self.writeSwComponentType(child_element, sw_component)
405
445
  self.writeSwComponentPrototypes(child_element, sw_component)
406
446
  self.writeSwConnectors(child_element, sw_component)
407
- self.writeDataTypeMappingSet(child_element, sw_component)
447
+ self.writeCompositionSwComponentTypeDataTypeMappingSet(child_element, sw_component)
408
448
 
409
449
  def writeCompositionSwComponentTypes(self, element: ET.Element, ar_package: ARPackage):
410
450
  for sw_component in ar_package.getCompositionSwComponentTypes():
411
451
  self.writeCompositionSwComponentType(element, sw_component)
412
452
 
413
- def writeSwDataDefProps(self, element: ET.Element, sw_data_def_props: SwDataDefProps):
414
- sw_data_def_props_tag = ET.SubElement(element, "SW-DATA-DEF-PROPS")
415
- sw_data_def_props_variants_tag = ET.SubElement(sw_data_def_props_tag, "SW-DATA-DEF-PROPS-VARIANTS")
416
- sw_data_def_props_conditional_tag = ET.SubElement(sw_data_def_props_variants_tag, "SW-DATA-DEF-PROPS-CONDITIONAL")
417
- if sw_data_def_props.sw_calibration_access is not None:
418
- self.writeChildOptionalElement(sw_data_def_props_conditional_tag, "SW-CALIBRATION-ACCESS", sw_data_def_props.sw_calibration_access)
419
- if sw_data_def_props.compu_method_ref is not None:
420
- self.writeChildOptionalRefElement(sw_data_def_props_conditional_tag, "COMPU-METHOD-REF", sw_data_def_props.compu_method_ref)
421
- if sw_data_def_props.data_constr_ref is not None:
422
- self.writeChildOptionalRefElement(sw_data_def_props_conditional_tag, "DATA-CONSTR-REF", sw_data_def_props.data_constr_ref)
423
-
424
- def writeAutosarDataType(self, parent: ET.Element, data_type: AutosarDataType):
425
- self.writeARElement(parent, data_type)
426
- if data_type.sw_data_def_props is not None:
427
- self.writeSwDataDefProps(parent, data_type.sw_data_def_props)
428
-
429
- def writeApplicationDataType(self, parent: ET.Element, data_type: ApplicationDataType):
430
- self.writeAutosarDataType(parent, data_type)
453
+ def writeGeneralAnnotation(self, element: ET.Element, annotation: Annotation):
454
+ self.setMultiLongName(element, "LABEL", annotation.label)
455
+
456
+ def writeAnnotations(self, element: ET.Element, props: SwDataDefProps) :
457
+ annotations = props.getAnnotations()
458
+ if len(annotations) > 0:
459
+ annotations_tag = ET.SubElement(element, "ANNOTATIONS")
460
+ for annotation in annotations:
461
+ annotation_tag = ET.SubElement(annotations_tag, "ANNOTATION")
462
+ self.writeGeneralAnnotation(annotation_tag, annotation)
463
+
464
+ def setSwAxisIndividual(self, element: ET.Element, props: SwAxisIndividual):
465
+ child_element = ET.SubElement(element, "SW-AXIS-INDIVIDUAL")
466
+ self.setARObjectAttributes(child_element, props)
467
+ self.setChildElementOptionalRefType(child_element, "INPUT-VARIABLE-TYPE-REF", props.inputVariableTypeRef)
468
+ self.setChildElementOptionalRefType(child_element, "COMPU-METHOD-REF", props.compuMethodRef)
469
+ self.setChildElementOptionalNumericalValue(child_element, "SW-MAX-AXIS-POINTS", props.swMaxAxisPoints)
470
+ self.setChildElementOptionalNumericalValue(child_element, "SW-MIN-AXIS-POINTS", props.swMinAxisPoints)
471
+ self.setChildElementOptionalRefType(child_element, "DATA-CONSTR-REF", props.dataConstrRef)
472
+
473
+ def setSwAxisGrouped(self, element: ET.Element, props: SwAxisGrouped):
474
+ child_element = ET.SubElement(element, "SW-AXIS-GROUPED")
475
+ self.setARObjectAttributes(child_element, props)
476
+ self.setChildElementOptionalRefType(child_element, "SHARED-AXIS-TYPE-REF", props.sharedAxisTypeRef)
477
+
478
+ def setSwCalprmAxis(self, element: ET.Element, axis: SwCalprmAxis):
479
+ if axis is not None:
480
+ child_element = ET.SubElement(element, "SW-CALPRM-AXIS")
481
+ self.setChildElementOptionalNumericalValue(child_element, "SW-AXIS-INDEX", axis.sw_axis_index)
482
+ self.setChildElementOptionalLiteral(child_element, "CATEGORY", axis.category)
483
+ if axis.sw_calprm_axis_type_props is not None:
484
+ if isinstance(axis.sw_calprm_axis_type_props, SwAxisIndividual):
485
+ self.setSwAxisIndividual(child_element, axis.sw_calprm_axis_type_props)
486
+ elif isinstance(axis.sw_calprm_axis_type_props, SwAxisGrouped):
487
+ self.setSwAxisGrouped(child_element, axis.sw_calprm_axis_type_props)
488
+ else:
489
+ self._raiseError("Unsupported SwCalprmAxisTypeProps %s" % type(axis.sw_calprm_axis_type_props))
490
+
491
+ def setSwCalprmAxisSet(self, element: ET.Element, key: str, set: SwCalprmAxisSet):
492
+ axises = set.getSwCalprmAxises()
493
+ if len(axises) > 0:
494
+ child_element = ET.SubElement(element, key)
495
+ for axis in axises:
496
+ self.setSwCalprmAxis(child_element, axis)
497
+
498
+ def setSwDataDefProps(self, element: ET.Element, key: str, sw_data_def_props: SwDataDefProps):
499
+ if sw_data_def_props is not None:
500
+ child_element = ET.SubElement(element, key)
501
+ self.setARObjectAttributes(child_element, sw_data_def_props)
502
+ sw_data_def_props_variants_tag = ET.SubElement(child_element, "SW-DATA-DEF-PROPS-VARIANTS")
503
+ sw_data_def_props_conditional_tag = ET.SubElement(sw_data_def_props_variants_tag, "SW-DATA-DEF-PROPS-CONDITIONAL")
504
+ self.setARObjectAttributes(sw_data_def_props_conditional_tag, sw_data_def_props.conditional)
505
+ self.writeAnnotations(sw_data_def_props_conditional_tag, sw_data_def_props)
506
+ self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "BASE-TYPE-REF", sw_data_def_props.baseTypeRef)
507
+ self.setChildElementOptionalLiteral(sw_data_def_props_conditional_tag, "SW-CALIBRATION-ACCESS", sw_data_def_props.swCalibrationAccess)
508
+ self.setSwCalprmAxisSet(sw_data_def_props_conditional_tag, "SW-CALPRM-AXIS-SET", sw_data_def_props.swCalprmAxisSet)
509
+ self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "COMPU-METHOD-REF", sw_data_def_props.compuMethodRef)
510
+ self.setChildElementOptionalLiteral(sw_data_def_props_conditional_tag, "SW-IMPL-POLICY", sw_data_def_props.swImplPolicy)
511
+ self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "IMPLEMENTATION-DATA-TYPE-REF", sw_data_def_props.implementationDataTypeRef)
512
+ self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "DATA-CONSTR-REF", sw_data_def_props.dataConstrRef)
513
+ self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "SW-RECORD-LAYOUT-REF", sw_data_def_props.swRecordLayoutRef)
514
+ self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "VALUE-AXIS-DATA-TYPE-REF", sw_data_def_props.valueAxisDataTypeRef)
515
+ self.setChildElementOptionalRefType(sw_data_def_props_conditional_tag, "UNIT-REF", sw_data_def_props.unitRef)
516
+
517
+
518
+ def writeApplicationDataType(self, element: ET.Element, data_type: ApplicationDataType):
519
+ self.writeAutosarDataType(element, data_type)
520
+
521
+ def writeApplicationCompositeDataType(self, element: ET.Element, data_type: ApplicationCompositeDataType):
522
+ self.writeApplicationDataType(element, data_type)
523
+
524
+ def writeAutosarDataType(self, element: ET.Element, data_type: AutosarDataType):
525
+ self.writeARElement(element, data_type)
526
+ self.setSwDataDefProps(element, "SW-DATA-DEF-PROPS", data_type.sw_data_def_props)
431
527
 
432
528
  def writeApplicationPrimitiveDataType(self, element: ET.Element, data_type: ApplicationPrimitiveDataType):
529
+ self.logger.debug("writeApplicationPrimitiveDataType %s" % data_type.short_name)
433
530
  data_type_tag = ET.SubElement(element, "APPLICATION-PRIMITIVE-DATA-TYPE")
434
531
  self.writeApplicationDataType(data_type_tag, data_type)
435
532
 
533
+ def setDataPrototype(self, element: ET.Element, prototype: DataPrototype):
534
+ self.writeIdentifiable(element, prototype)
535
+
536
+ def setApplicationCompositeElementDataPrototype(self, element: ET.Element, prototype: ApplicationCompositeElementDataPrototype):
537
+ self.setDataPrototype(element, prototype)
538
+ self.setChildElementOptionalRefType(element, "TYPE-TREF", prototype.typeTRef)
539
+
540
+ def setApplicationRecordElement(self, element: ET.Element, prototype: ApplicationRecordElement):
541
+ self.setApplicationCompositeElementDataPrototype(element, prototype)
542
+
436
543
  def writeApplicationRecordElements(self, element: ET.Element, data_type: ApplicationRecordDataType):
437
- record_elements = data_type.getApplicationRecordElements()
438
- if len(record_elements) > 0:
544
+ records = data_type.getApplicationRecordElements()
545
+ if len(records) > 0:
439
546
  elements_tag = ET.SubElement(element, "ELEMENTS")
440
- for record_element in record_elements:
441
- record_element_tag = ET.SubElement(elements_tag, "APPLICATION-RECORD-ELEMENT")
442
- self.writeIdentifiable(record_element_tag, record_element)
443
- self.writeChildOptionalRefElement(record_element_tag, "TYPE-TREF", record_element.type_tref)
547
+ for record in records:
548
+ child_element = ET.SubElement(elements_tag, "APPLICATION-RECORD-ELEMENT")
549
+ self.setApplicationRecordElement(child_element, record)
444
550
 
445
551
  def writeApplicationRecordDataType(self, element: ET.Element, data_type: ApplicationRecordDataType):
446
552
  data_type_tag = ET.SubElement(element, "APPLICATION-RECORD-DATA-TYPE")
@@ -456,21 +562,21 @@ class ARXMLWriter:
456
562
  else:
457
563
  raise NotImplementedError("Unsupported ApplicationDataType <%s>" % type(data_type))
458
564
 
459
- def writeBaseTypeDirectDefinition(self, element: ET.Element, base_type: BaseType):
460
- self.writeChildOptionalElement(element, "BASE-TYPE-SIZE", str(base_type.base_type_definition.base_type_size))
461
- self.writeChildOptionalElementLiteral(element, "BASE-TYPE-ENCODING", base_type.base_type_definition.base_type_encoding)
462
- self.writeChildOptionalElementLiteral(element, "NATIVE-DECLARATION", base_type.base_type_definition.native_declaration)
565
+ def writeBaseTypeDirectDefinition(self, element: ET.Element, base_type_definition: BaseTypeDirectDefinition):
566
+ self.setChildElementOptionalNumericalValue(element, "BASE-TYPE-SIZE", base_type_definition.base_type_size)
567
+ self.setChildElementOptionalLiteral(element, "BASE-TYPE-ENCODING", base_type_definition.base_type_encoding)
568
+ self.setChildElementOptionalNumericalValue(element, "MEM-ALIGNMENT", base_type_definition.mem_alignment)
569
+ self.setChildElementOptionalLiteral(element, "NATIVE-DECLARATION", base_type_definition.native_declaration)
463
570
 
464
- def writeSwBaseTypes(self, element: ET.Element, ar_package: ARPackage):
465
- for base_type in ar_package.getSwBaseTypes():
466
- data_type_tag = ET.SubElement(element, "SW-BASE-TYPE")
467
- self.writeIdentifiable(data_type_tag, base_type)
468
- self.writeBaseTypeDirectDefinition(data_type_tag, base_type)
571
+ def writeSwBaseType(self, element: ET.Element, base_type: SwBaseType):
572
+ data_type_tag = ET.SubElement(element, "SW-BASE-TYPE")
573
+ self.writeIdentifiable(data_type_tag, base_type)
574
+ self.writeBaseTypeDirectDefinition(data_type_tag, base_type.baseTypeDefinition)
469
575
 
470
576
  def writeCompuScaleConstantContents(self, element: ET.Element, contents: CompuScaleConstantContents):
471
577
  compu_const_tag = ET.SubElement(element, "COMPU-CONST")
472
578
  if isinstance(contents.compu_const.compu_const_content_type, CompuConstTextContent):
473
- self.writeChildOptionalElement(compu_const_tag, "VT", contents.compu_const.compu_const_content_type.vt)
579
+ self.setChildElementOptionalLiteral(compu_const_tag, "VT", contents.compu_const.compu_const_content_type.vt)
474
580
 
475
581
  def writeCompuNominatorDenominator(self, element: ET.Element, key: str, parent: CompuNominatorDenominator):
476
582
  child_element = ET.SubElement(element, key)
@@ -487,105 +593,1135 @@ class ARXMLWriter:
487
593
  self.writeCompuNominatorDenominator(coeffs_tag, "COMPU-DENOMINATOR", contents.compu_rational_coeffs.compu_denominator)
488
594
 
489
595
  def writeCompuScaleContents(self, element: ET.Element, compu_scale: CompuScale):
490
- if isinstance(compu_scale.compu_scale_contents, CompuScaleConstantContents):
491
- self.writeCompuScaleConstantContents(element, compu_scale.compu_scale_contents)
492
- elif isinstance(compu_scale.compu_scale_contents, CompuScaleRationalFormula):
493
- self.writeCompuScaleRationalFormula(element, compu_scale.compu_scale_contents)
596
+ if isinstance(compu_scale.compuScaleContents, CompuScaleConstantContents):
597
+ self.writeCompuScaleConstantContents(element, compu_scale.compuScaleContents)
598
+ elif isinstance(compu_scale.compuScaleContents, CompuScaleRationalFormula):
599
+ self.writeCompuScaleRationalFormula(element, compu_scale.compuScaleContents)
494
600
  else:
495
- raise NotImplementedError("Unsupported CompuScaleContents %s" % type(compu_scale.compu_scale_contents))
601
+ raise NotImplementedError("Unsupported CompuScaleContents %s" % type(compu_scale.compuScaleContents))
496
602
 
497
603
  def writeCompuScales(self, element: ET.Element, compu_scales: CompuScales):
498
604
  compu_scales_tag = ET.SubElement(element, "COMPU-SCALES")
499
605
  for compu_scale in compu_scales.getCompuScales():
500
- compu_scale_tag = ET.SubElement(compu_scales_tag, "COMPU-SCALE")
501
- self.writeChildLimitElement(compu_scale_tag, "LOWER-LIMIT", compu_scale.lower_limit)
502
- self.writeChildLimitElement(compu_scale_tag, "UPPER-LIMIT", compu_scale.upper_limit)
503
- self.writeCompuScaleContents(compu_scale_tag, compu_scale)
606
+ child_element = ET.SubElement(compu_scales_tag, "COMPU-SCALE")
607
+ self.setARObjectAttributes(child_element, compu_scale)
608
+ self.setChildElementOptionalLiteral(child_element, "SYMBOL", compu_scale.symbol)
609
+ self.writeChildLimitElement(child_element, "LOWER-LIMIT", compu_scale.lowerLimit)
610
+ self.writeChildLimitElement(child_element, "UPPER-LIMIT", compu_scale.upperLimit)
611
+ self.writeCompuScaleContents(child_element, compu_scale)
504
612
 
505
613
  def writeCompuInternalToPhys(self, element: ET.Element, compu_method: CompuMethod):
506
614
  if compu_method.compu_internal_to_phys is not None:
507
615
  compu_internal_to_phys_tag = ET.SubElement(element, "COMPU-INTERNAL-TO-PHYS")
508
- self.writeElementAttributes(compu_internal_to_phys_tag, compu_method.compu_internal_to_phys)
616
+ self.setARObjectAttributes(compu_internal_to_phys_tag, compu_method.compu_internal_to_phys)
509
617
  if isinstance(compu_method.compu_internal_to_phys.compu_content, CompuScales):
510
618
  self.writeCompuScales(compu_internal_to_phys_tag, compu_method.compu_internal_to_phys.compu_content)
511
619
 
512
- def writeCompuMethods(self, element: ET.Element, parent: ARPackage):
513
- for compu_method in parent.getCompuMethods():
514
- compu_method_tag = ET.SubElement(element, "COMPU-METHOD")
515
- self.logger.debug("writeCompuMethods %s" % compu_method.short_name)
516
- self.writeIdentifiable(compu_method_tag, compu_method)
517
- self.writeChildOptionalRefElement(compu_method_tag, "UNIT-REF", compu_method.unit_ref)
518
- self.writeCompuInternalToPhys(compu_method_tag, compu_method)
620
+ def writeCompuMethod(self, element: ET.Element, compu_method: CompuMethod):
621
+ compu_method_tag = ET.SubElement(element, "COMPU-METHOD")
622
+ self.logger.debug("writeCompuMethods %s" % compu_method.short_name)
623
+ self.writeIdentifiable(compu_method_tag, compu_method)
624
+ self.setChildElementOptionalRefType(compu_method_tag, "UNIT-REF", compu_method.unit_ref)
625
+ self.writeCompuInternalToPhys(compu_method_tag, compu_method)
519
626
 
520
- def writeApplicationValueSpecification(self, element: ET.Element, spec: ApplicationValueSpecification):
627
+ def setApplicationValueSpecification(self, element: ET.Element, spec: ApplicationValueSpecification):
521
628
  spec_tag = ET.SubElement(element, "APPLICATION-VALUE-SPECIFICATION")
522
- self.writeChildOptionalElement(spec_tag, "SHORT-LABEL", spec.short_label)
523
- self.writeChildOptionalElement(spec_tag, "CATEGORY", spec.category)
629
+ self.setChildElementOptionalLiteral(spec_tag, "SHORT-LABEL", spec.short_label)
630
+ self.setChildElementOptionalLiteral(spec_tag, "CATEGORY", spec.category)
524
631
  self.writeSwValueCont(spec_tag, spec.sw_value_cont)
525
632
 
526
- def writeRecordValueSpecification(self, element: ET.Element, spec: RecordValueSpecification):
527
- spec_tag = ET.SubElement(element, "RECORD-VALUE-SPECIFICATION")
633
+ def setRecordValueSpecification(self, element: ET.Element, spec: RecordValueSpecification):
634
+ child_element = ET.SubElement(element, "RECORD-VALUE-SPECIFICATION")
635
+ self.setARObjectAttributes(child_element, spec)
636
+ self.setChildElementOptionalLiteral(child_element, "SHORT-LABEL", spec.short_label)
528
637
  fields = spec.get_fields()
529
638
  if len(fields) > 0:
530
- fields_tag = ET.SubElement(spec_tag, "FIELDS")
639
+ fields_tag = ET.SubElement(child_element, "FIELDS")
531
640
  for field in fields:
532
641
  if isinstance(field, ApplicationValueSpecification):
533
- self.writeApplicationValueSpecification(fields_tag, field)
642
+ self.setApplicationValueSpecification(fields_tag, field)
643
+ elif isinstance(field, NumericalValueSpecification):
644
+ self.setNumericalValueSpecification(fields_tag, field)
645
+ elif isinstance(field, TextValueSpecification):
646
+ self.setTextValueSpecification(fields_tag, field)
647
+ elif isinstance(field, ArrayValueSpecification):
648
+ self.setArrayValueSpecification(fields_tag, field)
534
649
  else:
535
650
  raise NotImplementedError("Unsupported Field <%s>" % type(field))
536
651
 
537
- def writeConstantSpecifications(self, element: ET.Element, parent: ARPackage):
538
- for spec in parent.getConstantSpecifications():
539
- spec_tag = ET.SubElement(element, "CONSTANT-SPECIFICATION")
540
- self.writeIdentifiable(spec_tag, spec)
541
-
542
- if spec.value_spec is not None:
543
- value_spec_tag = ET.SubElement(spec_tag, "VALUE-SPEC")
544
- if isinstance(spec.value_spec, ApplicationValueSpecification):
545
- self.writeApplicationValueSpecification(value_spec_tag, spec.value_spec)
546
- elif isinstance(spec.value_spec, RecordValueSpecification):
547
- self.writeRecordValueSpecification(value_spec_tag, spec.value_spec)
548
- else:
549
- raise NotImplementedError("Unsupported ConstantSpecification %s" % type(spec.value_spec))
652
+ def writeConstantSpecification(self, element: ET.Element, spec: ConstantSpecification):
653
+ spec_tag = ET.SubElement(element, "CONSTANT-SPECIFICATION")
654
+ self.writeIdentifiable(spec_tag, spec)
655
+
656
+ if spec.value_spec is not None:
657
+ value_spec_tag = ET.SubElement(spec_tag, "VALUE-SPEC")
658
+ self.setValueSpecification(value_spec_tag, spec.value_spec)
550
659
 
551
- def writeInternalConstrs(self, element: ET.Element, parent: InternalConstrs):
552
- constrs_tag = ET.SubElement(element, "INTERNAL-CONSTRS")
553
- if parent.lower_limit is not None:
554
- self.writeChildLimitElement(constrs_tag, "LOWER-LIMIT", parent.lower_limit)
555
- if parent.upper_limit is not None:
556
- self.writeChildLimitElement(constrs_tag, "UPPER-LIMIT", parent.upper_limit)
557
-
558
- def writePhysConstrs(self, element: ET.Element, parent: PhysConstrs):
559
- constrs_tag = ET.SubElement(element, "PHYS-CONSTRS")
560
- if parent.lower_limit is not None:
561
- self.writeChildLimitElement(constrs_tag, "LOWER-LIMIT", parent.lower_limit)
562
- if parent.upper_limit is not None:
563
- self.writeChildLimitElement(constrs_tag, "UPPER-LIMIT", parent.upper_limit)
564
- self.writeChildOptionalRefElement(constrs_tag, "UNIT-REF", parent.unit_ref)
660
+ def setInternalConstrs(self, element: ET.Element, constrs: InternalConstrs):
661
+ if constrs is not None:
662
+ constrs_tag = ET.SubElement(element, "INTERNAL-CONSTRS")
663
+ self.setARObjectAttributes(constrs_tag, constrs)
664
+ if constrs.lower_limit is not None:
665
+ self.writeChildLimitElement(constrs_tag, "LOWER-LIMIT", constrs.lower_limit)
666
+ if constrs.upper_limit is not None:
667
+ self.writeChildLimitElement(constrs_tag, "UPPER-LIMIT", constrs.upper_limit)
668
+
669
+ def setPhysConstrs(self, element: ET.Element, constrs: PhysConstrs):
670
+ if constrs is not None:
671
+ child_element = ET.SubElement(element, "PHYS-CONSTRS")
672
+ self.setARObjectAttributes(child_element, constrs)
673
+ if constrs.lower_limit is not None:
674
+ self.writeChildLimitElement(child_element, "LOWER-LIMIT", constrs.lower_limit)
675
+ if constrs.upper_limit is not None:
676
+ self.writeChildLimitElement(child_element, "UPPER-LIMIT", constrs.upper_limit)
677
+ self.setChildElementOptionalRefType(child_element, "UNIT-REF", constrs.unit_ref)
565
678
 
566
679
  def writeDataConstrRules(self, element: ET.Element, parent: DataConstr):
567
680
  rules = parent.getDataConstrRules()
568
681
  if len(rules) > 0:
569
682
  rules_tag = ET.SubElement(element, "DATA-CONSTR-RULES")
570
683
  for rule in rules:
571
- rule_tag = ET.SubElement(rules_tag, "DATA-CONSTR-RULE")
572
- if rule.internal_constrs is not None:
573
- self.writeInternalConstrs(rule_tag, rule.internal_constrs)
574
- if rule.phys_constrs is not None:
575
- self.writePhysConstrs(rule_tag, rule.phys_constrs)
576
-
577
- def writeDataConstr(self, element: ET.Element, parent: ARPackage):
578
- for constr in parent.getDataConstrs():
579
- child_element = ET.SubElement(element, "DATA-CONSTR")
580
- self.writeIdentifiable(child_element, constr)
581
- self.writeDataConstrRules(child_element, constr)
582
-
583
- def writeUnit(self, element: ET.Element, parent: ARPackage):
584
- for unit in parent.getUnits():
585
- self.logger.debug("writeUnit %s" % unit.short_name)
586
- child_element = ET.SubElement(element, "UNIT")
587
- self.writeIdentifiable(child_element, unit)
588
- self.writeChildOptionalElementLiteral(child_element, "DISPLAY-NAME", unit.display_name)
684
+ child_element = ET.SubElement(rules_tag, "DATA-CONSTR-RULE")
685
+ self.setARObjectAttributes(child_element, rule)
686
+ self.setChildElementOptionalNumericalValue(child_element, "CONSTR-LEVEL", rule.constrLevel)
687
+ self.setPhysConstrs(child_element, rule.physConstrs)
688
+ self.setInternalConstrs(child_element, rule.internalConstrs)
689
+
690
+ def writeDataConstr(self, element: ET.Element, constr: DataConstr):
691
+ child_element = ET.SubElement(element, "DATA-CONSTR")
692
+ self.writeIdentifiable(child_element, constr)
693
+ self.writeDataConstrRules(child_element, constr)
694
+
695
+ def writeUnit(self, element: ET.Element, unit: Unit):
696
+ self.logger.debug("writeUnit %s" % unit.short_name)
697
+ child_element = ET.SubElement(element, "UNIT")
698
+ self.writeIdentifiable(child_element, unit)
699
+ self.setChildElementOptionalLiteral(child_element, "DISPLAY-NAME", unit.display_name)
700
+
701
+ def setRModeInAtomicSwcInstanceRef(self, element: ET.Element, key: str, iref: RModeInAtomicSwcInstanceRef):
702
+ child_element = ET.SubElement(element, key)
703
+ self.setChildElementOptionalRefType(child_element, "BASE", iref.base_ref)
704
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-PORT-REF", iref.context_port_ref)
705
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-MODE-DECLARATION-GROUP-PROTOTYPE-REF", iref.context_mode_declaration_group_prototype_ref)
706
+ self.setChildElementOptionalRefType(child_element, "TARGET-MODE-DECLARATION-REF", iref.target_mode_declaration_ref)
707
+
708
+ def setPOperationInAtomicSwcInstanceRef(self, element: ET.Element, key: str, iref: POperationInAtomicSwcInstanceRef):
709
+ child_element = ET.SubElement(element, key)
710
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-P-PORT-REF", iref.context_p_port_ref)
711
+ self.setChildElementOptionalRefType(child_element, "TARGET-PROVIDED-OPERATION-REF", iref.target_provided_operation_ref)
712
+
713
+ def setRTEEvent(self, element: ET.Element, event: RTEEvent):
714
+ self.writeIdentifiable(element, event)
715
+ irefs = event.getDisabledModeIRefs()
716
+ if len(irefs) > 0:
717
+ child_element = ET.SubElement(element, "DISABLED-MODE-IREFS")
718
+ for iref in irefs:
719
+ self.setRModeInAtomicSwcInstanceRef(child_element, "DISABLED-MODE-IREF", iref)
720
+ self.setChildElementOptionalRefType(element, "START-ON-EVENT-REF", event.start_on_event_ref)
721
+
722
+ def setTimingEvent(self, element: ET.Element, event: TimingEvent):
723
+ if event is not None:
724
+ child_element = ET.SubElement(element, "TIMING-EVENT")
725
+ self.setRTEEvent(child_element, event)
726
+ self.setChildElementOptionalFloatValue(child_element, "PERIOD", event.period)
727
+
728
+ def setOperationInvokedEvent(self, element: ET.Element, event: OperationInvokedEvent):
729
+ if event is not None:
730
+ child_element = ET.SubElement(element, "OPERATION-INVOKED-EVENT")
731
+ self.setRTEEvent(child_element, event)
732
+ self.setPOperationInAtomicSwcInstanceRef(child_element, "OPERATION-IREF", event.operation_iref)
733
+
734
+ def setSwcModeSwitchEvent(self, element: ET.Element, event: SwcModeSwitchEvent):
735
+ if event is not None:
736
+ child_element = ET.SubElement(element, "SWC-MODE-SWITCH-EVENT")
737
+ self.setRTEEvent(child_element, event)
738
+ self.setChildElementOptionalLiteral(child_element, "ACTIVATION", event.activation)
739
+ irefs = event.getModeIRefs()
740
+ if len(irefs) > 0:
741
+ mode_irefs_tag = ET.SubElement(child_element, "MODE-IREFS")
742
+ for iref in irefs:
743
+ self.setRModeInAtomicSwcInstanceRef(mode_irefs_tag, "MODE-IREF", iref)
744
+
745
+ def setRVariableInAtomicSwcInstanceRef(self, element: ET.Element, iref: RVariableInAtomicSwcInstanceRef):
746
+ if iref is not None:
747
+ child_element = ET.SubElement(element, "DATA-IREF")
748
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-R-PORT-REF", iref.context_r_port_ref)
749
+ self.setChildElementOptionalRefType(child_element, "TARGET-DATA-ELEMENT-REF", iref.target_data_element_ref)
750
+
751
+ def setDataReceivedEvent(self, element: ET.Element, event: DataReceivedEvent):
752
+ if event is not None:
753
+ child_element = ET.SubElement(element, "DATA-RECEIVED-EVENT")
754
+ self.setRTEEvent(child_element, event)
755
+ self.setRVariableInAtomicSwcInstanceRef(child_element, event.data_iref)
756
+
757
+ def setInternalTriggerOccurredEvent(self, element: ET.Element, event: DataReceivedEvent):
758
+ pass
759
+
760
+ def writeRTEEvents(self, element: ET.Element, parent: SwcInternalBehavior):
761
+ events = parent.getRteEvents()
762
+ if len(events) > 0:
763
+ child_element = ET.SubElement(element, "EVENTS")
764
+
765
+ for event in events:
766
+ if isinstance(event, TimingEvent):
767
+ self.setTimingEvent(child_element, event)
768
+ elif isinstance(event, OperationInvokedEvent):
769
+ self.setOperationInvokedEvent(child_element, event)
770
+ elif isinstance(event, SwcModeSwitchEvent):
771
+ self.setSwcModeSwitchEvent(child_element, event)
772
+ elif isinstance(event, DataReceivedEvent):
773
+ self.setDataReceivedEvent(child_element, event)
774
+ elif isinstance(event, InternalTriggerOccurredEvent):
775
+ self.setInternalTriggerOccurredEvent(child_element, event)
776
+ else:
777
+ raise NotImplementedError("Unsupported Event <%s>" % type(event))
778
+
779
+ def writeExclusiveAreas(self, element: ET.Element, behavior: InternalBehavior):
780
+ areas = behavior.getExclusiveAreas()
781
+ if len(areas) > 0:
782
+ areas_tag = ET.SubElement(element, "EXCLUSIVE-AREAS")
783
+ for area in areas:
784
+ child_element = ET.SubElement(areas_tag, "EXCLUSIVE-AREA")
785
+ self.writeIdentifiable(child_element, area)
786
+
787
+ def writeDataTypeMappingRefs(self, element: ET.Element, behavior: InternalBehavior):
788
+ refs = behavior.getDataTypeMappingRefs()
789
+ if len(refs) > 0:
790
+ refs_tag = ET.SubElement(element, "DATA-TYPE-MAPPING-REFS")
791
+ for ref in refs:
792
+ self.setChildElementOptionalRefType(refs_tag, "DATA-TYPE-MAPPING-REF", ref)
793
+
794
+ def writeInternalBehavior(self, element: ET.Element, behavior: InternalBehavior):
795
+ self.writeIdentifiable(element, behavior)
796
+ self.writeDataTypeMappingRefs(element, behavior)
797
+ self.writeExclusiveAreas(element, behavior)
798
+
799
+ def writeExecutableEntity(self, element: ET.Element, entity: ExecutableEntity):
800
+ if entity is not None:
801
+ self.setChildElementOptionalFloatValue(element, "MINIMUM-START-INTERVAL", entity.minimum_start_interval)
802
+
803
+ def setAutosarVariableRef(self, element: ET.Element, ref: AutosarVariableRef):
804
+ if ref is not None:
805
+ child_element = ET.SubElement(element, "ACCESSED-VARIABLE")
806
+ if ref.autosar_variable_iref is not None:
807
+ child_element = ET.SubElement(child_element, "AUTOSAR-VARIABLE-IREF")
808
+ self.setChildElementOptionalRefType(child_element, "PORT-PROTOTYPE-REF", ref.autosar_variable_iref.port_prototype_ref)
809
+ self.setChildElementOptionalRefType(child_element, "TARGET-DATA-PROTOTYPE-REF", ref.autosar_variable_iref.target_data_prototype_ref)
810
+ if ref.local_variable_ref is not None:
811
+ self.setChildElementOptionalRefType(child_element, "LOCAL-VARIABLE-REF", ref.local_variable_ref)
812
+
813
+ def setVariableAccess(self, element: ET.Element, access: VariableAccess):
814
+ child_element = ET.SubElement(element, "VARIABLE-ACCESS")
815
+ self.writeIdentifiable(child_element, access)
816
+ self.setAutosarVariableRef(child_element, access.accessed_variable_ref)
817
+
818
+ def writeDataReadAccesses(self, element: ET.Element, entity: RunnableEntity):
819
+ #accesses = entity.getDataReadAccesses():
820
+ pass
821
+
822
+ def setAutosarParameterRef(self, element: ET.Element, key: str, parameter_ref: AutosarParameterRef):
823
+ if parameter_ref is not None:
824
+ child_element = ET.SubElement(element, key)
825
+ self.setChildElementOptionalRefType(child_element, "LOCAL-PARAMETER-REF", parameter_ref.local_parameter_ref)
826
+
827
+ def writeParameterAccess(self, element: ET.Element, parameter_access: ParameterAccess):
828
+ child_element = ET.SubElement(element, "PARAMETER-ACCESS")
829
+ self.writeIdentifiable(child_element, parameter_access)
830
+ self.setAutosarParameterRef(child_element, "ACCESSED-PARAMETER", parameter_access.accessed_parameter)
831
+
832
+ def writeParameterAccesses(self, element: ET.Element, entity: RunnableEntity):
833
+ parameter_accesses = entity.getParameterAccesses()
834
+ if len(parameter_accesses) > 0:
835
+ child_element = ET.SubElement(element, "PARAMETER-ACCESSS")
836
+ for parameter_access in parameter_accesses:
837
+ self.writeParameterAccess(child_element, parameter_access)
838
+
839
+ def writeDataReceivePointByArguments(self, element: ET.Element, entity: RunnableEntity):
840
+ accesses = entity.getDataReceivePointByArguments()
841
+ if len(accesses) > 0:
842
+ child_element = ET.SubElement(element, "DATA-RECEIVE-POINT-BY-ARGUMENTS")
843
+ for access in accesses:
844
+ self.setVariableAccess(child_element, access)
845
+
846
+ def writeDataSendPoints(self, element: ET.Element, entity: RunnableEntity):
847
+ points = entity.getDataSendPoints()
848
+ if len(points) > 0:
849
+ child_element = ET.SubElement(element, "DATA-SEND-POINTS")
850
+ for point in points:
851
+ self.setVariableAccess(child_element, point)
852
+
853
+ def writeDataWriteAccesses(self, element: ET.Element, entity: RunnableEntity):
854
+ points = entity.getDataWriteAccesses()
855
+ if len(points) > 0:
856
+ child_element = ET.SubElement(element, "DATA-WRITE-ACCESSS")
857
+ for point in points:
858
+ self.setVariableAccess(child_element, point)
859
+
860
+ def writeReadLocalVariables(self, element: ET.Element, entity: RunnableEntity):
861
+ variables = entity.getReadLocalVariables()
862
+ if len(variables) > 0:
863
+ child_element = ET.SubElement(element, "READ-LOCAL-VARIABLES")
864
+ for access in variables:
865
+ self.setVariableAccess(child_element, access)
866
+
867
+ def writeROperationInAtomicSwcInstanceRef(self, element: ET.Element, key: str, iref: ROperationInAtomicSwcInstanceRef):
868
+ if iref is not None:
869
+ child_element = ET.SubElement(element, key)
870
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-R-PORT-REF", iref.context_r_port_ref)
871
+ self.setChildElementOptionalRefType(child_element, "TARGET-REQUIRED-OPERATION-REF", iref.target_required_operation_ref)
872
+
873
+ def writeServerCallPoint(self, element: ET.Element, call_point: ServerCallPoint):
874
+ self.writeROperationInAtomicSwcInstanceRef(element, "OPERATION-IREF", call_point.operation_iref)
875
+ self.setChildElementOptionalFloatValue(element, "TIMEOUT", call_point.timeout)
876
+
877
+ def writeSynchronousServerCallPoint(self, element: ET.Element, call_point: SynchronousServerCallPoint):
878
+ child_element = ET.SubElement(element, "SYNCHRONOUS-SERVER-CALL-POINT")
879
+ self.writeIdentifiable(child_element, call_point)
880
+ self.writeServerCallPoint(child_element, call_point)
881
+
882
+ def writeServerCallPoints(self, element: ET.Element, entity: RunnableEntity):
883
+ call_points = entity.getServerCallPoints()
884
+ if len(call_points) > 0:
885
+ child_element = ET.SubElement(element, "SERVER-CALL-POINTS")
886
+ for call_point in call_points:
887
+ if isinstance(call_point, SynchronousServerCallPoint):
888
+ self.writeSynchronousServerCallPoint(child_element, call_point)
889
+ else:
890
+ self._raiseError("Unsupported ServerCallPoint type <%s>" % type(call_point))
891
+
892
+ def writeWrittenLocalVariable(self, element: ET.Element, entity: RunnableEntity):
893
+ variables = entity.getWrittenLocalVariables()
894
+ if len(variables) > 0:
895
+ child_element = ET.SubElement(element, "WRITTEN-LOCAL-VARIABLES")
896
+ for access in variables:
897
+ self.setVariableAccess(child_element, access)
898
+
899
+ def writeRunnableEntity(self, element: ET.Element, entity: RunnableEntity):
900
+ if entity is not None:
901
+ child_element = ET.SubElement(element, "RUNNABLE-ENTITY")
902
+ self.writeIdentifiable(child_element, entity)
903
+ self.writeExecutableEntity(child_element, entity)
904
+ self.setChildElementOptionalBooleanValue(child_element, "CAN-BE-INVOKED-CONCURRENTLY", entity.can_be_invoked_concurrently)
905
+ self.writeParameterAccesses(child_element, entity)
906
+ self.writeDataReceivePointByArguments(child_element, entity)
907
+ self.writeDataSendPoints(child_element, entity)
908
+ self.writeDataWriteAccesses(child_element, entity)
909
+ self.writeReadLocalVariables(child_element, entity)
910
+ self.writeServerCallPoints(child_element, entity)
911
+ self.setChildElementOptionalLiteral(child_element, "SYMBOL", entity.symbol)
912
+ self.writeWrittenLocalVariable(child_element, entity)
913
+
914
+ def writeSwcInternalBehaviorRunnableEntities(self, element: ET.Element, behavior: SwcInternalBehavior):
915
+ entities = behavior.getRunnableEntities()
916
+ if len(entities) > 0:
917
+ runnables_tag = ET.SubElement(element, "RUNNABLES")
918
+ for entity in entities:
919
+ if isinstance(entity, RunnableEntity):
920
+ self.writeRunnableEntity(runnables_tag, entity)
921
+ else:
922
+ raise NotImplementedError("Unsupported RunnableEntity <%s>" % type(entity))
923
+
924
+ def writeExplicitInterRunnableVariables(self, element: ET.Element, behavior: SwcInternalBehavior):
925
+ prototypes = behavior.getExplicitInterRunnableVariables()
926
+ if len(prototypes) > 0:
927
+ child_element = ET.SubElement(element, "EXPLICIT-INTER-RUNNABLE-VARIABLES")
928
+ for prototype in prototypes:
929
+ if isinstance(prototype, VariableDataPrototype):
930
+ self.writeVariableDataPrototype(child_element, prototype)
931
+ else:
932
+ self._raiseError("Unsupported ExplicitInterRunnableVariables <%s>" % type(prototype))
933
+
934
+ def writePerInstanceMemories(self, element: ET.Element, behavior: SwcInternalBehavior):
935
+ memories = behavior.getPerInstanceMemories()
936
+ if len(memories) > 0:
937
+ memories_tag = ET.SubElement(element, "PER-INSTANCE-MEMORYS")
938
+ for memory in memories:
939
+ child_element = ET.SubElement(memories_tag, "PER-INSTANCE-MEMORY")
940
+ self.writeIdentifiable(child_element, memory)
941
+ self.setChildElementOptionalLiteral(child_element, "INIT-VALUE", memory.init_value)
942
+ self.setSwDataDefProps(child_element, "SW-DATA-DEF-PROPS", memory.sw_data_def_props)
943
+ self.setChildElementOptionalLiteral(child_element, "TYPE", memory.type)
944
+ self.setChildElementOptionalLiteral (child_element, "TYPE-DEFINITION", memory.type_definition)
945
+
946
+ def writeParameterDataPrototype(self, element: ET.Element, prototype: ParameterDataPrototype):
947
+ child_element = ET.SubElement(element, "PARAMETER-DATA-PROTOTYPE")
948
+ self.writeIdentifiable(child_element, prototype)
949
+ self.writeAutosarDataPrototype(child_element, prototype)
950
+ self.setInitValue(child_element, prototype.init_value)
951
+
952
+ def writeParameterDataPrototypes(self, element: ET.Element, behavior: SwcInternalBehavior):
953
+ prototypes = behavior.getParameterDataPrototypes()
954
+ if len(prototypes) > 0:
955
+ child_element = ET.SubElement(element, "PER-INSTANCE-PARAMETERS")
956
+ for prototype in prototypes:
957
+ self.writeParameterDataPrototype(child_element, prototype)
958
+
959
+ def writePortDefinedArgumentValues(self, element: ET.Element, option: PortAPIOption) :
960
+ argument_values = option.getPortArgValues()
961
+ if len(argument_values) > 0:
962
+ child_element = ET.SubElement(element, "PORT-ARG-VALUES")
963
+ for argument_value in argument_values:
964
+ child_element = ET.SubElement(child_element, "PORT-DEFINED-ARGUMENT-VALUE")
965
+ if argument_value.value is not None:
966
+ value_tag = ET.SubElement(child_element, "VALUE")
967
+ self.setValueSpecification(value_tag, argument_value.value)
968
+ self.setChildElementOptionalRefType(child_element, "VALUE-TYPE-TREF", argument_value.value_type)
969
+
970
+ def writePortAPIOptions(self, element: ET.Element, behavior: SwcInternalBehavior):
971
+ options = behavior.getPortAPIOptions()
972
+ if len(options) > 0:
973
+ port_api_options_tag = ET.SubElement(element, "PORT-API-OPTIONS")
974
+ for option in options:
975
+ child_element = ET.SubElement(port_api_options_tag, "PORT-API-OPTION")
976
+ self.setChildElementOptionalBooleanValue(child_element, "ENABLE-TAKE-ADDRESS", option.enable_take_address)
977
+ self.setChildElementOptionalBooleanValue(child_element, "INDIRECT-API", option.indirect_api)
978
+ self.writePortDefinedArgumentValues(child_element, option)
979
+ self.setChildElementOptionalRefType(child_element, "PORT-REF", option.port_ref)
980
+
981
+ def writeServiceDependency(self, element: ET.Element, dependency: ServiceDependency):
982
+ self.writeIdentifiable(element, dependency)
983
+
984
+ def writeRoleBasedDataAssignment(self, element: ET.Element, assignment: RoleBasedDataAssignment):
985
+ child_element = ET.SubElement(element, "ROLE-BASED-DATA-ASSIGNMENT")
986
+ self.setChildElementOptionalLiteral(child_element, "ROLE", assignment.role)
987
+ self.setAutosarParameterRef(child_element, "USED-PARAMETER-ELEMENT", assignment.used_parameter_element)
988
+ self.setChildElementOptionalRefType(child_element, "USED-PIM-REF", assignment.used_pim_ref)
989
+
990
+ def writeRoleBasedPortAssignment(self, element: ET.Element, assignment: RoleBasedPortAssignment):
991
+ child_element = ET.SubElement(element, "ROLE-BASED-PORT-ASSIGNMENT")
992
+ self.setChildElementOptionalRefType(child_element, "PORT-PROTOTYPE-REF", assignment.port_prototype_ref)
993
+ self.setChildElementOptionalLiteral(child_element, "ROLE", assignment.role)
994
+
995
+ def writeSwcServiceDependencyAssignedData(self, element: ET.Element, dependency: SwcServiceDependency):
996
+ assigned_data = dependency.getAssignedData()
997
+ if len(assigned_data) > 0:
998
+ child_element = ET.SubElement(element, "ASSIGNED-DATAS")
999
+ for data in assigned_data:
1000
+ if isinstance(data, RoleBasedDataAssignment):
1001
+ self.writeRoleBasedDataAssignment(child_element, data)
1002
+ else:
1003
+ self._raiseError("Unsupported Assigned Data <%s>" % type(data))
1004
+
1005
+ def writeSwcServiceDependencyAssignedPorts(self, element: ET.Element, dependency: SwcServiceDependency):
1006
+ assigned_data = dependency.getAssignedPorts()
1007
+ if len(assigned_data) > 0:
1008
+ child_element = ET.SubElement(element, "ASSIGNED-PORTS")
1009
+ for data in assigned_data:
1010
+ if isinstance(data, RoleBasedPortAssignment):
1011
+ self.writeRoleBasedPortAssignment(child_element, data)
1012
+ else:
1013
+ self._raiseError("Unsupported Assigned Data <%s>" % type(data))
1014
+
1015
+ def writeNvBlockNeeds(self, element: ET.Element, needs: NvBlockNeeds):
1016
+ child_element = ET.SubElement(element, "NV-BLOCK-NEEDS")
1017
+ self.logger.debug("writeNvBlockNeeds %s" % needs.short_name)
1018
+ self.writeIdentifiable(child_element, needs)
1019
+ self.setChildElementOptionalBooleanValue(child_element, "CALC-RAM-BLOCK-CRC", needs.calc_ram_block_crc)
1020
+ self.setChildElementOptionalBooleanValue(child_element, "CHECK-STATIC-BLOCK-ID", needs.check_static_block_id)
1021
+ self.setChildElementOptionalNumericalValue(child_element, "N-DATA-SETS", needs.n_data_sets)
1022
+ self.setChildElementOptionalNumericalValue(child_element, "N-ROM-BLOCKS", needs.n_rom_blocks)
1023
+ self.setChildElementOptionalBooleanValue(child_element, "READONLY", needs.readonly)
1024
+ self.setChildElementOptionalLiteral(child_element, "RELIABILITY", needs.reliability)
1025
+ self.setChildElementOptionalBooleanValue(child_element, "RESISTANT-TO-CHANGED-SW", needs.resistant_to_changed_sw)
1026
+ self.setChildElementOptionalBooleanValue(child_element, "RESTORE-AT-START", needs.restore_at_start)
1027
+ self.setChildElementOptionalBooleanValue(child_element, "STORE-AT-SHUTDOWN", needs.store_at_shutdown)
1028
+ self.setChildElementOptionalBooleanValue(child_element, "WRITE-ONLY-ONCE", needs.write_only_once)
1029
+ self.setChildElementOptionalBooleanValue(child_element, "WRITE-VERIFICATION", needs.write_verification)
1030
+ self.setChildElementOptionalLiteral(child_element, "WRITING-PRIORITY", needs.writing_priority)
1031
+
1032
+ def writeSwcServiceDependencyServiceNeeds(self, element: ET.Element, parent: SwcServiceDependency):
1033
+ needs = parent.getServiceNeeds()
1034
+ if len(needs) > 0:
1035
+ child_element = ET.SubElement(element, "SERVICE-NEEDS")
1036
+ for need in needs:
1037
+ if isinstance(need, NvBlockNeeds):
1038
+ self.writeNvBlockNeeds(child_element, need)
1039
+ else:
1040
+ self._raiseError("Unsupported service needs <%s>" % type(need))
1041
+
1042
+ def writeSwcServiceDependency(self, element: ET.Element, dependency: SwcServiceDependency):
1043
+ child_element = ET.SubElement(element, "SWC-SERVICE-DEPENDENCY")
1044
+ self.writeServiceDependency(child_element, dependency)
1045
+ self.writeSwcServiceDependencyAssignedData(child_element, dependency)
1046
+ self.writeSwcServiceDependencyAssignedPorts(child_element, dependency)
1047
+ self.writeSwcServiceDependencyServiceNeeds(child_element, dependency)
1048
+
1049
+ def writeSwcInternalBehaviorServiceDependencies(self, element: ET.Element, behavior: SwcInternalBehavior):
1050
+ dependencies = behavior.getSwcServiceDependencies()
1051
+ if len(dependencies) > 0:
1052
+ child_element = ET.SubElement(element, "SERVICE-DEPENDENCYS")
1053
+ for dependency in dependencies:
1054
+ if isinstance(dependency, SwcServiceDependency):
1055
+ self.writeSwcServiceDependency(child_element, dependency)
1056
+ else:
1057
+ self._raiseError("Unsupported ServiceDependency <%s>" % type(dependency))
1058
+
1059
+ def writeSwcInternalBehavior(self, element: ET.Element, behavior: SwcInternalBehavior):
1060
+ self.logger.debug("writeSwInternalBehavior %s" % behavior.short_name)
1061
+
1062
+ child_element = ET.SubElement(element, "SWC-INTERNAL-BEHAVIOR")
1063
+ self.writeInternalBehavior(child_element, behavior)
1064
+ self.writeRTEEvents(child_element, behavior)
1065
+ self.writeExplicitInterRunnableVariables(child_element, behavior)
1066
+ self.setChildElementOptionalLiteral(child_element, "HANDLE-TERMINATION-AND-RESTART", behavior.handle_termination_and_restart)
1067
+ self.writePerInstanceMemories(child_element, behavior)
1068
+ self.writeParameterDataPrototypes(child_element, behavior)
1069
+ self.writePortAPIOptions(child_element, behavior)
1070
+ self.writeSwcInternalBehaviorRunnableEntities(child_element, behavior)
1071
+ self.writeSwcInternalBehaviorServiceDependencies(child_element, behavior)
1072
+ self.setChildElementOptionalBooleanValue(child_element, "SUPPORTS-MULTIPLE-INSTANTIATION", behavior.supports_multiple_instantiation)
1073
+
1074
+ def writeAtomicSwComponentTypeInternalBehaviors(self, element: ET.Element, behavior: InternalBehavior):
1075
+ if behavior is not None:
1076
+ behaviors_tag = ET.SubElement(element, "INTERNAL-BEHAVIORS")
1077
+ if isinstance(behavior, SwcInternalBehavior):
1078
+ self.writeSwcInternalBehavior(behaviors_tag, behavior)
1079
+ else:
1080
+ self._raiseError("Unsupported Internal Behaviors <%s>" % type(behavior))
1081
+
1082
+ def writeAtomicSwComponentType(self, element: ET.Element, sw_component: AtomicSwComponentType):
1083
+ self.writeSwComponentType(element, sw_component)
1084
+ self.writeAtomicSwComponentTypeInternalBehaviors(element, sw_component.internal_behavior)
1085
+
1086
+ def writeComplexDeviceDriverSwComponentType(self, element: ET.Element, sw_component: ComplexDeviceDriverSwComponentType):
1087
+ self.logger.debug("writeComplexDeviceDriverSwComponentType %s" % sw_component.short_name)
1088
+ child_element = ET.SubElement(element, "COMPLEX-DEVICE-DRIVER-SW-COMPONENT-TYPE")
1089
+ self.writeAtomicSwComponentType(child_element, sw_component)
1090
+
1091
+ def writeArtifactDescriptors(self, element: ET.Element, code_desc: Code):
1092
+ artifact_descriptors = code_desc.getArtifactDescriptors()
1093
+ if len(artifact_descriptors) > 0:
1094
+ artifact_descs_tag = ET.SubElement(element, "ARTIFACT-DESCRIPTORS")
1095
+ for artifact_desc in artifact_descriptors:
1096
+ artifact_desc_tag = ET.SubElement(artifact_descs_tag, "AUTOSAR-ENGINEERING-OBJECT")
1097
+ self.logger.debug("writeArtifactDescriptor %s", artifact_desc.short_label)
1098
+ self.setARObjectAttributes(artifact_desc_tag, artifact_desc)
1099
+ self.setChildElementOptionalLiteral(artifact_desc_tag, "SHORT-LABEL", artifact_desc.short_label)
1100
+ self.setChildElementOptionalLiteral(artifact_desc_tag, "CATEGORY", artifact_desc.category)
1101
+
1102
+ def setCode(self, element: ET.SubElement, code_desc: Code):
1103
+ self.logger.debug("setCode %s" % code_desc.short_name)
1104
+ child_element = ET.SubElement(element, "CODE")
1105
+ self.writeIdentifiable(child_element, code_desc)
1106
+ self.writeArtifactDescriptor(child_element, code_desc)
1107
+
1108
+ def writeCodeDescriptors(self, element: ET.Element, impl: Implementation):
1109
+ descs = impl.getCodeDescriptors()
1110
+ if len(descs) > 0:
1111
+ child_element = ET.SubElement(element, "CODE-DESCRIPTORS")
1112
+ for desc in descs:
1113
+ if isinstance(desc, Code):
1114
+ self.setCode(child_element, desc)
1115
+ else:
1116
+ self._raiseError("Unsupported Code Descriptor <%s>" % type(desc))
1117
+
1118
+ def setMemorySectionOptions(self, element: ET.Element, options: List[ARLiteral]):
1119
+ if len(options) > 0:
1120
+ child_element = ET.SubElement(element, "OPTIONS")
1121
+ for option in options:
1122
+ self.setChildElementOptionalLiteral(child_element, "OPTION", option)
1123
+
1124
+ def writeMemorySections(self, element: ET.Element, consumption: ResourceConsumption):
1125
+ memory_sections = consumption.getMemorySections()
1126
+ if len(memory_sections) > 0:
1127
+ sections_tag = ET.SubElement(element, "MEMORY-SECTIONS")
1128
+ for memory_section in memory_sections:
1129
+ child_element = ET.SubElement(sections_tag, "MEMORY-SECTION")
1130
+ self.writeIdentifiable(child_element, memory_section)
1131
+ self.setChildElementOptionalLiteral(child_element, "ALIGNMENT", memory_section.alignment)
1132
+ self.setMemorySectionOptions(child_element, memory_section.getOptions())
1133
+ self.setChildElementOptionalNumericalValue(child_element, "SIZE", memory_section.size)
1134
+ self.setChildElementOptionalRefType(child_element, "SW-ADDRMETHOD-REF", memory_section.swAddrMethodRef)
1135
+ self.setChildElementOptionalLiteral(child_element, "SYMBOL", memory_section.symbol)
1136
+ self.logger.debug("writeMemorySections %s" % memory_section.short_name)
1137
+
1138
+ def setResourceConsumption(self, element: ET.Element, consumption: ResourceConsumption):
1139
+ if consumption is not None:
1140
+ child_element = ET.SubElement(element, "RESOURCE-CONSUMPTION")
1141
+ self.writeIdentifiable(child_element, consumption)
1142
+ self.writeMemorySections(child_element, consumption)
1143
+
1144
+ def writeImplementation(self, element: ET.Element, impl: Implementation):
1145
+ self.writeIdentifiable(element, impl)
1146
+ self.writeCodeDescriptors(element, impl)
1147
+ self.setChildElementOptionalLiteral(element, "PROGRAMMING-LANGUAGE", impl.programming_language)
1148
+ self.setResourceConsumption(element, impl.getResourceConsumption())
1149
+ self.setChildElementOptionalLiteral(element, "SW-VERSION", impl.sw_version)
1150
+ self.setChildElementOptionalRefType(element, "SWC-BSW-MAPPING-REF", impl.swc_bsw_mapping_ref)
1151
+ self.setChildElementOptionalLiteral(element, "USED-CODE-GENERATOR", impl.used_code_generator)
1152
+ self.setChildElementOptionalNumericalValue(element, "VENDOR-ID", impl.vendor_id)
1153
+
1154
+ def writeSwcImplementation(self, element: ET.Element, impl: SwcImplementation):
1155
+ self.logger.debug("writeSwcImplementation %s" % impl.short_name)
1156
+ child_element = ET.SubElement(element, "SWC-IMPLEMENTATION")
1157
+ self.writeImplementation(child_element, impl)
1158
+ self.setChildElementOptionalRefType(child_element, "BEHAVIOR-REF", impl.behavior_ref)
1159
+
1160
+ def writeEndToEndDescriptionDataId(self, element: ET.Element, parent: EndToEndDescription):
1161
+ data_ids = parent.getDataIds()
1162
+ if len(data_ids) > 0:
1163
+ child_element = ET.SubElement(element, "DATA-IDS")
1164
+ for data_id in data_ids:
1165
+ self.setChildElementOptionalNumericalValue(child_element, "DATA-ID", data_id)
1166
+
1167
+ def setEndToEndDescription(self, element: ET.Element, key: str, desc: EndToEndDescription):
1168
+ if desc is not None:
1169
+ child_element = ET.SubElement(element, key)
1170
+ self.setChildElementOptionalLiteral(child_element, "CATEGORY", desc.category)
1171
+ self.writeEndToEndDescriptionDataId(child_element, desc)
1172
+ self.setChildElementOptionalNumericalValue(child_element, "DATA-ID-MODE", desc.dataIdMode)
1173
+ self.setChildElementOptionalNumericalValue(child_element, "MAX-DELTA-COUNTER-INIT", desc.maxDeltaCounterInit)
1174
+ self.setChildElementOptionalNumericalValue(child_element, "CRC-OFFSET", desc.crcOffset)
1175
+ self.setChildElementOptionalNumericalValue(child_element, "COUNTER-OFFSET", desc.counterOffset)
1176
+
1177
+ def setVariableDataPrototypeInSystemInstanceRef(self, element: ET.Element, key: str, iref: VariableDataPrototypeInSystemInstanceRef):
1178
+ if iref is not None:
1179
+ child_element = ET.SubElement(element, key)
1180
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-COMPONENT-REF", iref.contextComponentRef)
1181
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-COMPOSITION-REF", iref.contextCompositionRef)
1182
+ self.setChildElementOptionalRefType(child_element, "CONTEXT-PORT-REF", iref.contextPortRef)
1183
+ self.setChildElementOptionalRefType(child_element, "TARGET-DATA-PROTOTYPE-REF", iref.targetDataPrototypeRef)
1184
+
1185
+ def setEndToEndProtectionVariablePrototype(self, element: ET.Element, key: str, prototype: EndToEndProtectionVariablePrototype):
1186
+ if prototype is not None:
1187
+ child_element = ET.SubElement(element, key)
1188
+ irefs = prototype.getReceiverIrefs()
1189
+ if len(irefs) > 0:
1190
+ child_element = ET.SubElement(child_element, "RECEIVER-IREFS")
1191
+ for iref in irefs:
1192
+ self.setVariableDataPrototypeInSystemInstanceRef(child_element, "RECEIVER-IREF", iref)
1193
+ self.setVariableDataPrototypeInSystemInstanceRef(child_element, "SENDER-IREF", prototype.senderIRef)
1194
+
1195
+ def writeEndToEndProtectionVariablePrototypes(self, element: ET.Element, parent: EndToEndProtection):
1196
+ prototypes = parent.getEndToEndProtectionVariablePrototypes()
1197
+ if len(prototypes) > 0:
1198
+ child_element = ET.SubElement(element, "END-TO-END-PROTECTION-VARIABLE-PROTOTYPES")
1199
+ for prototype in prototypes:
1200
+ if isinstance(prototype, EndToEndProtectionVariablePrototype):
1201
+ self.setEndToEndProtectionVariablePrototype(child_element, "END-TO-END-PROTECTION-VARIABLE-PROTOTYPE", prototype)
1202
+ else:
1203
+ self._raiseError("Unsupported End To End Protection Variable Prototype <%s>" % type(prototype))
1204
+
1205
+ def setEndToEndProtection(self, element: ET.Element, protection: EndToEndProtection):
1206
+ if protection is not None:
1207
+ child_element = ET.SubElement(element, "END-TO-END-PROTECTION")
1208
+ self.writeIdentifiable(child_element, protection)
1209
+ self.setEndToEndDescription(child_element, "END-TO-END-PROFILE", protection.endToEndProfile)
1210
+ self.writeEndToEndProtectionVariablePrototypes(child_element, protection)
1211
+
1212
+ def writeEndToEndProtections(self, element: ET.Element, protection_set: EndToEndProtectionSet):
1213
+ protections = protection_set.getEndToEndProtections()
1214
+ if len(protections) > 0:
1215
+ child_element = ET.SubElement(element, "END-TO-END-PROTECTIONS")
1216
+ for protection in protections:
1217
+ if isinstance(protection, EndToEndProtection):
1218
+ self.setEndToEndProtection(child_element, protection)
1219
+
1220
+ def writeEndToEndProtectionSet(self, element: ET.Element, protection_set: EndToEndProtectionSet):
1221
+ self.logger.debug("writeEndToEndProtectionSet %s" % protection_set.short_name)
1222
+ child_element = ET.SubElement(element, "END-TO-END-PROTECTION-SET")
1223
+ self.writeIdentifiable(child_element, protection_set)
1224
+ self.writeEndToEndProtections(child_element, protection_set)
1225
+
1226
+ def writeAutosarDataPrototype(self, element: ET.Element, prototype: AutosarDataPrototype):
1227
+ self.setChildElementOptionalRefType(element, "TYPE-TREF", prototype.type_tref)
1228
+
1229
+ def writeVariableDataPrototype(self, element: ET.Element, prototype: VariableDataPrototype):
1230
+ self.logger.debug("writeVariableDataPrototype %s" % prototype.short_name)
1231
+ child_element = ET.SubElement(element, "VARIABLE-DATA-PROTOTYPE")
1232
+ self.writeIdentifiable(child_element, prototype)
1233
+ self.setSwDataDefProps(child_element, "SW-DATA-DEF-PROPS", prototype.sw_data_def_props)
1234
+ self.writeAutosarDataPrototype(child_element, prototype)
1235
+ self.setInitValue(child_element, prototype.init_value)
1236
+
1237
+ def writeDataElements(self, element: ET.Element, sr_interface: SenderReceiverInterface):
1238
+ data_elements = sr_interface.getDataElements()
1239
+ if len(data_elements) > 0:
1240
+ data_elements_tag = ET.SubElement(element, "DATA-ELEMENTS")
1241
+ for data_element in data_elements:
1242
+ if isinstance(data_element, VariableDataPrototype):
1243
+ self.writeVariableDataPrototype(data_elements_tag, data_element)
1244
+ else:
1245
+ self._raiseError("Unsupported Data Element <%s>" % type(data_element))
1246
+
1247
+ def writeSenderReceiverInterface(self, element: ET.Element, sr_interface: SenderReceiverInterface):
1248
+ self.logger.debug("writeSenderReceiverInterface %s" % sr_interface.short_name)
1249
+ child_element = ET.SubElement(element, "SENDER-RECEIVER-INTERFACE")
1250
+ self.writeIdentifiable(child_element, sr_interface)
1251
+ self.setChildElementOptionalBooleanValue(child_element, "IS-SERVICE", sr_interface.is_service)
1252
+ self.writeDataElements(child_element, sr_interface)
1253
+
1254
+ def writerBswModuleDescriptionImplementedEntry(self, element: ET.Element, desc: BswModuleDescription):
1255
+ entries = desc.getImplementedEntries()
1256
+ if len(entries) > 0:
1257
+ entries_tag = ET.SubElement(element, "PROVIDED-ENTRYS")
1258
+ for entry in entries:
1259
+ entry_tag = ET.SubElement(entries_tag, "BSW-MODULE-ENTRY-REF-CONDITIONAL")
1260
+ self.setChildElementOptionalRefType(entry_tag, "BSW-MODULE-ENTRY-REF", entry)
1261
+
1262
+ def setModeDeclarationGroupPrototype(self, element: ET.Element, prototype: ModeDeclarationGroupPrototype):
1263
+ self.writeIdentifiable(element, prototype)
1264
+ self.setChildElementOptionalRefType(element, "TYPE-TREF", prototype.type_tref)
1265
+
1266
+ def writeProvidedModeGroup(self, element: ET.Element, parent: BswModuleDescription):
1267
+ mode_groups = parent.getProvidedModeGroups()
1268
+ if len(mode_groups) > 0:
1269
+ mode_groups_tag = ET.SubElement(element, "PROVIDED-MODE-GROUPS")
1270
+ for mode_group in mode_groups:
1271
+ child_element = ET.SubElement(mode_groups_tag, "MODE-DECLARATION-GROUP-PROTOTYPE")
1272
+ self.setModeDeclarationGroupPrototype(child_element, mode_group)
1273
+
1274
+ def writeCanEnterExclusiveAreaRefs(self, element: ET.Element, entity: ExecutableEntity):
1275
+ refs = entity.getCanEnterExclusiveAreaRefs()
1276
+ if len(refs) > 0:
1277
+ child_element = ET.SubElement(element, "CAN-ENTER-EXCLUSIVE-AREA-REFS")
1278
+ for ref in refs:
1279
+ self.setChildElementOptionalRefType(child_element, "CAN-ENTER-EXCLUSIVE-AREA-REF", ref)
1280
+
1281
+ def setExecutableEntity(self, element: ET.Element, entity: ExecutableEntity):
1282
+ self.writeIdentifiable(element, entity)
1283
+ self.writeCanEnterExclusiveAreaRefs(element, entity)
1284
+ self.setChildElementOptionalFloatValue(element, "MINIMUM-START-INTERVAL", entity.minimum_start_interval)
1285
+
1286
+ def writeBswModuleEntityManagedModeGroup(self, element: ET.Element, entity: BswModuleEntity):
1287
+ mode_group_refs = entity.getManagedModeGroupRefs()
1288
+ if len(mode_group_refs) > 0:
1289
+ mode_groups_tag = ET.SubElement(element, "MANAGED-MODE-GROUPS")
1290
+ for mode_group_ref in mode_group_refs:
1291
+ child_element = ET.SubElement(mode_groups_tag, "MODE-DECLARATION-GROUP-PROTOTYPE-REF-CONDITIONAL")
1292
+ self.setChildElementOptionalRefType(child_element, "MODE-DECLARATION-GROUP-PROTOTYPE-REF", mode_group_ref)
1293
+
1294
+ def setBswModuleEntity(self, element: ET.Element, entity: BswModuleEntity):
1295
+ self.setExecutableEntity(element, entity)
1296
+ self.setChildElementOptionalRefType(element, "IMPLEMENTED-ENTRY-REF", entity.implemented_entry_ref)
1297
+ self.writeBswModuleEntityManagedModeGroup(element, entity)
1298
+
1299
+ def setBswCalledEntity(self, element: ET.Element, entity: BswCalledEntity):
1300
+ self.logger.debug("setBswCalledEntity %s" % entity.short_name)
1301
+ child_element = ET.SubElement(element, "BSW-CALLED-ENTITY")
1302
+ self.setBswModuleEntity(child_element, entity)
1303
+
1304
+ def setBswSchedulableEntity(self, element: ET.Element, entity: BswSchedulableEntity):
1305
+ self.logger.debug("setBswCalledEntity %s" % entity.short_name)
1306
+ child_element = ET.SubElement(element, "BSW-SCHEDULABLE-ENTITY")
1307
+ self.setBswModuleEntity(child_element, entity)
1308
+
1309
+ def writeBswInternalBehaviorBswModuleEntities(self, element: ET.Element, parent: BswInternalBehavior):
1310
+ entities = parent.getBswModuleEntities()
1311
+ if len(entities) > 0:
1312
+ child_element = ET.SubElement(element, "ENTITYS")
1313
+ for entity in entities:
1314
+ if isinstance(entity, BswCalledEntity):
1315
+ self.setBswCalledEntity(child_element, entity)
1316
+ elif isinstance(entity, BswSchedulableEntity):
1317
+ self.setBswSchedulableEntity(child_element, entity)
1318
+ else:
1319
+ self._raiseError("Unsupported BswModuleEntity <%s>" % type(entity))
1320
+
1321
+ def setBswEvent(self, element: ET.Element, event: BswEvent):
1322
+ self.writeIdentifiable(element, event)
1323
+ self.setChildElementOptionalRefType(element, "STARTS-ON-EVENT-REF", event.startsOnEventRef)
1324
+
1325
+ def setBswScheduleEvent(self, element: ET.Element, event: BswScheduleEvent):
1326
+ self.setBswEvent(element, event)
1327
+
1328
+ def setBswTimingEvent(self, element: ET.Element, event: BswTimingEvent):
1329
+ self.logger.debug("setBswTimingEvent %s" % event.short_name)
1330
+ child_element = ET.SubElement(element, "BSW-TIMING-EVENT")
1331
+ self.setBswScheduleEvent(child_element, event)
1332
+ self.setChildElementOptionalFloatValue(child_element, "PERIOD", event.period)
1333
+
1334
+ def writeBswInternalBehaviorBswEvents(self, element: ET.Element, parent: BswInternalBehavior):
1335
+ events = parent.getBswEvents()
1336
+ if len(events) > 0:
1337
+ child_element = ET.SubElement(element, "EVENTS")
1338
+ for event in events:
1339
+ if isinstance(event, BswTimingEvent):
1340
+ self.setBswTimingEvent(child_element, event)
1341
+ else:
1342
+ self._raiseError("Unsupported BswModuleEntity <%s>" % type(event))
1343
+
1344
+ def setBswModeSenderPolicy(self, element: ET.Element, policy: BswModeSenderPolicy):
1345
+ child_element = ET.SubElement(element, "BSW-MODE-SENDER-POLICY")
1346
+ self.setChildElementOptionalRefType(child_element, "PROVIDED-MODE-GROUP-REF", policy.getProvidedModeGroupRef())
1347
+ self.setChildElementOptionalNumericalValue(child_element, "QUEUE-LENGTH", policy.getQueueLength())
1348
+
1349
+ def writeBswInternalBehaviorModeSenderPolicy(self, element: ET.Element, parent: BswInternalBehavior):
1350
+ policies = parent.getModeSenderPolicies()
1351
+ if len(policies) > 0:
1352
+ child_element = ET.SubElement(element, "MODE-SENDER-POLICYS")
1353
+ for policy in policies:
1354
+ if isinstance(policy, BswModeSenderPolicy):
1355
+ self.setBswModeSenderPolicy(child_element, policy)
1356
+ else:
1357
+ self._raiseError("Unsupported ModeSenderPolicy type <%s>." % type(policy))
1358
+
1359
+ def setBswInternalBehavior(self, element: ET.Element, behavior: BswInternalBehavior):
1360
+ child_element = ET.SubElement(element, "BSW-INTERNAL-BEHAVIOR")
1361
+ self.writeInternalBehavior(child_element, behavior)
1362
+ self.writeBswInternalBehaviorBswModuleEntities(child_element, behavior)
1363
+ self.writeBswInternalBehaviorBswEvents(child_element, behavior)
1364
+ self.writeBswInternalBehaviorModeSenderPolicy(child_element, behavior)
1365
+
1366
+ def writeBswModuleDescriptionInternalBehaviors(self, element: ET.Element, behaviors: List[InternalBehavior]):
1367
+ if len(behaviors) > 0:
1368
+ child_element = ET.SubElement(element, "INTERNAL-BEHAVIORS")
1369
+ for behavior in behaviors:
1370
+ if isinstance(behavior, BswInternalBehavior):
1371
+ self.setBswInternalBehavior(child_element, behavior)
1372
+ else:
1373
+ self._raiseError("Unsupported BswInternalBehavior <%s>" % type(behavior))
1374
+
1375
+ def writeBswModuleDescription(self, element: ET.Element, desc: BswModuleDescription):
1376
+ self.logger.debug("writeBswModuleDescription %s" % desc.short_name)
1377
+ child_element = ET.SubElement(element, "BSW-MODULE-DESCRIPTION")
1378
+ self.writeIdentifiable(child_element, desc)
1379
+ self.setChildElementOptionalNumericalValue(child_element, "MODULE-ID", desc.module_id)
1380
+ self.writerBswModuleDescriptionImplementedEntry(child_element, desc)
1381
+ self.writeProvidedModeGroup(child_element, desc)
1382
+ #self.readRequiredModeGroup(element, bsw_module_description)
1383
+ self.writeBswModuleDescriptionInternalBehaviors(child_element, desc.getBswInternalBehaviors())
1384
+
1385
+ def writeBswModuleEntityManagedModeGroup(self, element: ET.Element, entity: BswModuleEntity):
1386
+ mode_group_refs = entity.getManagedModeGroupRefs()
1387
+ if len(mode_group_refs) > 0:
1388
+ mode_groups_tag = ET.SubElement(element, "MANAGED-MODE-GROUPS")
1389
+ for mode_group_ref in mode_group_refs:
1390
+ child_element = ET.SubElement(mode_groups_tag, "MODE-DECLARATION-GROUP-PROTOTYPE-REF-CONDITIONAL")
1391
+ self.setChildElementOptionalRefType(child_element, "MODE-DECLARATION-GROUP-PROTOTYPE-REF", mode_group_ref)
1392
+
1393
+ def writeBswModuleEntry(self, element: ET.Element, entry: BswModuleEntry):
1394
+ self.logger.debug("writeBswModuleDescription %s" % entry.short_name)
1395
+ child_element = ET.SubElement(element, "BSW-MODULE-ENTRY")
1396
+ self.writeIdentifiable(child_element, entry)
1397
+ self.setChildElementOptionalNumericalValue(child_element, "SERVICE-ID", entry.service_id)
1398
+ self.setChildElementOptionalBooleanValue(child_element, "IS-REENTRANT", entry.is_reentrant)
1399
+ self.setChildElementOptionalBooleanValue(child_element, "IS-SYNCHRONOUS", entry.is_synchronous)
1400
+ self.setChildElementOptionalLiteral(child_element, "CALL-TYPE", entry.call_type)
1401
+ self.setChildElementOptionalLiteral(child_element, "EXECUTION-CONTEXT", entry.execution_context)
1402
+ self.setChildElementOptionalLiteral(child_element, "SW-SERVICE-IMPL-POLICY", entry.sw_service_impl_policy)
1403
+
1404
+
1405
+ def setSwcBswRunnableMapping(self, element: ET.SubElement, mapping: SwcBswRunnableMapping):
1406
+ child_element = ET.SubElement(element, "SWC-BSW-RUNNABLE-MAPPING")
1407
+ self.setChildElementOptionalRefType(child_element, "BSW-ENTITY-REF", mapping.bswEntityRef)
1408
+ self.setChildElementOptionalRefType(child_element, "SWC-RUNNABLE-REF", mapping.swcRunnableRef)
1409
+
1410
+ def writeSwcBswRunnableMappings(self, element: ET.Element, parent: SwcBswMapping):
1411
+ runnable_mappings = parent.getRunnableMappings()
1412
+ if len(runnable_mappings) > 0:
1413
+ child_element = ET.SubElement(element, "RUNNABLE-MAPPINGS")
1414
+ for mapping in runnable_mappings:
1415
+ if isinstance(mapping, SwcBswRunnableMapping):
1416
+ self.setSwcBswRunnableMapping(child_element, mapping)
1417
+ else:
1418
+ self._raiseError("Unsupported Runnable Mapping <%s>" % type(mapping))
1419
+
1420
+ def setSwcBswMapping(self, element: ET.Element, mapping: SwcBswMapping):
1421
+ self.logger.debug("writeBswModuleDescription %s" % mapping.short_name)
1422
+ child_element = ET.SubElement(element, "SWC-BSW-MAPPING")
1423
+ self.writeIdentifiable(child_element, mapping)
1424
+ self.setChildElementOptionalRefType(child_element, "BSW-BEHAVIOR-REF", mapping.bswBehaviorRef)
1425
+ self.writeSwcBswRunnableMappings(child_element, mapping)
1426
+ self.setChildElementOptionalRefType(child_element, "SWC-BEHAVIOR-REF", mapping.swcBehaviorRef)
1427
+
1428
+ def writeEngineeringObject(self, element: ET.Element, engineering_obj: EngineeringObject):
1429
+ self.setARObjectAttributes(element, engineering_obj)
1430
+ self.setChildElementOptionalLiteral(element, "SHORT-LABEL", engineering_obj.short_label)
1431
+ self.setChildElementOptionalLiteral(element, "CATEGORY", engineering_obj.category)
1432
+
1433
+ def setAutosarEngineeringObject(self, element: ET.Element, obj: AutosarEngineeringObject):
1434
+ self.logger.debug("readArtifactDescriptor %s", obj.short_label)
1435
+ child_element = ET.SubElement(element, "AUTOSAR-ENGINEERING-OBJECT")
1436
+ self.writeEngineeringObject(child_element, obj)
1437
+
1438
+ def writeArtifactDescriptor(self, element: ET.Element, code_desc: Code):
1439
+ artifact_descs = code_desc.getArtifactDescriptors()
1440
+ if len(artifact_descs) > 0:
1441
+ child_element = ET.SubElement(element, "ARTIFACT-DESCRIPTORS")
1442
+ for artifact_desc in artifact_descs:
1443
+ if isinstance(artifact_desc, AutosarEngineeringObject):
1444
+ self.setAutosarEngineeringObject(child_element, artifact_desc)
1445
+ else:
1446
+ self._raiseError("Unsupported Artifact descriptor <%s>" % type(artifact_desc))
1447
+
1448
+ def writeBswImplementationVendorSpecificModuleDefRefs(self, element: ET.Element, parent: BswImplementation):
1449
+ refs = parent.getVendorSpecificModuleDefRefs()
1450
+ if len(refs) > 0:
1451
+ child_element = ET.SubElement(element, "VENDOR-SPECIFIC-MODULE-DEF-REFS")
1452
+ if child_element != None:
1453
+ for ref in refs:
1454
+ self.setChildElementOptionalRefType(child_element, "VENDOR-SPECIFIC-MODULE-DEF-REF", ref)
1455
+
1456
+ def writeBswImplementation(self, element: ET.Element, impl: BswImplementation):
1457
+ self.logger.debug("writeBswModuleDescription %s" % impl.short_name)
1458
+ child_element = ET.SubElement(element, "BSW-IMPLEMENTATION")
1459
+ self.writeImplementation(child_element, impl)
1460
+ self.setChildElementOptionalLiteral(child_element, "AR-RELEASE-VERSION", impl.ar_release_version)
1461
+ self.setChildElementOptionalRefType(child_element, "BEHAVIOR-REF", impl.behavior_ref)
1462
+ self.writeBswImplementationVendorSpecificModuleDefRefs(child_element, impl)
1463
+
1464
+ def writeImplementationDataTypeElements(self, element: ET.Element, parent: ImplementationDataType):
1465
+ sub_elements = parent.getImplementationDataTypeElements()
1466
+ if len(sub_elements) > 0:
1467
+ sub_elements_tag = ET.SubElement(element, "SUB-ELEMENTS")
1468
+ for type_element in sub_elements:
1469
+ child_element = ET.SubElement(sub_elements_tag, "IMPLEMENTATION-DATA-TYPE-ELEMENT")
1470
+ self.writeIdentifiable(child_element, type_element)
1471
+ self.setSwDataDefProps(child_element, "SW-DATA-DEF-PROPS", type_element.sw_data_def_props)
1472
+
1473
+ def writeImplementationDataType(self, element: ET.Element, data_type: ImplementationDataType):
1474
+ self.logger.debug("writeImplementationDataType %s" % data_type.short_name)
1475
+ child_element = ET.SubElement(element, "IMPLEMENTATION-DATA-TYPE")
1476
+ self.writeAutosarDataType(child_element, data_type)
1477
+ self.setChildElementOptionalLiteral(child_element, "TYPE-EMITTER", data_type.getTypeEmitter())
1478
+ self.writeImplementationDataTypeElements(child_element, data_type)
1479
+
1480
+ def writeArgumentDataPrototypes(self, element: ET.Element, parent: ClientServerOperation):
1481
+ arguments = parent.getArgumentDataPrototypes()
1482
+ if len(arguments) > 0:
1483
+ arguments_tag = ET.SubElement(element, "ARGUMENTS")
1484
+ for prototype in arguments:
1485
+ child_element = ET.SubElement(arguments_tag, "ARGUMENT-DATA-PROTOTYPE")
1486
+ self.writeIdentifiable(child_element, prototype)
1487
+ self.setChildElementOptionalRefType(child_element, "TYPE-TREF", prototype.type_tref)
1488
+ self.setChildElementOptionalLiteral(child_element, "DIRECTION", prototype.direction)
1489
+
1490
+ def writePossibleErrorRefs(self, element: ET.Element, parent: ClientServerOperation):
1491
+ error_refs = parent.getPossbileErrorRefs()
1492
+ if len(error_refs) > 0:
1493
+ error_refs_tag = ET.SubElement(element, "POSSIBLE-ERROR-REFS")
1494
+ for error_ref in error_refs:
1495
+ self.setChildElementOptionalRefType(error_refs_tag, "POSSIBLE-ERROR-REF", error_ref)
1496
+
1497
+ def writeClientServerOperation(self, element: ET.Element, operation: ClientServerOperation):
1498
+ self.logger.debug("writeClientServerOperation %s" % operation.short_name)
1499
+ child_element = ET.SubElement(element, "CLIENT-SERVER-OPERATION")
1500
+ self.writeIdentifiable(child_element, operation)
1501
+ self.writeArgumentDataPrototypes(child_element, operation)
1502
+ self.writePossibleErrorRefs(child_element, operation)
1503
+
1504
+ def writeOperations(self, element: ET.Element, parent: ClientServerInterface):
1505
+ operations = parent.getOperations()
1506
+ if len(operations) > 0:
1507
+ operations_tag = ET.SubElement(element, "OPERATIONS")
1508
+ for operation in operations:
1509
+ if isinstance(operation, ClientServerOperation):
1510
+ self.writeClientServerOperation(operations_tag, operation)
1511
+ else:
1512
+ self._raiseError("Unsupported Operation <%s>" % type(operation))
1513
+
1514
+ def writeApplicationError(self, element: ET.Element, error: ApplicationError):
1515
+ self.logger.debug("writeApplicationError %s" % error.short_name)
1516
+ child_element = ET.SubElement(element, "APPLICATION-ERROR")
1517
+ self.writeIdentifiable(child_element, error)
1518
+ self.setChildElementOptionalNumericalValue(child_element, "ERROR-CODE", error.error_code)
1519
+
1520
+ def writePossibleErrors(self, element: ET.Element, parent: ClientServerInterface):
1521
+ errors = parent.getPossibleErrors()
1522
+ if len(errors) > 0:
1523
+ errors_tag = ET.SubElement(element, "POSSIBLE-ERRORS")
1524
+ for error in errors:
1525
+ if isinstance(error, ApplicationError):
1526
+ self.writeApplicationError(errors_tag, error)
1527
+ else:
1528
+ self._raiseError("Unsupported PossibleError %s" % type(error))
1529
+
1530
+ def setPortInterface(self, element: ET.Element, port_interface: PortInterface):
1531
+ self.writeIdentifiable(element, port_interface)
1532
+ self.setChildElementOptionalBooleanValue(element, "IS-SERVICE", port_interface.is_service)
1533
+ self.setChildElementOptionalLiteral(element, "SERVICE-KIND", port_interface.serviceKind)
1534
+
1535
+ def writeClientServerInterface(self, element: ET.Element, cs_interface: ClientServerInterface):
1536
+ self.logger.debug("writeClientServerInterface %s" % cs_interface.short_name)
1537
+ child_element = ET.SubElement(element, "CLIENT-SERVER-INTERFACE")
1538
+ self.setPortInterface(child_element, cs_interface)
1539
+ self.writeOperations(child_element, cs_interface)
1540
+ self.writePossibleErrors(child_element, cs_interface)
1541
+
1542
+ def writeApplicationSwComponentType(self, element: ET.Element, sw_component: ApplicationSwComponentType):
1543
+ self.logger.debug("writeApplicationSwComponentType %s" % sw_component.short_name)
1544
+ child_element = ET.SubElement(element, "APPLICATION-SW-COMPONENT-TYPE")
1545
+ self.writeAtomicSwComponentType(child_element, sw_component)
1546
+
1547
+ def writeEcuAbstractionSwComponentType(self, element: ET.Element, sw_component: EcuAbstractionSwComponentType):
1548
+ self.logger.debug("writeEcuAbstractionSwComponentType %s" % sw_component.short_name)
1549
+ child_element = ET.SubElement(element, "ECU-ABSTRACTION-SW-COMPONENT-TYPE")
1550
+ self.writeAtomicSwComponentType(child_element, sw_component)
1551
+
1552
+ def setApplicationArrayElement(self, element: ET.Element, prototype: ApplicationArrayElement):
1553
+ if prototype is not None:
1554
+ child_element = ET.SubElement(element, "ELEMENT")
1555
+ self.setApplicationCompositeElementDataPrototype(child_element, prototype)
1556
+ self.setChildElementOptionalLiteral(child_element, "ARRAY-SIZE-SEMANTICS", prototype.arraySizeSemantics)
1557
+ self.setChildElementOptionalNumericalValue(child_element, "MAX-NUMBER-OF-ELEMENTS", prototype.maxNumberOfElements)
1558
+
1559
+ def writeApplicationArrayDataType(self, element: ET.Element, data_type: ApplicationArrayDataType):
1560
+ self.logger.debug("writeApplicationArrayDataType %s" % data_type.short_name)
1561
+ child_element = ET.SubElement(element, "APPLICATION-ARRAY-DATA-TYPE")
1562
+ self.writeApplicationCompositeDataType(child_element, data_type)
1563
+ self.setApplicationArrayElement(child_element, data_type.element)
1564
+
1565
+ def setSwRecordLayoutV(self, element: ET.Element, key: str, layout_v: SwRecordLayoutV):
1566
+ if layout_v is not None:
1567
+ child_element = ET.SubElement(element, key)
1568
+ self.setChildElementOptionalLiteral(child_element, "SHORT-LABEL", layout_v.shortLabel)
1569
+ self.setChildElementOptionalRefType(child_element, "BASE-TYPE-REF", layout_v.baseTypeRef)
1570
+ self.setChildElementOptionalNumericalValue(child_element, "SW-RECORD-LAYOUT-V-AXIS", layout_v.swRecordLayoutVAxis)
1571
+ self.setChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-V-PROP", layout_v.swRecordLayoutVProp)
1572
+ self.setChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-V-INDEX", layout_v.swRecordLayoutVIndex)
1573
+
1574
+ def setSwRecordLayoutGroup(self, element: ET.Element, key: str, group: SwRecordLayoutGroup):
1575
+ if group is not None:
1576
+ child_element = ET.SubElement(element, key)
1577
+ self.setChildElementOptionalLiteral(child_element, "SHORT-LABEL", group.shortLabel)
1578
+ self.setChildElementOptionalLiteral(child_element, "CATEGORY", group.category)
1579
+ self.setChildElementOptionalNumericalValue(child_element, "SW-RECORD-LAYOUT-GROUP-AXIS", group.swRecordLayoutGroupAxis)
1580
+ self.setChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-INDEX", group.swRecordLayoutGroupIndex)
1581
+ self.setChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-FROM", group.swRecordLayoutGroupFrom)
1582
+ self.setChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-TO", group.swRecordLayoutGroupTo)
1583
+ self.setSwRecordLayoutV(child_element, "SW-RECORD-LAYOUT-V", group.swRecordLayoutGroupContentType.swRecordLayoutV)
1584
+ self.setSwRecordLayoutGroup(child_element, "SW-RECORD-LAYOUT-GROUP", group.swRecordLayoutGroupContentType.swRecordLayoutGroup)
1585
+ return group
1586
+
1587
+ def writeSwRecordLayout(self, element: ET.Element, layout: SwRecordLayout):
1588
+ self.logger.debug("writeSwRecordLayout %s" % layout.short_name)
1589
+ child_element = ET.SubElement(element, "SW-RECORD-LAYOUT")
1590
+ self.writeIdentifiable(child_element, layout)
1591
+ self.setSwRecordLayoutGroup(child_element, "SW-RECORD-LAYOUT-GROUP", layout.swRecordLayoutGroup)
1592
+
1593
+ def writeSwAddrMethod(self, element: ET.Element, method: SwAddrMethod):
1594
+ self.logger.debug("writeSwAddrMethod %s" % method.short_name)
1595
+ child_element = ET.SubElement(element, "SW-RECORD-LAYOUT")
1596
+
1597
+ def writeTriggerInterface(self, element: ET.Element, trigger_if: TriggerInterface):
1598
+ self.logger.debug("writeTriggerInterface %s" % trigger_if.short_name)
1599
+ child_element = ET.SubElement(element, "SW-RECORD-LAYOUT")
1600
+
1601
+ def writeServiceSwComponentType(self, element: ET.Element, sw_component: ServiceSwComponentType):
1602
+ self.logger.debug("writeServiceSwComponentType %s" % sw_component.short_name)
1603
+ child_element = ET.SubElement(element, "SERVICE-SW-COMPONENT-TYPE")
1604
+ self.writeAtomicSwComponentType(child_element, sw_component)
1605
+
1606
+ def writeDataTypeMaps(self, element: ET.Element, parent: DataTypeMappingSet):
1607
+ maps = parent.getDataTypeMaps()
1608
+ if len(maps) > 0:
1609
+ maps_tag = ET.SubElement(element, "DATA-TYPE-MAPS")
1610
+ for map in maps:
1611
+ child_element = ET.SubElement(maps_tag, "DATA-TYPE-MAP")
1612
+ self.setARObjectAttributes(child_element, map)
1613
+ self.setChildElementOptionalRefType(child_element, "APPLICATION-DATA-TYPE-REF", map.application_data_type_ref)
1614
+ self.setChildElementOptionalRefType(child_element, "IMPLEMENTATION-DATA-TYPE-REF", map.implementation_data_type_ref)
1615
+
1616
+ def writeModeRequestTypeMaps(self, element: ET.Element, parent: DataTypeMappingSet):
1617
+ maps = parent.getModeRequestTypeMaps()
1618
+ if len(maps) > 0:
1619
+ maps_tag = ET.SubElement(element, "MODE-REQUEST-TYPE-MAPS")
1620
+ for map in maps:
1621
+ child_element = ET.SubElement(maps_tag, "MODE-REQUEST-TYPE-MAP")
1622
+ self.setChildElementOptionalRefType(child_element, "IMPLEMENTATION-DATA-TYPE-REF", map.implementation_data_type_ref)
1623
+ self.setChildElementOptionalRefType(child_element, "MODE-GROUP-REF", map.mode_group_ref)
1624
+
1625
+ def writeDataTypeMappingSet(self, element: ET.Element, mapping_set: DataTypeMappingSet):
1626
+ self.logger.debug("writeDataTypeMappingSet %s" % mapping_set.short_name)
1627
+ child_element = ET.SubElement(element, "DATA-TYPE-MAPPING-SET")
1628
+ self.writeIdentifiable(child_element, mapping_set)
1629
+ self.writeDataTypeMaps(child_element, mapping_set)
1630
+ self.writeModeRequestTypeMaps(child_element, mapping_set)
1631
+
1632
+ def setModeDeclaration(self, element: ET.Element, mode_declaration: ModeDeclaration):
1633
+ child_element = ET.SubElement(element, "MODE-DECLARATION")
1634
+ self.writeIdentifiable(child_element, mode_declaration)
1635
+ self.setChildElementOptionalNumericalValue(child_element, "VALUE", mode_declaration.getValue())
1636
+
1637
+ def writeModeDeclarationGroupModeDeclaration(self, element: ET.Element, parent: ModeDeclarationGroup):
1638
+ mode_declarations = parent.getModeDeclarations()
1639
+ if len(mode_declarations) > 0:
1640
+ child_element = ET.SubElement(element, "MODE-DECLARATIONS")
1641
+ for mode_declaration in mode_declarations:
1642
+ self.setModeDeclaration(child_element, mode_declaration)
1643
+
1644
+ def writeModeDeclarationGroup(self, element: ET.Element, group: ModeDeclarationGroup):
1645
+ self.logger.debug("writeModeDeclarationGroup %s" % group.short_name)
1646
+ child_element = ET.SubElement(element, "MODE-DECLARATION-GROUP")
1647
+ self.writeIdentifiable(child_element, group)
1648
+ self.setChildElementOptionalRefType(child_element, "INITIAL-MODE-REF", group._initial_mode_ref)
1649
+ self.writeModeDeclarationGroupModeDeclaration(child_element, group)
1650
+ self.setChildElementOptionalNumericalValue(child_element, "ON-TRANSITION-VALUE", group.getOnTransitionValue())
1651
+
1652
+ def writeModeSwitchInterfaceModeGroup(self, element: ET.Element, parent: ModeSwitchInterface):
1653
+ mode_groups = parent.getModeGroups()
1654
+ if len(mode_groups) > 0:
1655
+ mode_group = mode_groups[0]
1656
+ child_element = ET.SubElement(element, "MODE-GROUP")
1657
+ self.writeIdentifiable(child_element, mode_group)
1658
+ self.setChildElementOptionalRefType(child_element, "TYPE-TREF", mode_group.type_tref)
1659
+
1660
+ def writeModeSwitchInterface(self, element: ET.Element, mode_interface: ModeSwitchInterface):
1661
+ self.logger.debug("writeModeSwitchInterface %s" % mode_interface.short_name)
1662
+ child_element = ET.SubElement(element, "MODE-SWITCH-INTERFACE")
1663
+ self.setPortInterface(child_element, mode_interface)
1664
+ self.writeModeSwitchInterfaceModeGroup(child_element, mode_interface)
1665
+
1666
+ def writeARPackageElement(self, element: ET.Element, ar_element: ARElement):
1667
+ if isinstance(ar_element, ComplexDeviceDriverSwComponentType):
1668
+ self.writeComplexDeviceDriverSwComponentType(element, ar_element)
1669
+ elif isinstance(ar_element, SwcImplementation):
1670
+ self.writeSwcImplementation(element, ar_element)
1671
+ elif isinstance(ar_element, CompositionSwComponentType):
1672
+ self.writeCompositionSwComponentType(element, ar_element)
1673
+ elif isinstance(ar_element, ApplicationPrimitiveDataType):
1674
+ self.writeApplicationPrimitiveDataType(element, ar_element)
1675
+ elif isinstance(ar_element, ApplicationRecordDataType):
1676
+ self.writeApplicationRecordDataType(element, ar_element)
1677
+ elif isinstance(ar_element, SwBaseType):
1678
+ self.writeSwBaseType(element, ar_element)
1679
+ elif isinstance(ar_element, CompuMethod):
1680
+ self.writeCompuMethod(element, ar_element)
1681
+ elif isinstance(ar_element, ConstantSpecification):
1682
+ self.writeConstantSpecification(element, ar_element)
1683
+ elif isinstance(ar_element, DataConstr):
1684
+ self.writeDataConstr(element, ar_element)
1685
+ elif isinstance(ar_element, EndToEndProtectionSet):
1686
+ self.writeEndToEndProtectionSet(element, ar_element)
1687
+ elif isinstance(ar_element, SenderReceiverInterface):
1688
+ self.writeSenderReceiverInterface(element, ar_element)
1689
+ elif isinstance(ar_element, Unit):
1690
+ self.writeUnit(element, ar_element)
1691
+ elif isinstance(ar_element, BswModuleDescription):
1692
+ self.writeBswModuleDescription(element, ar_element)
1693
+ elif isinstance(ar_element, BswModuleEntry):
1694
+ self.writeBswModuleEntry(element, ar_element)
1695
+ elif isinstance(ar_element, SwcBswMapping):
1696
+ self.setSwcBswMapping(element, ar_element)
1697
+ elif isinstance(ar_element, BswImplementation):
1698
+ self.writeBswImplementation(element, ar_element)
1699
+ elif isinstance(ar_element, ImplementationDataType):
1700
+ self.writeImplementationDataType(element, ar_element)
1701
+ elif isinstance(ar_element, ClientServerInterface):
1702
+ self.writeClientServerInterface(element, ar_element)
1703
+ elif isinstance(ar_element, ApplicationSwComponentType):
1704
+ self.writeApplicationSwComponentType(element, ar_element)
1705
+ elif isinstance(ar_element, EcuAbstractionSwComponentType):
1706
+ self.writeEcuAbstractionSwComponentType(element, ar_element)
1707
+ elif isinstance(ar_element, ApplicationArrayDataType):
1708
+ self.writeApplicationArrayDataType(element, ar_element)
1709
+ elif isinstance(ar_element, SwRecordLayout):
1710
+ self.writeSwRecordLayout(element, ar_element)
1711
+ elif isinstance(ar_element, SwAddrMethod):
1712
+ self.writeSwAddrMethod(element, ar_element)
1713
+ elif isinstance(ar_element, TriggerInterface):
1714
+ self.writeTriggerInterface(element, ar_element)
1715
+ elif isinstance(ar_element, ServiceSwComponentType):
1716
+ self.writeServiceSwComponentType(element, ar_element)
1717
+ elif isinstance(ar_element, DataTypeMappingSet):
1718
+ self.writeDataTypeMappingSet(element, ar_element)
1719
+ elif isinstance(ar_element, ModeDeclarationGroup):
1720
+ self.writeModeDeclarationGroup(element, ar_element)
1721
+ elif isinstance(ar_element, ModeSwitchInterface):
1722
+ self.writeModeSwitchInterface(element, ar_element)
1723
+ else:
1724
+ raise NotImplementedError("Unsupported Elements of ARPackage <%s>" % type(ar_element))
589
1725
 
590
1726
  def writeARPackages(self, element: ET.Element, pkgs: List[ARPackage]):
591
1727
  if len(pkgs) > 0:
@@ -594,46 +1730,24 @@ class ARXMLWriter:
594
1730
  for pkg in pkgs:
595
1731
  pkg_tag = ET.SubElement(pkgs_tag, "AR-PACKAGE")
596
1732
 
597
- self.writeElementAttributes(pkg_tag, pkg)
598
- self.writeShortName(pkg_tag, pkg.short_name)
1733
+ self.writeIdentifiable(pkg_tag, pkg)
599
1734
  self.logger.debug("writeARPackage %s" % pkg.full_name)
600
1735
 
601
1736
  if pkg.getTotalElement() > 0:
602
1737
  elements_tag = ET.SubElement(pkg_tag, "ELEMENTS")
603
-
604
- self.writeApplicationDataTypes(elements_tag, pkg)
605
- self.writeCompositionSwComponentTypes(elements_tag, pkg)
606
- self.writeSwBaseTypes(elements_tag, pkg)
607
- self.writeCompuMethods(elements_tag, pkg)
608
- self.writeConstantSpecifications(elements_tag, pkg)
609
- self.writeDataConstr(elements_tag, pkg)
610
- self.writeUnit(elements_tag, pkg)
611
-
612
- self.writeARPackages(pkg_tag, pkg.getARPackages())
613
-
614
- def patch_xml(self, xml: str) -> str:
615
- xml = xml.replace("<SW-DATA-DEF-PROPS-CONDITIONAL/>","<SW-DATA-DEF-PROPS-CONDITIONAL></SW-DATA-DEF-PROPS-CONDITIONAL>")
616
- xml = xml.replace("<ELEMENTS/>","")
617
- return xml
618
-
619
- def saveToFile(self, filename, root: ET.Element):
620
- xml = ET.tostring(root, encoding = "UTF-8", xml_declaration = True, short_empty_elements = False)
621
-
622
- dom = minidom.parseString(xml.decode())
623
- xml = dom.toprettyxml(indent = " ", encoding = "UTF-8")
624
1738
 
625
- text = self.patch_xml(xml.decode())
626
-
627
- with open(filename, "w") as f_out:
628
- #f_out.write(xml.decode())
629
- f_out.write(text)
1739
+ for ar_element in pkg.getElements():
1740
+ if not isinstance(ar_element, ARPackage):
1741
+ self.writeARPackageElement(elements_tag, ar_element)
1742
+
1743
+ self.writeARPackages(pkg_tag, pkg.getARPackages())
630
1744
 
631
1745
  def save(self, filename, document: AUTOSAR):
632
1746
  self.logger.info("Save %s ..." % filename)
633
1747
 
634
1748
  root = ET.Element("AUTOSAR", self.nsmap)
635
1749
  root.attrib["xmlns:xsi"] = "http://www.w3.org/2001/XMLSchema-instance"
636
- root.attrib["xsi:schemaLocation"] = "http://autosar.org/schema/r4.0 AUTOSAR_4-2-2.xsd"
1750
+ root.attrib["xsi:schemaLocation"] = document.schema_location
637
1751
 
638
1752
  self.writeARPackages(root, document.getARPackages())
639
1753