odxtools 9.7.0__py3-none-any.whl → 10.1.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.
- odxtools/additionalaudience.py +7 -7
- odxtools/admindata.py +14 -13
- odxtools/audience.py +17 -17
- odxtools/basecomparam.py +9 -8
- odxtools/basevariantpattern.py +9 -10
- odxtools/basicstructure.py +15 -15
- odxtools/cli/_print_utils.py +34 -22
- odxtools/cli/browse.py +8 -8
- odxtools/cli/compare.py +24 -24
- odxtools/cli/decode.py +3 -4
- odxtools/cli/find.py +4 -5
- odxtools/cli/list.py +6 -6
- odxtools/cli/main.py +2 -2
- odxtools/cli/snoop.py +3 -3
- odxtools/codec.py +3 -3
- odxtools/commrelation.py +18 -17
- odxtools/companydata.py +13 -13
- odxtools/companydocinfo.py +15 -17
- odxtools/companyrevisioninfo.py +9 -9
- odxtools/companyspecificinfo.py +11 -13
- odxtools/comparam.py +8 -7
- odxtools/comparaminstance.py +14 -14
- odxtools/comparamspec.py +10 -11
- odxtools/comparamsubset.py +17 -25
- odxtools/complexcomparam.py +14 -14
- odxtools/complexdop.py +1 -1
- odxtools/compositecodec.py +8 -8
- odxtools/compumethods/compucodecompumethod.py +7 -7
- odxtools/compumethods/compuconst.py +5 -6
- odxtools/compumethods/compudefaultvalue.py +2 -3
- odxtools/compumethods/compuinternaltophys.py +13 -12
- odxtools/compumethods/compumethod.py +10 -9
- odxtools/compumethods/compuphystointernal.py +13 -12
- odxtools/compumethods/compurationalcoeffs.py +7 -7
- odxtools/compumethods/compuscale.py +15 -16
- odxtools/compumethods/createanycompumethod.py +12 -13
- odxtools/compumethods/identicalcompumethod.py +4 -5
- odxtools/compumethods/limit.py +14 -14
- odxtools/compumethods/linearcompumethod.py +5 -5
- odxtools/compumethods/linearsegment.py +10 -11
- odxtools/compumethods/ratfunccompumethod.py +6 -6
- odxtools/compumethods/ratfuncsegment.py +7 -8
- odxtools/compumethods/scalelinearcompumethod.py +9 -9
- odxtools/compumethods/scaleratfunccompumethod.py +7 -7
- odxtools/compumethods/tabintpcompumethod.py +10 -13
- odxtools/compumethods/texttablecompumethod.py +6 -6
- odxtools/createanycomparam.py +5 -7
- odxtools/createanydiagcodedtype.py +7 -8
- odxtools/database.py +34 -31
- odxtools/dataobjectproperty.py +19 -20
- odxtools/decodestate.py +5 -5
- odxtools/description.py +9 -9
- odxtools/determinenumberofitems.py +8 -7
- odxtools/diagcodedtype.py +10 -10
- odxtools/diagcomm.py +29 -30
- odxtools/diagdatadictionaryspec.py +36 -36
- odxtools/diaglayercontainer.py +35 -34
- odxtools/diaglayers/basevariant.py +14 -12
- odxtools/diaglayers/basevariantraw.py +22 -23
- odxtools/diaglayers/diaglayer.py +24 -22
- odxtools/diaglayers/diaglayerraw.py +43 -52
- odxtools/diaglayers/diaglayertype.py +1 -2
- odxtools/diaglayers/ecushareddata.py +9 -9
- odxtools/diaglayers/ecushareddataraw.py +15 -16
- odxtools/diaglayers/ecuvariant.py +15 -13
- odxtools/diaglayers/ecuvariantraw.py +21 -22
- odxtools/diaglayers/functionalgroup.py +12 -11
- odxtools/diaglayers/functionalgroupraw.py +17 -18
- odxtools/diaglayers/hierarchyelement.py +48 -54
- odxtools/diaglayers/hierarchyelementraw.py +10 -11
- odxtools/diaglayers/protocol.py +7 -7
- odxtools/diaglayers/protocolraw.py +13 -14
- odxtools/diagnostictroublecode.py +15 -17
- odxtools/diagservice.py +28 -27
- odxtools/diagvariable.py +24 -25
- odxtools/docrevision.py +18 -17
- odxtools/dopbase.py +13 -14
- odxtools/dtcconnector.py +8 -7
- odxtools/dtcdop.py +24 -20
- odxtools/dynamicendmarkerfield.py +10 -9
- odxtools/dynamiclengthfield.py +10 -9
- odxtools/dyndefinedspec.py +10 -10
- odxtools/dynenddopref.py +9 -9
- odxtools/dyniddefmodeinfo.py +21 -21
- odxtools/ecuvariantpattern.py +8 -10
- odxtools/element.py +12 -13
- odxtools/encodestate.py +11 -11
- odxtools/encoding.py +2 -3
- odxtools/endofpdufield.py +9 -10
- odxtools/envdataconnector.py +8 -8
- odxtools/environmentdata.py +7 -9
- odxtools/environmentdatadescription.py +18 -17
- odxtools/exceptions.py +5 -5
- odxtools/externalaccessmethod.py +4 -6
- odxtools/externaldoc.py +6 -6
- odxtools/field.py +15 -15
- odxtools/functionalclass.py +9 -9
- odxtools/inputparam.py +11 -10
- odxtools/internalconstr.py +10 -11
- odxtools/isotp_state_machine.py +12 -11
- odxtools/leadinglengthinfotype.py +4 -6
- odxtools/library.py +9 -8
- odxtools/linkeddtcdop.py +9 -8
- odxtools/loadfile.py +5 -6
- odxtools/matchingbasevariantparameter.py +5 -6
- odxtools/matchingparameter.py +10 -10
- odxtools/message.py +1 -1
- odxtools/minmaxlengthtype.py +6 -7
- odxtools/modification.py +7 -6
- odxtools/multiplexer.py +54 -18
- odxtools/multiplexercase.py +13 -13
- odxtools/multiplexerdefaultcase.py +11 -10
- odxtools/multiplexerswitchkey.py +8 -8
- odxtools/nameditemlist.py +13 -13
- odxtools/negoutputparam.py +8 -8
- odxtools/obd.py +1 -2
- odxtools/odxcategory.py +14 -26
- odxtools/odxdoccontext.py +16 -0
- odxtools/odxlink.py +23 -25
- odxtools/odxtypes.py +18 -15
- odxtools/outputparam.py +9 -8
- odxtools/parameterinfo.py +1 -1
- odxtools/parameters/codedconstparameter.py +10 -10
- odxtools/parameters/createanyparameter.py +15 -16
- odxtools/parameters/dynamicparameter.py +5 -7
- odxtools/parameters/lengthkeyparameter.py +10 -10
- odxtools/parameters/matchingrequestparameter.py +6 -7
- odxtools/parameters/nrcconstparameter.py +13 -13
- odxtools/parameters/parameter.py +17 -18
- odxtools/parameters/parameterwithdop.py +13 -13
- odxtools/parameters/physicalconstantparameter.py +8 -7
- odxtools/parameters/reservedparameter.py +6 -8
- odxtools/parameters/systemparameter.py +5 -7
- odxtools/parameters/tableentryparameter.py +8 -8
- odxtools/parameters/tablekeyparameter.py +17 -17
- odxtools/parameters/tablestructparameter.py +11 -11
- odxtools/parameters/valueparameter.py +11 -11
- odxtools/paramlengthinfotype.py +10 -9
- odxtools/parentref.py +15 -13
- odxtools/physicaldimension.py +15 -15
- odxtools/physicaltype.py +5 -6
- odxtools/posresponsesuppressible.py +11 -12
- odxtools/preconditionstateref.py +11 -11
- odxtools/progcode.py +11 -10
- odxtools/protstack.py +10 -9
- odxtools/relateddiagcommref.py +5 -6
- odxtools/relateddoc.py +11 -10
- odxtools/request.py +18 -19
- odxtools/response.py +19 -20
- odxtools/scaleconstr.py +8 -9
- odxtools/servicebinner.py +5 -5
- odxtools/singleecujob.py +16 -15
- odxtools/snrefcontext.py +3 -3
- odxtools/specialdata.py +8 -7
- odxtools/specialdatagroup.py +17 -17
- odxtools/specialdatagroupcaption.py +7 -6
- odxtools/standardlengthtype.py +14 -22
- odxtools/state.py +7 -6
- odxtools/statechart.py +12 -11
- odxtools/statemachine.py +4 -3
- odxtools/statetransition.py +9 -9
- odxtools/statetransitionref.py +19 -19
- odxtools/staticfield.py +9 -7
- odxtools/structure.py +5 -6
- odxtools/subcomponent.py +20 -18
- odxtools/subcomponentparamconnector.py +10 -9
- odxtools/subcomponentpattern.py +9 -9
- odxtools/swvariable.py +6 -7
- odxtools/table.py +25 -26
- odxtools/tablediagcommconnector.py +9 -8
- odxtools/tablerow.py +64 -43
- odxtools/tablerowconnector.py +8 -8
- odxtools/teammember.py +16 -15
- odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
- odxtools/text.py +4 -5
- odxtools/uds.py +2 -3
- odxtools/unit.py +14 -13
- odxtools/unitgroup.py +11 -10
- odxtools/unitspec.py +18 -19
- odxtools/utils.py +3 -3
- odxtools/variablegroup.py +5 -6
- odxtools/variantmatcher.py +10 -10
- odxtools/variantpattern.py +5 -6
- odxtools/version.py +2 -2
- odxtools/writepdxfile.py +5 -24
- odxtools/xdoc.py +13 -12
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +4 -5
- odxtools-10.1.0.dist-info/RECORD +265 -0
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
- odxtools-9.7.0.dist-info/RECORD +0 -264
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from
|
3
|
-
from
|
4
|
-
from typing import Any, Dict, List, Optional, Union, cast
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import Any, cast
|
5
4
|
from xml.etree import ElementTree
|
6
5
|
|
7
6
|
from ..additionalaudience import AdditionalAudience
|
@@ -11,11 +10,12 @@ from ..diagcomm import DiagComm
|
|
11
10
|
from ..diagdatadictionaryspec import DiagDataDictionarySpec
|
12
11
|
from ..diagservice import DiagService
|
13
12
|
from ..element import IdentifiableElement
|
14
|
-
from ..exceptions import odxassert, odxraise
|
13
|
+
from ..exceptions import odxassert, odxraise
|
15
14
|
from ..functionalclass import FunctionalClass
|
16
15
|
from ..library import Library
|
17
16
|
from ..nameditemlist import NamedItemList
|
18
|
-
from ..
|
17
|
+
from ..odxdoccontext import OdxDocContext
|
18
|
+
from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
19
19
|
from ..request import Request
|
20
20
|
from ..response import Response
|
21
21
|
from ..singleecujob import SingleEcuJob
|
@@ -27,7 +27,7 @@ from ..utils import dataclass_fields_asdict
|
|
27
27
|
from .diaglayertype import DiagLayerType
|
28
28
|
|
29
29
|
|
30
|
-
@dataclass
|
30
|
+
@dataclass(kw_only=True)
|
31
31
|
class DiagLayerRaw(IdentifiableElement):
|
32
32
|
"""This class internalizes all data represented by the DIAG-LAYER
|
33
33
|
XML tag and its derivatives.
|
@@ -36,21 +36,21 @@ class DiagLayerRaw(IdentifiableElement):
|
|
36
36
|
"""
|
37
37
|
|
38
38
|
variant_type: DiagLayerType
|
39
|
-
admin_data:
|
40
|
-
company_datas: NamedItemList[CompanyData]
|
41
|
-
functional_classes: NamedItemList[FunctionalClass]
|
42
|
-
diag_data_dictionary_spec:
|
43
|
-
diag_comms_raw:
|
44
|
-
requests: NamedItemList[Request]
|
45
|
-
positive_responses: NamedItemList[Response]
|
46
|
-
negative_responses: NamedItemList[Response]
|
47
|
-
global_negative_responses: NamedItemList[Response]
|
48
|
-
import_refs:
|
49
|
-
state_charts: NamedItemList[StateChart]
|
50
|
-
additional_audiences: NamedItemList[AdditionalAudience]
|
51
|
-
sub_components: NamedItemList[SubComponent]
|
52
|
-
libraries: NamedItemList[Library]
|
53
|
-
sdgs:
|
39
|
+
admin_data: AdminData | None = None
|
40
|
+
company_datas: NamedItemList[CompanyData] = field(default_factory=NamedItemList)
|
41
|
+
functional_classes: NamedItemList[FunctionalClass] = field(default_factory=NamedItemList)
|
42
|
+
diag_data_dictionary_spec: DiagDataDictionarySpec | None = None
|
43
|
+
diag_comms_raw: list[OdxLinkRef | DiagComm] = field(default_factory=list)
|
44
|
+
requests: NamedItemList[Request] = field(default_factory=NamedItemList)
|
45
|
+
positive_responses: NamedItemList[Response] = field(default_factory=NamedItemList)
|
46
|
+
negative_responses: NamedItemList[Response] = field(default_factory=NamedItemList)
|
47
|
+
global_negative_responses: NamedItemList[Response] = field(default_factory=NamedItemList)
|
48
|
+
import_refs: list[OdxLinkRef] = field(default_factory=list)
|
49
|
+
state_charts: NamedItemList[StateChart] = field(default_factory=NamedItemList)
|
50
|
+
additional_audiences: NamedItemList[AdditionalAudience] = field(default_factory=NamedItemList)
|
51
|
+
sub_components: NamedItemList[SubComponent] = field(default_factory=NamedItemList)
|
52
|
+
libraries: NamedItemList[Library] = field(default_factory=NamedItemList)
|
53
|
+
sdgs: list[SpecialDataGroup] = field(default_factory=list)
|
54
54
|
|
55
55
|
@property
|
56
56
|
def diag_comms(self) -> NamedItemList[DiagComm]:
|
@@ -70,98 +70,89 @@ class DiagLayerRaw(IdentifiableElement):
|
|
70
70
|
return self._single_ecu_jobs
|
71
71
|
|
72
72
|
@staticmethod
|
73
|
-
def from_et(et_element: ElementTree.Element,
|
73
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "DiagLayerRaw":
|
74
74
|
try:
|
75
75
|
variant_type = DiagLayerType(et_element.tag)
|
76
76
|
except ValueError:
|
77
77
|
variant_type = cast(DiagLayerType, None)
|
78
78
|
odxraise(f"Encountered unknown diagnostic layer type '{et_element.tag}'")
|
79
79
|
|
80
|
-
|
81
|
-
|
82
|
-
# extend the applicable ODX "document fragments" for the diag layer objects
|
83
|
-
doc_frags = copy(doc_frags)
|
84
|
-
doc_frags.append(OdxDocFragment(short_name, DocType.LAYER))
|
85
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
80
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
86
81
|
|
87
82
|
admin_data = None
|
88
83
|
if (admin_data_elem := et_element.find("ADMIN-DATA")) is not None:
|
89
|
-
admin_data = AdminData.from_et(admin_data_elem,
|
84
|
+
admin_data = AdminData.from_et(admin_data_elem, context)
|
90
85
|
|
91
86
|
company_datas = NamedItemList([
|
92
|
-
CompanyData.from_et(cd_el,
|
87
|
+
CompanyData.from_et(cd_el, context)
|
93
88
|
for cd_el in et_element.iterfind("COMPANY-DATAS/COMPANY-DATA")
|
94
89
|
])
|
95
90
|
|
96
91
|
functional_classes = NamedItemList([
|
97
|
-
FunctionalClass.from_et(fc_el,
|
92
|
+
FunctionalClass.from_et(fc_el, context)
|
98
93
|
for fc_el in et_element.iterfind("FUNCT-CLASSS/FUNCT-CLASS")
|
99
94
|
])
|
100
95
|
|
101
96
|
diag_data_dictionary_spec = None
|
102
97
|
if (ddds_elem := et_element.find("DIAG-DATA-DICTIONARY-SPEC")) is not None:
|
103
|
-
diag_data_dictionary_spec = DiagDataDictionarySpec.from_et(ddds_elem,
|
98
|
+
diag_data_dictionary_spec = DiagDataDictionarySpec.from_et(ddds_elem, context)
|
104
99
|
|
105
|
-
diag_comms_raw:
|
100
|
+
diag_comms_raw: list[OdxLinkRef | DiagComm] = []
|
106
101
|
if (dc_elems := et_element.find("DIAG-COMMS")) is not None:
|
107
102
|
for dc_proxy_elem in dc_elems:
|
108
|
-
dc:
|
103
|
+
dc: OdxLinkRef | DiagComm
|
109
104
|
if dc_proxy_elem.tag == "DIAG-COMM-REF":
|
110
|
-
dc = OdxLinkRef.from_et(dc_proxy_elem,
|
105
|
+
dc = OdxLinkRef.from_et(dc_proxy_elem, context)
|
111
106
|
elif dc_proxy_elem.tag == "DIAG-SERVICE":
|
112
|
-
dc = DiagService.from_et(dc_proxy_elem,
|
107
|
+
dc = DiagService.from_et(dc_proxy_elem, context)
|
113
108
|
else:
|
114
109
|
odxassert(dc_proxy_elem.tag == "SINGLE-ECU-JOB")
|
115
|
-
dc = SingleEcuJob.from_et(dc_proxy_elem,
|
110
|
+
dc = SingleEcuJob.from_et(dc_proxy_elem, context)
|
116
111
|
|
117
112
|
diag_comms_raw.append(dc)
|
118
113
|
|
119
114
|
requests = NamedItemList([
|
120
|
-
Request.from_et(rq_elem,
|
121
|
-
for rq_elem in et_element.iterfind("REQUESTS/REQUEST")
|
115
|
+
Request.from_et(rq_elem, context) for rq_elem in et_element.iterfind("REQUESTS/REQUEST")
|
122
116
|
])
|
123
117
|
|
124
118
|
positive_responses = NamedItemList([
|
125
|
-
Response.from_et(rs_elem,
|
119
|
+
Response.from_et(rs_elem, context)
|
126
120
|
for rs_elem in et_element.iterfind("POS-RESPONSES/POS-RESPONSE")
|
127
121
|
])
|
128
122
|
|
129
123
|
negative_responses = NamedItemList([
|
130
|
-
Response.from_et(rs_elem,
|
124
|
+
Response.from_et(rs_elem, context)
|
131
125
|
for rs_elem in et_element.iterfind("NEG-RESPONSES/NEG-RESPONSE")
|
132
126
|
])
|
133
127
|
|
134
128
|
global_negative_responses = NamedItemList([
|
135
|
-
Response.from_et(rs_elem,
|
129
|
+
Response.from_et(rs_elem, context)
|
136
130
|
for rs_elem in et_element.iterfind("GLOBAL-NEG-RESPONSES/GLOBAL-NEG-RESPONSE")
|
137
131
|
])
|
138
132
|
|
139
133
|
import_refs = [
|
140
|
-
OdxLinkRef.from_et(el,
|
141
|
-
for el in et_element.iterfind("IMPORT-REFS/IMPORT-REF")
|
134
|
+
OdxLinkRef.from_et(el, context) for el in et_element.iterfind("IMPORT-REFS/IMPORT-REF")
|
142
135
|
]
|
143
136
|
|
144
137
|
state_charts = NamedItemList([
|
145
|
-
StateChart.from_et(el,
|
138
|
+
StateChart.from_et(el, context)
|
146
139
|
for el in et_element.iterfind("STATE-CHARTS/STATE-CHART")
|
147
140
|
])
|
148
141
|
|
149
142
|
additional_audiences = NamedItemList([
|
150
|
-
AdditionalAudience.from_et(el,
|
143
|
+
AdditionalAudience.from_et(el, context)
|
151
144
|
for el in et_element.iterfind("ADDITIONAL-AUDIENCES/ADDITIONAL-AUDIENCE")
|
152
145
|
])
|
153
146
|
|
154
147
|
sub_components = NamedItemList([
|
155
|
-
SubComponent.from_et(el,
|
148
|
+
SubComponent.from_et(el, context)
|
156
149
|
for el in et_element.iterfind("SUB-COMPONENTS/SUB-COMPONENT")
|
157
150
|
])
|
158
151
|
|
159
152
|
libraries = NamedItemList(
|
160
|
-
[Library.from_et(el,
|
153
|
+
[Library.from_et(el, context) for el in et_element.iterfind("LIBRARYS/LIBRARY")])
|
161
154
|
|
162
|
-
sdgs = [
|
163
|
-
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
164
|
-
]
|
155
|
+
sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
|
165
156
|
|
166
157
|
# Create DiagLayer
|
167
158
|
return DiagLayerRaw(
|
@@ -183,7 +174,7 @@ class DiagLayerRaw(IdentifiableElement):
|
|
183
174
|
sdgs=sdgs,
|
184
175
|
**kwargs)
|
185
176
|
|
186
|
-
def _build_odxlinks(self) ->
|
177
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
187
178
|
"""Construct a mapping from IDs to all objects that are contained in this diagnostic layer."""
|
188
179
|
odxlinks = {self.odx_id: self}
|
189
180
|
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from enum import Enum
|
3
|
-
from typing import Dict
|
4
3
|
|
5
4
|
|
6
5
|
class DiagLayerType(Enum):
|
@@ -19,7 +18,7 @@ class DiagLayerType(Enum):
|
|
19
18
|
|
20
19
|
"""
|
21
20
|
|
22
|
-
PRIORITY_OF_DIAG_LAYER_TYPE:
|
21
|
+
PRIORITY_OF_DIAG_LAYER_TYPE: dict[DiagLayerType, int] = {
|
23
22
|
DiagLayerType.PROTOCOL:
|
24
23
|
1,
|
25
24
|
DiagLayerType.FUNCTIONAL_GROUP:
|
@@ -1,23 +1,24 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from copy import deepcopy
|
3
3
|
from dataclasses import dataclass
|
4
|
-
from typing import TYPE_CHECKING, Any,
|
4
|
+
from typing import TYPE_CHECKING, Any, cast
|
5
5
|
from xml.etree import ElementTree
|
6
6
|
|
7
7
|
from ..diagvariable import DiagVariable
|
8
8
|
from ..exceptions import odxassert
|
9
9
|
from ..nameditemlist import NamedItemList
|
10
|
-
from ..
|
10
|
+
from ..odxdoccontext import OdxDocContext
|
11
|
+
from ..odxlink import OdxLinkDatabase, OdxLinkRef
|
11
12
|
from ..snrefcontext import SnRefContext
|
12
13
|
from ..variablegroup import VariableGroup
|
13
14
|
from .diaglayer import DiagLayer
|
14
15
|
from .ecushareddataraw import EcuSharedDataRaw
|
15
16
|
|
16
17
|
if TYPE_CHECKING:
|
17
|
-
from
|
18
|
+
from ..database import Database
|
18
19
|
|
19
20
|
|
20
|
-
@dataclass
|
21
|
+
@dataclass(kw_only=True)
|
21
22
|
class EcuSharedData(DiagLayer):
|
22
23
|
"""This is a diagnostic layer for data shared across others
|
23
24
|
"""
|
@@ -27,7 +28,7 @@ class EcuSharedData(DiagLayer):
|
|
27
28
|
return cast(EcuSharedDataRaw, self.diag_layer_raw)
|
28
29
|
|
29
30
|
@property
|
30
|
-
def diag_variables_raw(self) ->
|
31
|
+
def diag_variables_raw(self) -> list[OdxLinkRef | DiagVariable]:
|
31
32
|
return self.ecu_shared_data_raw.diag_variables_raw
|
32
33
|
|
33
34
|
@property
|
@@ -39,9 +40,8 @@ class EcuSharedData(DiagLayer):
|
|
39
40
|
return self.ecu_shared_data_raw.variable_groups
|
40
41
|
|
41
42
|
@staticmethod
|
42
|
-
def from_et(et_element: ElementTree.Element,
|
43
|
-
|
44
|
-
ecu_shared_data_raw = EcuSharedDataRaw.from_et(et_element, doc_frags)
|
43
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuSharedData":
|
44
|
+
ecu_shared_data_raw = EcuSharedDataRaw.from_et(et_element, context)
|
45
45
|
|
46
46
|
return EcuSharedData(diag_layer_raw=ecu_shared_data_raw)
|
47
47
|
|
@@ -78,7 +78,7 @@ class EcuSharedData(DiagLayer):
|
|
78
78
|
self._resolve_snrefs(context)
|
79
79
|
context.diag_layer = None
|
80
80
|
|
81
|
-
def __deepcopy__(self, memo:
|
81
|
+
def __deepcopy__(self, memo: dict[int, Any]) -> Any:
|
82
82
|
"""Create a deep copy of the protocol layer
|
83
83
|
|
84
84
|
Note that the copied diagnostic layer is not fully
|
@@ -1,56 +1,55 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from ..diagvariable import DiagVariable
|
7
7
|
from ..exceptions import odxraise
|
8
8
|
from ..nameditemlist import NamedItemList
|
9
|
-
from ..
|
9
|
+
from ..odxdoccontext import OdxDocContext
|
10
|
+
from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
10
11
|
from ..snrefcontext import SnRefContext
|
11
12
|
from ..utils import dataclass_fields_asdict
|
12
13
|
from ..variablegroup import VariableGroup
|
13
14
|
from .diaglayerraw import DiagLayerRaw
|
14
15
|
|
15
16
|
|
16
|
-
@dataclass
|
17
|
+
@dataclass(kw_only=True)
|
17
18
|
class EcuSharedDataRaw(DiagLayerRaw):
|
18
19
|
"""This is a diagnostic layer for data shared accross others
|
19
20
|
"""
|
20
21
|
|
21
|
-
diag_variables_raw:
|
22
|
-
variable_groups: NamedItemList[VariableGroup]
|
22
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef] = field(default_factory=list)
|
23
|
+
variable_groups: NamedItemList[VariableGroup] = field(default_factory=NamedItemList)
|
23
24
|
|
24
25
|
@property
|
25
26
|
def diag_variables(self) -> NamedItemList[DiagVariable]:
|
26
27
|
return self._diag_variables
|
27
28
|
|
28
29
|
@staticmethod
|
29
|
-
def from_et(et_element: ElementTree.Element,
|
30
|
-
doc_frags: List[OdxDocFragment]) -> "EcuSharedDataRaw":
|
30
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuSharedDataRaw":
|
31
31
|
# objects contained by diagnostic layers exibit an additional
|
32
32
|
# document fragment for the diag layer, so we use the document
|
33
33
|
# fragments of the odx id of the diag layer for IDs of
|
34
34
|
# contained objects.
|
35
|
-
dlr = DiagLayerRaw.from_et(et_element,
|
35
|
+
dlr = DiagLayerRaw.from_et(et_element, context)
|
36
36
|
kwargs = dataclass_fields_asdict(dlr)
|
37
|
-
doc_frags = dlr.odx_id.doc_fragments
|
38
37
|
|
39
|
-
diag_variables_raw:
|
38
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
|
40
39
|
if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
|
41
40
|
for dv_proxy_elem in dv_elems:
|
42
|
-
dv_proxy:
|
41
|
+
dv_proxy: OdxLinkRef | DiagVariable
|
43
42
|
if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
|
44
|
-
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem,
|
43
|
+
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, context)
|
45
44
|
elif dv_proxy_elem.tag == "DIAG-VARIABLE":
|
46
|
-
dv_proxy = DiagVariable.from_et(dv_proxy_elem,
|
45
|
+
dv_proxy = DiagVariable.from_et(dv_proxy_elem, context)
|
47
46
|
else:
|
48
47
|
odxraise()
|
49
48
|
|
50
49
|
diag_variables_raw.append(dv_proxy)
|
51
50
|
|
52
51
|
variable_groups = NamedItemList([
|
53
|
-
VariableGroup.from_et(vg_elem,
|
52
|
+
VariableGroup.from_et(vg_elem, context)
|
54
53
|
for vg_elem in et_element.iterfind("VARIABLE-GROUPS/VARIABLE-GROUP")
|
55
54
|
])
|
56
55
|
|
@@ -58,7 +57,7 @@ class EcuSharedDataRaw(DiagLayerRaw):
|
|
58
57
|
return EcuSharedDataRaw(
|
59
58
|
diag_variables_raw=diag_variables_raw, variable_groups=variable_groups, **kwargs)
|
60
59
|
|
61
|
-
def _build_odxlinks(self) ->
|
60
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
62
61
|
result = super()._build_odxlinks()
|
63
62
|
for dv_proxy in self.diag_variables_raw:
|
64
63
|
if not isinstance(dv_proxy, OdxLinkRef):
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
+
from collections.abc import Iterable
|
2
3
|
from copy import deepcopy
|
3
4
|
from dataclasses import dataclass
|
4
|
-
from typing import Any,
|
5
|
+
from typing import Any, cast
|
5
6
|
from xml.etree import ElementTree
|
6
7
|
|
7
8
|
from typing_extensions import override
|
@@ -11,7 +12,8 @@ from ..dyndefinedspec import DynDefinedSpec
|
|
11
12
|
from ..ecuvariantpattern import EcuVariantPattern
|
12
13
|
from ..exceptions import odxassert
|
13
14
|
from ..nameditemlist import NamedItemList
|
14
|
-
from ..
|
15
|
+
from ..odxdoccontext import OdxDocContext
|
16
|
+
from ..odxlink import OdxLinkDatabase, OdxLinkRef
|
15
17
|
from ..parentref import ParentRef
|
16
18
|
from ..variablegroup import HasVariableGroups, VariableGroup
|
17
19
|
from .basevariant import BaseVariant
|
@@ -20,7 +22,7 @@ from .ecuvariantraw import EcuVariantRaw
|
|
20
22
|
from .hierarchyelement import HierarchyElement
|
21
23
|
|
22
24
|
|
23
|
-
@dataclass
|
25
|
+
@dataclass(kw_only=True)
|
24
26
|
class EcuVariant(HierarchyElement):
|
25
27
|
|
26
28
|
@property
|
@@ -28,19 +30,19 @@ class EcuVariant(HierarchyElement):
|
|
28
30
|
return cast(EcuVariantRaw, self.diag_layer_raw)
|
29
31
|
|
30
32
|
@property
|
31
|
-
def diag_variables_raw(self) ->
|
33
|
+
def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
|
32
34
|
return self.ecu_variant_raw.diag_variables_raw
|
33
35
|
|
34
36
|
@property
|
35
|
-
def dyn_defined_spec(self) ->
|
37
|
+
def dyn_defined_spec(self) -> DynDefinedSpec | None:
|
36
38
|
return self.ecu_variant_raw.dyn_defined_spec
|
37
39
|
|
38
40
|
@property
|
39
|
-
def parent_refs(self) ->
|
41
|
+
def parent_refs(self) -> list[ParentRef]:
|
40
42
|
return self.ecu_variant_raw.parent_refs
|
41
43
|
|
42
44
|
@property
|
43
|
-
def base_variant(self) ->
|
45
|
+
def base_variant(self) -> BaseVariant | None:
|
44
46
|
"""Return the base variant for the ECU variant
|
45
47
|
|
46
48
|
The ODX specification allows at a single base variant for each
|
@@ -55,7 +57,7 @@ class EcuVariant(HierarchyElement):
|
|
55
57
|
return None
|
56
58
|
|
57
59
|
@property
|
58
|
-
def ecu_variant_patterns(self) ->
|
60
|
+
def ecu_variant_patterns(self) -> list[EcuVariantPattern]:
|
59
61
|
return self.ecu_variant_raw.ecu_variant_patterns
|
60
62
|
|
61
63
|
#######
|
@@ -74,8 +76,8 @@ class EcuVariant(HierarchyElement):
|
|
74
76
|
#######
|
75
77
|
|
76
78
|
@staticmethod
|
77
|
-
def from_et(et_element: ElementTree.Element,
|
78
|
-
ecu_variant_raw = EcuVariantRaw.from_et(et_element,
|
79
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuVariant":
|
80
|
+
ecu_variant_raw = EcuVariantRaw.from_et(et_element, context)
|
79
81
|
|
80
82
|
return EcuVariant(diag_layer_raw=ecu_variant_raw)
|
81
83
|
|
@@ -87,7 +89,7 @@ class EcuVariant(HierarchyElement):
|
|
87
89
|
"The raw diagnostic layer passed to EcuVariant "
|
88
90
|
"must be a EcuVariantRaw")
|
89
91
|
|
90
|
-
def __deepcopy__(self, memo:
|
92
|
+
def __deepcopy__(self, memo: dict[int, Any]) -> Any:
|
91
93
|
"""Create a deep copy of the ECU variant
|
92
94
|
|
93
95
|
Note that the copied diagnostic layer is not fully
|
@@ -120,7 +122,7 @@ class EcuVariant(HierarchyElement):
|
|
120
122
|
|
121
123
|
return dl.diag_layer_raw.diag_variables
|
122
124
|
|
123
|
-
def not_inherited_fn(parent_ref: ParentRef) ->
|
125
|
+
def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
|
124
126
|
return parent_ref.not_inherited_variables
|
125
127
|
|
126
128
|
return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
|
@@ -134,7 +136,7 @@ class EcuVariant(HierarchyElement):
|
|
134
136
|
|
135
137
|
return dl.diag_layer_raw.variable_groups
|
136
138
|
|
137
|
-
def not_inherited_fn(parent_ref: ParentRef) ->
|
139
|
+
def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
|
138
140
|
return []
|
139
141
|
|
140
142
|
return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from ..diagvariable import DiagVariable
|
@@ -8,7 +8,8 @@ from ..dyndefinedspec import DynDefinedSpec
|
|
8
8
|
from ..ecuvariantpattern import EcuVariantPattern
|
9
9
|
from ..exceptions import odxraise
|
10
10
|
from ..nameditemlist import NamedItemList
|
11
|
-
from ..
|
11
|
+
from ..odxdoccontext import OdxDocContext
|
12
|
+
from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
12
13
|
from ..parentref import ParentRef
|
13
14
|
from ..snrefcontext import SnRefContext
|
14
15
|
from ..utils import dataclass_fields_asdict
|
@@ -16,59 +17,57 @@ from ..variablegroup import VariableGroup
|
|
16
17
|
from .hierarchyelementraw import HierarchyElementRaw
|
17
18
|
|
18
19
|
|
19
|
-
@dataclass
|
20
|
+
@dataclass(kw_only=True)
|
20
21
|
class EcuVariantRaw(HierarchyElementRaw):
|
21
|
-
diag_variables_raw:
|
22
|
-
variable_groups: NamedItemList[VariableGroup]
|
23
|
-
ecu_variant_patterns:
|
24
|
-
dyn_defined_spec:
|
25
|
-
parent_refs:
|
22
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef] = field(default_factory=list)
|
23
|
+
variable_groups: NamedItemList[VariableGroup] = field(default_factory=NamedItemList)
|
24
|
+
ecu_variant_patterns: list[EcuVariantPattern] = field(default_factory=list)
|
25
|
+
dyn_defined_spec: DynDefinedSpec | None = None
|
26
|
+
parent_refs: list[ParentRef] = field(default_factory=list)
|
26
27
|
|
27
28
|
@property
|
28
29
|
def diag_variables(self) -> NamedItemList[DiagVariable]:
|
29
30
|
return self._diag_variables
|
30
31
|
|
31
32
|
@staticmethod
|
32
|
-
def from_et(et_element: ElementTree.Element,
|
33
|
-
doc_frags: List[OdxDocFragment]) -> "EcuVariantRaw":
|
33
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "EcuVariantRaw":
|
34
34
|
# objects contained by diagnostic layers exibit an additional
|
35
35
|
# document fragment for the diag layer, so we use the document
|
36
36
|
# fragments of the odx id of the diag layer for IDs of
|
37
37
|
# contained objects.
|
38
|
-
her = HierarchyElementRaw.from_et(et_element,
|
38
|
+
her = HierarchyElementRaw.from_et(et_element, context)
|
39
39
|
kwargs = dataclass_fields_asdict(her)
|
40
|
-
doc_frags = her.odx_id.doc_fragments
|
41
40
|
|
42
|
-
diag_variables_raw:
|
41
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
|
43
42
|
if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
|
44
43
|
for dv_proxy_elem in dv_elems:
|
45
|
-
dv_proxy:
|
44
|
+
dv_proxy: OdxLinkRef | DiagVariable
|
46
45
|
if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
|
47
|
-
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem,
|
46
|
+
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, context)
|
48
47
|
elif dv_proxy_elem.tag == "DIAG-VARIABLE":
|
49
|
-
dv_proxy = DiagVariable.from_et(dv_proxy_elem,
|
48
|
+
dv_proxy = DiagVariable.from_et(dv_proxy_elem, context)
|
50
49
|
else:
|
51
50
|
odxraise()
|
52
51
|
|
53
52
|
diag_variables_raw.append(dv_proxy)
|
54
53
|
|
55
54
|
variable_groups = NamedItemList([
|
56
|
-
VariableGroup.from_et(vg_elem,
|
55
|
+
VariableGroup.from_et(vg_elem, context)
|
57
56
|
for vg_elem in et_element.iterfind("VARIABLE-GROUPS/VARIABLE-GROUP")
|
58
57
|
])
|
59
58
|
|
60
59
|
ecu_variant_patterns = None
|
61
60
|
ecu_variant_patterns = [
|
62
|
-
EcuVariantPattern.from_et(varpat_elem,
|
61
|
+
EcuVariantPattern.from_et(varpat_elem, context)
|
63
62
|
for varpat_elem in et_element.iterfind("ECU-VARIANT-PATTERNS/ECU-VARIANT-PATTERN")
|
64
63
|
]
|
65
64
|
|
66
65
|
dyn_defined_spec = None
|
67
66
|
if (dds_elem := et_element.find("DYN-DEFINED-SPEC")) is not None:
|
68
|
-
dyn_defined_spec = DynDefinedSpec.from_et(dds_elem,
|
67
|
+
dyn_defined_spec = DynDefinedSpec.from_et(dds_elem, context)
|
69
68
|
|
70
69
|
parent_refs = [
|
71
|
-
ParentRef.from_et(pr_el,
|
70
|
+
ParentRef.from_et(pr_el, context)
|
72
71
|
for pr_el in et_element.iterfind("PARENT-REFS/PARENT-REF")
|
73
72
|
]
|
74
73
|
|
@@ -81,7 +80,7 @@ class EcuVariantRaw(HierarchyElementRaw):
|
|
81
80
|
parent_refs=parent_refs,
|
82
81
|
**kwargs)
|
83
82
|
|
84
|
-
def _build_odxlinks(self) ->
|
83
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
85
84
|
result = super()._build_odxlinks()
|
86
85
|
|
87
86
|
for dv_proxy in self.diag_variables_raw:
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
+
from collections.abc import Iterable
|
2
3
|
from copy import deepcopy
|
3
4
|
from dataclasses import dataclass
|
4
|
-
from typing import Any,
|
5
|
+
from typing import Any, cast
|
5
6
|
from xml.etree import ElementTree
|
6
7
|
|
7
8
|
from typing_extensions import override
|
@@ -9,7 +10,8 @@ from typing_extensions import override
|
|
9
10
|
from ..diagvariable import DiagVariable
|
10
11
|
from ..exceptions import odxassert
|
11
12
|
from ..nameditemlist import NamedItemList
|
12
|
-
from ..
|
13
|
+
from ..odxdoccontext import OdxDocContext
|
14
|
+
from ..odxlink import OdxLinkDatabase, OdxLinkRef
|
13
15
|
from ..parentref import ParentRef
|
14
16
|
from ..variablegroup import VariableGroup
|
15
17
|
from .diaglayer import DiagLayer
|
@@ -17,7 +19,7 @@ from .functionalgroupraw import FunctionalGroupRaw
|
|
17
19
|
from .hierarchyelement import HierarchyElement
|
18
20
|
|
19
21
|
|
20
|
-
@dataclass
|
22
|
+
@dataclass(kw_only=True)
|
21
23
|
class FunctionalGroup(HierarchyElement):
|
22
24
|
"""This is a diagnostic layer for functionality shared between multiple ECU variants
|
23
25
|
"""
|
@@ -27,7 +29,7 @@ class FunctionalGroup(HierarchyElement):
|
|
27
29
|
return cast(FunctionalGroupRaw, self.diag_layer_raw)
|
28
30
|
|
29
31
|
@property
|
30
|
-
def diag_variables_raw(self) ->
|
32
|
+
def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
|
31
33
|
return self.functional_group_raw.diag_variables_raw
|
32
34
|
|
33
35
|
@property
|
@@ -39,13 +41,12 @@ class FunctionalGroup(HierarchyElement):
|
|
39
41
|
return self._variable_groups
|
40
42
|
|
41
43
|
@property
|
42
|
-
def parent_refs(self) ->
|
44
|
+
def parent_refs(self) -> list[ParentRef]:
|
43
45
|
return self.functional_group_raw.parent_refs
|
44
46
|
|
45
47
|
@staticmethod
|
46
|
-
def from_et(et_element: ElementTree.Element,
|
47
|
-
|
48
|
-
functional_group_raw = FunctionalGroupRaw.from_et(et_element, doc_frags)
|
48
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "FunctionalGroup":
|
49
|
+
functional_group_raw = FunctionalGroupRaw.from_et(et_element, context)
|
49
50
|
|
50
51
|
return FunctionalGroup(diag_layer_raw=functional_group_raw)
|
51
52
|
|
@@ -73,7 +74,7 @@ class FunctionalGroup(HierarchyElement):
|
|
73
74
|
|
74
75
|
return dl.diag_layer_raw.diag_variables # type: ignore[no-any-return]
|
75
76
|
|
76
|
-
def not_inherited_fn(parent_ref: ParentRef) ->
|
77
|
+
def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
|
77
78
|
return parent_ref.not_inherited_variables
|
78
79
|
|
79
80
|
return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
|
@@ -87,12 +88,12 @@ class FunctionalGroup(HierarchyElement):
|
|
87
88
|
|
88
89
|
return dl.diag_layer_raw.variable_groups # type: ignore[no-any-return]
|
89
90
|
|
90
|
-
def not_inherited_fn(parent_ref: ParentRef) ->
|
91
|
+
def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
|
91
92
|
return []
|
92
93
|
|
93
94
|
return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
|
94
95
|
|
95
|
-
def __deepcopy__(self, memo:
|
96
|
+
def __deepcopy__(self, memo: dict[int, Any]) -> Any:
|
96
97
|
"""Create a deep copy of the functional group layer
|
97
98
|
|
98
99
|
Note that the copied diagnostic layer is not fully
|