odxtools 9.7.0__py3-none-any.whl → 10.0.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 +3 -3
- odxtools/admindata.py +8 -8
- odxtools/audience.py +10 -10
- odxtools/basecomparam.py +5 -5
- odxtools/basevariantpattern.py +4 -5
- odxtools/basicstructure.py +8 -8
- odxtools/cli/_print_utils.py +35 -23
- odxtools/cli/browse.py +9 -9
- odxtools/cli/compare.py +24 -24
- odxtools/cli/decode.py +3 -4
- odxtools/cli/find.py +4 -5
- odxtools/cli/list.py +7 -7
- odxtools/cli/main.py +2 -2
- odxtools/cli/snoop.py +3 -3
- odxtools/codec.py +3 -3
- odxtools/commrelation.py +11 -11
- odxtools/companydata.py +5 -5
- odxtools/companydocinfo.py +8 -8
- odxtools/companyrevisioninfo.py +5 -5
- odxtools/companyspecificinfo.py +5 -5
- odxtools/comparam.py +3 -3
- odxtools/comparaminstance.py +10 -10
- odxtools/comparamspec.py +3 -3
- odxtools/comparamsubset.py +5 -5
- odxtools/complexcomparam.py +7 -7
- odxtools/compositecodec.py +11 -11
- odxtools/compumethods/compucodecompumethod.py +4 -4
- odxtools/compumethods/compuconst.py +4 -5
- odxtools/compumethods/compudefaultvalue.py +1 -2
- odxtools/compumethods/compuinternaltophys.py +6 -6
- odxtools/compumethods/compumethod.py +5 -5
- odxtools/compumethods/compuphystointernal.py +6 -6
- odxtools/compumethods/compurationalcoeffs.py +4 -4
- odxtools/compumethods/compuscale.py +9 -10
- odxtools/compumethods/createanycompumethod.py +1 -2
- odxtools/compumethods/identicalcompumethod.py +1 -2
- odxtools/compumethods/limit.py +12 -12
- odxtools/compumethods/linearcompumethod.py +2 -2
- odxtools/compumethods/linearsegment.py +14 -15
- odxtools/compumethods/ratfunccompumethod.py +3 -3
- odxtools/compumethods/ratfuncsegment.py +7 -8
- odxtools/compumethods/scalelinearcompumethod.py +7 -7
- odxtools/compumethods/scaleratfunccompumethod.py +4 -4
- odxtools/compumethods/tabintpcompumethod.py +15 -18
- odxtools/compumethods/texttablecompumethod.py +3 -3
- odxtools/createanycomparam.py +2 -4
- odxtools/createanydiagcodedtype.py +1 -2
- odxtools/database.py +9 -8
- odxtools/dataobjectproperty.py +10 -10
- odxtools/decodestate.py +5 -5
- odxtools/description.py +5 -5
- odxtools/determinenumberofitems.py +4 -4
- odxtools/diagcodedtype.py +7 -7
- odxtools/diagcomm.py +17 -17
- odxtools/diagdatadictionaryspec.py +6 -6
- odxtools/diaglayercontainer.py +4 -4
- odxtools/diaglayers/basevariant.py +10 -9
- odxtools/diaglayers/basevariantraw.py +9 -9
- odxtools/diaglayers/diaglayer.py +20 -19
- odxtools/diaglayers/diaglayerraw.py +10 -10
- odxtools/diaglayers/diaglayertype.py +1 -2
- odxtools/diaglayers/ecushareddata.py +4 -4
- odxtools/diaglayers/ecushareddataraw.py +6 -6
- odxtools/diaglayers/ecuvariant.py +11 -10
- odxtools/diaglayers/ecuvariantraw.py +9 -9
- odxtools/diaglayers/functionalgroup.py +8 -7
- odxtools/diaglayers/functionalgroupraw.py +7 -7
- odxtools/diaglayers/hierarchyelement.py +43 -49
- odxtools/diaglayers/hierarchyelementraw.py +4 -4
- odxtools/diaglayers/protocol.py +4 -4
- odxtools/diaglayers/protocolraw.py +6 -6
- odxtools/diagnostictroublecode.py +8 -8
- odxtools/diagservice.py +18 -18
- odxtools/diagvariable.py +14 -14
- odxtools/docrevision.py +11 -11
- odxtools/dopbase.py +6 -6
- odxtools/dtcconnector.py +3 -3
- odxtools/dtcdop.py +13 -9
- odxtools/dynamicendmarkerfield.py +5 -4
- odxtools/dynamiclengthfield.py +5 -4
- odxtools/dyndefinedspec.py +5 -5
- odxtools/dynenddopref.py +5 -5
- odxtools/dyniddefmodeinfo.py +13 -13
- odxtools/ecuvariantpattern.py +4 -5
- odxtools/element.py +5 -6
- odxtools/encodestate.py +11 -11
- odxtools/encoding.py +2 -3
- odxtools/endofpdufield.py +6 -6
- odxtools/envdataconnector.py +3 -3
- odxtools/environmentdata.py +3 -4
- odxtools/environmentdatadescription.py +11 -11
- odxtools/exceptions.py +5 -5
- odxtools/externalaccessmethod.py +1 -2
- odxtools/externaldoc.py +4 -4
- odxtools/field.py +9 -10
- odxtools/functionalclass.py +4 -4
- odxtools/inputparam.py +6 -6
- odxtools/internalconstr.py +4 -5
- odxtools/isotp_state_machine.py +12 -11
- odxtools/leadinglengthinfotype.py +2 -3
- odxtools/library.py +5 -5
- odxtools/linkeddtcdop.py +4 -4
- odxtools/loadfile.py +5 -6
- odxtools/matchingbasevariantparameter.py +2 -3
- odxtools/matchingparameter.py +7 -7
- odxtools/minmaxlengthtype.py +4 -4
- odxtools/modification.py +4 -4
- odxtools/multiplexer.py +11 -11
- odxtools/multiplexercase.py +6 -6
- odxtools/multiplexerdefaultcase.py +6 -6
- odxtools/multiplexerswitchkey.py +4 -4
- odxtools/nameditemlist.py +14 -14
- odxtools/negoutputparam.py +3 -3
- odxtools/obd.py +1 -2
- odxtools/odxcategory.py +6 -6
- odxtools/odxlink.py +19 -20
- odxtools/odxtypes.py +21 -18
- odxtools/outputparam.py +4 -4
- odxtools/parameterinfo.py +1 -1
- odxtools/parameters/codedconstparameter.py +5 -5
- odxtools/parameters/createanyparameter.py +1 -2
- odxtools/parameters/dynamicparameter.py +2 -3
- odxtools/parameters/lengthkeyparameter.py +5 -5
- odxtools/parameters/matchingrequestparameter.py +3 -4
- odxtools/parameters/nrcconstparameter.py +7 -7
- odxtools/parameters/parameter.py +11 -11
- odxtools/parameters/parameterwithdop.py +9 -9
- odxtools/parameters/physicalconstantparameter.py +4 -4
- odxtools/parameters/reservedparameter.py +3 -4
- odxtools/parameters/systemparameter.py +2 -3
- odxtools/parameters/tableentryparameter.py +3 -3
- odxtools/parameters/tablekeyparameter.py +10 -10
- odxtools/parameters/tablestructparameter.py +7 -7
- odxtools/parameters/valueparameter.py +7 -7
- odxtools/paramlengthinfotype.py +5 -3
- odxtools/parentref.py +9 -9
- odxtools/physicaldimension.py +11 -11
- odxtools/physicaltype.py +3 -4
- odxtools/posresponsesuppressible.py +9 -10
- odxtools/preconditionstateref.py +7 -7
- odxtools/progcode.py +6 -6
- odxtools/protstack.py +4 -4
- odxtools/relateddiagcommref.py +1 -2
- odxtools/relateddoc.py +6 -6
- odxtools/request.py +9 -9
- odxtools/response.py +10 -10
- odxtools/scaleconstr.py +3 -4
- odxtools/servicebinner.py +5 -5
- odxtools/singleecujob.py +4 -4
- odxtools/snrefcontext.py +2 -2
- odxtools/specialdata.py +5 -5
- odxtools/specialdatagroup.py +9 -9
- odxtools/specialdatagroupcaption.py +3 -3
- odxtools/standardlengthtype.py +10 -10
- odxtools/state.py +3 -3
- odxtools/statechart.py +4 -4
- odxtools/statemachine.py +4 -3
- odxtools/statetransition.py +4 -4
- odxtools/statetransitionref.py +18 -18
- odxtools/staticfield.py +5 -4
- odxtools/structure.py +2 -3
- odxtools/subcomponent.py +5 -5
- odxtools/subcomponentparamconnector.py +5 -5
- odxtools/subcomponentpattern.py +4 -4
- odxtools/swvariable.py +3 -4
- odxtools/table.py +14 -14
- odxtools/tablediagcommconnector.py +5 -5
- odxtools/tablerow.py +30 -30
- odxtools/tablerowconnector.py +3 -3
- odxtools/teammember.py +11 -11
- odxtools/text.py +2 -3
- odxtools/uds.py +2 -3
- odxtools/unit.py +9 -9
- odxtools/unitgroup.py +5 -5
- odxtools/unitspec.py +6 -6
- odxtools/utils.py +3 -3
- odxtools/variablegroup.py +2 -2
- odxtools/variantmatcher.py +10 -10
- odxtools/variantpattern.py +3 -3
- odxtools/version.py +2 -2
- odxtools/writepdxfile.py +5 -5
- odxtools/xdoc.py +9 -9
- {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/METADATA +4 -5
- odxtools-10.0.0.dist-info/RECORD +264 -0
- odxtools-9.7.0.dist-info/RECORD +0 -264
- {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/WHEEL +0 -0
- {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/entry_points.txt +0 -0
- {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/licenses/LICENSE +0 -0
- {odxtools-9.7.0.dist-info → odxtools-10.0.0.dist-info}/top_level.txt +0 -0
odxtools/diaglayers/diaglayer.py
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
+
from collections.abc import Callable, Iterable
|
2
3
|
from copy import copy, deepcopy
|
3
4
|
from dataclasses import dataclass
|
4
5
|
from functools import cached_property
|
5
6
|
from itertools import chain
|
6
|
-
from typing import Any,
|
7
|
+
from typing import Any, Union, cast
|
7
8
|
from xml.etree import ElementTree
|
8
9
|
|
9
10
|
from ..admindata import AdminData
|
@@ -29,7 +30,7 @@ from ..unitgroup import UnitGroup
|
|
29
30
|
from .diaglayerraw import DiagLayerRaw
|
30
31
|
from .diaglayertype import DiagLayerType
|
31
32
|
|
32
|
-
PrefixTree =
|
33
|
+
PrefixTree = dict[int, Union[list[DiagService], "PrefixTree"]]
|
33
34
|
|
34
35
|
|
35
36
|
@dataclass
|
@@ -44,7 +45,7 @@ class DiagLayer:
|
|
44
45
|
diag_layer_raw: DiagLayerRaw
|
45
46
|
|
46
47
|
@staticmethod
|
47
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
48
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DiagLayer":
|
48
49
|
diag_layer_raw = DiagLayerRaw.from_et(et_element, doc_frags)
|
49
50
|
|
50
51
|
# Create DiagLayer
|
@@ -72,7 +73,7 @@ class DiagLayer:
|
|
72
73
|
else:
|
73
74
|
self._diag_data_dictionary_spec = self.diag_layer_raw.diag_data_dictionary_spec
|
74
75
|
|
75
|
-
def _build_odxlinks(self) ->
|
76
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
76
77
|
"""Construct a mapping from IDs to all objects that are contained in this diagnostic layer."""
|
77
78
|
result = self.diag_layer_raw._build_odxlinks()
|
78
79
|
|
@@ -91,7 +92,7 @@ class DiagLayer:
|
|
91
92
|
# reference. This mechanism can thus be seen as a kind of
|
92
93
|
# "poor man's inheritance".
|
93
94
|
if self.import_refs:
|
94
|
-
imported_links:
|
95
|
+
imported_links: dict[OdxLinkId, Any] = {}
|
95
96
|
for import_ref in self.import_refs:
|
96
97
|
imported_dl = odxlinks.resolve(import_ref, DiagLayer)
|
97
98
|
|
@@ -168,7 +169,7 @@ class DiagLayer:
|
|
168
169
|
"""
|
169
170
|
return get_local_objects(self)
|
170
171
|
|
171
|
-
def __deepcopy__(self, memo:
|
172
|
+
def __deepcopy__(self, memo: dict[int, Any]) -> Any:
|
172
173
|
"""Create a deep copy of the diagnostic layer
|
173
174
|
|
174
175
|
Note that the copied diagnostic layer is not fully
|
@@ -210,15 +211,15 @@ class DiagLayer:
|
|
210
211
|
return self.diag_layer_raw.short_name
|
211
212
|
|
212
213
|
@property
|
213
|
-
def long_name(self) ->
|
214
|
+
def long_name(self) -> str | None:
|
214
215
|
return self.diag_layer_raw.long_name
|
215
216
|
|
216
217
|
@property
|
217
|
-
def description(self) ->
|
218
|
+
def description(self) -> Description | None:
|
218
219
|
return self.diag_layer_raw.description
|
219
220
|
|
220
221
|
@property
|
221
|
-
def admin_data(self) ->
|
222
|
+
def admin_data(self) -> AdminData | None:
|
222
223
|
return self.diag_layer_raw.admin_data
|
223
224
|
|
224
225
|
@property
|
@@ -258,7 +259,7 @@ class DiagLayer:
|
|
258
259
|
return self.diag_layer_raw.global_negative_responses
|
259
260
|
|
260
261
|
@property
|
261
|
-
def import_refs(self) ->
|
262
|
+
def import_refs(self) -> list[OdxLinkRef]:
|
262
263
|
return self.diag_layer_raw.import_refs
|
263
264
|
|
264
265
|
@property
|
@@ -270,7 +271,7 @@ class DiagLayer:
|
|
270
271
|
return self.diag_layer_raw.sub_components
|
271
272
|
|
272
273
|
@property
|
273
|
-
def sdgs(self) ->
|
274
|
+
def sdgs(self) -> list[SpecialDataGroup]:
|
274
275
|
return self.diag_layer_raw.sdgs
|
275
276
|
|
276
277
|
@property
|
@@ -359,13 +360,13 @@ class DiagLayer:
|
|
359
360
|
if sub_tree.get(-1) is None:
|
360
361
|
sub_tree[-1] = [service]
|
361
362
|
else:
|
362
|
-
cast(
|
363
|
+
cast(list[DiagService], sub_tree[-1]).append(service)
|
363
364
|
|
364
|
-
def _find_services_for_uds(self, message: bytes) ->
|
365
|
+
def _find_services_for_uds(self, message: bytes) -> list[DiagService]:
|
365
366
|
prefix_tree = self._prefix_tree
|
366
367
|
|
367
368
|
# Find matching service(s) in prefix tree
|
368
|
-
possible_services:
|
369
|
+
possible_services: list[DiagService] = []
|
369
370
|
for b in message:
|
370
371
|
if b in prefix_tree:
|
371
372
|
odxassert(isinstance(prefix_tree[b], dict))
|
@@ -373,11 +374,11 @@ class DiagLayer:
|
|
373
374
|
else:
|
374
375
|
break
|
375
376
|
if -1 in prefix_tree:
|
376
|
-
possible_services += cast(
|
377
|
+
possible_services += cast(list[DiagService], prefix_tree[-1])
|
377
378
|
return possible_services
|
378
379
|
|
379
|
-
def _decode(self, message: bytes, candidate_services: Iterable[DiagService]) ->
|
380
|
-
decoded_messages:
|
380
|
+
def _decode(self, message: bytes, candidate_services: Iterable[DiagService]) -> list[Message]:
|
381
|
+
decoded_messages: list[Message] = []
|
381
382
|
|
382
383
|
for service in candidate_services:
|
383
384
|
try:
|
@@ -415,12 +416,12 @@ class DiagLayer:
|
|
415
416
|
|
416
417
|
return decoded_messages
|
417
418
|
|
418
|
-
def decode(self, message: bytes) ->
|
419
|
+
def decode(self, message: bytes) -> list[Message]:
|
419
420
|
candidate_services = self._find_services_for_uds(message)
|
420
421
|
|
421
422
|
return self._decode(message, candidate_services)
|
422
423
|
|
423
|
-
def decode_response(self, response: bytes, request: bytes) ->
|
424
|
+
def decode_response(self, response: bytes, request: bytes) -> list[Message]:
|
424
425
|
candidate_services = self._find_services_for_uds(request)
|
425
426
|
if candidate_services is None:
|
426
427
|
raise DecodeError(f"Couldn't find corresponding service for request {request.hex()}.")
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from copy import copy
|
3
3
|
from dataclasses import dataclass
|
4
|
-
from typing import Any,
|
4
|
+
from typing import Any, cast
|
5
5
|
from xml.etree import ElementTree
|
6
6
|
|
7
7
|
from ..additionalaudience import AdditionalAudience
|
@@ -36,21 +36,21 @@ class DiagLayerRaw(IdentifiableElement):
|
|
36
36
|
"""
|
37
37
|
|
38
38
|
variant_type: DiagLayerType
|
39
|
-
admin_data:
|
39
|
+
admin_data: AdminData | None
|
40
40
|
company_datas: NamedItemList[CompanyData]
|
41
41
|
functional_classes: NamedItemList[FunctionalClass]
|
42
|
-
diag_data_dictionary_spec:
|
43
|
-
diag_comms_raw:
|
42
|
+
diag_data_dictionary_spec: DiagDataDictionarySpec | None
|
43
|
+
diag_comms_raw: list[OdxLinkRef | DiagComm]
|
44
44
|
requests: NamedItemList[Request]
|
45
45
|
positive_responses: NamedItemList[Response]
|
46
46
|
negative_responses: NamedItemList[Response]
|
47
47
|
global_negative_responses: NamedItemList[Response]
|
48
|
-
import_refs:
|
48
|
+
import_refs: list[OdxLinkRef]
|
49
49
|
state_charts: NamedItemList[StateChart]
|
50
50
|
additional_audiences: NamedItemList[AdditionalAudience]
|
51
51
|
sub_components: NamedItemList[SubComponent]
|
52
52
|
libraries: NamedItemList[Library]
|
53
|
-
sdgs:
|
53
|
+
sdgs: list[SpecialDataGroup]
|
54
54
|
|
55
55
|
@property
|
56
56
|
def diag_comms(self) -> NamedItemList[DiagComm]:
|
@@ -70,7 +70,7 @@ class DiagLayerRaw(IdentifiableElement):
|
|
70
70
|
return self._single_ecu_jobs
|
71
71
|
|
72
72
|
@staticmethod
|
73
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
73
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "DiagLayerRaw":
|
74
74
|
try:
|
75
75
|
variant_type = DiagLayerType(et_element.tag)
|
76
76
|
except ValueError:
|
@@ -102,10 +102,10 @@ class DiagLayerRaw(IdentifiableElement):
|
|
102
102
|
if (ddds_elem := et_element.find("DIAG-DATA-DICTIONARY-SPEC")) is not None:
|
103
103
|
diag_data_dictionary_spec = DiagDataDictionarySpec.from_et(ddds_elem, doc_frags)
|
104
104
|
|
105
|
-
diag_comms_raw:
|
105
|
+
diag_comms_raw: list[OdxLinkRef | DiagComm] = []
|
106
106
|
if (dc_elems := et_element.find("DIAG-COMMS")) is not None:
|
107
107
|
for dc_proxy_elem in dc_elems:
|
108
|
-
dc:
|
108
|
+
dc: OdxLinkRef | DiagComm
|
109
109
|
if dc_proxy_elem.tag == "DIAG-COMM-REF":
|
110
110
|
dc = OdxLinkRef.from_et(dc_proxy_elem, doc_frags)
|
111
111
|
elif dc_proxy_elem.tag == "DIAG-SERVICE":
|
@@ -183,7 +183,7 @@ class DiagLayerRaw(IdentifiableElement):
|
|
183
183
|
sdgs=sdgs,
|
184
184
|
**kwargs)
|
185
185
|
|
186
|
-
def _build_odxlinks(self) ->
|
186
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
187
187
|
"""Construct a mapping from IDs to all objects that are contained in this diagnostic layer."""
|
188
188
|
odxlinks = {self.odx_id: self}
|
189
189
|
|
@@ -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,7 +1,7 @@
|
|
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
|
@@ -27,7 +27,7 @@ class EcuSharedData(DiagLayer):
|
|
27
27
|
return cast(EcuSharedDataRaw, self.diag_layer_raw)
|
28
28
|
|
29
29
|
@property
|
30
|
-
def diag_variables_raw(self) ->
|
30
|
+
def diag_variables_raw(self) -> list[OdxLinkRef | DiagVariable]:
|
31
31
|
return self.ecu_shared_data_raw.diag_variables_raw
|
32
32
|
|
33
33
|
@property
|
@@ -40,7 +40,7 @@ class EcuSharedData(DiagLayer):
|
|
40
40
|
|
41
41
|
@staticmethod
|
42
42
|
def from_et(et_element: ElementTree.Element,
|
43
|
-
doc_frags:
|
43
|
+
doc_frags: list[OdxDocFragment]) -> "EcuSharedData":
|
44
44
|
ecu_shared_data_raw = EcuSharedDataRaw.from_et(et_element, doc_frags)
|
45
45
|
|
46
46
|
return EcuSharedData(diag_layer_raw=ecu_shared_data_raw)
|
@@ -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,6 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from ..diagvariable import DiagVariable
|
@@ -18,7 +18,7 @@ class EcuSharedDataRaw(DiagLayerRaw):
|
|
18
18
|
"""This is a diagnostic layer for data shared accross others
|
19
19
|
"""
|
20
20
|
|
21
|
-
diag_variables_raw:
|
21
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef]
|
22
22
|
variable_groups: NamedItemList[VariableGroup]
|
23
23
|
|
24
24
|
@property
|
@@ -27,7 +27,7 @@ class EcuSharedDataRaw(DiagLayerRaw):
|
|
27
27
|
|
28
28
|
@staticmethod
|
29
29
|
def from_et(et_element: ElementTree.Element,
|
30
|
-
doc_frags:
|
30
|
+
doc_frags: list[OdxDocFragment]) -> "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
|
@@ -36,10 +36,10 @@ class EcuSharedDataRaw(DiagLayerRaw):
|
|
36
36
|
kwargs = dataclass_fields_asdict(dlr)
|
37
37
|
doc_frags = dlr.odx_id.doc_fragments
|
38
38
|
|
39
|
-
diag_variables_raw:
|
39
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
|
40
40
|
if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
|
41
41
|
for dv_proxy_elem in dv_elems:
|
42
|
-
dv_proxy:
|
42
|
+
dv_proxy: OdxLinkRef | DiagVariable
|
43
43
|
if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
|
44
44
|
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
|
45
45
|
elif dv_proxy_elem.tag == "DIAG-VARIABLE":
|
@@ -58,7 +58,7 @@ class EcuSharedDataRaw(DiagLayerRaw):
|
|
58
58
|
return EcuSharedDataRaw(
|
59
59
|
diag_variables_raw=diag_variables_raw, variable_groups=variable_groups, **kwargs)
|
60
60
|
|
61
|
-
def _build_odxlinks(self) ->
|
61
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
62
62
|
result = super()._build_odxlinks()
|
63
63
|
for dv_proxy in self.diag_variables_raw:
|
64
64
|
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
|
@@ -28,19 +29,19 @@ class EcuVariant(HierarchyElement):
|
|
28
29
|
return cast(EcuVariantRaw, self.diag_layer_raw)
|
29
30
|
|
30
31
|
@property
|
31
|
-
def diag_variables_raw(self) ->
|
32
|
+
def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
|
32
33
|
return self.ecu_variant_raw.diag_variables_raw
|
33
34
|
|
34
35
|
@property
|
35
|
-
def dyn_defined_spec(self) ->
|
36
|
+
def dyn_defined_spec(self) -> DynDefinedSpec | None:
|
36
37
|
return self.ecu_variant_raw.dyn_defined_spec
|
37
38
|
|
38
39
|
@property
|
39
|
-
def parent_refs(self) ->
|
40
|
+
def parent_refs(self) -> list[ParentRef]:
|
40
41
|
return self.ecu_variant_raw.parent_refs
|
41
42
|
|
42
43
|
@property
|
43
|
-
def base_variant(self) ->
|
44
|
+
def base_variant(self) -> BaseVariant | None:
|
44
45
|
"""Return the base variant for the ECU variant
|
45
46
|
|
46
47
|
The ODX specification allows at a single base variant for each
|
@@ -55,7 +56,7 @@ class EcuVariant(HierarchyElement):
|
|
55
56
|
return None
|
56
57
|
|
57
58
|
@property
|
58
|
-
def ecu_variant_patterns(self) ->
|
59
|
+
def ecu_variant_patterns(self) -> list[EcuVariantPattern]:
|
59
60
|
return self.ecu_variant_raw.ecu_variant_patterns
|
60
61
|
|
61
62
|
#######
|
@@ -74,7 +75,7 @@ class EcuVariant(HierarchyElement):
|
|
74
75
|
#######
|
75
76
|
|
76
77
|
@staticmethod
|
77
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
78
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "EcuVariant":
|
78
79
|
ecu_variant_raw = EcuVariantRaw.from_et(et_element, doc_frags)
|
79
80
|
|
80
81
|
return EcuVariant(diag_layer_raw=ecu_variant_raw)
|
@@ -87,7 +88,7 @@ class EcuVariant(HierarchyElement):
|
|
87
88
|
"The raw diagnostic layer passed to EcuVariant "
|
88
89
|
"must be a EcuVariantRaw")
|
89
90
|
|
90
|
-
def __deepcopy__(self, memo:
|
91
|
+
def __deepcopy__(self, memo: dict[int, Any]) -> Any:
|
91
92
|
"""Create a deep copy of the ECU variant
|
92
93
|
|
93
94
|
Note that the copied diagnostic layer is not fully
|
@@ -120,7 +121,7 @@ class EcuVariant(HierarchyElement):
|
|
120
121
|
|
121
122
|
return dl.diag_layer_raw.diag_variables
|
122
123
|
|
123
|
-
def not_inherited_fn(parent_ref: ParentRef) ->
|
124
|
+
def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
|
124
125
|
return parent_ref.not_inherited_variables
|
125
126
|
|
126
127
|
return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
|
@@ -134,7 +135,7 @@ class EcuVariant(HierarchyElement):
|
|
134
135
|
|
135
136
|
return dl.diag_layer_raw.variable_groups
|
136
137
|
|
137
|
-
def not_inherited_fn(parent_ref: ParentRef) ->
|
138
|
+
def not_inherited_fn(parent_ref: ParentRef) -> list[str]:
|
138
139
|
return []
|
139
140
|
|
140
141
|
return self._compute_available_objects(get_local_objects_fn, not_inherited_fn)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from ..diagvariable import DiagVariable
|
@@ -18,11 +18,11 @@ from .hierarchyelementraw import HierarchyElementRaw
|
|
18
18
|
|
19
19
|
@dataclass
|
20
20
|
class EcuVariantRaw(HierarchyElementRaw):
|
21
|
-
diag_variables_raw:
|
21
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef]
|
22
22
|
variable_groups: NamedItemList[VariableGroup]
|
23
|
-
ecu_variant_patterns:
|
24
|
-
dyn_defined_spec:
|
25
|
-
parent_refs:
|
23
|
+
ecu_variant_patterns: list[EcuVariantPattern]
|
24
|
+
dyn_defined_spec: DynDefinedSpec | None
|
25
|
+
parent_refs: list[ParentRef]
|
26
26
|
|
27
27
|
@property
|
28
28
|
def diag_variables(self) -> NamedItemList[DiagVariable]:
|
@@ -30,7 +30,7 @@ class EcuVariantRaw(HierarchyElementRaw):
|
|
30
30
|
|
31
31
|
@staticmethod
|
32
32
|
def from_et(et_element: ElementTree.Element,
|
33
|
-
doc_frags:
|
33
|
+
doc_frags: list[OdxDocFragment]) -> "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
|
@@ -39,10 +39,10 @@ class EcuVariantRaw(HierarchyElementRaw):
|
|
39
39
|
kwargs = dataclass_fields_asdict(her)
|
40
40
|
doc_frags = her.odx_id.doc_fragments
|
41
41
|
|
42
|
-
diag_variables_raw:
|
42
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
|
43
43
|
if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
|
44
44
|
for dv_proxy_elem in dv_elems:
|
45
|
-
dv_proxy:
|
45
|
+
dv_proxy: OdxLinkRef | DiagVariable
|
46
46
|
if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
|
47
47
|
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
|
48
48
|
elif dv_proxy_elem.tag == "DIAG-VARIABLE":
|
@@ -81,7 +81,7 @@ class EcuVariantRaw(HierarchyElementRaw):
|
|
81
81
|
parent_refs=parent_refs,
|
82
82
|
**kwargs)
|
83
83
|
|
84
|
-
def _build_odxlinks(self) ->
|
84
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
85
85
|
result = super()._build_odxlinks()
|
86
86
|
|
87
87
|
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
|
@@ -27,7 +28,7 @@ class FunctionalGroup(HierarchyElement):
|
|
27
28
|
return cast(FunctionalGroupRaw, self.diag_layer_raw)
|
28
29
|
|
29
30
|
@property
|
30
|
-
def diag_variables_raw(self) ->
|
31
|
+
def diag_variables_raw(self) -> list[DiagVariable | OdxLinkRef]:
|
31
32
|
return self.functional_group_raw.diag_variables_raw
|
32
33
|
|
33
34
|
@property
|
@@ -39,12 +40,12 @@ class FunctionalGroup(HierarchyElement):
|
|
39
40
|
return self._variable_groups
|
40
41
|
|
41
42
|
@property
|
42
|
-
def parent_refs(self) ->
|
43
|
+
def parent_refs(self) -> list[ParentRef]:
|
43
44
|
return self.functional_group_raw.parent_refs
|
44
45
|
|
45
46
|
@staticmethod
|
46
47
|
def from_et(et_element: ElementTree.Element,
|
47
|
-
doc_frags:
|
48
|
+
doc_frags: list[OdxDocFragment]) -> "FunctionalGroup":
|
48
49
|
functional_group_raw = FunctionalGroupRaw.from_et(et_element, doc_frags)
|
49
50
|
|
50
51
|
return FunctionalGroup(diag_layer_raw=functional_group_raw)
|
@@ -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
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from ..diagvariable import DiagVariable
|
@@ -19,9 +19,9 @@ class FunctionalGroupRaw(HierarchyElementRaw):
|
|
19
19
|
"""This is a diagnostic layer for common functionality of an ECU
|
20
20
|
"""
|
21
21
|
|
22
|
-
diag_variables_raw:
|
22
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef]
|
23
23
|
variable_groups: NamedItemList[VariableGroup]
|
24
|
-
parent_refs:
|
24
|
+
parent_refs: list[ParentRef]
|
25
25
|
|
26
26
|
@property
|
27
27
|
def diag_variables(self) -> NamedItemList[DiagVariable]:
|
@@ -29,7 +29,7 @@ class FunctionalGroupRaw(HierarchyElementRaw):
|
|
29
29
|
|
30
30
|
@staticmethod
|
31
31
|
def from_et(et_element: ElementTree.Element,
|
32
|
-
doc_frags:
|
32
|
+
doc_frags: list[OdxDocFragment]) -> "FunctionalGroupRaw":
|
33
33
|
# objects contained by diagnostic layers exibit an additional
|
34
34
|
# document fragment for the diag layer, so we use the document
|
35
35
|
# fragments of the odx id of the diag layer for IDs of
|
@@ -38,10 +38,10 @@ class FunctionalGroupRaw(HierarchyElementRaw):
|
|
38
38
|
kwargs = dataclass_fields_asdict(her)
|
39
39
|
doc_frags = her.odx_id.doc_fragments
|
40
40
|
|
41
|
-
diag_variables_raw:
|
41
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
|
42
42
|
if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
|
43
43
|
for dv_proxy_elem in dv_elems:
|
44
|
-
dv_proxy:
|
44
|
+
dv_proxy: OdxLinkRef | DiagVariable
|
45
45
|
if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
|
46
46
|
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, doc_frags)
|
47
47
|
elif dv_proxy_elem.tag == "DIAG-VARIABLE":
|
@@ -67,7 +67,7 @@ class FunctionalGroupRaw(HierarchyElementRaw):
|
|
67
67
|
parent_refs=parent_refs,
|
68
68
|
**kwargs)
|
69
69
|
|
70
|
-
def _build_odxlinks(self) ->
|
70
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
71
71
|
result = super()._build_odxlinks()
|
72
72
|
|
73
73
|
for dv_proxy in self.diag_variables_raw:
|