odxtools 10.0.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 +5 -5
- odxtools/admindata.py +10 -9
- odxtools/audience.py +15 -15
- odxtools/basecomparam.py +7 -6
- odxtools/basevariantpattern.py +7 -7
- odxtools/basicstructure.py +9 -9
- odxtools/cli/_print_utils.py +1 -1
- odxtools/cli/browse.py +1 -1
- odxtools/cli/list.py +1 -1
- odxtools/commrelation.py +14 -13
- odxtools/companydata.py +11 -11
- odxtools/companydocinfo.py +11 -13
- odxtools/companyrevisioninfo.py +7 -7
- odxtools/companyspecificinfo.py +9 -11
- odxtools/comparam.py +6 -5
- odxtools/comparaminstance.py +10 -10
- odxtools/comparamspec.py +8 -9
- odxtools/comparamsubset.py +14 -22
- odxtools/complexcomparam.py +10 -10
- odxtools/complexdop.py +1 -1
- odxtools/compositecodec.py +3 -3
- odxtools/compumethods/compucodecompumethod.py +4 -4
- odxtools/compumethods/compuconst.py +3 -3
- odxtools/compumethods/compudefaultvalue.py +2 -2
- odxtools/compumethods/compuinternaltophys.py +11 -10
- odxtools/compumethods/compumethod.py +8 -7
- odxtools/compumethods/compuphystointernal.py +11 -10
- odxtools/compumethods/compurationalcoeffs.py +6 -6
- odxtools/compumethods/compuscale.py +14 -14
- odxtools/compumethods/createanycompumethod.py +12 -12
- odxtools/compumethods/identicalcompumethod.py +4 -4
- odxtools/compumethods/limit.py +8 -8
- odxtools/compumethods/linearcompumethod.py +4 -4
- odxtools/compumethods/linearsegment.py +8 -8
- odxtools/compumethods/ratfunccompumethod.py +4 -4
- odxtools/compumethods/ratfuncsegment.py +8 -8
- odxtools/compumethods/scalelinearcompumethod.py +5 -5
- odxtools/compumethods/scaleratfunccompumethod.py +4 -4
- odxtools/compumethods/tabintpcompumethod.py +12 -12
- odxtools/compumethods/texttablecompumethod.py +4 -4
- odxtools/createanycomparam.py +4 -4
- odxtools/createanydiagcodedtype.py +7 -7
- odxtools/database.py +28 -26
- odxtools/dataobjectproperty.py +15 -16
- odxtools/description.py +7 -7
- odxtools/determinenumberofitems.py +6 -5
- odxtools/diagcodedtype.py +6 -6
- odxtools/diagcomm.py +26 -27
- odxtools/diagdatadictionaryspec.py +34 -34
- odxtools/diaglayercontainer.py +32 -31
- odxtools/diaglayers/basevariant.py +5 -4
- odxtools/diaglayers/basevariantraw.py +18 -19
- odxtools/diaglayers/diaglayer.py +5 -4
- odxtools/diaglayers/diaglayerraw.py +39 -48
- odxtools/diaglayers/ecushareddata.py +6 -6
- odxtools/diaglayers/ecushareddataraw.py +11 -12
- odxtools/diaglayers/ecuvariant.py +5 -4
- odxtools/diaglayers/ecuvariantraw.py +17 -18
- odxtools/diaglayers/functionalgroup.py +5 -5
- odxtools/diaglayers/functionalgroupraw.py +13 -14
- odxtools/diaglayers/hierarchyelement.py +9 -9
- odxtools/diaglayers/hierarchyelementraw.py +8 -9
- odxtools/diaglayers/protocol.py +4 -4
- odxtools/diaglayers/protocolraw.py +10 -11
- odxtools/diagnostictroublecode.py +12 -14
- odxtools/diagservice.py +19 -18
- odxtools/diagvariable.py +19 -20
- odxtools/docrevision.py +14 -13
- odxtools/dopbase.py +10 -11
- odxtools/dtcconnector.py +6 -5
- odxtools/dtcdop.py +15 -15
- odxtools/dynamicendmarkerfield.py +6 -6
- odxtools/dynamiclengthfield.py +6 -6
- odxtools/dyndefinedspec.py +7 -7
- odxtools/dynenddopref.py +7 -7
- odxtools/dyniddefmodeinfo.py +17 -17
- odxtools/ecuvariantpattern.py +6 -7
- odxtools/element.py +12 -12
- odxtools/endofpdufield.py +6 -7
- odxtools/envdataconnector.py +6 -6
- odxtools/environmentdata.py +7 -8
- odxtools/environmentdatadescription.py +13 -12
- odxtools/externalaccessmethod.py +4 -5
- odxtools/externaldoc.py +4 -4
- odxtools/field.py +12 -11
- odxtools/functionalclass.py +7 -7
- odxtools/inputparam.py +9 -8
- odxtools/internalconstr.py +10 -10
- odxtools/leadinglengthinfotype.py +5 -6
- odxtools/library.py +7 -6
- odxtools/linkeddtcdop.py +7 -6
- odxtools/matchingbasevariantparameter.py +5 -5
- odxtools/matchingparameter.py +6 -6
- odxtools/message.py +1 -1
- odxtools/minmaxlengthtype.py +6 -7
- odxtools/modification.py +5 -4
- odxtools/multiplexer.py +48 -12
- odxtools/multiplexercase.py +10 -10
- odxtools/multiplexerdefaultcase.py +8 -7
- odxtools/multiplexerswitchkey.py +6 -6
- odxtools/nameditemlist.py +1 -1
- odxtools/negoutputparam.py +6 -6
- odxtools/odxcategory.py +12 -24
- odxtools/odxdoccontext.py +16 -0
- odxtools/odxlink.py +11 -12
- odxtools/odxtypes.py +3 -3
- odxtools/outputparam.py +7 -6
- odxtools/parameters/codedconstparameter.py +6 -6
- odxtools/parameters/createanyparameter.py +15 -15
- odxtools/parameters/dynamicparameter.py +4 -5
- odxtools/parameters/lengthkeyparameter.py +6 -6
- odxtools/parameters/matchingrequestparameter.py +4 -4
- odxtools/parameters/nrcconstparameter.py +8 -8
- odxtools/parameters/parameter.py +12 -13
- odxtools/parameters/parameterwithdop.py +9 -9
- odxtools/parameters/physicalconstantparameter.py +5 -4
- odxtools/parameters/reservedparameter.py +4 -5
- odxtools/parameters/systemparameter.py +4 -5
- odxtools/parameters/tableentryparameter.py +6 -6
- odxtools/parameters/tablekeyparameter.py +12 -12
- odxtools/parameters/tablestructparameter.py +9 -9
- odxtools/parameters/valueparameter.py +6 -6
- odxtools/paramlengthinfotype.py +6 -7
- odxtools/parentref.py +12 -10
- odxtools/physicaldimension.py +12 -12
- odxtools/physicaltype.py +5 -5
- odxtools/posresponsesuppressible.py +11 -11
- odxtools/preconditionstateref.py +8 -8
- odxtools/progcode.py +9 -8
- odxtools/protstack.py +8 -7
- odxtools/relateddiagcommref.py +5 -5
- odxtools/relateddoc.py +8 -7
- odxtools/request.py +12 -13
- odxtools/response.py +12 -13
- odxtools/scaleconstr.py +8 -8
- odxtools/singleecujob.py +14 -13
- odxtools/snrefcontext.py +1 -1
- odxtools/specialdata.py +6 -5
- odxtools/specialdatagroup.py +13 -13
- odxtools/specialdatagroupcaption.py +5 -4
- odxtools/standardlengthtype.py +5 -13
- odxtools/state.py +5 -4
- odxtools/statechart.py +10 -9
- odxtools/statemachine.py +2 -2
- odxtools/statetransition.py +7 -7
- odxtools/statetransitionref.py +11 -11
- odxtools/staticfield.py +5 -4
- odxtools/structure.py +5 -5
- odxtools/subcomponent.py +18 -16
- odxtools/subcomponentparamconnector.py +8 -7
- odxtools/subcomponentpattern.py +7 -7
- odxtools/swvariable.py +6 -6
- odxtools/table.py +20 -21
- odxtools/tablediagcommconnector.py +7 -6
- odxtools/tablerow.py +57 -36
- odxtools/tablerowconnector.py +6 -6
- odxtools/teammember.py +14 -13
- odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
- odxtools/text.py +4 -4
- odxtools/unit.py +9 -8
- odxtools/unitgroup.py +9 -8
- odxtools/unitspec.py +15 -16
- odxtools/variablegroup.py +4 -5
- odxtools/variantpattern.py +3 -4
- odxtools/version.py +2 -2
- odxtools/writepdxfile.py +0 -19
- odxtools/xdoc.py +11 -10
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +1 -1
- odxtools-10.1.0.dist-info/RECORD +265 -0
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
- odxtools-10.0.0.dist-info/RECORD +0 -264
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
- {odxtools-10.0.0.dist-info → odxtools-10.1.0.dist-info}/top_level.txt +0 -0
odxtools/diagcodedtype.py
CHANGED
@@ -7,7 +7,8 @@ from .decodestate import DecodeState
|
|
7
7
|
from .encodestate import EncodeState
|
8
8
|
from .encoding import Encoding
|
9
9
|
from .exceptions import odxassert, odxraise, odxrequire
|
10
|
-
from .
|
10
|
+
from .odxdoccontext import OdxDocContext
|
11
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
11
12
|
from .odxtypes import AtomicOdxType, DataType, odxstr_to_bool
|
12
13
|
from .snrefcontext import SnRefContext
|
13
14
|
|
@@ -20,12 +21,12 @@ DctType = Literal[
|
|
20
21
|
]
|
21
22
|
|
22
23
|
|
23
|
-
@dataclass
|
24
|
+
@dataclass(kw_only=True)
|
24
25
|
class DiagCodedType:
|
25
|
-
base_type_encoding: Encoding | None
|
26
|
+
base_type_encoding: Encoding | None = None
|
26
27
|
base_data_type: DataType
|
27
28
|
|
28
|
-
is_highlow_byte_order_raw: bool | None
|
29
|
+
is_highlow_byte_order_raw: bool | None = None
|
29
30
|
|
30
31
|
@property
|
31
32
|
def dct_type(self) -> DctType:
|
@@ -38,8 +39,7 @@ class DiagCodedType:
|
|
38
39
|
return self.is_highlow_byte_order_raw in [None, True]
|
39
40
|
|
40
41
|
@staticmethod
|
41
|
-
def from_et(et_element: ElementTree.Element,
|
42
|
-
doc_frags: list[OdxDocFragment]) -> "DiagCodedType":
|
42
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "DiagCodedType":
|
43
43
|
base_type_encoding = None
|
44
44
|
if (base_type_encoding_str := et_element.get("BASE-TYPE-ENCODING")) is not None:
|
45
45
|
try:
|
odxtools/diagcomm.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from typing import TYPE_CHECKING, Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
@@ -10,7 +10,8 @@ from .element import IdentifiableElement
|
|
10
10
|
from .exceptions import odxraise, odxrequire
|
11
11
|
from .functionalclass import FunctionalClass
|
12
12
|
from .nameditemlist import NamedItemList
|
13
|
-
from .
|
13
|
+
from .odxdoccontext import OdxDocContext
|
14
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
|
14
15
|
from .odxtypes import odxstr_to_bool
|
15
16
|
from .preconditionstateref import PreConditionStateRef
|
16
17
|
from .relateddiagcommref import RelatedDiagCommRef
|
@@ -25,7 +26,7 @@ if TYPE_CHECKING:
|
|
25
26
|
from .diaglayers.protocol import Protocol
|
26
27
|
|
27
28
|
|
28
|
-
@dataclass
|
29
|
+
@dataclass(kw_only=True)
|
29
30
|
class DiagComm(IdentifiableElement):
|
30
31
|
"""Representation of a diagnostic communication object.
|
31
32
|
|
@@ -34,21 +35,21 @@ class DiagComm(IdentifiableElement):
|
|
34
35
|
|
35
36
|
"""
|
36
37
|
|
37
|
-
admin_data: AdminData | None
|
38
|
-
sdgs: list[SpecialDataGroup]
|
39
|
-
functional_class_refs: list[OdxLinkRef]
|
40
|
-
audience: Audience | None
|
41
|
-
protocol_snrefs: list[str]
|
42
|
-
related_diag_comm_refs: list[RelatedDiagCommRef]
|
43
|
-
pre_condition_state_refs: list[PreConditionStateRef]
|
44
|
-
state_transition_refs: list[StateTransitionRef]
|
38
|
+
admin_data: AdminData | None = None
|
39
|
+
sdgs: list[SpecialDataGroup] = field(default_factory=list)
|
40
|
+
functional_class_refs: list[OdxLinkRef] = field(default_factory=list)
|
41
|
+
audience: Audience | None = None
|
42
|
+
protocol_snrefs: list[str] = field(default_factory=list)
|
43
|
+
related_diag_comm_refs: list[RelatedDiagCommRef] = field(default_factory=list)
|
44
|
+
pre_condition_state_refs: list[PreConditionStateRef] = field(default_factory=list)
|
45
|
+
state_transition_refs: list[StateTransitionRef] = field(default_factory=list)
|
45
46
|
|
46
47
|
# attributes
|
47
|
-
semantic: str | None
|
48
|
-
diagnostic_class: DiagClassType | None
|
49
|
-
is_mandatory_raw: bool | None
|
50
|
-
is_executable_raw: bool | None
|
51
|
-
is_final_raw: bool | None
|
48
|
+
semantic: str | None = None
|
49
|
+
diagnostic_class: DiagClassType | None = None
|
50
|
+
is_mandatory_raw: bool | None = None
|
51
|
+
is_executable_raw: bool | None = None
|
52
|
+
is_final_raw: bool | None = None
|
52
53
|
|
53
54
|
@property
|
54
55
|
def functional_classes(self) -> NamedItemList[FunctionalClass]:
|
@@ -83,22 +84,20 @@ class DiagComm(IdentifiableElement):
|
|
83
84
|
return self.is_final_raw is True
|
84
85
|
|
85
86
|
@staticmethod
|
86
|
-
def from_et(et_element: ElementTree.Element,
|
87
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element,
|
87
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "DiagComm":
|
88
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
88
89
|
|
89
|
-
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"),
|
90
|
-
sdgs = [
|
91
|
-
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
92
|
-
]
|
90
|
+
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), context)
|
91
|
+
sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
|
93
92
|
|
94
93
|
functional_class_refs = [
|
95
|
-
odxrequire(OdxLinkRef.from_et(el,
|
94
|
+
odxrequire(OdxLinkRef.from_et(el, context))
|
96
95
|
for el in et_element.iterfind("FUNCT-CLASS-REFS/FUNCT-CLASS-REF")
|
97
96
|
]
|
98
97
|
|
99
98
|
audience = None
|
100
99
|
if (audience_elem := et_element.find("AUDIENCE")) is not None:
|
101
|
-
audience = Audience.from_et(audience_elem,
|
100
|
+
audience = Audience.from_et(audience_elem, context)
|
102
101
|
|
103
102
|
protocol_snrefs = [
|
104
103
|
odxrequire(el.get("SHORT-NAME"))
|
@@ -106,17 +105,17 @@ class DiagComm(IdentifiableElement):
|
|
106
105
|
]
|
107
106
|
|
108
107
|
related_diag_comm_refs = [
|
109
|
-
RelatedDiagCommRef.from_et(el,
|
108
|
+
RelatedDiagCommRef.from_et(el, context)
|
110
109
|
for el in et_element.iterfind("RELATED-DIAG-COMM-REFS/RELATED-DIAG-COMM-REF")
|
111
110
|
]
|
112
111
|
|
113
112
|
pre_condition_state_refs = [
|
114
|
-
PreConditionStateRef.from_et(el,
|
113
|
+
PreConditionStateRef.from_et(el, context)
|
115
114
|
for el in et_element.iterfind("PRE-CONDITION-STATE-REFS/PRE-CONDITION-STATE-REF")
|
116
115
|
]
|
117
116
|
|
118
117
|
state_transition_refs = [
|
119
|
-
StateTransitionRef.from_et(el,
|
118
|
+
StateTransitionRef.from_et(el, context)
|
120
119
|
for el in et_element.iterfind("STATE-TRANSITION-REFS/STATE-TRANSITION-REF")
|
121
120
|
]
|
122
121
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from itertools import chain
|
4
4
|
from typing import Any
|
5
5
|
from xml.etree import ElementTree
|
@@ -15,7 +15,8 @@ from .environmentdata import EnvironmentData
|
|
15
15
|
from .environmentdatadescription import EnvironmentDataDescription
|
16
16
|
from .multiplexer import Multiplexer
|
17
17
|
from .nameditemlist import NamedItemList
|
18
|
-
from .
|
18
|
+
from .odxdoccontext import OdxDocContext
|
19
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
19
20
|
from .snrefcontext import SnRefContext
|
20
21
|
from .specialdatagroup import SpecialDataGroup
|
21
22
|
from .staticfield import StaticField
|
@@ -24,72 +25,73 @@ from .table import Table
|
|
24
25
|
from .unitspec import UnitSpec
|
25
26
|
|
26
27
|
|
27
|
-
@dataclass
|
28
|
+
@dataclass(kw_only=True)
|
28
29
|
class DiagDataDictionarySpec:
|
29
|
-
admin_data: AdminData | None
|
30
|
-
dtc_dops: NamedItemList[DtcDop]
|
31
|
-
env_data_descs: NamedItemList[EnvironmentDataDescription]
|
32
|
-
data_object_props: NamedItemList[DataObjectProperty]
|
33
|
-
structures: NamedItemList[Structure]
|
34
|
-
static_fields: NamedItemList[StaticField]
|
35
|
-
dynamic_length_fields: NamedItemList[DynamicLengthField]
|
36
|
-
dynamic_endmarker_fields: NamedItemList[DynamicEndmarkerField]
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
30
|
+
admin_data: AdminData | None = None
|
31
|
+
dtc_dops: NamedItemList[DtcDop] = field(default_factory=NamedItemList)
|
32
|
+
env_data_descs: NamedItemList[EnvironmentDataDescription] = field(default_factory=NamedItemList)
|
33
|
+
data_object_props: NamedItemList[DataObjectProperty] = field(default_factory=NamedItemList)
|
34
|
+
structures: NamedItemList[Structure] = field(default_factory=NamedItemList)
|
35
|
+
static_fields: NamedItemList[StaticField] = field(default_factory=NamedItemList)
|
36
|
+
dynamic_length_fields: NamedItemList[DynamicLengthField] = field(default_factory=NamedItemList)
|
37
|
+
dynamic_endmarker_fields: NamedItemList[DynamicEndmarkerField] = field(
|
38
|
+
default_factory=NamedItemList)
|
39
|
+
end_of_pdu_fields: NamedItemList[EndOfPduField] = field(default_factory=NamedItemList)
|
40
|
+
muxs: NamedItemList[Multiplexer] = field(default_factory=NamedItemList)
|
41
|
+
env_datas: NamedItemList[EnvironmentData] = field(default_factory=NamedItemList)
|
42
|
+
unit_spec: UnitSpec | None = None
|
43
|
+
tables: NamedItemList[Table] = field(default_factory=NamedItemList)
|
44
|
+
sdgs: list[SpecialDataGroup] = field(default_factory=list)
|
43
45
|
|
44
46
|
@staticmethod
|
45
47
|
def from_et(et_element: ElementTree.Element,
|
46
|
-
|
48
|
+
context: OdxDocContext) -> "DiagDataDictionarySpec":
|
47
49
|
admin_data = None
|
48
50
|
if (admin_data_elem := et_element.find("ADMIN-DATA")) is not None:
|
49
|
-
admin_data = AdminData.from_et(admin_data_elem,
|
51
|
+
admin_data = AdminData.from_et(admin_data_elem, context)
|
50
52
|
|
51
53
|
dtc_dops = NamedItemList([
|
52
|
-
DtcDop.from_et(dtc_dop_elem,
|
54
|
+
DtcDop.from_et(dtc_dop_elem, context)
|
53
55
|
for dtc_dop_elem in et_element.iterfind("DTC-DOPS/DTC-DOP")
|
54
56
|
])
|
55
57
|
|
56
58
|
env_data_descs = NamedItemList([
|
57
|
-
EnvironmentDataDescription.from_et(env_data_desc_element,
|
59
|
+
EnvironmentDataDescription.from_et(env_data_desc_element, context)
|
58
60
|
for env_data_desc_element in et_element.iterfind("ENV-DATA-DESCS/ENV-DATA-DESC")
|
59
61
|
])
|
60
62
|
|
61
63
|
data_object_props = NamedItemList([
|
62
|
-
DataObjectProperty.from_et(dop_element,
|
64
|
+
DataObjectProperty.from_et(dop_element, context)
|
63
65
|
for dop_element in et_element.iterfind("DATA-OBJECT-PROPS/DATA-OBJECT-PROP")
|
64
66
|
])
|
65
67
|
|
66
68
|
structures = NamedItemList([
|
67
|
-
Structure.from_et(structure_element,
|
69
|
+
Structure.from_et(structure_element, context)
|
68
70
|
for structure_element in et_element.iterfind("STRUCTURES/STRUCTURE")
|
69
71
|
])
|
70
72
|
|
71
73
|
static_fields = NamedItemList([
|
72
|
-
StaticField.from_et(dl_element,
|
74
|
+
StaticField.from_et(dl_element, context)
|
73
75
|
for dl_element in et_element.iterfind("STATIC-FIELDS/STATIC-FIELD")
|
74
76
|
])
|
75
77
|
|
76
78
|
dynamic_length_fields = NamedItemList([
|
77
|
-
DynamicLengthField.from_et(dl_element,
|
79
|
+
DynamicLengthField.from_et(dl_element, context)
|
78
80
|
for dl_element in et_element.iterfind("DYNAMIC-LENGTH-FIELDS/DYNAMIC-LENGTH-FIELD")
|
79
81
|
])
|
80
82
|
|
81
83
|
dynamic_endmarker_fields = NamedItemList([
|
82
|
-
DynamicEndmarkerField.from_et(dl_element,
|
84
|
+
DynamicEndmarkerField.from_et(dl_element, context) for dl_element in
|
83
85
|
et_element.iterfind("DYNAMIC-ENDMARKER-FIELDS/DYNAMIC-ENDMARKER-FIELD")
|
84
86
|
])
|
85
87
|
|
86
88
|
end_of_pdu_fields = NamedItemList([
|
87
|
-
EndOfPduField.from_et(eofp_element,
|
89
|
+
EndOfPduField.from_et(eofp_element, context)
|
88
90
|
for eofp_element in et_element.iterfind("END-OF-PDU-FIELDS/END-OF-PDU-FIELD")
|
89
91
|
])
|
90
92
|
|
91
93
|
muxs = NamedItemList([
|
92
|
-
Multiplexer.from_et(mux_element,
|
94
|
+
Multiplexer.from_et(mux_element, context)
|
93
95
|
for mux_element in et_element.iterfind("MUXS/MUX")
|
94
96
|
])
|
95
97
|
|
@@ -99,23 +101,21 @@ class DiagDataDictionarySpec:
|
|
99
101
|
et_element.iterfind("ENV-DATA-DESCS/ENV-DATA-DESC/ENV-DATAS/ENV-DATA"),
|
100
102
|
)
|
101
103
|
env_datas = NamedItemList([
|
102
|
-
EnvironmentData.from_et(env_data_element,
|
104
|
+
EnvironmentData.from_et(env_data_element, context)
|
103
105
|
for env_data_element in env_data_elements
|
104
106
|
])
|
105
107
|
|
106
108
|
if (spec_elem := et_element.find("UNIT-SPEC")) is not None:
|
107
|
-
unit_spec = UnitSpec.from_et(spec_elem,
|
109
|
+
unit_spec = UnitSpec.from_et(spec_elem, context)
|
108
110
|
else:
|
109
111
|
unit_spec = None
|
110
112
|
|
111
113
|
tables = NamedItemList([
|
112
|
-
Table.from_et(table_element,
|
114
|
+
Table.from_et(table_element, context)
|
113
115
|
for table_element in et_element.iterfind("TABLES/TABLE")
|
114
116
|
])
|
115
117
|
|
116
|
-
sdgs = [
|
117
|
-
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
118
|
-
]
|
118
|
+
sdgs = [SpecialDataGroup.from_et(sdge, context) for sdge in et_element.iterfind("SDGS/SDG")]
|
119
119
|
|
120
120
|
return DiagDataDictionarySpec(
|
121
121
|
admin_data=admin_data,
|
odxtools/diaglayercontainer.py
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from itertools import chain
|
4
4
|
from typing import TYPE_CHECKING, Any
|
5
5
|
from xml.etree import ElementTree
|
@@ -10,8 +10,10 @@ from .diaglayers.ecushareddata import EcuSharedData
|
|
10
10
|
from .diaglayers.ecuvariant import EcuVariant
|
11
11
|
from .diaglayers.functionalgroup import FunctionalGroup
|
12
12
|
from .diaglayers.protocol import Protocol
|
13
|
+
from .exceptions import odxrequire
|
13
14
|
from .nameditemlist import NamedItemList
|
14
15
|
from .odxcategory import OdxCategory
|
16
|
+
from .odxdoccontext import OdxDocContext
|
15
17
|
from .odxlink import DocType, OdxDocFragment, OdxLinkDatabase, OdxLinkId
|
16
18
|
from .snrefcontext import SnRefContext
|
17
19
|
from .utils import dataclass_fields_asdict
|
@@ -20,13 +22,13 @@ if TYPE_CHECKING:
|
|
20
22
|
from .database import Database
|
21
23
|
|
22
24
|
|
23
|
-
@dataclass
|
25
|
+
@dataclass(kw_only=True)
|
24
26
|
class DiagLayerContainer(OdxCategory):
|
25
|
-
protocols: NamedItemList[Protocol]
|
26
|
-
functional_groups: NamedItemList[FunctionalGroup]
|
27
|
-
ecu_shared_datas: NamedItemList[EcuSharedData]
|
28
|
-
base_variants: NamedItemList[BaseVariant]
|
29
|
-
ecu_variants: NamedItemList[EcuVariant]
|
27
|
+
protocols: NamedItemList[Protocol] = field(default_factory=NamedItemList)
|
28
|
+
functional_groups: NamedItemList[FunctionalGroup] = field(default_factory=NamedItemList)
|
29
|
+
ecu_shared_datas: NamedItemList[EcuSharedData] = field(default_factory=NamedItemList)
|
30
|
+
base_variants: NamedItemList[BaseVariant] = field(default_factory=NamedItemList)
|
31
|
+
ecu_variants: NamedItemList[EcuVariant] = field(default_factory=NamedItemList)
|
30
32
|
|
31
33
|
@property
|
32
34
|
def diag_layers(self) -> NamedItemList[DiagLayer]:
|
@@ -40,33 +42,32 @@ class DiagLayerContainer(OdxCategory):
|
|
40
42
|
return self.ecu_variants
|
41
43
|
|
42
44
|
@staticmethod
|
43
|
-
def from_et(et_element: ElementTree.Element,
|
44
|
-
doc_frags: list[OdxDocFragment]) -> "DiagLayerContainer":
|
45
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "DiagLayerContainer":
|
45
46
|
|
46
|
-
cat = OdxCategory.
|
47
|
-
doc_frags = cat.odx_id.doc_fragments
|
47
|
+
cat = OdxCategory.from_et(et_element, context)
|
48
48
|
kwargs = dataclass_fields_asdict(cat)
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
for
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
50
|
+
def get_layer_context(diag_layer_et: ElementTree.Element) -> OdxDocContext:
|
51
|
+
layer_sn = odxrequire(diag_layer_et.findtext("SHORT-NAME"))
|
52
|
+
layer_docfrag = OdxDocFragment(layer_sn, DocType.LAYER)
|
53
|
+
# add layer doc fragment to container doc fragment
|
54
|
+
return OdxDocContext(context.version, (context.doc_fragments[0], layer_docfrag))
|
55
|
+
|
56
|
+
protocols = NamedItemList(
|
57
|
+
Protocol.from_et(layer_et, get_layer_context(layer_et))
|
58
|
+
for layer_et in et_element.iterfind("PROTOCOLS/PROTOCOL"))
|
59
|
+
functional_groups = NamedItemList(
|
60
|
+
FunctionalGroup.from_et(layer_et, get_layer_context(layer_et))
|
61
|
+
for layer_et in et_element.iterfind("FUNCTIONAL-GROUPS/FUNCTIONAL-GROUP"))
|
62
|
+
ecu_shared_datas = NamedItemList(
|
63
|
+
EcuSharedData.from_et(layer_et, get_layer_context(layer_et))
|
64
|
+
for layer_et in et_element.iterfind("ECU-SHARED-DATAS/ECU-SHARED-DATA"))
|
65
|
+
base_variants = NamedItemList(
|
66
|
+
BaseVariant.from_et(layer_et, get_layer_context(layer_et))
|
67
|
+
for layer_et in et_element.iterfind("BASE-VARIANTS/BASE-VARIANT"))
|
68
|
+
ecu_variants = NamedItemList(
|
69
|
+
EcuVariant.from_et(layer_et, get_layer_context(layer_et))
|
70
|
+
for layer_et in et_element.iterfind("ECU-VARIANTS/ECU-VARIANT"))
|
70
71
|
|
71
72
|
return DiagLayerContainer(
|
72
73
|
protocols=protocols,
|
@@ -12,7 +12,8 @@ from ..diagvariable import DiagVariable
|
|
12
12
|
from ..dyndefinedspec import DynDefinedSpec
|
13
13
|
from ..exceptions import odxassert
|
14
14
|
from ..nameditemlist import NamedItemList
|
15
|
-
from ..
|
15
|
+
from ..odxdoccontext import OdxDocContext
|
16
|
+
from ..odxlink import OdxLinkDatabase, OdxLinkRef
|
16
17
|
from ..parentref import ParentRef
|
17
18
|
from ..variablegroup import VariableGroup
|
18
19
|
from .basevariantraw import BaseVariantRaw
|
@@ -20,7 +21,7 @@ from .diaglayer import DiagLayer
|
|
20
21
|
from .hierarchyelement import HierarchyElement
|
21
22
|
|
22
23
|
|
23
|
-
@dataclass
|
24
|
+
@dataclass(kw_only=True)
|
24
25
|
class BaseVariant(HierarchyElement):
|
25
26
|
"""This is a diagnostic layer for common functionality of an ECU
|
26
27
|
"""
|
@@ -68,8 +69,8 @@ class BaseVariant(HierarchyElement):
|
|
68
69
|
#######
|
69
70
|
|
70
71
|
@staticmethod
|
71
|
-
def from_et(et_element: ElementTree.Element,
|
72
|
-
base_variant_raw = BaseVariantRaw.from_et(et_element,
|
72
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "BaseVariant":
|
73
|
+
base_variant_raw = BaseVariantRaw.from_et(et_element, context)
|
73
74
|
|
74
75
|
return BaseVariant(diag_layer_raw=base_variant_raw)
|
75
76
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
2
|
+
from dataclasses import dataclass, field
|
3
3
|
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
@@ -8,7 +8,8 @@ from ..diagvariable import DiagVariable
|
|
8
8
|
from ..dyndefinedspec import DynDefinedSpec
|
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,60 +17,58 @@ from ..variablegroup import VariableGroup
|
|
16
17
|
from .hierarchyelementraw import HierarchyElementRaw
|
17
18
|
|
18
19
|
|
19
|
-
@dataclass
|
20
|
+
@dataclass(kw_only=True)
|
20
21
|
class BaseVariantRaw(HierarchyElementRaw):
|
21
22
|
"""This is a diagnostic layer for common functionality of an ECU
|
22
23
|
"""
|
23
24
|
|
24
|
-
diag_variables_raw: list[DiagVariable | OdxLinkRef]
|
25
|
-
variable_groups: NamedItemList[VariableGroup]
|
26
|
-
dyn_defined_spec: DynDefinedSpec | None
|
27
|
-
base_variant_pattern: BaseVariantPattern | None
|
28
|
-
parent_refs: list[ParentRef]
|
25
|
+
diag_variables_raw: list[DiagVariable | OdxLinkRef] = field(default_factory=list)
|
26
|
+
variable_groups: NamedItemList[VariableGroup] = field(default_factory=NamedItemList)
|
27
|
+
dyn_defined_spec: DynDefinedSpec | None = None
|
28
|
+
base_variant_pattern: BaseVariantPattern | None = None
|
29
|
+
parent_refs: list[ParentRef] = field(default_factory=list)
|
29
30
|
|
30
31
|
@property
|
31
32
|
def diag_variables(self) -> NamedItemList[DiagVariable]:
|
32
33
|
return self._diag_variables
|
33
34
|
|
34
35
|
@staticmethod
|
35
|
-
def from_et(et_element: ElementTree.Element,
|
36
|
-
|
37
|
-
# objects contained by diagnostic layers exibit an additional
|
36
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "BaseVariantRaw":
|
37
|
+
# objects contained by diagnostic layers exhibit an additional
|
38
38
|
# document fragment for the diag layer, so we use the document
|
39
39
|
# fragments of the odx id of the diag layer for IDs of
|
40
40
|
# contained objects.
|
41
|
-
her = HierarchyElementRaw.from_et(et_element,
|
41
|
+
her = HierarchyElementRaw.from_et(et_element, context)
|
42
42
|
kwargs = dataclass_fields_asdict(her)
|
43
|
-
doc_frags = her.odx_id.doc_fragments
|
44
43
|
|
45
44
|
diag_variables_raw: list[DiagVariable | OdxLinkRef] = []
|
46
45
|
if (dv_elems := et_element.find("DIAG-VARIABLES")) is not None:
|
47
46
|
for dv_proxy_elem in dv_elems:
|
48
47
|
dv_proxy: OdxLinkRef | DiagVariable
|
49
48
|
if dv_proxy_elem.tag == "DIAG-VARIABLE-REF":
|
50
|
-
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem,
|
49
|
+
dv_proxy = OdxLinkRef.from_et(dv_proxy_elem, context)
|
51
50
|
elif dv_proxy_elem.tag == "DIAG-VARIABLE":
|
52
|
-
dv_proxy = DiagVariable.from_et(dv_proxy_elem,
|
51
|
+
dv_proxy = DiagVariable.from_et(dv_proxy_elem, context)
|
53
52
|
else:
|
54
53
|
odxraise()
|
55
54
|
|
56
55
|
diag_variables_raw.append(dv_proxy)
|
57
56
|
|
58
57
|
variable_groups = NamedItemList([
|
59
|
-
VariableGroup.from_et(vg_elem,
|
58
|
+
VariableGroup.from_et(vg_elem, context)
|
60
59
|
for vg_elem in et_element.iterfind("VARIABLE-GROUPS/VARIABLE-GROUP")
|
61
60
|
])
|
62
61
|
|
63
62
|
dyn_defined_spec = None
|
64
63
|
if (dds_elem := et_element.find("DYN-DEFINED-SPEC")) is not None:
|
65
|
-
dyn_defined_spec = DynDefinedSpec.from_et(dds_elem,
|
64
|
+
dyn_defined_spec = DynDefinedSpec.from_et(dds_elem, context)
|
66
65
|
|
67
66
|
base_variant_pattern = None
|
68
67
|
if (bvp_elem := et_element.find("BASE-VARIANT-PATTERN")) is not None:
|
69
|
-
base_variant_pattern = BaseVariantPattern.from_et(bvp_elem,
|
68
|
+
base_variant_pattern = BaseVariantPattern.from_et(bvp_elem, context)
|
70
69
|
|
71
70
|
parent_refs = [
|
72
|
-
ParentRef.from_et(pr_elem,
|
71
|
+
ParentRef.from_et(pr_elem, context)
|
73
72
|
for pr_elem in et_element.iterfind("PARENT-REFS/PARENT-REF")
|
74
73
|
]
|
75
74
|
|
odxtools/diaglayers/diaglayer.py
CHANGED
@@ -17,7 +17,8 @@ from ..exceptions import DecodeError, odxassert, odxraise
|
|
17
17
|
from ..library import Library
|
18
18
|
from ..message import Message
|
19
19
|
from ..nameditemlist import NamedItemList, TNamed
|
20
|
-
from ..
|
20
|
+
from ..odxdoccontext import OdxDocContext
|
21
|
+
from ..odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
21
22
|
from ..parentref import ParentRef
|
22
23
|
from ..request import Request
|
23
24
|
from ..response import Response
|
@@ -33,7 +34,7 @@ from .diaglayertype import DiagLayerType
|
|
33
34
|
PrefixTree = dict[int, Union[list[DiagService], "PrefixTree"]]
|
34
35
|
|
35
36
|
|
36
|
-
@dataclass
|
37
|
+
@dataclass(kw_only=True)
|
37
38
|
class DiagLayer:
|
38
39
|
"""This class represents a "logical view" upon a diagnostic layer
|
39
40
|
according to the ODX standard.
|
@@ -45,8 +46,8 @@ class DiagLayer:
|
|
45
46
|
diag_layer_raw: DiagLayerRaw
|
46
47
|
|
47
48
|
@staticmethod
|
48
|
-
def from_et(et_element: ElementTree.Element,
|
49
|
-
diag_layer_raw = DiagLayerRaw.from_et(et_element,
|
49
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "DiagLayer":
|
50
|
+
diag_layer_raw = DiagLayerRaw.from_et(et_element, context)
|
50
51
|
|
51
52
|
# Create DiagLayer
|
52
53
|
return DiagLayer(diag_layer_raw=diag_layer_raw)
|