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