armodel 1.7.6__py3-none-any.whl → 1.7.7__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 (41) hide show
  1. armodel/models/M2/AUTOSARTemplates/AutosarTopLevelStructure.py +41 -2
  2. armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswBehavior.py +47 -6
  3. armodel/models/M2/AUTOSARTemplates/CommonStructure/Filter.py +17 -7
  4. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/ARPackage.py +1 -1
  5. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/Identifiable.py +9 -3
  6. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/PrimitiveTypes.py +17 -1
  7. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Communication.py +19 -5
  8. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Components/__init__.py +53 -0
  9. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Composition/__init__.py +2 -2
  10. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Datatype/DataPrototypes.py +41 -16
  11. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Datatype/Datatypes.py +10 -3
  12. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/RTEEvents.py +26 -8
  13. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/__init__.py +19 -5
  14. armodel/models/M2/AUTOSARTemplates/SystemTemplate/DoIp.py +29 -0
  15. armodel/models/M2/AUTOSARTemplates/SystemTemplate/ECUResourceMapping.py +44 -0
  16. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/EthernetTopology.py +9 -0
  17. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreCommunication.py +483 -54
  18. armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/EcuInstance.py +9 -0
  19. armodel/models/M2/AUTOSARTemplates/SystemTemplate/NetworkManagement.py +245 -130
  20. armodel/models/M2/AUTOSARTemplates/SystemTemplate/SWmapping.py +27 -0
  21. armodel/models/M2/AUTOSARTemplates/SystemTemplate/TransportProtocols.py +592 -17
  22. armodel/models/M2/AUTOSARTemplates/SystemTemplate/__init__.py +20 -10
  23. armodel/models/M2/MSR/AsamHdo/AdminData.py +1 -2
  24. armodel/models/M2/MSR/AsamHdo/ComputationMethod.py +3 -1
  25. armodel/models/M2/MSR/AsamHdo/SpecialData.py +35 -8
  26. armodel/models/M2/MSR/DataDictionary/RecordLayout.py +0 -3
  27. armodel/models/__init__.py +4 -0
  28. armodel/parser/abstract_arxml_parser.py +3 -0
  29. armodel/parser/arxml_parser.py +614 -123
  30. armodel/tests/test_armodel/models/test_bsw_module_template.py +5 -3
  31. armodel/tests/test_armodel/models/test_datatype.py +1 -1
  32. armodel/tests/test_armodel/parser/test_bsw_module_descriiption.py +218 -0
  33. armodel/tests/test_armodel/parser/test_sw_components.py +22 -1
  34. armodel/writer/abstract_arxml_writer.py +7 -6
  35. armodel/writer/arxml_writer.py +694 -139
  36. {armodel-1.7.6.dist-info → armodel-1.7.7.dist-info}/METADATA +41 -3
  37. {armodel-1.7.6.dist-info → armodel-1.7.7.dist-info}/RECORD +41 -37
  38. {armodel-1.7.6.dist-info → armodel-1.7.7.dist-info}/LICENSE +0 -0
  39. {armodel-1.7.6.dist-info → armodel-1.7.7.dist-info}/WHEEL +0 -0
  40. {armodel-1.7.6.dist-info → armodel-1.7.7.dist-info}/entry_points.txt +0 -0
  41. {armodel-1.7.6.dist-info → armodel-1.7.7.dist-info}/top_level.txt +0 -0
@@ -2,6 +2,10 @@ from typing import List
2
2
  import xml.etree.ElementTree as ET
3
3
  import os
4
4
 
5
+ from armodel.models.M2.AUTOSARTemplates.SystemTemplate.SWmapping import SwcToImplMapping
6
+
7
+
8
+
5
9
  from ..models.M2.MSR.AsamHdo.AdminData import AdminData
6
10
  from ..models.M2.MSR.AsamHdo.BaseTypes import BaseTypeDirectDefinition, SwBaseType
7
11
  from ..models.M2.MSR.AsamHdo.Constraints.GlobalConstraints import DataConstrRule, InternalConstrs, PhysConstrs, DataConstr
@@ -25,7 +29,7 @@ from ..models.M2.MSR.Documentation.TextModel.LanguageDataModel import LLongName,
25
29
  from ..models.M2.MSR.Documentation.TextModel.MultilanguageData import MultiLanguageOverviewParagraph, MultiLanguageParagraph, MultiLanguagePlainText, MultilanguageLongName
26
30
 
27
31
  from ..models.M2.AUTOSARTemplates.AutosarTopLevelStructure import AUTOSAR
28
- from ..models.M2.AUTOSARTemplates.BswModuleTemplate.BswBehavior import BswCalledEntity, BswDataReceivedEvent, BswInternalBehavior, BswInternalTriggerOccurredEvent, BswInterruptEntity, BswModeSwitchEvent, BswModuleEntity, BswSchedulableEntity, BswScheduleEvent, BswModeSenderPolicy, BswTimingEvent
32
+ from ..models.M2.AUTOSARTemplates.BswModuleTemplate.BswBehavior import BswBackgroundEvent, BswCalledEntity, BswDataReceivedEvent, BswExternalTriggerOccurredEvent, BswInternalBehavior, BswInternalTriggerOccurredEvent, BswInterruptEntity, BswModeSwitchEvent, BswModuleEntity, BswSchedulableEntity, BswScheduleEvent, BswModeSenderPolicy, BswTimingEvent
29
33
  from ..models.M2.AUTOSARTemplates.BswModuleTemplate.BswInterfaces import BswModuleEntry
30
34
  from ..models.M2.AUTOSARTemplates.BswModuleTemplate.BswImplementation import BswImplementation
31
35
  from ..models.M2.AUTOSARTemplates.BswModuleTemplate.BswOverview import BswModuleDescription
@@ -47,19 +51,19 @@ from ..models.M2.AUTOSARTemplates.CommonStructure.Timing.TimingConstraint.Timing
47
51
  from ..models.M2.AUTOSARTemplates.DiagnosticExtract.DiagnosticContribution import DiagnosticServiceTable
48
52
  from ..models.M2.AUTOSARTemplates.ECUCDescriptionTemplate import EcucAbstractReferenceValue, EcucContainerValue, EcucInstanceReferenceValue, EcucModuleConfigurationValues, EcucNumericalParamValue, EcucParameterValue, EcucReferenceValue, EcucTextualParamValue, EcucValueCollection
49
53
  from ..models.M2.AUTOSARTemplates.GenericStructure.AbstractStructure import AnyInstanceRef
50
- from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.Identifiable import Identifiable, MultilanguageReferrable
54
+ from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.Identifiable import Identifiable, MultilanguageReferrable, Referrable
51
55
  from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.EngineeringObject import AutosarEngineeringObject, EngineeringObject
52
56
  from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ARPackage import ARPackage, ReferenceBase
53
57
  from ..models.M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import Ip6AddressString, RefType, ARLiteral
54
58
  from ..models.M2.AUTOSARTemplates.GenericStructure.LifeCycles import LifeCycleInfoSet
55
59
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.PortAPIOptions import PortAPIOption, PortDefinedArgumentValue
56
- from ..models.M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.RTEEvents import DataReceivedEvent, OperationInvokedEvent, RTEEvent, SwcModeSwitchEvent
60
+ from ..models.M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.RTEEvents import AsynchronousServerCallReturnsEvent, BackgroundEvent, DataReceivedEvent, InitEvent, InternalTriggerOccurredEvent, ModeSwitchedAckEvent, OperationInvokedEvent, RTEEvent, SwcModeSwitchEvent, TimingEvent
57
61
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Datatype.Datatypes import ApplicationPrimitiveDataType, ApplicationRecordDataType, ApplicationArrayDataType, ApplicationCompositeDataType, ApplicationDataType, AutosarDataType, DataTypeMap, DataTypeMappingSet
58
62
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.EndToEndProtection import EndToEndProtectionSet, EndToEndDescription, EndToEndProtection, EndToEndProtectionVariablePrototype
59
63
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Composition.InstanceRefs import POperationInAtomicSwcInstanceRef, PPortInCompositionInstanceRef, ROperationInAtomicSwcInstanceRef, RPortInCompositionInstanceRef
60
64
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.PortInterface.InstanceRefs import ApplicationCompositeElementInPortInterfaceInstanceRef
61
65
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.InstanceRefsUsage import AutosarParameterRef, VariableInAtomicSWCTypeInstanceRef
62
- from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Communication import CompositeNetworkRepresentation, TransmissionAcknowledgementRequest
66
+ from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Communication import CompositeNetworkRepresentation, ModeSwitchedAckRequest, TransmissionAcknowledgementRequest
63
67
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.IncludedDataTypes import IncludedDataTypeSet
64
68
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Components import AbstractProvidedPortPrototype, AbstractRequiredPortPrototype, ApplicationSwComponentType, ComplexDeviceDriverSwComponentType, CompositionSwComponentType, EcuAbstractionSwComponentType, PortGroup, SensorActuatorSwComponentType, ServiceSwComponentType, SwComponentType, SymbolProps, PPortPrototype, RPortPrototype
65
69
  from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Components.InstanceRefs import InnerPortGroupInCompositionInstanceRef, PModeGroupInAtomicSwcInstanceRef, RModeGroupInAtomicSWCInstanceRef, RModeInAtomicSwcInstanceRef, RVariableInAtomicSwcInstanceRef
@@ -78,12 +82,13 @@ from ..models.M2.AUTOSARTemplates.SWComponentTemplate.Datatype.DataPrototypes im
78
82
  from ..models.M2.AUTOSARTemplates.SystemTemplate import SwcToEcuMapping , System, SystemMapping
79
83
  from ..models.M2.AUTOSARTemplates.SystemTemplate.DataMapping import SenderReceiverToSignalGroupMapping, SenderReceiverToSignalMapping
80
84
  from ..models.M2.AUTOSARTemplates.SystemTemplate.DiagnosticConnection import DiagnosticConnection
81
- from ..models.M2.AUTOSARTemplates.SystemTemplate.NetworkManagement import CanNmCluster, CanNmClusterCoupling, CanNmNode, NmCluster, NmConfig, NmNode, UdpNmCluster, UdpNmClusterCoupling, UdpNmNode
85
+ from ..models.M2.AUTOSARTemplates.SystemTemplate.ECUResourceMapping import ECUMapping
86
+ from ..models.M2.AUTOSARTemplates.SystemTemplate.NetworkManagement import CanNmCluster, CanNmClusterCoupling, CanNmNode, NmCluster, NmConfig, NmEcu, NmNode, UdpNmCluster, UdpNmClusterCoupling, UdpNmEcu, UdpNmNode
82
87
  from ..models.M2.AUTOSARTemplates.SystemTemplate.InstanceRefs import ComponentInSystemInstanceRef, VariableDataPrototypeInSystemInstanceRef
83
88
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Lin.LinCommunication import ApplicationEntry, LinFrameTriggering, LinScheduleTable, LinUnconditionalFrame, ScheduleTableEntry
84
89
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Lin.LinTopology import LinCommunicationConnector, LinCommunicationController, LinMaster
85
90
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.CoreTopology import AbstractCanCluster, CanCluster, CanClusterBusOffRecovery, CanPhysicalChannel, CommConnectorPort, CommunicationCluster, CommunicationConnector, CommunicationController, EthernetPhysicalChannel, FramePort, IPduPort, ISignalPort, LinCluster, LinPhysicalChannel, PhysicalChannel
86
- from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.CoreCommunication import DcmIPdu, Frame, FrameTriggering, GeneralPurposeIPdu, GeneralPurposePdu, IPdu, IPduTiming, ISignal, ISignalGroup, ISignalIPdu, ISignalIPduGroup, ISignalTriggering, MultiplexedIPdu, NPdu, NmPdu, PduTriggering, SecureCommunicationPropsSet, SecuredIPdu, SystemSignal, SystemSignalGroup, UserDefinedIPdu, UserDefinedPdu
91
+ from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.CoreCommunication import DcmIPdu, DynamicPart, DynamicPartAlternative, Frame, FrameTriggering, GeneralPurposeIPdu, GeneralPurposePdu, IPdu, IPduTiming, ISignal, ISignalGroup, ISignalIPdu, ISignalIPduGroup, ISignalToIPduMapping, ISignalTriggering, MultiplexedIPdu, MultiplexedPart, NPdu, NmPdu, Pdu, PduTriggering, SecureCommunicationAuthenticationProps, SecureCommunicationFreshnessProps, SecureCommunicationProps, SecureCommunicationPropsSet, SecuredIPdu, SegmentPosition, StaticPart, SystemSignal, SystemSignalGroup, UserDefinedIPdu, UserDefinedPdu
87
92
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.Timing import CyclicTiming, EventControlledTiming, TimeRangeType, TransmissionModeCondition, TransmissionModeDeclaration, TransmissionModeTiming
88
93
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.EcuInstance import EcuInstance
89
94
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Can.CanCommunication import CanFrame, CanFrameTriggering, RxIdentifierRange
@@ -94,7 +99,7 @@ from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Ethernet.NetworkEnd
94
99
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Ethernet.ServiceInstances import ApplicationEndpoint, ConsumedEventGroup, ConsumedServiceInstance, EventHandler, GenericTp, ProvidedServiceInstance, SdServerConfig, SoAdConfig, SocketAddress, TcpTp, TpPort, TransportProtocolConfiguration, UdpTp
95
100
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Ethernet.EthernetTopology import CouplingPort, CouplingPortDetails, CouplingPortFifo, CouplingPortScheduler, CouplingPortStructuralElement, EthernetCluster, EthernetCommunicationConnector, EthernetCommunicationController, EthernetPriorityRegeneration, InitialSdDelayConfig, MacMulticastGroup, RequestResponseDelay, SdClientConfig, VlanMembership
96
101
  from ..models.M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Multiplatform import Gateway, IPduMapping, ISignalMapping, TargetIPduRef
97
- from ..models.M2.AUTOSARTemplates.SystemTemplate.TransportProtocols import CanTpConfig, DoIpTpConfig, LinTpConfig
102
+ from ..models.M2.AUTOSARTemplates.SystemTemplate.TransportProtocols import CanTpAddress, CanTpChannel, CanTpConfig, CanTpConnection, CanTpEcu, CanTpNode, DoIpLogicAddress, DoIpTpConfig, DoIpTpConnection, LinTpConfig, LinTpConnection, LinTpNode, TpAddress, TpConfig, TpConnection
98
103
 
99
104
  from .abstract_arxml_parser import AbstractARXMLParser
100
105
 
@@ -119,13 +124,24 @@ class ARXMLParser(AbstractARXMLParser):
119
124
  sd.setValue(child_element.text)
120
125
  sdg.addSd(sd)
121
126
 
127
+ def readSdgCaption(self, element: ET.Element, sdg:Sdg):
128
+ child_element = self.find(element, "SDG-CAPTION")
129
+ if child_element is not None:
130
+ sdg.createSdgCaption(self.getShortName(child_element))
131
+
132
+ def readSdgSdxRefs(self, element: ET.SubElement, sdg:Sdg):
133
+ for ref in self.getChildElementRefTypeList(element, "SDX-REF"):
134
+ sdg.addSdxRef(ref)
135
+
122
136
  def getSdg(self, element: ET.Element) -> Sdg:
123
137
  sdg = Sdg()
124
138
  if 'GID' in element.attrib:
125
139
  sdg.setGID(element.attrib["GID"])
140
+ self.readSdgCaption(element, sdg)
126
141
  self.readSd(element, sdg)
127
142
  for child_element in self.findall(element, "SDG"):
128
143
  sdg.addSdgContentsType(self.getSdg(child_element))
144
+ self.readSdgSdxRefs(element, sdg)
129
145
  return sdg
130
146
 
131
147
  def readSdgs(self, element: ET.Element, admin_data: AdminData):
@@ -143,9 +159,12 @@ class ARXMLParser(AbstractARXMLParser):
143
159
 
144
160
  self.readSdgs(child_element, admin_data)
145
161
  return admin_data
162
+
163
+ def readReferrable(self, element: ET.Element, referrable: Referrable):
164
+ self.readARObjectAttributes(element, referrable)
146
165
 
147
166
  def readMultilanguageReferrable(self, element: ET.Element, referrable: MultilanguageReferrable):
148
- self.readARObjectAttributes(element, referrable)
167
+ self.readReferrable(element, referrable)
149
168
  referrable.setLongName(self.getMultilanguageLongName(element, "LONG-NAME"))
150
169
 
151
170
  def readIdentifiable(self, element: ET.Element, identifiable: Identifiable):
@@ -315,12 +334,12 @@ class ARXMLParser(AbstractARXMLParser):
315
334
  self.readBswEvent(element, event)
316
335
 
317
336
  def readBswModeSwitchEvent(self, element: ET.Element, event: BswModeSwitchEvent):
318
- self.logger.debug("read BswModeSwitchEvent %s" % event.getShortName())
337
+ self.logger.debug("Read BswModeSwitchEvent <%s>" % event.getShortName())
319
338
  # Read the Inherit BswScheduleEvent
320
339
  self.readBswScheduleEvent(element, event)
321
340
 
322
341
  def readBswTimingEvent(self, element: ET.Element, event: BswTimingEvent):
323
- self.logger.debug("read BswTimingEvent %s" % event.getShortName())
342
+ self.logger.debug("Read BswTimingEvent <%s>" % event.getShortName())
324
343
  # Read the Inherit BswScheduleEvent
325
344
  self.readBswScheduleEvent(element, event)
326
345
  event.setPeriod(self.getChildElementOptionalTimeValue(element, "PERIOD"))
@@ -330,13 +349,13 @@ class ARXMLParser(AbstractARXMLParser):
330
349
  self.logger.debug(" Period: <%f, %s>" % (event.getPeriod().getValue(), event.getPeriod().getText()))
331
350
 
332
351
  def readBswDataReceivedEvent(self, element: ET.Element, event: BswDataReceivedEvent):
333
- self.logger.debug("read BswTimingEvent %s" % event.getShortName())
352
+ self.logger.debug("Read BswDataReceivedEvent <%s>" % event.getShortName())
334
353
  # Read the Inherit BswScheduleEvent
335
354
  self.readBswScheduleEvent(element, event)
336
355
  event.setDataRef(self.getChildElementOptionalRefType(element, "DATA-REF"))
337
356
 
338
357
  def readBswInternalTriggerOccurredEvent(self, element: ET.Element, event: BswInternalTriggerOccurredEvent):
339
- self.logger.debug("read BswTimingEvent %s" % event.getShortName())
358
+ self.logger.debug("Read BswInternalTriggerOccurredEvent <%s>" % event.getShortName())
340
359
  # Read the Inherit BswScheduleEvent
341
360
  self.readBswScheduleEvent(element, event)
342
361
  event.setEventSourceRef(self.getChildElementOptionalRefType(element, "EVENT-SOURCE-REF"))
@@ -639,6 +658,13 @@ class ARXMLParser(AbstractARXMLParser):
639
658
  else:
640
659
  self.notImplemented("Unsupported BswModuleEntity <%s>" % tag_name)
641
660
 
661
+ def readBswBackgroundEvent(self, element: ET.Element, event: BswBackgroundEvent):
662
+ self.readBswScheduleEvent(element, event)
663
+
664
+ def readBswExternalTriggerOccurredEvent(self, element: ET.Element, event: BswExternalTriggerOccurredEvent):
665
+ self.readBswScheduleEvent(element, event)
666
+ event.setTriggerRef(self.getChildElementOptionalRefType(element, "TRIGGER-REF"))
667
+
642
668
  def readBswInternalBehaviorEvents(self, element: ET.Element, behavior: BswInternalBehavior):
643
669
  for child_element in self.findall(element, "EVENTS/*"):
644
670
  tag_name = self.getTagName(child_element)
@@ -654,6 +680,12 @@ class ARXMLParser(AbstractARXMLParser):
654
680
  elif tag_name == "BSW-INTERNAL-TRIGGER-OCCURRED-EVENT":
655
681
  event = behavior.createBswInternalTriggerOccurredEvent(self.getShortName(child_element))
656
682
  self.readBswInternalTriggerOccurredEvent(child_element, event)
683
+ elif tag_name == "BSW-BACKGROUND-EVENT":
684
+ event = behavior.createBswBackgroundEvent(self.getShortName(child_element))
685
+ self.readBswBackgroundEvent(child_element, event)
686
+ elif tag_name == "BSW-EXTERNAL-TRIGGER-OCCURRED-EVENT":
687
+ event = behavior.createBswExternalTriggerOccurredEvent(self.getShortName(child_element))
688
+ self.readBswExternalTriggerOccurredEvent(child_element, event)
657
689
  else:
658
690
  self.notImplemented("Unsupported BswModuleEntity <%s>" % tag_name)
659
691
 
@@ -800,11 +832,13 @@ class ARXMLParser(AbstractARXMLParser):
800
832
  impl.setArReleaseVersion(self.getChildElementOptionalLiteral(element, "AR-RELEASE-VERSION")) \
801
833
  .setBehaviorRef(self.getChildElementOptionalRefType(element, "BEHAVIOR-REF"))
802
834
  self.readBswImplementationVendorSpecificModuleDefRefs(element, impl)
835
+ AUTOSAR.getInstance().addImplementationBehaviorMap(impl.getFullName(), impl.getBehaviorRef().getValue())
803
836
 
804
837
  def readSwcImplementation(self, element: ET.Element, impl: SwcImplementation):
805
838
  self.logger.debug("Read SwcImplementation <%s>" % impl.getShortName())
806
839
  self.readImplementation(element, impl)
807
840
  impl.setBehaviorRef(self.getChildElementOptionalRefType(element, "BEHAVIOR-REF"))
841
+ AUTOSAR.getInstance().addImplementationBehaviorMap(impl.getFullName(), impl.getBehaviorRef().getValue())
808
842
 
809
843
  def readDataReceivePointByArguments(self, element, parent: RunnableEntity):
810
844
  self._readVariableAccesses(element, parent, "DATA-RECEIVE-POINT-BY-ARGUMENTS")
@@ -1008,9 +1042,8 @@ class ARXMLParser(AbstractARXMLParser):
1008
1042
  .setTargetProvidedOperationRef(self.getChildElementRefType(parent.getShortName(), child_element, "TARGET-PROVIDED-OPERATION-REF"))
1009
1043
  parent.setOperationIRef(operation_iref)
1010
1044
 
1011
- def readOperationInvokedEvent(self, element: ET.Element, parent: SwcInternalBehavior):
1012
- short_name = self.getShortName(element)
1013
- event = parent.createOperationInvokedEvent(short_name)
1045
+ def readOperationInvokedEvent(self, element: ET.Element, event: OperationInvokedEvent):
1046
+ self.logger.debug("Read OperationInvokedEvent <%s>" % event.getShortName())
1014
1047
  self.readPOperationIRef(element, "OPERATION-IREF", event)
1015
1048
  self.readRTEEvent(element, event)
1016
1049
 
@@ -1068,60 +1101,76 @@ class ARXMLParser(AbstractARXMLParser):
1068
1101
  option.addPortArgValue(self.readPortDefinedArgumentValue(argument_value_tag))
1069
1102
  behavior.addPortAPIOption(option)
1070
1103
 
1071
- def readTimingEvent(self, element: ET.Element, parent: SwcInternalBehavior):
1072
- short_name = self.getShortName(element)
1073
- event = parent.createTimingEvent(short_name)
1104
+ def readTimingEvent(self, element: ET.Element, event: TimingEvent):
1105
+ self.logger.debug("Read TimingEvent <%s>" % event.getShortName())
1074
1106
  self.readRTEEvent(element, event)
1075
1107
  event.setOffset(self.getChildElementOptionalTimeValue(element, "OFFSET")) \
1076
1108
  .setPeriod(self.getChildElementOptionalTimeValue(element, "PERIOD"))
1077
1109
 
1078
- def readDataReceivedEvent(self, element: ET.Element, parent: SwcInternalBehavior):
1079
- short_name = self.getShortName(element)
1080
- event = parent.createDataReceivedEvent(short_name)
1110
+ def readDataReceivedEvent(self, element: ET.Element, event: DataReceivedEvent):
1111
+ self.logger.debug("Read DataReceivedEvent <%s>" % event.getShortName())
1081
1112
  self.readRTEEvent(element, event)
1082
1113
  self.readRVariableInAtomicSwcInstanceRef(element, event)
1083
1114
 
1084
- def readSwcModeSwitchEvent(self, element: ET.Element, parent: SwcInternalBehavior):
1085
- short_name = self.getShortName(element)
1086
- event = parent.createSwcModeSwitchEvent(short_name)
1115
+ def readSwcModeSwitchEvent(self, element: ET.Element, event: SwcModeSwitchEvent):
1116
+ self.logger.debug("Read SwcModeSwitchEvent <%s>" % event.getShortName())
1087
1117
  self.readRTEEvent(element, event)
1088
1118
  event.setActivation(self.getChildElementOptionalLiteral(element, "ACTIVATION"))
1089
1119
  self.readRModeInAtomicSwcInstanceRef(element, event)
1090
1120
 
1091
- def readInternalTriggerOccurredEvent(self, element: ET.Element, parent: SwcInternalBehavior):
1092
- short_name = self.getShortName(element)
1093
- event = parent.createInternalTriggerOccurredEvent(short_name)
1121
+ def readInternalTriggerOccurredEvent(self, element: ET.Element, event: InternalTriggerOccurredEvent):
1122
+ self.logger.debug("Read InternalTriggerOccurredEvent <%s>" % event.getShortName())
1094
1123
  self.readRTEEvent(element, event)
1095
1124
  event.setEventSourceRef(self.getChildElementOptionalRefType(element, "EVENT-SOURCE-REF"))
1096
1125
 
1097
- def readInitEvent(self, element, parent: SwcInternalBehavior):
1098
- short_name = self.getShortName(element)
1099
- event = parent.createInitEvent(short_name)
1126
+ def readInitEvent(self, element, event: InitEvent):
1127
+ self.logger.debug("Read InitEvent <%s>" % event.getShortName())
1100
1128
  self.readRTEEvent(element, event)
1101
1129
 
1102
- def readAsynchronousServerCallReturnsEvent(self, element, parent: SwcInternalBehavior):
1103
- short_name = self.getShortName(element)
1104
- event = parent.createAsynchronousServerCallReturnsEvent(short_name)
1130
+ def readAsynchronousServerCallReturnsEvent(self, element, event: AsynchronousServerCallReturnsEvent):
1131
+ self.logger.debug("Read AsynchronousServerCallReturnsEvent <%s>" % event.getShortName())
1105
1132
  self.readRTEEvent(element, event)
1106
1133
  event.setActivationReasonRepresentationRef(self.getChildElementOptionalRefType(element, "EVENT-SOURCE-REF"))
1107
1134
 
1135
+ def readModeSwitchedAckEvent(self, element, event: ModeSwitchedAckEvent):
1136
+ self.logger.debug("Read ModeSwitchedAckEvent <%s>" % event.getShortName())
1137
+ self.readRTEEvent(element, event)
1138
+ event.setEventSourceRef(self.getChildElementOptionalRefType(element, "EVENT-SOURCE-REF"))
1139
+
1140
+ def readBackgroundEvent(self, element, event: BackgroundEvent):
1141
+ self.logger.debug("Read BackgroundEvent <%s>" % event.getShortName())
1142
+ self.readRTEEvent(element, event)
1143
+
1108
1144
  def readSwcInternalBehaviorEvents(self, element: ET.Element, parent: SwcInternalBehavior):
1109
1145
  for child_element in self.findall(element, "EVENTS/*"):
1110
1146
  tag_name = self.getTagName(child_element)
1111
1147
  if tag_name == "TIMING-EVENT":
1112
- self.readTimingEvent(child_element, parent)
1148
+ event = parent.createTimingEvent(self.getShortName(child_element))
1149
+ self.readTimingEvent(child_element, event)
1113
1150
  elif tag_name == "SWC-MODE-SWITCH-EVENT":
1114
- self.readSwcModeSwitchEvent(child_element, parent)
1151
+ event = parent.createSwcModeSwitchEvent(self.getShortName(child_element))
1152
+ self.readSwcModeSwitchEvent(child_element, event)
1115
1153
  elif tag_name == "OPERATION-INVOKED-EVENT":
1116
- self.readOperationInvokedEvent(child_element, parent)
1154
+ event = parent.createOperationInvokedEvent(self.getShortName(child_element))
1155
+ self.readOperationInvokedEvent(child_element, event)
1117
1156
  elif tag_name == "DATA-RECEIVED-EVENT":
1118
- self.readDataReceivedEvent(child_element, parent)
1157
+ event = parent.createDataReceivedEvent(self.getShortName(child_element))
1158
+ self.readDataReceivedEvent(child_element, event)
1119
1159
  elif tag_name == "INTERNAL-TRIGGER-OCCURRED-EVENT":
1120
- self.readInternalTriggerOccurredEvent(child_element, parent)
1160
+ event = parent.createInternalTriggerOccurredEvent(self.getShortName(child_element))
1161
+ self.readInternalTriggerOccurredEvent(child_element, event)
1121
1162
  elif tag_name == "INIT-EVENT":
1122
- self.readInitEvent(child_element, parent)
1163
+ event = parent.createInitEvent(self.getShortName(child_element))
1164
+ self.readInitEvent(child_element, event)
1123
1165
  elif tag_name == "ASYNCHRONOUS-SERVER-CALL-RETURNS-EVENT":
1124
- self.readAsynchronousServerCallReturnsEvent(child_element, parent)
1166
+ event = parent.createAsynchronousServerCallReturnsEvent(self.getShortName(child_element))
1167
+ self.readAsynchronousServerCallReturnsEvent(child_element, event)
1168
+ elif tag_name == "MODE-SWITCHED-ACK-EVENT":
1169
+ event = parent.createModeSwitchedAckEvent(self.getShortName(child_element))
1170
+ self.readModeSwitchedAckEvent(child_element, event)
1171
+ elif tag_name == "BACKGROUND-EVENT":
1172
+ event = parent.createBackgroundEvent(self.getShortName(child_element))
1173
+ self.readBackgroundEvent(child_element, event)
1125
1174
  else:
1126
1175
  self.notImplemented("Unsupported SwcInternalBehavior Event <%s>" % tag_name)
1127
1176
 
@@ -1553,27 +1602,36 @@ class ARXMLParser(AbstractARXMLParser):
1553
1602
  .setTransmissionAcknowledge(self.readTransmissionAcknowledgementRequest(element)) \
1554
1603
  .setUsesEndToEndProtection(self.getChildElementOptionalBooleanValue(element, "USES-END-TO-END-PROTECTION"))
1555
1604
 
1556
- def getNonqueuedSenderComSpec(self, element) -> NonqueuedSenderComSpec:
1605
+ def getNonqueuedSenderComSpec(self, element:ET.Element) -> NonqueuedSenderComSpec:
1557
1606
  com_spec = NonqueuedSenderComSpec()
1558
1607
  self.readSenderComSpec(element, com_spec)
1559
1608
  com_spec.setInitValue(self.getInitValue(element))
1560
1609
  return com_spec
1561
1610
 
1562
- def getServerComSpec(self, element) -> ServerComSpec:
1611
+ def getServerComSpec(self, element:ET.Element) -> ServerComSpec:
1563
1612
  com_spec = ServerComSpec()
1564
1613
  self.readARObjectAttributes(element, com_spec)
1565
1614
  com_spec.setOperationRef(self.getChildElementOptionalRefType(element, "OPERATION-REF")) \
1566
1615
  .setQueueLength(self.getChildElementOptionalNumericalValue(element, "QUEUE-LENGTH"))
1567
1616
  return com_spec
1568
1617
 
1569
- def getQueuedSenderComSpec(self, element) -> QueuedSenderComSpec:
1618
+ def getQueuedSenderComSpec(self, element:ET.Element) -> QueuedSenderComSpec:
1570
1619
  com_spec = QueuedSenderComSpec()
1571
1620
  self.readSenderComSpec(element, com_spec)
1572
1621
  return com_spec
1573
1622
 
1623
+ def getModeSwitchedAckRequest(self, element: ET.Element, key: str) -> ModeSwitchedAckRequest:
1624
+ request = None
1625
+ child_element = self.find(element, key)
1626
+ if child_element is not None:
1627
+ request = ModeSwitchedAckRequest()
1628
+ request.setTimeout(self.getChildElementOptionalTimeValue(child_element, "TIMEOUT"))
1629
+ return request
1630
+
1574
1631
  def getModeSwitchSenderComSpec(self, element) -> ModeSwitchSenderComSpec:
1575
1632
  com_spec = ModeSwitchSenderComSpec()
1576
1633
  com_spec.setModeGroupRef(self.getChildElementOptionalRefType(element, "MODE-GROUP-REF")) \
1634
+ .setModeSwitchedAck(self.getModeSwitchedAckRequest(element, "MODE-SWITCHED-ACK")) \
1577
1635
  .setQueueLength(self.getChildElementOptionalNumericalValue(element, "QUEUE-LENGTH"))
1578
1636
  return com_spec
1579
1637
 
@@ -1931,6 +1989,7 @@ class ARXMLParser(AbstractARXMLParser):
1931
1989
  self.readARObjectAttributes(child_element, compu_scale)
1932
1990
  compu_scale.setLowerLimit(self.getChildLimitElement(child_element, "LOWER-LIMIT")) \
1933
1991
  .setShortLabel(self.getChildElementOptionalLiteral(child_element, "SHORT-LABEL")) \
1992
+ .setDesc(self.getMultiLanguageOverviewParagraph(child_element, "DESC")) \
1934
1993
  .setSymbol(self.getChildElementOptionalLiteral(child_element, "SYMBOL")) \
1935
1994
  .setUpperLimit(self.getChildLimitElement(child_element, "UPPER-LIMIT"))
1936
1995
  self.readCompuScaleContents(child_element, compu_scale)
@@ -2144,7 +2203,7 @@ class ARXMLParser(AbstractARXMLParser):
2144
2203
  self.readEndToEndProtectionVariablePrototypes(element, protection)
2145
2204
 
2146
2205
  def readEndToEndProtections(self, element: ET.Element, parent: EndToEndProtectionSet):
2147
- for child_element in self.findall(element, "END-TO-END-PROTECTIONS/*", self.nsmap):
2206
+ for child_element in self.findall(element, "END-TO-END-PROTECTIONS/*"):
2148
2207
  tag_name = self.getTagName(child_element)
2149
2208
  if tag_name == "END-TO-END-PROTECTION":
2150
2209
  self.readEndToEndProtection(child_element, parent)
@@ -2193,12 +2252,14 @@ class ARXMLParser(AbstractARXMLParser):
2193
2252
  self.logger.debug("readApplicationArrayElement %s" % short_name)
2194
2253
  array_element = parent.createApplicationArrayElement(short_name)
2195
2254
  self.readApplicationCompositeElementDataPrototype(child_element, array_element)
2255
+ array_element.setArraySizeHandling(self.getChildElementOptionalLiteral(child_element, "ARRAY-SIZE-HANDLING"))
2196
2256
  array_element.setArraySizeSemantics(self.getChildElementOptionalLiteral(child_element, "ARRAY-SIZE-SEMANTICS"))
2197
2257
  array_element.setMaxNumberOfElements(self.getChildElementOptionalNumericalValue(child_element, "MAX-NUMBER-OF-ELEMENTS"))
2198
2258
 
2199
2259
  def readApplicationArrayDataType(self, element: ET.Element, data_type: ApplicationArrayDataType):
2200
2260
  self.logger.debug("Read ApplicationArrayDataType <%s>" % data_type)
2201
2261
  self.readApplicationCompositeDataType(element, data_type)
2262
+ data_type.setDynamicArraySizeProfile(self.getChildElementOptionalLiteral(element, "DYNAMIC-ARRAY-SIZE-PROFILE"))
2202
2263
  self.readApplicationArrayElement(element, data_type)
2203
2264
 
2204
2265
  def getSwRecordLayoutV(self, element: ET.Element, key: str) -> SwRecordLayoutV:
@@ -2211,7 +2272,14 @@ class ARXMLParser(AbstractARXMLParser):
2211
2272
  .setSwRecordLayoutVAxis(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-V-AXIS")) \
2212
2273
  .setSwRecordLayoutVProp(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-V-PROP")) \
2213
2274
  .setSwRecordLayoutVIndex(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-V-INDEX"))
2275
+ #print(layout_v.getShortLabel())
2214
2276
  return layout_v
2277
+
2278
+ def readSwRecordLayoutGroupSwRecordLayoutGroupContentType(self, element: ET.Element, group: SwRecordLayoutGroup):
2279
+ content = SwRecordLayoutGroupContent()
2280
+ content.setSwRecordLayoutGroup(self.getSwRecordLayoutGroup(element, "SW-RECORD-LAYOUT-GROUP")) \
2281
+ .setSwRecordLayoutV(self.getSwRecordLayoutV(element, "SW-RECORD-LAYOUT-V"))
2282
+ group.setSwRecordLayoutGroupContentType(content)
2215
2283
 
2216
2284
  def getSwRecordLayoutGroup(self, element: ET.Element, key: str) -> SwRecordLayoutGroup:
2217
2285
  child_element = element.find("./xmlns:%s" % key, self.nsmap)
@@ -2219,22 +2287,14 @@ class ARXMLParser(AbstractARXMLParser):
2219
2287
  if child_element is not None:
2220
2288
  group = SwRecordLayoutGroup()
2221
2289
  group.setShortLabel(self.getChildElementOptionalLiteral(child_element, "SHORT-LABEL")) \
2222
- .setCategory(self.getChildElementOptionalLiteral(child_element, "CATEGORY")) \
2223
- .setSwRecordLayoutGroupAxis(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-AXIS")) \
2290
+ .setCategory(self.getChildElementOptionalLiteral(child_element, "CATEGORY"))
2291
+ self.readSwRecordLayoutGroupSwRecordLayoutGroupContentType(child_element, group)
2292
+ group.setSwRecordLayoutGroupAxis(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-AXIS")) \
2224
2293
  .setSwRecordLayoutGroupIndex(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-INDEX")) \
2225
2294
  .setSwRecordLayoutGroupFrom(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-FROM")) \
2226
2295
  .setSwRecordLayoutGroupStep(self.getChildElementOptionalIntegerValue(child_element, "SW-RECORD-LAYOUT-GROUP-STEP")) \
2227
- .setSwRecordLayoutGroupTo(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-TO")) \
2228
-
2229
- group_content = SwRecordLayoutGroupContent()
2230
- group_content.swRecordLayoutGroup = self.getSwRecordLayoutGroup(child_element, "SW-RECORD-LAYOUT-GROUP")
2231
- group_content.swRecordLayoutV = self.getSwRecordLayoutV(child_element, "SW-RECORD-LAYOUT-V")
2232
-
2233
- if group_content.swRecordLayoutGroup is not None:
2234
- group.setSwRecordLayoutGroupContentType(group_content)
2235
- elif group_content.swRecordLayoutV is not None:
2236
- group.setSwRecordLayoutGroupContentType(group_content)
2237
-
2296
+ .setSwRecordLayoutGroupTo(self.getChildElementOptionalLiteral(child_element, "SW-RECORD-LAYOUT-GROUP-TO"))
2297
+ #print(group.getShortLabel())
2238
2298
  return group
2239
2299
 
2240
2300
  def readSwRecordLayout(self, element: ET.Element, layout: SwRecordLayout):
@@ -2858,37 +2918,169 @@ class ARXMLParser(AbstractARXMLParser):
2858
2918
  self.readDiagnosticServiceTableDiagnosticConnectionRefs(element, table)
2859
2919
  table.setEcuInstanceRef(self.getChildElementOptionalRefType(element, "ECU-INSTANCE-REF"))
2860
2920
 
2861
- def readMultiplexedIPdu(self, element: ET.Element, i_pdu: MultiplexedIPdu):
2862
- self.logger.debug("Read MultiplexedIPdu <%s>" % i_pdu.getShortName())
2863
- self.readIdentifiable(element, i_pdu)
2921
+ def readSegmentPosition(self, element: ET.Element, position: SegmentPosition):
2922
+ position.setSegmentByteOrder(self.getChildElementOptionalLiteral(element, "SEGMENT-BYTE-ORDER")) \
2923
+ .setSegmentLength(self.getChildElementOptionalIntegerValue(element, "SEGMENT-LENGTH")) \
2924
+ .setSegmentPosition(self.getChildElementOptionalIntegerValue(element, "SEGMENT-POSITION"))
2925
+
2926
+ def readMultiplexedPartSegmentPositions(self, element: ET.Element, part: MultiplexedPart):
2927
+ for child_element in self.findall(element, "SEGMENT-POSITIONS/*"):
2928
+ tag_name = self.getTagName(child_element)
2929
+ if tag_name == "SEGMENT-POSITION":
2930
+ position = SegmentPosition()
2931
+ self.readSegmentPosition(child_element, position)
2932
+ part.addSegmentPosition(position)
2933
+ else:
2934
+ self.notImplemented("Unsupported DynamicPart <%s>" % tag_name)
2935
+
2936
+ def readMultiplexedPart(self, element: ET.Element, part: MultiplexedPart):
2937
+ self.readMultiplexedPartSegmentPositions(element, part)
2938
+
2939
+ def readDynamicPartAlternative(self, element: ET.Element, alternative: DynamicPartAlternative):
2940
+ alternative.setIPduRef(self.getChildElementOptionalRefType(element, "I-PDU-REF")) \
2941
+ .setInitialDynamicPart(self.getChildElementOptionalBooleanValue(element, "INITIAL-DYNAMIC-PART")) \
2942
+ .setSelectorFieldCode(self.getChildElementOptionalIntegerValue(element, "SELECTOR-FIELD-CODE"))
2943
+
2944
+ def readDynamicPartDynamicPartAlternatives(self, element: ET.Element, part: DynamicPart):
2945
+ for child_element in self.findall(element, "DYNAMIC-PART-ALTERNATIVES/*"):
2946
+ tag_name = self.getTagName(child_element)
2947
+ if tag_name == "DYNAMIC-PART-ALTERNATIVE":
2948
+ alternative = DynamicPartAlternative()
2949
+ self.readDynamicPartAlternative(child_element, alternative)
2950
+ part.addDynamicPartAlternative(alternative)
2951
+ else:
2952
+ self.notImplemented("Unsupported DynamicPartAlternative <%s>" % tag_name)
2953
+
2954
+ def readDynamicPart(self, element: ET.Element, part: DynamicPart):
2955
+ self.readMultiplexedPart(element, part)
2956
+ self.readDynamicPartDynamicPartAlternatives(element, part)
2957
+
2958
+ def readMultiplexedIPduDynamicParts(self, element: ET.Element, ipdu: MultiplexedIPdu):
2959
+ for child_element in self.findall(element, "DYNAMIC-PARTS/*"):
2960
+ tag_name = self.getTagName(child_element)
2961
+ if tag_name == "DYNAMIC-PART":
2962
+ part = DynamicPart()
2963
+ self.readDynamicPart(child_element, part)
2964
+ ipdu.setDynamicPart(part)
2965
+ else:
2966
+ self.notImplemented("Unsupported DynamicPart <%s>" % tag_name)
2864
2967
 
2865
- def readUserDefinedIPdu(self, element: ET.Element, i_pdu: UserDefinedIPdu):
2866
- self.logger.debug("Read UserDefinedIPdu <%s>" % i_pdu.getShortName())
2867
- self.readIdentifiable(element, i_pdu)
2968
+ def readStaticPart(self, element: ET.Element, part: StaticPart):
2969
+ self.readMultiplexedPart(element, part)
2970
+ part.setIPduRef(self.getChildElementOptionalRefType(element, "I-PDU-REF"))
2971
+
2972
+ def readMultiplexedIPduStaticParts(self, element: ET.Element, ipdu: MultiplexedIPdu):
2973
+ for child_element in self.findall(element, "STATIC-PARTS/*"):
2974
+ tag_name = self.getTagName(child_element)
2975
+ if tag_name == "STATIC-PART":
2976
+ part = StaticPart()
2977
+ self.readStaticPart(child_element, part)
2978
+ ipdu.setStaticPart(part)
2979
+ else:
2980
+ self.notImplemented("Unsupported StaticPart <%s>" % tag_name)
2981
+
2982
+ def readMultiplexedIPdu(self, element: ET.Element, ipdu: MultiplexedIPdu):
2983
+ self.logger.debug("Read MultiplexedIPdu <%s>" % ipdu.getShortName())
2984
+ self.readIPdu(element, ipdu)
2985
+ self.readMultiplexedIPduDynamicParts(element, ipdu)
2986
+ ipdu.setSelectorFieldByteOrder(self.getChildElementOptionalLiteral(element, "SELECTOR-FIELD-BYTE-ORDER")) \
2987
+ .setSelectorFieldLength(self.getChildElementOptionalIntegerValue(element, "SELECTOR-FIELD-LENGTH")) \
2988
+ .setSelectorFieldStartPosition(self.getChildElementOptionalIntegerValue(element, "SELECTOR-FIELD-START-POSITION"))
2989
+ self.readMultiplexedIPduStaticParts(element, ipdu)
2990
+ ipdu.setTriggerMode(self.getChildElementOptionalLiteral(element, "TRIGGER-MODE")) \
2991
+ .setUnusedBitPattern(self.getChildElementOptionalIntegerValue(element, "UNUSED-BIT-PATTERN"))
2992
+
2993
+ def readUserDefinedIPdu(self, element: ET.Element, ipdu: UserDefinedIPdu):
2994
+ self.logger.debug("Read UserDefinedIPdu <%s>" % ipdu.getShortName())
2995
+ self.readIPdu(element, ipdu)
2996
+ ipdu.setCddType(self.getChildElementOptionalLiteral(element, "CDD-TYPE"))
2868
2997
 
2869
2998
  def readUserDefinedPdu(self, element: ET.Element, pdu: UserDefinedPdu):
2870
2999
  self.logger.debug("Read UserDefinedPdu <%s>" % pdu.getShortName())
2871
- self.readIdentifiable(element, pdu)
3000
+ self.readPdu(element, pdu)
3001
+ pdu.setCddType(self.getChildElementOptionalLiteral(element, "CDD-TYPE"))
2872
3002
 
2873
3003
  def readGeneralPurposePdu(self, element: ET.Element, pdu: GeneralPurposePdu):
2874
3004
  self.logger.debug("Read GeneralPurposePdu <%s>" % pdu.getShortName())
2875
- self.readIdentifiable(element, pdu)
3005
+ self.readPdu(element, pdu)
2876
3006
 
2877
3007
  def readGeneralPurposeIPdu(self, element: ET.Element, i_pdu: GeneralPurposeIPdu):
2878
3008
  self.logger.debug("Read GeneralPurposeIPdu <%s>" % i_pdu.getShortName())
2879
- self.readIdentifiable(element, i_pdu)
3009
+ self.readIPdu(element, i_pdu)
3010
+
3011
+ def readSecureCommunicationAuthenticationProps(self, element: ET.Element, props: SecureCommunicationAuthenticationProps):
3012
+ self.readIdentifiable(element, props)
3013
+ props.setAuthAlgorithm(self.getChildElementOptionalLiteral(element, "AUTH-ALGORITHM")) \
3014
+ .setAuthInfoTxLength(self.getChildElementOptionalPositiveInteger(element, "AUTH-INFO-TX-LENGTH"))
3015
+
3016
+ def readSecureCommunicationPropsSetAuthenticationProps(self, element: ET.Element, props_set: SecureCommunicationPropsSet):
3017
+ for child_element in self.findall(element, "AUTHENTICATION-PROPSS/*"):
3018
+ tag_name = self.getTagName(child_element)
3019
+ if tag_name == "SECURE-COMMUNICATION-AUTHENTICATION-PROPS":
3020
+ props = props_set.createSecureCommunicationAuthenticationProps(self.getShortName(child_element))
3021
+ self.readSecureCommunicationAuthenticationProps(child_element, props)
3022
+ else:
3023
+ self.notImplemented("Unsupported AuthenticationProps <%s>" % tag_name)
3024
+
3025
+ def readSecureCommunicationFreshnessProps(self, element: ET.Element, props: SecureCommunicationFreshnessProps):
3026
+ self.readIdentifiable(element, props)
3027
+ props.setFreshnessValueLength(self.getChildElementOptionalLiteral(element, "FRESHNESS-VALUE-LENGTH")) \
3028
+ .setFreshnessValueTxLength(self.getChildElementOptionalPositiveInteger(element, "FRESHNESS-VALUE-TX-LENGTH"))
3029
+
3030
+ def readSecureCommunicationPropsSetFreshnessProps(self, element: ET.Element, props_set: SecureCommunicationPropsSet):
3031
+ for child_element in self.findall(element, "FRESHNESS-PROPSS/*"):
3032
+ tag_name = self.getTagName(child_element)
3033
+ if tag_name == "SECURE-COMMUNICATION-FRESHNESS-PROPS":
3034
+ props = props_set.createSecureCommunicationFreshnessProps(self.getShortName(child_element))
3035
+ self.readSecureCommunicationFreshnessProps(child_element, props)
3036
+ else:
3037
+ self.notImplemented("Unsupported FreshnessProps <%s>" % tag_name)
2880
3038
 
2881
3039
  def readSecureCommunicationPropsSet(self, element: ET.Element, props_set: SecureCommunicationPropsSet):
2882
3040
  self.logger.debug("Read SecureCommunicationPropsSet <%s>" % props_set.getShortName())
2883
3041
  self.readIdentifiable(element, props_set)
2884
-
3042
+ self.readSecureCommunicationPropsSetAuthenticationProps(element, props_set)
3043
+ self.readSecureCommunicationPropsSetFreshnessProps(element, props_set)
3044
+
2885
3045
  def readSoAdRoutingGroup(self, element: ET.Element, group: SoAdRoutingGroup):
2886
3046
  self.logger.debug("Read SoAdRoutingGroup <%s>" % group.getShortName())
2887
3047
  self.readIdentifiable(element, group)
3048
+ group.setEventGroupControlType(self.getChildElementOptionalLiteral(element, "EVENT-GROUP-CONTROL-TYPE"))
3049
+
3050
+ def readDoIpLogicAddress(self, element: ET.Element, address: DoIpLogicAddress):
3051
+ self.readIdentifiable(element, address)
3052
+ address.setAddress(self.getChildElementOptionalIntegerValue(element, "ADDRESS"))
3053
+
3054
+ def readDoIpTpConfigDoIpLogicAddresses(self, element: ET.Element, config: DoIpTpConfig):
3055
+ for child_element in self.findall(element, "DO-IP-LOGIC-ADDRESSS/*"):
3056
+ tag_name = self.getTagName(child_element)
3057
+ if tag_name == "DO-IP-LOGIC-ADDRESS":
3058
+ address = config.createDoIpLogicAddress(self.getShortName(child_element))
3059
+ self.readDoIpLogicAddress(child_element, address)
3060
+ else:
3061
+ self.notImplemented("Unsupported DoIpLogicAddress <%s>" % tag_name)
3062
+
3063
+ def readDoIpTpConnection(self, element: ET.Element, connection: DoIpTpConnection):
3064
+ self.readTpConnection(element, connection)
3065
+ connection.setDoIpSourceAddressRef(self.getChildElementOptionalRefType(element, "DO-IP-SOURCE-ADDRESS-REF")) \
3066
+ .setDoIpTargetAddressRef(self.getChildElementOptionalRefType(element, "DO-IP-TARGET-ADDRESS-REF")) \
3067
+ .setTpSduRef(self.getChildElementOptionalRefType(element, "TP-SDU-REF"))
3068
+
3069
+ def readDoIpTpConfigTpConnections(self, element: ET.Element, config: DoIpTpConfig):
3070
+ for child_element in self.findall(element, "TP-CONNECTIONS/*"):
3071
+ tag_name = self.getTagName(child_element)
3072
+ if tag_name == "DO-IP-TP-CONNECTION":
3073
+ connection = DoIpTpConnection()
3074
+ self.readDoIpTpConnection(child_element, connection)
3075
+ config.addTpConnection(connection)
3076
+ else:
3077
+ self.notImplemented("Unsupported TpConnection <%s>" % tag_name)
2888
3078
 
2889
3079
  def readDoIpTpConfig(self, element: ET.Element, config: DoIpTpConfig):
2890
3080
  self.logger.debug("Read DoIpTpConfig <%s>" % config.getShortName())
2891
- self.readIdentifiable(element, config)
3081
+ self.readTpConfig(element, config)
3082
+ self.readDoIpTpConfigDoIpLogicAddresses(element, config)
3083
+ self.readDoIpTpConfigTpConnections(element, config)
2892
3084
 
2893
3085
  def readPduToFrameMappings(self, element: ET.Element, parent: Frame):
2894
3086
  for child_element in self.findall(element, "PDU-TO-FRAME-MAPPINGS/PDU-TO-FRAME-MAPPING"):
@@ -2909,82 +3101,125 @@ class ARXMLParser(AbstractARXMLParser):
2909
3101
  self.logger.debug("Read LinUnconditionalFrame <%s>" % frame.getShortName())
2910
3102
  self.readFrame(element, frame)
2911
3103
 
3104
+ def readPdu(self, element: ET.Element, pdu: Pdu):
3105
+ self.readIdentifiable(element, pdu)
3106
+ pdu.setHasDynamicLength(self.getChildElementOptionalBooleanValue(element, "HAS-DYNAMIC-LENGTH")) \
3107
+ .setLength(self.getChildElementOptionalNumericalValue(element, "LENGTH"))
3108
+
3109
+ def readISignalToIPduMapping(self, element: ET.Element, mapping: ISignalToIPduMapping):
3110
+ self.readIdentifiable(element, mapping)
3111
+ mapping.setISignalRef(self.getChildElementOptionalRefType(element, "I-SIGNAL-REF")) \
3112
+ .setPackingByteOrder(self.getChildElementOptionalLiteral(element, "PACKING-BYTE-ORDER")) \
3113
+ .setStartPosition(self.getChildElementOptionalIntegerValue(element, "START-POSITION")) \
3114
+ .setTransferProperty(self.getChildElementOptionalLiteral(element, "TRANSFER-PROPERTY"))
3115
+
3116
+ def readNmPduISignalToIPduMappings(self, element: ET.Element, pdu: NmPdu):
3117
+ for child_element in self.findall(element, "I-SIGNAL-TO-I-PDU-MAPPINGS/*"):
3118
+ tag_name = self.getTagName(child_element)
3119
+ if tag_name == "I-SIGNAL-TO-I-PDU-MAPPING":
3120
+ mapping = pdu.createISignalToIPduMapping(self.getShortName(child_element))
3121
+ self.readISignalToIPduMapping(child_element, mapping)
3122
+ else:
3123
+ self.notImplemented("Unsupported ISignalToIPduMapping <%s>" % tag_name)
3124
+
2912
3125
  def readNmPdu(self, element: ET.Element, pdu: NmPdu):
2913
3126
  self.logger.debug("Read NmPdu <%s>" % pdu.getShortName())
2914
- self.readIPdu(element, pdu)
3127
+ self.readPdu(element, pdu)
3128
+ self.readNmPduISignalToIPduMappings(element, pdu)
3129
+ pdu.setUnusedBitPattern(self.getChildElementOptionalIntegerValue(element, "UNUSED-BIT-PATTERN"))
3130
+
3131
+ def readIPdu(self, element: ET.Element, pdu: IPdu):
3132
+ self.readPdu(element, pdu)
2915
3133
 
2916
3134
  def readNPdu(self, element: ET.Element, pdu: NPdu):
2917
3135
  self.logger.debug("Read NPdu <%s>" % pdu.getShortName())
2918
3136
  self.readIPdu(element, pdu)
2919
3137
 
2920
- def readIPdu(self, element: ET.Element, pdu: IPdu):
2921
- self.readIdentifiable(element, pdu)
2922
- pdu.setLength(self.getChildElementOptionalNumericalValue(element, "LENGTH"))
2923
-
2924
3138
  def readDcmIPdu(self, element: ET.Element, i_pdu: DcmIPdu):
2925
3139
  self.logger.debug("Read DcmIPdu <%s>" % i_pdu.getShortName())
2926
3140
  self.readIPdu(element, i_pdu)
2927
3141
  i_pdu.setDiagPduType(self.getChildElementOptionalLiteral(element, "DIAG-PDU-TYPE"))
2928
3142
 
3143
+ def getSecureCommunicationProps(self, element: ET.Element, key: str) -> SecureCommunicationProps:
3144
+ props = None
3145
+ child_element = self.find(element, key)
3146
+ if child_element is not None:
3147
+ props = SecureCommunicationProps()
3148
+ props.setAuthDataFreshnessLength(self.getChildElementOptionalPositiveInteger(child_element, "AUTH-DATA-FRESHNESS-LENGTH")) \
3149
+ .setAuthDataFreshnessStartPosition(self.getChildElementOptionalPositiveInteger(child_element, "AUTH-DATA-FRESHNESS-START-POSITION")) \
3150
+ .setAuthInfoTxLength(self.getChildElementOptionalPositiveInteger(child_element, "AUTH-INFO-TX-LENGTH")) \
3151
+ .setAuthenticationBuildAttempts(self.getChildElementOptionalPositiveInteger(child_element, "AUTHENTICATION-BUILD-ATTEMPTS")) \
3152
+ .setAuthenticationRetries(self.getChildElementOptionalPositiveInteger(child_element, "AUTHENTICATION-RETRIES")) \
3153
+ .setDataId(self.getChildElementOptionalPositiveInteger(child_element, "DATA-ID")) \
3154
+ .setFreshnessValueId(self.getChildElementOptionalPositiveInteger(child_element, "FRESHNESS-VALUE-ID")) \
3155
+ .setFreshnessValueLength(self.getChildElementOptionalPositiveInteger(child_element, "FRESHNESS-VALUE-LENGTH")) \
3156
+ .setFreshnessValueTxLength(self.getChildElementOptionalPositiveInteger(child_element, "FRESHNESS-VALUE-TX-LENGTH"))
3157
+ return props
3158
+
2929
3159
  def readSecuredIPdu(self, element: ET.Element, i_pdu: SecuredIPdu):
2930
3160
  self.logger.debug("Read SecuredIPdu <%s>" % i_pdu.getShortName())
2931
3161
  self.readIPdu(element, i_pdu)
3162
+ i_pdu.setAuthenticationPropsRef(self.getChildElementOptionalRefType(element, "AUTHENTICATION-PROPS-REF")) \
3163
+ .setFreshnessPropsRef(self.getChildElementOptionalRefType(element, "FRESHNESS-PROPS-REF")) \
3164
+ .setPayloadRef(self.getChildElementOptionalRefType(element, "PAYLOAD-REF")) \
3165
+ .setSecureCommunicationProps(self.getSecureCommunicationProps(element, "SECURE-COMMUNICATION-PROPS")) \
3166
+ .setUseAsCryptographicIPdu(self.getChildElementOptionalBooleanValue(element, "USE-AS-CRYPTOGRAPHIC-I-PDU"))
2932
3167
 
2933
3168
  def readNmNode(self, element: ET.Element, nm_node: NmNode):
2934
3169
  self.readIdentifiable(element, nm_node)
2935
3170
 
2936
3171
  nm_node.setControllerRef(self.getChildElementOptionalRefType(element, "CONTROLLER-REF")) \
2937
- .setNmIfEcuRef(self.getChildElementOptionalRefType(element, "NM-IF-ECU-REF")) \
2938
- .setNmNodeId(self.getChildElementOptionalNumericalValue(element, "NM-NODE-ID"))
3172
+ .setNmIfEcuRef(self.getChildElementOptionalRefType(element, "NM-IF-ECU-REF")) \
3173
+ .setNmPassiveModeEnabled(self.getChildElementOptionalBooleanValue(element, "NM-PASSIVE-MODE-ENABLED")) \
3174
+ .setNmNodeId(self.getChildElementOptionalNumericalValue(element, "NM-NODE-ID"))
2939
3175
  for ref in self.getChildElementRefTypeList(element, "RX-NM-PDU-REFS/RX-NM-PDU-REF"):
2940
3176
  nm_node.addRxNmPduRef(ref)
2941
3177
  for ref in self.getChildElementRefTypeList(element, "TX-NM-PDU-REFS/TX-NM-PDU-REF"):
2942
3178
  nm_node.addTxNmPduRefs(ref)
3179
+
2943
3180
 
2944
3181
  def readCanNmNode(self, element: ET.Element, nm_node: CanNmNode):
2945
- self.logger.debug("Read CanNmNode %s" % nm_node.getShortName())
2946
-
3182
+ self.logger.debug("Read CanNmNode <%s>" % nm_node.getShortName())
2947
3183
  self.readNmNode(element, nm_node)
2948
-
2949
- nm_node.setNmMsgCycleOffset(self.getChildElementOptionalFloatValue(element, "NM-MSG-CYCLE-OFFSET")) \
3184
+ nm_node.setNmCarWakeUpRxEnabled(self.getChildElementOptionalBooleanValue(element, "NM-CAR-WAKE-UP-RX-ENABLED")) \
3185
+ .setNmMsgCycleOffset(self.getChildElementOptionalFloatValue(element, "NM-MSG-CYCLE-OFFSET")) \
2950
3186
  .setNmMsgReducedTime(self.getChildElementOptionalFloatValue(element, "NM-MSG-REDUCED-TIME")) \
2951
3187
  .setNmRangeConfig(self.getChildElementRxIdentifierRange(element, "NM-RANGE-CONFIG"))
2952
3188
 
2953
3189
  def readUdpNmNode(self, element: ET.Element, nm_node: UdpNmNode):
2954
- self.logger.debug("Read UdpNmNode %s" % nm_node.getShortName())
2955
-
3190
+ self.logger.debug("Read UdpNmNode <%s>" % nm_node.getShortName())
2956
3191
  self.readNmNode(element, nm_node)
3192
+ nm_node.setNmMsgCycleOffset(self.getChildElementOptionalTimeValue(element, "NM-MSG-CYCLE-OFFSET"))
2957
3193
 
2958
- def readNmClusterNmNodes(self, element: ET.Element, parent: NmCluster):
2959
- self.logger.debug("readNmConfigNmNodes %s" % parent.getShortName())
3194
+ def readNmClusterNmNodes(self, element: ET.Element, cluster: NmCluster):
3195
+ self.logger.debug("readNmConfigNmNodes %s" % cluster.getShortName())
2960
3196
  for child_element in self.findall(element, "NM-NODES/*"):
2961
3197
  tag_name = self.getTagName(child_element)
2962
3198
  if tag_name == "CAN-NM-NODE":
2963
- nm_node = parent.createCanNmNode(self.getShortName(child_element))
3199
+ nm_node = cluster.createCanNmNode(self.getShortName(child_element))
2964
3200
  self.readCanNmNode(child_element, nm_node)
2965
3201
  elif tag_name == "UDP-NM-NODE":
2966
- nm_node = parent.readUdpNmNode(self.getShortName(child_element))
3202
+ nm_node = cluster.readUdpNmNode(self.getShortName(child_element))
2967
3203
  self.readUdpNmNode(child_element, nm_node)
2968
3204
  else:
2969
- self.raiseError("Unsupported Nm Node <%s>" % tag_name)
3205
+ self.notImplemented("Unsupported Nm Node <%s>" % tag_name)
2970
3206
 
2971
3207
  def getCanNmClusterCoupling(self, element: ET.Element) -> CanNmClusterCoupling:
2972
3208
  coupling = CanNmClusterCoupling()
2973
-
2974
3209
  for ref in self.getChildElementRefTypeList(element, "COUPLED-CLUSTER-REFS/COUPLED-CLUSTER-REF"):
2975
3210
  coupling.addCoupledClusterRef(ref)
2976
-
2977
3211
  coupling.setNmBusloadReductionEnabled(self.getChildElementOptionalBooleanValue(element, "NM-BUSLOAD-REDUCTION-ENABLED")) \
2978
3212
  .setNmImmediateRestartEnabled(self.getChildElementOptionalBooleanValue(element, "NM-IMMEDIATE-RESTART-ENABLED"))
2979
-
2980
3213
  return coupling
2981
3214
 
2982
3215
  def getUdpNmClusterCoupling(self, element: ET.Element) -> UdpNmClusterCoupling:
2983
3216
  coupling = UdpNmClusterCoupling()
3217
+ for ref in self.getChildElementRefTypeList(element, "COUPLED-CLUSTER-REFS/COUPLED-CLUSTER-REF"):
3218
+ coupling.addCoupledClusterRef(ref)
3219
+ coupling.setNmImmediateRestartEnabled(self.getChildElementOptionalBooleanValue(element, "NM-IMMEDIATE-RESTART-ENABLED"))
2984
3220
  return coupling
2985
3221
 
2986
3222
  def readNmConfigNmClusterCouplings(self, element: ET.Element, nm_config: NmConfig):
2987
- self.logger.debug("readNmClusterNmClusterCouplings %s" % nm_config.getShortName())
2988
3223
  for child_element in self.findall(element, "NM-CLUSTER-COUPLINGS/*"):
2989
3224
  tag_name = self.getTagName(child_element)
2990
3225
  if tag_name == "CAN-NM-CLUSTER-COUPLING":
@@ -2995,6 +3230,7 @@ class ARXMLParser(AbstractARXMLParser):
2995
3230
  self.notImplemented("Unsupported Nm Node <%s>" % tag_name)
2996
3231
 
2997
3232
  def readNmCluster(self, element: ET.Element, cluster: NmCluster):
3233
+ self.logger.debug("read NmCluster %s" % cluster.getShortName())
2998
3234
  self.readIdentifiable(element, cluster)
2999
3235
  cluster.setCommunicationClusterRef(self.getChildElementOptionalRefType(element, "COMMUNICATION-CLUSTER-REF")) \
3000
3236
  .setNmChannelId(self.getChildElementOptionalNumericalValue(element, "NM-CHANNEL-ID")) \
@@ -3002,12 +3238,9 @@ class ARXMLParser(AbstractARXMLParser):
3002
3238
  self.readNmClusterNmNodes(element, cluster)
3003
3239
  cluster.setNmSynchronizingNetwork(self.getChildElementOptionalBooleanValue(element, "NM-SYNCHRONIZING-NETWORK"))
3004
3240
 
3005
- def readCanNmCluster(self, element: ET.Element, parent: NmConfig):
3006
- short_name = self.getShortName(element)
3007
- self.logger.debug("readCanNmCluster %s" % short_name)
3008
- cluster = parent.createCanNmCluster(short_name) # type: CanNmCluster
3241
+ def readCanNmCluster(self, element: ET.Element, cluster: CanNmCluster):
3242
+ self.logger.debug("Read CanNmCluster <%s>" % cluster.getShortName())
3009
3243
  self.readNmCluster(element, cluster)
3010
-
3011
3244
  cluster.setNmBusloadReductionActive(self.getChildElementOptionalBooleanValue(element, "NM-BUSLOAD-REDUCTION-ACTIVE")) \
3012
3245
  .setNmCarWakeUpRxEnabled(self.getChildElementOptionalBooleanValue(element, "NM-CAR-WAKE-UP-RX-ENABLED")) \
3013
3246
  .setNmCbvPosition(self.getChildElementOptionalNumericalValue(element, "NM-CBV-POSITION")) \
@@ -3023,35 +3256,247 @@ class ARXMLParser(AbstractARXMLParser):
3023
3256
  .setNmUserDataLength(self. getChildElementOptionalNumericalValue(element, "NM-USER-DATA-LENGTH")) \
3024
3257
  .setNmWaitBusSleepTime(self.getChildElementOptionalFloatValue(element, "NM-WAIT-BUS-SLEEP-TIME"))
3025
3258
 
3026
- def readUdpNmCluster(self, element: ET.Element, parent: NmConfig):
3027
- short_name = self.getShortName(element)
3028
- self.logger.debug("readCanNmCluster %s" % short_name)
3029
- cluster = parent.createUdpNmCluster(short_name) # type: CanNmCluster
3259
+ def readUdpNmCluster(self, element: ET.Element, cluster: UdpNmCluster):
3260
+ self.logger.debug("Read UdpNmCluster %s" % cluster.getShortName())
3030
3261
  self.readNmCluster(element, cluster)
3262
+ cluster.setNmCbvPosition(self.getChildElementOptionalIntegerValue(element, "NM-CBV-POSITION")) \
3263
+ .setNmChannelActive(self.getChildElementOptionalBooleanValue(element, "NM-CHANNEL-ACTIVE")) \
3264
+ .setNmImmediateNmCycleTime(self.getChildElementOptionalTimeValue(element, "NM-IMMEDIATE-NM-CYCLE-TIME")) \
3265
+ .setNmImmediateNmTransmissions(self.getChildElementOptionalPositiveInteger(element, "NM-IMMEDIATE-NM-TRANSMISSIONS")) \
3266
+ .setNmMessageTimeoutTime(self.getChildElementOptionalTimeValue(element, "NM-MESSAGE-TIMEOUT-TIME")) \
3267
+ .setNmMsgCycleTime(self.getChildElementOptionalTimeValue(element, "NM-MSG-CYCLE-TIME")) \
3268
+ .setNmNetworkTimeout(self.getChildElementOptionalTimeValue(element, "NM-NETWORK-TIMEOUT")) \
3269
+ .setNmNidPosition(self.getChildElementOptionalIntegerValue(element, "NM-NID-POSITION")) \
3270
+ .setNmRemoteSleepIndicationTime(self.getChildElementOptionalTimeValue(element, "NM-REMOTE-SLEEP-INDICATION-TIME")) \
3271
+ .setNmRepeatMessageTime(self.getChildElementOptionalTimeValue(element, "NM-REPEAT-MESSAGE-TIME")) \
3272
+ .setNmWaitBusSleepTime(self.getChildElementOptionalTimeValue(element, "NM-WAIT-BUS-SLEEP-TIME")) \
3273
+ .setVlanRef(self.getChildElementOptionalRefType(element, "VLAN-REF"))
3031
3274
 
3032
- def readNmConfigNmClusters(self, element: ET.Element, parent: NmConfig):
3275
+ def readNmConfigNmClusters(self, element: ET.Element, nm_config: NmConfig):
3033
3276
  for child_element in self.findall(element, "NM-CLUSTERS/*"):
3034
3277
  tag_name = self.getTagName(child_element)
3035
3278
  if tag_name == "CAN-NM-CLUSTER":
3036
- self.readCanNmCluster(child_element, parent)
3279
+ cluster = nm_config.createCanNmCluster(self.getShortName(child_element))
3280
+ self.readCanNmCluster(child_element, cluster)
3037
3281
  elif tag_name == "UDP-NM-CLUSTER":
3038
- self.readUdpNmCluster(child_element, parent)
3282
+ cluster = nm_config.createUdpNmCluster(self.getShortName(child_element))
3283
+ self.readUdpNmCluster(child_element, cluster)
3039
3284
  else:
3040
3285
  self.raiseError("Unsupported Nm Cluster <%s>" % tag_name)
3286
+
3287
+ def readUdpNmEcu(self, element: ET.Element, ecu: UdpNmEcu):
3288
+ ecu.setNmSynchronizationPointEnabled(self.getChildElementOptionalBooleanValue(element, "NM-SYNCHRONIZATION-POINT-ENABLED"))
3289
+
3290
+ def readBusDependentNmEcus(self, element: ET.Element, nm_ecu: NmEcu):
3291
+ for child_element in self.findall(element, "BUS-DEPENDENT-NM-ECUS/*"):
3292
+ tag_name = self.getTagName(child_element)
3293
+ if tag_name == "UDP-NM-ECU":
3294
+ udp_nm_ecu = UdpNmEcu()
3295
+ self.readUdpNmEcu(child_element, udp_nm_ecu)
3296
+ nm_ecu.addBusDependentNmEcu(udp_nm_ecu)
3297
+ else:
3298
+ self.notImplemented("Unsupported BusDependentNmEcu <%s>" % tag_name)
3299
+
3300
+ def readNmEcu(self, element: ET.Element, nm_ecu: NmEcu):
3301
+ self.readIdentifiable(element, nm_ecu)
3302
+ self.readBusDependentNmEcus(element, nm_ecu)
3303
+ nm_ecu.setEcuInstanceRef(self.getChildElementOptionalRefType(element, "ECU-INSTANCE-REF")) \
3304
+ .setNmBusSynchronizationEnabled(self.getChildElementOptionalBooleanValue(element, "NM-BUS-SYNCHRONIZATION-ENABLED")) \
3305
+ .setNmComControlEnabled(self.getChildElementOptionalBooleanValue(element, "NM-COM-CONTROL-ENABLED")) \
3306
+ .setNmNodeDetectionEnabled(self.getChildElementOptionalBooleanValue(element, "NM-NODE-DETECTION-ENABLED")) \
3307
+ .setNmNodeIdEnabled(self.getChildElementOptionalBooleanValue(element, "NM-NODE-ID-ENABLED")) \
3308
+ .setNmPduRxIndicationEnabled(self.getChildElementOptionalBooleanValue(element, "NM-PDU-RX-INDICATION-ENABLED")) \
3309
+ .setNmRemoteSleepIndEnabled(self.getChildElementOptionalBooleanValue(element, "NM-REMOTE-SLEEP-IND-ENABLED")) \
3310
+ .setNmRepeatMsgIndEnabled(self.getChildElementOptionalBooleanValue(element, "NM-REPEAT-MSG-IND-ENABLED")) \
3311
+ .setNmStateChangeIndEnabled(self.getChildElementOptionalBooleanValue(element, "NM-STATE-CHANGE-IND-ENABLED")) \
3312
+ .setNmUserDataEnabled(self.getChildElementOptionalBooleanValue(element, "NM-USER-DATA-ENABLED"))
3313
+
3314
+ def readNmConfigNmIfEcus(self, element: ET.Element, nm_config: NmConfig):
3315
+ for child_element in self.findall(element, "NM-IF-ECUS/*"):
3316
+ tag_name = self.getTagName(child_element)
3317
+ if tag_name == "NM-ECU":
3318
+ ecu = nm_config.createNmEcu(self.getShortName(child_element))
3319
+ self.readNmEcu(child_element, ecu)
3320
+ else:
3321
+ self.notImplemented("Unsupported NmIfEcus <%s>" % tag_name)
3041
3322
 
3042
3323
  def readNmConfig(self, element: ET.Element, config: NmConfig):
3043
3324
  self.logger.debug("Read NmConfig <%s>" % config.getShortName())
3044
3325
  self.readIdentifiable(element, config)
3045
3326
  self.readNmConfigNmClusters(element, config)
3046
3327
  self.readNmConfigNmClusterCouplings(element, config)
3328
+ self.readNmConfigNmIfEcus(element, config)
3329
+
3330
+ def readTpConfig(self, element: ET.Element, config: TpConfig):
3331
+ self.readIdentifiable(element, config)
3332
+ config.setCommunicationClusterRef(self.getChildElementOptionalRefType(element, "COMMUNICATION-CLUSTER-REF"))
3333
+
3334
+ def readCanTpAddress(self, element: ET.Element, address: CanTpAddress):
3335
+ self.readIdentifiable(element, address)
3336
+ address.setTpAddress(self.getChildElementOptionalIntegerValue(element, "TP-ADDRESS")) \
3337
+ .setTpAddressExtensionValue(self.getChildElementOptionalIntegerValue(element, "TP-ADDRESS-EXTENSION-VALUE"))
3338
+
3339
+ def readCanTpConfigTpAddresses(self, element: ET.Element, config: CanTpConfig):
3340
+ for child_element in self.findall(element, "TP-ADDRESSS/*"):
3341
+ tag_name = self.getTagName(child_element)
3342
+ if tag_name == "CAN-TP-ADDRESS":
3343
+ address = config.createCanTpAddress(self.getShortName(child_element))
3344
+ self.readCanTpAddress(child_element, address)
3345
+ else:
3346
+ self.notImplemented("Unsupported TpAddress <%s>" % tag_name)
3347
+
3348
+ def readCanTpChannel(self, element: ET.Element, channel: CanTpChannel):
3349
+ self.readIdentifiable(element, channel)
3350
+ channel.setChannelId(self.getChildElementOptionalPositiveInteger(element, "CHANNEL-ID")) \
3351
+ .setChannelMode(self.getChildElementOptionalLiteral(element, "CHANNEL-MODE"))
3352
+
3353
+ def readCanTpConfigTpChannels(self, element: ET.Element, config: CanTpConfig):
3354
+ for child_element in self.findall(element, "TP-CHANNELS/*"):
3355
+ tag_name = self.getTagName(child_element)
3356
+ if tag_name == "CAN-TP-CHANNEL":
3357
+ channel = config.createCanTpChannel(self.getShortName(child_element))
3358
+ self.readCanTpChannel(child_element, channel)
3359
+ else:
3360
+ self.notImplemented("Unsupported TpChannel <%s>" % tag_name)
3361
+
3362
+ def readTpConnection(self, element: ET.Element, connection: TpConnection):
3363
+ self.readARObjectAttributes(element, connection)
3364
+ child_element = self.find(element, "IDENT")
3365
+ if child_element is not None:
3366
+ ident = connection.createTpConnectionIdent(self.getShortName(child_element))
3367
+ self.readReferrable(child_element, ident)
3368
+
3369
+ def readTpConnectionReceiverRefs(self, element: ET.Element, connection: CanTpConnection):
3370
+ for ref in self.getChildElementRefTypeList(element, "RECEIVER-REFS/RECEIVER-REF"):
3371
+ connection.addReceiverRef(ref)
3372
+
3373
+ def readCanTpConnection(self, element: ET.Element, connection: CanTpConnection):
3374
+ self.readTpConnection(element, connection)
3375
+ connection.setAddressingFormat(self.getChildElementOptionalLiteral(element, "ADDRESSING-FORMAT")) \
3376
+ .setCanTpChannelRef(self.getChildElementOptionalRefType(element, "CAN-TP-CHANNEL-REF")) \
3377
+ .setCancellation(self.getChildElementOptionalBooleanValue(element, "CANCELLATION")) \
3378
+ .setDataPduRef(self.getChildElementOptionalRefType(element, "DATA-PDU-REF")) \
3379
+ .setFlowControlPduRef(self.getChildElementOptionalRefType(element, "FLOW-CONTROL-PDU-REF")) \
3380
+ .setMaxBlockSize(self.getChildElementOptionalIntegerValue(element, "MAX-BLOCK-SIZE")) \
3381
+ .setMulticastRef(self.getChildElementOptionalRefType(element, "MULTICAST-REF")) \
3382
+ .setPaddingActivation(self.getChildElementOptionalBooleanValue(element, "PADDING-ACTIVATION"))
3383
+ self.readTpConnectionReceiverRefs(element, connection)
3384
+ connection.setTaType(self.getChildElementOptionalLiteral(element, "TA-TYPE")) \
3385
+ .setTimeoutBr(self.getChildElementOptionalTimeValue(element, "TIMEOUT-BR")) \
3386
+ .setTimeoutBs(self.getChildElementOptionalTimeValue(element, "TIMEOUT-BS")) \
3387
+ .setTimeoutCr(self.getChildElementOptionalTimeValue(element, "TIMEOUT-CR")) \
3388
+ .setTimeoutCs(self.getChildElementOptionalTimeValue(element, "TIMEOUT-CS")) \
3389
+ .setTpSduRef(self.getChildElementOptionalRefType(element, "TP-SDU-REF")) \
3390
+ .setTransmitterRef(self.getChildElementOptionalRefType(element, "TRANSMITTER-REF"))
3391
+
3392
+ def readCanTpConfigTpConnections(self, element: ET.Element, config: CanTpConfig):
3393
+ for child_element in self.findall(element, "TP-CONNECTIONS/*"):
3394
+ tag_name = self.getTagName(child_element)
3395
+ if tag_name == "CAN-TP-CONNECTION":
3396
+ connection = CanTpConnection()
3397
+ self.readCanTpConnection(child_element, connection)
3398
+ config.addTpConnection(connection)
3399
+ else:
3400
+ self.notImplemented("Unsupported TpConnection <%s>" % tag_name)
3401
+
3402
+ def readCanTpEcu(self, element: ET.Element, tp_ecu: CanTpEcu):
3403
+ tp_ecu.setCycleTimeMainFunction(self.getChildElementOptionalTimeValue(element, "CYCLE-TIME-MAIN-FUNCTION")) \
3404
+ .setEcuInstanceRef(self.getChildElementOptionalRefType(element, "ECU-INSTANCE-REF"))
3405
+
3406
+ def readCanTpConfigTpEcus(self, element: ET.Element, config: CanTpConfig):
3407
+ for child_element in self.findall(element, "TP-ECUS/*"):
3408
+ tag_name = self.getTagName(child_element)
3409
+ if tag_name == "CAN-TP-ECU":
3410
+ tp_ecu = CanTpEcu()
3411
+ self.readCanTpEcu(child_element, tp_ecu)
3412
+ config.addTpEcu(tp_ecu)
3413
+ else:
3414
+ self.notImplemented("Unsupported TpEcu <%s>" % tag_name)
3415
+
3416
+ def readCanTpNode(self, element: ET.Element, tp_node: CanTpNode):
3417
+ self.readIdentifiable(element, tp_node)
3418
+ tp_node.setConnectorRef(self.getChildElementOptionalRefType(element, "CONNECTOR-REF")) \
3419
+ .setMaxFcWait(self.getChildElementOptionalIntegerValue(element, "MAX-FC-WAIT")) \
3420
+ .setStMin(self.getChildElementOptionalTimeValue(element, "ST-MIN")) \
3421
+ .setTimeoutAr(self.getChildElementOptionalTimeValue(element, "TIMEOUT-AR")) \
3422
+ .setTimeoutAs(self.getChildElementOptionalTimeValue(element, "TIMEOUT-AS")) \
3423
+ .setTpAddressRef(self.getChildElementOptionalRefType(element, "TP-ADDRESS-REF"))
3424
+
3425
+ def readCanTpConfigTpNodes(self, element: ET.Element, config: CanTpConfig):
3426
+ for child_element in self.findall(element, "TP-NODES/*"):
3427
+ tag_name = self.getTagName(child_element)
3428
+ if tag_name == "CAN-TP-NODE":
3429
+ tp_node = config.createCanTpNode(self.getShortName(child_element))
3430
+ self.readCanTpNode(child_element, tp_node)
3431
+ else:
3432
+ self.notImplemented("Unsupported TpNode <%s>" % tag_name)
3047
3433
 
3048
3434
  def readCanTpConfig(self, element: ET.Element, config: CanTpConfig):
3049
3435
  self.logger.debug("Read CanTpConfig <%s>" % config.getShortName())
3050
- self.readIdentifiable(element, config)
3436
+ self.readTpConfig(element, config)
3437
+ self.readCanTpConfigTpAddresses(element, config)
3438
+ self.readCanTpConfigTpChannels(element, config)
3439
+ self.readCanTpConfigTpConnections(element, config)
3440
+ self.readCanTpConfigTpEcus(element, config)
3441
+ self.readCanTpConfigTpNodes(element, config)
3442
+
3443
+ def readTpAddress(self, element: ET.Element, address: TpAddress):
3444
+ self.readIdentifiable(element, address)
3445
+ address.setTpAddress(self.getChildElementOptionalIntegerValue(element, "TP-ADDRESS"))
3446
+
3447
+ def readLinTpConfigTpAddresses(self, element: ET.Element, config: LinTpConfig):
3448
+ for child_element in self.findall(element, "TP-ADDRESSS/*"):
3449
+ tag_name = self.getTagName(child_element)
3450
+ if tag_name == "TP-ADDRESS":
3451
+ address = config.createTpAddress(self.getShortName(child_element))
3452
+ self.readTpAddress(child_element, address)
3453
+ else:
3454
+ self.notImplemented("Unsupported TpAddress <%s>" % tag_name)
3455
+
3456
+ def readLinTpConnection(self, element: ET.Element, connection: LinTpConnection):
3457
+ self.readTpConnection(element, connection)
3458
+ connection.setDataPduRef(self.getChildElementOptionalRefType(element, "DATA-PDU-REF")) \
3459
+ .setFlowControlRef(self.getChildElementOptionalRefType(element, "FLOW-CONTROL-REF")) \
3460
+ .setLinTpNSduRef(self.getChildElementOptionalRefType(element, "LIN-TP-N-SDU-REF"))
3461
+ self.readTpConnectionReceiverRefs(element, connection)
3462
+ connection.setTimeoutAs(self.getChildElementOptionalTimeValue(element, "TIMEOUT-AS")) \
3463
+ .setTimeoutCr(self.getChildElementOptionalTimeValue(element, "TIMEOUT-CR")) \
3464
+ .setTimeoutCs(self.getChildElementOptionalTimeValue(element, "TIMEOUT-CS")) \
3465
+ .setTransmitterRef(self.getChildElementOptionalRefType(element, "TRANSMITTER-REF"))
3466
+
3467
+ def readLinTpConfigTpConnections(self, element: ET.Element, config: LinTpConfig):
3468
+ for child_element in self.findall(element, "TP-CONNECTIONS/*"):
3469
+ tag_name = self.getTagName(child_element)
3470
+ if tag_name == "LIN-TP-CONNECTION":
3471
+ connection = LinTpConnection()
3472
+ self.readLinTpConnection(child_element, connection)
3473
+ config.addTpConnection(connection)
3474
+ else:
3475
+ self.notImplemented("Unsupported TpConnection <%s>" % tag_name)
3476
+
3477
+ def readLinTpNode(self, element: ET.Element, tp_node: LinTpNode):
3478
+ self.readIdentifiable(element, tp_node)
3479
+ tp_node.setConnectorRef(self.getChildElementOptionalRefType(element, "CONNECTOR-REF")) \
3480
+ .setDropNotRequestedNad(self.getChildElementOptionalBooleanValue(element, "DROP-NOT-REQUESTED-NAD")) \
3481
+ .setP2Max(self.getChildElementOptionalTimeValue(element, "P-2-MAX")) \
3482
+ .setP2Timing(self.getChildElementOptionalTimeValue(element, "P-2-TIMING")) \
3483
+ .setTpAddressRef(self.getChildElementOptionalRefType(element, "TP-ADDRESS-REF"))
3484
+
3485
+ def readLinTpConfigTpNodes(self, element: ET.Element, config: LinTpConfig):
3486
+ for child_element in self.findall(element, "TP-NODES/*"):
3487
+ tag_name = self.getTagName(child_element)
3488
+ if tag_name == "LIN-TP-NODE":
3489
+ tp_node = config.createLinTpNode(self.getShortName(child_element))
3490
+ self.readLinTpNode(child_element, tp_node)
3491
+ else:
3492
+ self.notImplemented("Unsupported TpNode <%s>" % tag_name)
3051
3493
 
3052
3494
  def readLinTpConfig(self, element: ET.Element, config: LinTpConfig):
3053
3495
  self.logger.debug("Read LinTpConfig <%s>" % config.getShortName())
3054
- self.readIdentifiable(element, config)
3496
+ self.readTpConfig(element, config)
3497
+ self.readLinTpConfigTpAddresses(element, config)
3498
+ self.readLinTpConfigTpConnections(element, config)
3499
+ self.readLinTpConfigTpNodes(element, config)
3055
3500
 
3056
3501
  def readCanFrame(self, element: ET.Element, frame: CanFrame):
3057
3502
  self.logger.debug("Read CanFrame <%s>" % frame.getShortName())
@@ -3272,9 +3717,14 @@ class ARXMLParser(AbstractARXMLParser):
3272
3717
  def readCanCommunicationConnector(self, element: ET.Element, connector: CanCommunicationConnector):
3273
3718
  self.readCommunicationConnector(element, connector)
3274
3719
 
3720
+ def readEthernetCommunicationConnectorNetworkEndpointRefs(self, element: ET.Element, connector: EthernetCommunicationConnector):
3721
+ for ref in self.getChildElementRefTypeList(element, "NETWORK-ENDPOINT-REFS/NETWORK-ENDPOINT-REF"):
3722
+ connector.addNetworkEndpointRef(ref)
3723
+
3275
3724
  def readEthernetCommunicationConnector(self, element: ET.Element, connector: EthernetCommunicationConnector):
3276
3725
  self.readCommunicationConnector(element, connector)
3277
3726
  connector.setMaximumTransmissionUnit(self.getChildElementOptionalPositiveInteger(element, "MAXIMUM-TRANSMISSION-UNIT"))
3727
+ self.readEthernetCommunicationConnectorNetworkEndpointRefs(element, connector)
3278
3728
 
3279
3729
  def readLinCommunicationConnector(self, element: ET.Element, connector: LinCommunicationConnector):
3280
3730
  self.readCommunicationConnector(element, connector)
@@ -3309,7 +3759,8 @@ class ARXMLParser(AbstractARXMLParser):
3309
3759
  .setComEnableMDTForCyclicTransmission(self.getChildElementOptionalBooleanValue(element, "COM-ENABLE-MDT-FOR-CYCLIC-TRANSMISSION"))
3310
3760
  self.readEcuInstanceCommControllers(element, instance)
3311
3761
  self.readEcuInstanceConnectors(element, instance)
3312
- instance.setSleepModeSupported(self.getChildElementOptionalBooleanValue(element, "SLEEP-MODE-SUPPORTED")) \
3762
+ instance.setDiagnosticAddress(self.getChildElementOptionalIntegerValue(element, "DIAGNOSTIC-ADDRESS")) \
3763
+ .setSleepModeSupported(self.getChildElementOptionalBooleanValue(element, "SLEEP-MODE-SUPPORTED")) \
3313
3764
  .setWakeUpOverBusSupported(self.getChildElementOptionalBooleanValue(element, "WAKE-UP-OVER-BUS-SUPPORTED"))
3314
3765
 
3315
3766
  '''
@@ -3492,9 +3943,12 @@ class ARXMLParser(AbstractARXMLParser):
3492
3943
  def readPhysicalDimension(self, element: ET.Element, dimension: PhysicalDimension):
3493
3944
  self.logger.debug("Read PhysicalDimension <%s>" % dimension.getShortName())
3494
3945
  self.readIdentifiable(element, dimension)
3495
- dimension.setCurrentExp(self.getChildElementOptionalNumericalValue(element, "CURRENT-EXP")) \
3496
- .setLengthExp(self.getChildElementOptionalNumericalValue(element, "LENGTH-EXP")) \
3497
- .setTimeExp(self.getChildElementOptionalNumericalValue(element, "TIME-EXP"))
3946
+ dimension.setLengthExp(self.getChildElementOptionalNumericalValue(element, "LENGTH-EXP")) \
3947
+ .setLuminousIntensityExp(self.getChildElementOptionalNumericalValue(element, "LUMINOUS-INTENSITY-EXP")) \
3948
+ .setMassExp(self.getChildElementOptionalNumericalValue(element, "MASS-EXP")) \
3949
+ .setTemperatureExp(self.getChildElementOptionalNumericalValue(element, "TEMPERATURE-EXP")) \
3950
+ .setTimeExp(self.getChildElementOptionalNumericalValue(element, "TIME-EXP")) \
3951
+ .setCurrentExp(self.getChildElementOptionalNumericalValue(element, "CURRENT-EXP")) \
3498
3952
 
3499
3953
  '''
3500
3954
  def getIPduMappings(self, element: ET.Element) -> List[IPduMapping]:
@@ -3543,7 +3997,10 @@ class ARXMLParser(AbstractARXMLParser):
3543
3997
  child_element = self.find(element, key)
3544
3998
  if child_element is not None:
3545
3999
  filter = DataFilter()
3546
- filter.setDataFilterType(self.getChildElementOptionalLiteral(child_element, "DATA-FILTER-TYPE"))
4000
+ filter.setDataFilterType(self.getChildElementOptionalLiteral(child_element, "DATA-FILTER-TYPE")) \
4001
+ .setMask(self.getChildElementOptionalIntegerValue(child_element, "MASK")) \
4002
+ .setX(self.getChildElementOptionalIntegerValue(child_element, "X"))
4003
+
3547
4004
  return filter
3548
4005
 
3549
4006
  def getTransmissionModeConditions(self, element: ET.Element, key: str) -> List[TransmissionModeCondition]:
@@ -3599,7 +4056,8 @@ class ARXMLParser(AbstractARXMLParser):
3599
4056
  decl = TransmissionModeDeclaration()
3600
4057
  for condition in self.getTransmissionModeConditions(child_element, "TRANSMISSION-MODE-CONDITIONS/TRANSMISSION-MODE-CONDITION"):
3601
4058
  decl.addTransmissionModeCondition(condition)
3602
- decl.setTransmissionModeTrueTiming(self.getTransmissionModeTiming(child_element, "TRANSMISSION-MODE-TRUE-TIMING"))
4059
+ decl.setTransmissionModeFalseTiming(self.getTransmissionModeTiming(child_element, "TRANSMISSION-MODE-FALSE-TIMING")) \
4060
+ .setTransmissionModeTrueTiming(self.getTransmissionModeTiming(child_element, "TRANSMISSION-MODE-TRUE-TIMING"))
3603
4061
  return decl
3604
4062
 
3605
4063
  def getISignalIPduIPduTimingSpecification(self, element: ET.Element) -> IPduTiming:
@@ -3611,13 +4069,13 @@ class ARXMLParser(AbstractARXMLParser):
3611
4069
  .setTransmissionModeDeclaration(self.getTransmissionModeDeclaration(child_element, "TRANSMISSION-MODE-DECLARATION"))
3612
4070
  return timing
3613
4071
 
3614
- def readISignalIPdu(self, element: ET.Element, i_pdu: ISignalIPdu):
3615
- self.logger.debug("Read ISignalIPdu <%s>" % i_pdu.getShortName())
3616
- self.readIdentifiable(element, i_pdu)
3617
- i_pdu.setLength(self.getChildElementOptionalNumericalValue(element, "LENGTH")) \
4072
+ def readISignalIPdu(self, element: ET.Element, ipdu: ISignalIPdu):
4073
+ self.logger.debug("Read ISignalIPdu <%s>" % ipdu.getShortName())
4074
+ self.readIdentifiable(element, ipdu)
4075
+ ipdu.setLength(self.getChildElementOptionalNumericalValue(element, "LENGTH")) \
3618
4076
  .setIPduTimingSpecification(self.getISignalIPduIPduTimingSpecification(element))
3619
- self.readISignalToPduMappings(element, i_pdu)
3620
- i_pdu.setUnusedBitPattern(self.getChildElementOptionalLiteral(element, "UNUSED-BIT-PATTERN"))
4077
+ self.readISignalToPduMappings(element, ipdu)
4078
+ ipdu.setUnusedBitPattern(self.getChildElementOptionalIntegerValue(element, "UNUSED-BIT-PATTERN"))
3621
4079
 
3622
4080
  def getISignalIPduRefs(self, element: ET.Element) -> List[RefType]:
3623
4081
  ref_types = []
@@ -3669,23 +4127,54 @@ class ARXMLParser(AbstractARXMLParser):
3669
4127
  for child_element in self.findall(element, "SW-MAPPINGS/*"):
3670
4128
  tag_name = self.getTagName(child_element)
3671
4129
  if tag_name == "SWC-TO-ECU-MAPPING":
3672
- self.readSwcToEcuMapping(child_element, mapping.createSwcToEcuMapping(self.getShortName(child_element)))
4130
+ swc_to_ecu_mapping = mapping.createSwcToEcuMapping(self.getShortName(child_element))
4131
+ self.readSwcToEcuMapping(child_element, swc_to_ecu_mapping)
3673
4132
  else:
3674
4133
  self.notImplemented("Unsupported Sw Mapping %s" % tag_name)
3675
4134
 
3676
- def readSystemMapping(self, element: ET.Element, parent: System):
3677
- short_name = self.getShortName(element)
3678
- self.logger.debug("SystemMapping %s" % short_name)
3679
- mapping = parent.createSystemMapping(short_name)
4135
+ def readEcuMapping(self, element: ET.Element, mapping: ECUMapping):
4136
+ self.readIdentifiable(element, mapping)
4137
+ mapping.setEcuInstanceRef(self.getChildElementOptionalRefType(element, "ECU-INSTANCE-REF")) \
4138
+ .setEcuRef(self.getChildElementOptionalRefType(element, "ECU-REF"))
4139
+
4140
+ def readSystemMappingEcuResourceMappings(self, element: ET.Element, mapping: SystemMapping):
4141
+ for child_element in self.findall(element, "ECU-RESOURCE-MAPPINGS/*"):
4142
+ tag_name = self.getTagName(child_element)
4143
+ if tag_name == "ECU-MAPPING":
4144
+ ecu_mapping = mapping.createECUMapping(self.getShortName(child_element))
4145
+ self.readEcuMapping(child_element, ecu_mapping)
4146
+ else:
4147
+ self.notImplemented("Unsupported EcuResourceMapping <%s>" % tag_name)
4148
+
4149
+ def readSwcToImplMapping(self, element: ET.Element, mapping: SwcToImplMapping):
4150
+ self.readIdentifiable(element, mapping)
4151
+ mapping.setComponentImplementationRef(self.getChildElementOptionalRefType(element, "COMPONENT-IMPLEMENTATION-REF"))
4152
+ for child_element in self.findall(element, "COMPONENT-IREFS/COMPONENT-IREF"):
4153
+ mapping.addComponentIRef(self.getComponentInSystemInstanceRef(child_element))
4154
+
4155
+ def readSystemMappingSwImplMappings(self, element: ET.Element, mapping: SystemMapping):
4156
+ for child_element in self.findall(element, "SW-IMPL-MAPPINGS/*"):
4157
+ tag_name = self.getTagName(child_element)
4158
+ if tag_name == "SWC-TO-IMPL-MAPPING":
4159
+ sw_impl_mapping = mapping.createSwcToImplMapping(self.getShortName(child_element))
4160
+ self.readSwcToImplMapping(child_element, sw_impl_mapping)
4161
+ else:
4162
+ self.notImplemented("Unsupported SwImplMapping <%s>" % tag_name)
4163
+
4164
+ def readSystemMapping(self, element: ET.Element, mapping: SystemMapping):
4165
+ self.logger.debug("SystemMapping %s" % mapping.getShortName())
3680
4166
  self.readIdentifiable(element, mapping)
3681
4167
  self.readSystemMappingDataMappings(element, mapping)
4168
+ self.readSystemMappingEcuResourceMappings(element, mapping)
4169
+ self.readSystemMappingSwImplMappings(element, mapping)
3682
4170
  self.readSystemMappingSwMappings(element, mapping)
3683
4171
 
3684
4172
  def readSystemMappings(self, element: ET.Element, system: System):
3685
4173
  for child_element in self.findall(element, "MAPPINGS/*"):
3686
4174
  tag_name = self.getTagName(child_element)
3687
4175
  if tag_name == "SYSTEM-MAPPING":
3688
- self.readSystemMapping(child_element, system)
4176
+ mapping = system.createSystemMapping(self.getShortName(child_element))
4177
+ self.readSystemMapping(child_element, mapping)
3689
4178
  else:
3690
4179
  self.notImplemented("Unsupported Mapping %s" % tag_name)
3691
4180
 
@@ -3698,6 +4187,7 @@ class ARXMLParser(AbstractARXMLParser):
3698
4187
  self.readIdentifiable(child_element, prototype)
3699
4188
  prototype.setFlatMapRef(self.getChildElementOptionalRefType(child_element, "FLAT-MAP-REF")) \
3700
4189
  .setSoftwareCompositionTRef(self.getChildElementOptionalRefType(child_element, "SOFTWARE-COMPOSITION-TREF"))
4190
+ AUTOSAR.getInstance().setRootSwCompositionPrototype(prototype)
3701
4191
 
3702
4192
  def readSystemFibexElementRefs(self, element: ET.Element, system: System):
3703
4193
  for ref in self.getChildElementRefTypeList(element, "FIBEX-ELEMENTS/FIBEX-ELEMENT-REF-CONDITIONAL/FIBEX-ELEMENT-REF"):
@@ -3711,6 +4201,7 @@ class ARXMLParser(AbstractARXMLParser):
3711
4201
  self.readSystemMappings(element, system)
3712
4202
  self.readRootSwCompositionPrototype(element, system)
3713
4203
  system.setSystemVersion(self.getChildElementOptionalRevisionLabelString(element, "SYSTEM-VERSION"))
4204
+ AUTOSAR.getInstance().addSystem(system)
3714
4205
 
3715
4206
  def readGenericEthernetFrame(self, element: ET.Element, frame: GenericEthernetFrame):
3716
4207
  self.logger.debug("Read GenericEthernetFrame <%s>" % frame.getShortName())
@@ -4006,7 +4497,7 @@ class ARXMLParser(AbstractARXMLParser):
4006
4497
  self.readReferenceBases(child_element, ar_package)
4007
4498
 
4008
4499
  def load(self, filename, document: AUTOSAR):
4009
- self.logger.info("Load %s ..." % os.path.realpath(filename))
4500
+ self.logger.info("Loading %s ..." % os.path.realpath(filename))
4010
4501
 
4011
4502
  tree = ET.parse(filename)
4012
4503
  root = tree.getroot()