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/parentref.py
CHANGED
@@ -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
|
5
5
|
from xml.etree import ElementTree
|
6
6
|
|
7
7
|
from .exceptions import odxrequire
|
@@ -16,18 +16,18 @@ if TYPE_CHECKING:
|
|
16
16
|
@dataclass
|
17
17
|
class ParentRef:
|
18
18
|
layer_ref: OdxLinkRef
|
19
|
-
not_inherited_diag_comms:
|
20
|
-
not_inherited_variables:
|
21
|
-
not_inherited_dops:
|
22
|
-
not_inherited_tables:
|
23
|
-
not_inherited_global_neg_responses:
|
19
|
+
not_inherited_diag_comms: list[str] # short_name references
|
20
|
+
not_inherited_variables: list[str] # short_name references
|
21
|
+
not_inherited_dops: list[str] # short_name references
|
22
|
+
not_inherited_tables: list[str] # short_name references
|
23
|
+
not_inherited_global_neg_responses: list[str] # short_name references
|
24
24
|
|
25
25
|
@property
|
26
26
|
def layer(self) -> "DiagLayer":
|
27
27
|
return self._layer
|
28
28
|
|
29
29
|
@staticmethod
|
30
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
30
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ParentRef":
|
31
31
|
|
32
32
|
layer_ref = odxrequire(OdxLinkRef.from_et(et_element, doc_frags))
|
33
33
|
|
@@ -69,7 +69,7 @@ class ParentRef:
|
|
69
69
|
not_inherited_global_neg_responses=not_inherited_global_neg_responses,
|
70
70
|
)
|
71
71
|
|
72
|
-
def _build_odxlinks(self) ->
|
72
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
73
73
|
return {}
|
74
74
|
|
75
75
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
@@ -81,7 +81,7 @@ class ParentRef:
|
|
81
81
|
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
82
82
|
pass
|
83
83
|
|
84
|
-
def __deepcopy__(self, memo:
|
84
|
+
def __deepcopy__(self, memo: dict[int, Any]) -> Any:
|
85
85
|
cls = self.__class__
|
86
86
|
result = cls.__new__(cls)
|
87
87
|
memo[id(self)] = result
|
odxtools/physicaldimension.py
CHANGED
@@ -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 .element import IdentifiableElement
|
@@ -41,20 +41,20 @@ class PhysicalDimension(IdentifiableElement):
|
|
41
41
|
)
|
42
42
|
```
|
43
43
|
"""
|
44
|
-
length_exp:
|
45
|
-
mass_exp:
|
46
|
-
time_exp:
|
47
|
-
current_exp:
|
48
|
-
temperature_exp:
|
49
|
-
molar_amount_exp:
|
50
|
-
luminous_intensity_exp:
|
44
|
+
length_exp: int | None
|
45
|
+
mass_exp: int | None
|
46
|
+
time_exp: int | None
|
47
|
+
current_exp: int | None
|
48
|
+
temperature_exp: int | None
|
49
|
+
molar_amount_exp: int | None
|
50
|
+
luminous_intensity_exp: int | None
|
51
51
|
|
52
52
|
@staticmethod
|
53
53
|
def from_et(et_element: ElementTree.Element,
|
54
|
-
doc_frags:
|
54
|
+
doc_frags: list[OdxDocFragment]) -> "PhysicalDimension":
|
55
55
|
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
56
56
|
|
57
|
-
def read_optional_int(element: ElementTree.Element, name: str) ->
|
57
|
+
def read_optional_int(element: ElementTree.Element, name: str) -> int | None:
|
58
58
|
if (val_str := element.findtext(name)) is not None:
|
59
59
|
return int(val_str)
|
60
60
|
else:
|
@@ -78,7 +78,7 @@ class PhysicalDimension(IdentifiableElement):
|
|
78
78
|
luminous_intensity_exp=luminous_intensity_exp,
|
79
79
|
**kwargs)
|
80
80
|
|
81
|
-
def _build_odxlinks(self) ->
|
81
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
82
82
|
return {self.odx_id: self}
|
83
83
|
|
84
84
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
odxtools/physicaltype.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import List, Optional
|
4
3
|
from xml.etree import ElementTree
|
5
4
|
|
6
5
|
from .exceptions import odxraise
|
@@ -32,20 +31,20 @@ class PhysicalType:
|
|
32
31
|
PhysicalType(DataType.A_FLOAT64, precision=2)
|
33
32
|
"""
|
34
33
|
|
35
|
-
precision:
|
34
|
+
precision: int | None
|
36
35
|
"""Number of digits after the decimal point to display to the user
|
37
36
|
The precision is only applicable if the base data type is A_FLOAT32 or A_FLOAT64.
|
38
37
|
"""
|
39
38
|
|
40
39
|
base_data_type: DataType
|
41
40
|
|
42
|
-
display_radix:
|
41
|
+
display_radix: Radix | None
|
43
42
|
"""The display radix defines how integers are displayed to the user.
|
44
43
|
The display radix is only applicable if the base data type is A_UINT32.
|
45
44
|
"""
|
46
45
|
|
47
46
|
@staticmethod
|
48
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
47
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "PhysicalType":
|
49
48
|
precision_str = et_element.findtext("PRECISION")
|
50
49
|
precision = int(precision_str) if precision_str is not None else None
|
51
50
|
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import List, Optional
|
4
3
|
from xml.etree import ElementTree
|
5
4
|
|
6
5
|
from .exceptions import odxrequire
|
@@ -14,21 +13,21 @@ from .utils import read_hex_binary
|
|
14
13
|
class PosResponseSuppressible:
|
15
14
|
bit_mask: int
|
16
15
|
|
17
|
-
coded_const_snref:
|
18
|
-
coded_const_snpathref:
|
16
|
+
coded_const_snref: str | None
|
17
|
+
coded_const_snpathref: str | None
|
19
18
|
|
20
|
-
value_snref:
|
21
|
-
value_snpathref:
|
19
|
+
value_snref: str | None
|
20
|
+
value_snpathref: str | None
|
22
21
|
|
23
|
-
phys_const_snref:
|
24
|
-
phys_const_snpathref:
|
22
|
+
phys_const_snref: str | None
|
23
|
+
phys_const_snpathref: str | None
|
25
24
|
|
26
|
-
table_key_snref:
|
27
|
-
table_key_snpathref:
|
25
|
+
table_key_snref: str | None
|
26
|
+
table_key_snpathref: str | None
|
28
27
|
|
29
28
|
@staticmethod
|
30
29
|
def from_et(et_element: ElementTree.Element,
|
31
|
-
doc_frags:
|
30
|
+
doc_frags: list[OdxDocFragment]) -> "PosResponseSuppressible":
|
32
31
|
|
33
32
|
bit_mask = odxrequire(read_hex_binary(et_element.find("BIT-MASK")))
|
34
33
|
|
odxtools/preconditionstateref.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import TYPE_CHECKING, Any
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .exceptions import odxassert, odxrequire
|
@@ -21,10 +21,10 @@ class PreConditionStateRef(OdxLinkRef):
|
|
21
21
|
"""
|
22
22
|
This class represents the PRE-CONDITION-STATE-REF XML tag.
|
23
23
|
"""
|
24
|
-
value:
|
24
|
+
value: str | None
|
25
25
|
|
26
|
-
in_param_if_snref:
|
27
|
-
in_param_if_snpathref:
|
26
|
+
in_param_if_snref: str | None
|
27
|
+
in_param_if_snpathref: str | None
|
28
28
|
|
29
29
|
@property
|
30
30
|
def state(self) -> "State":
|
@@ -33,7 +33,7 @@ class PreConditionStateRef(OdxLinkRef):
|
|
33
33
|
@staticmethod
|
34
34
|
def from_et( # type: ignore[override]
|
35
35
|
et_element: ElementTree.Element,
|
36
|
-
doc_frags:
|
36
|
+
doc_frags: list[OdxDocFragment]) -> "PreConditionStateRef":
|
37
37
|
kwargs = dataclass_fields_asdict(OdxLinkRef.from_et(et_element, doc_frags))
|
38
38
|
|
39
39
|
value = et_element.findtext("VALUE")
|
@@ -57,7 +57,7 @@ class PreConditionStateRef(OdxLinkRef):
|
|
57
57
|
odxassert(self.in_param_if_snref is not None or self.in_param_if_snref is not None,
|
58
58
|
"If VALUE is specified, a parameter must be referenced")
|
59
59
|
|
60
|
-
def _build_odxlinks(self) ->
|
60
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
61
61
|
return {}
|
62
62
|
|
63
63
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
@@ -66,7 +66,7 @@ class PreConditionStateRef(OdxLinkRef):
|
|
66
66
|
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
67
67
|
pass
|
68
68
|
|
69
|
-
def applies(self, state_machine: "StateMachine", params:
|
69
|
+
def applies(self, state_machine: "StateMachine", params: list[Parameter],
|
70
70
|
param_value_dict: ParameterValueDict) -> bool:
|
71
71
|
"""Given a state machine, evaluate whether the precondition is fulfilled or not
|
72
72
|
|
odxtools/progcode.py
CHANGED
@@ -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, cast
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .exceptions import odxraise, odxrequire
|
@@ -14,11 +14,11 @@ from .snrefcontext import SnRefContext
|
|
14
14
|
class ProgCode:
|
15
15
|
"""A reference to code that is executed by a single ECU job"""
|
16
16
|
code_file: str
|
17
|
-
encryption:
|
17
|
+
encryption: str | None
|
18
18
|
syntax: str
|
19
19
|
revision: str
|
20
|
-
entrypoint:
|
21
|
-
library_refs:
|
20
|
+
entrypoint: str | None
|
21
|
+
library_refs: list[OdxLinkRef]
|
22
22
|
|
23
23
|
@property
|
24
24
|
def code(self) -> bytes:
|
@@ -29,7 +29,7 @@ class ProgCode:
|
|
29
29
|
return self._libraries
|
30
30
|
|
31
31
|
@staticmethod
|
32
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
32
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ProgCode":
|
33
33
|
code_file = odxrequire(et_element.findtext("CODE-FILE"))
|
34
34
|
encryption = et_element.findtext("ENCRYPTION")
|
35
35
|
syntax = odxrequire(et_element.findtext("SYNTAX"))
|
@@ -50,7 +50,7 @@ class ProgCode:
|
|
50
50
|
library_refs=library_refs,
|
51
51
|
)
|
52
52
|
|
53
|
-
def _build_odxlinks(self) ->
|
53
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
54
54
|
return {}
|
55
55
|
|
56
56
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
odxtools/protstack.py
CHANGED
@@ -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 .comparamsubset import ComparamSubset
|
@@ -17,14 +17,14 @@ class ProtStack(IdentifiableElement):
|
|
17
17
|
# mandatory in ODX 2.2, but non existent in ODX 2.0
|
18
18
|
pdu_protocol_type: str
|
19
19
|
physical_link_type: str
|
20
|
-
comparam_subset_refs:
|
20
|
+
comparam_subset_refs: list[OdxLinkRef]
|
21
21
|
|
22
22
|
@property
|
23
23
|
def comparam_subsets(self) -> NamedItemList[ComparamSubset]:
|
24
24
|
return self._comparam_subsets
|
25
25
|
|
26
26
|
@staticmethod
|
27
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
27
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "ProtStack":
|
28
28
|
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
29
29
|
|
30
30
|
pdu_protocol_type = odxrequire(et_element.findtext("PDU-PROTOCOL-TYPE"))
|
@@ -41,7 +41,7 @@ class ProtStack(IdentifiableElement):
|
|
41
41
|
comparam_subset_refs=comparam_subset_refs,
|
42
42
|
**kwargs)
|
43
43
|
|
44
|
-
def _build_odxlinks(self) ->
|
44
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
45
45
|
result = {self.odx_id: self}
|
46
46
|
return result
|
47
47
|
|
odxtools/relateddiagcommref.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import List
|
4
3
|
from xml.etree import ElementTree
|
5
4
|
|
6
5
|
from .exceptions import odxrequire
|
@@ -15,7 +14,7 @@ class RelatedDiagCommRef(OdxLinkRef):
|
|
15
14
|
@staticmethod
|
16
15
|
def from_et( # type: ignore[override]
|
17
16
|
et_element: ElementTree.Element,
|
18
|
-
doc_frags:
|
17
|
+
doc_frags: list[OdxDocFragment]) -> "RelatedDiagCommRef":
|
19
18
|
kwargs = dataclass_fields_asdict(odxrequire(OdxLinkRef.from_et(et_element, doc_frags)))
|
20
19
|
|
21
20
|
relation_type = odxrequire(et_element.findtext("RELATION-TYPE"))
|
odxtools/relateddoc.py
CHANGED
@@ -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 .description import Description
|
@@ -11,12 +11,12 @@ from .xdoc import XDoc
|
|
11
11
|
|
12
12
|
@dataclass
|
13
13
|
class RelatedDoc:
|
14
|
-
xdoc:
|
15
|
-
description:
|
14
|
+
xdoc: XDoc | None
|
15
|
+
description: Description | None
|
16
16
|
|
17
17
|
@staticmethod
|
18
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
19
|
-
xdoc:
|
18
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "RelatedDoc":
|
19
|
+
xdoc: XDoc | None = None
|
20
20
|
if (xdoc_elem := et_element.find("XDOC")) is not None:
|
21
21
|
xdoc = XDoc.from_et(xdoc_elem, doc_frags)
|
22
22
|
description = Description.from_et(et_element.find("DESC"), doc_frags)
|
@@ -26,7 +26,7 @@ class RelatedDoc:
|
|
26
26
|
description=description,
|
27
27
|
)
|
28
28
|
|
29
|
-
def _build_odxlinks(self) ->
|
29
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
30
30
|
result = {}
|
31
31
|
|
32
32
|
if self.xdoc:
|
odxtools/request.py
CHANGED
@@ -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, cast
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .admindata import AdminData
|
@@ -29,20 +29,20 @@ class Request(IdentifiableElement):
|
|
29
29
|
|
30
30
|
This class implements the `CompositeCodec` interface.
|
31
31
|
"""
|
32
|
-
admin_data:
|
32
|
+
admin_data: AdminData | None
|
33
33
|
parameters: NamedItemList[Parameter]
|
34
|
-
sdgs:
|
34
|
+
sdgs: list[SpecialDataGroup]
|
35
35
|
|
36
36
|
@property
|
37
|
-
def required_parameters(self) ->
|
37
|
+
def required_parameters(self) -> list[Parameter]:
|
38
38
|
return composite_codec_get_required_parameters(self)
|
39
39
|
|
40
40
|
@property
|
41
|
-
def free_parameters(self) ->
|
41
|
+
def free_parameters(self) -> list[Parameter]:
|
42
42
|
return composite_codec_get_free_parameters(self)
|
43
43
|
|
44
44
|
@staticmethod
|
45
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
45
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "Request":
|
46
46
|
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
47
47
|
|
48
48
|
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
|
@@ -56,7 +56,7 @@ class Request(IdentifiableElement):
|
|
56
56
|
|
57
57
|
return Request(admin_data=admin_data, parameters=parameters, sdgs=sdgs, **kwargs)
|
58
58
|
|
59
|
-
def _build_odxlinks(self) ->
|
59
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
60
60
|
result = {self.odx_id: self}
|
61
61
|
|
62
62
|
if self.admin_data is not None:
|
@@ -96,7 +96,7 @@ class Request(IdentifiableElement):
|
|
96
96
|
context.request = None
|
97
97
|
context.parameters = None
|
98
98
|
|
99
|
-
def get_static_bit_length(self) ->
|
99
|
+
def get_static_bit_length(self) -> int | None:
|
100
100
|
return composite_codec_get_static_bit_length(self)
|
101
101
|
|
102
102
|
def print_free_parameters_info(self) -> None:
|
@@ -123,7 +123,7 @@ class Request(IdentifiableElement):
|
|
123
123
|
|
124
124
|
return cast(ParameterValueDict, param_values)
|
125
125
|
|
126
|
-
def encode_into_pdu(self, physical_value:
|
126
|
+
def encode_into_pdu(self, physical_value: ParameterValue | None,
|
127
127
|
encode_state: EncodeState) -> None:
|
128
128
|
composite_codec_encode_into_pdu(self, physical_value, encode_state)
|
129
129
|
|
odxtools/response.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
3
|
from enum import Enum
|
4
|
-
from typing import Any,
|
4
|
+
from typing import Any, cast
|
5
5
|
from xml.etree import ElementTree
|
6
6
|
|
7
7
|
from .admindata import AdminData
|
@@ -39,12 +39,12 @@ class Response(IdentifiableElement):
|
|
39
39
|
|
40
40
|
response_type: ResponseType
|
41
41
|
|
42
|
-
admin_data:
|
42
|
+
admin_data: AdminData | None
|
43
43
|
parameters: NamedItemList[Parameter]
|
44
|
-
sdgs:
|
44
|
+
sdgs: list[SpecialDataGroup]
|
45
45
|
|
46
46
|
@staticmethod
|
47
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
47
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "Response":
|
48
48
|
"""Reads a response."""
|
49
49
|
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
50
50
|
|
@@ -70,7 +70,7 @@ class Response(IdentifiableElement):
|
|
70
70
|
sdgs=sdgs,
|
71
71
|
**kwargs)
|
72
72
|
|
73
|
-
def _build_odxlinks(self) ->
|
73
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
74
74
|
result = {self.odx_id: self}
|
75
75
|
|
76
76
|
if self.admin_data is not None:
|
@@ -110,7 +110,7 @@ class Response(IdentifiableElement):
|
|
110
110
|
context.response = None
|
111
111
|
context.parameters = None
|
112
112
|
|
113
|
-
def encode(self, coded_request:
|
113
|
+
def encode(self, coded_request: bytes | None = None, **kwargs: ParameterValue) -> bytearray:
|
114
114
|
encode_state = EncodeState(triggering_request=coded_request, is_end_of_pdu=True)
|
115
115
|
|
116
116
|
self.encode_into_pdu(physical_value=kwargs, encode_state=encode_state)
|
@@ -126,22 +126,22 @@ class Response(IdentifiableElement):
|
|
126
126
|
|
127
127
|
return cast(ParameterValueDict, param_values)
|
128
128
|
|
129
|
-
def encode_into_pdu(self, physical_value:
|
129
|
+
def encode_into_pdu(self, physical_value: ParameterValue | None,
|
130
130
|
encode_state: EncodeState) -> None:
|
131
131
|
composite_codec_encode_into_pdu(self, physical_value, encode_state)
|
132
132
|
|
133
133
|
def decode_from_pdu(self, decode_state: DecodeState) -> ParameterValue:
|
134
134
|
return composite_codec_decode_from_pdu(self, decode_state)
|
135
135
|
|
136
|
-
def get_static_bit_length(self) ->
|
136
|
+
def get_static_bit_length(self) -> int | None:
|
137
137
|
return composite_codec_get_static_bit_length(self)
|
138
138
|
|
139
139
|
@property
|
140
|
-
def required_parameters(self) ->
|
140
|
+
def required_parameters(self) -> list[Parameter]:
|
141
141
|
return composite_codec_get_required_parameters(self)
|
142
142
|
|
143
143
|
@property
|
144
|
-
def free_parameters(self) ->
|
144
|
+
def free_parameters(self) -> list[Parameter]:
|
145
145
|
return composite_codec_get_free_parameters(self)
|
146
146
|
|
147
147
|
def print_free_parameters_info(self) -> None:
|
odxtools/scaleconstr.py
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import List, Optional
|
4
3
|
from xml.etree import ElementTree
|
5
4
|
|
6
5
|
from .compumethods.limit import Limit
|
@@ -16,15 +15,15 @@ class ScaleConstr:
|
|
16
15
|
"""This class represents a SCALE-CONSTR.
|
17
16
|
"""
|
18
17
|
|
19
|
-
short_label:
|
20
|
-
description:
|
18
|
+
short_label: str | None
|
19
|
+
description: Description | None
|
21
20
|
lower_limit: Limit
|
22
21
|
upper_limit: Limit
|
23
22
|
validity: ValidType
|
24
23
|
value_type: DataType
|
25
24
|
|
26
25
|
@staticmethod
|
27
|
-
def scale_constr_from_et(et_element: ElementTree.Element, doc_frags:
|
26
|
+
def scale_constr_from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment], *,
|
28
27
|
value_type: DataType) -> "ScaleConstr":
|
29
28
|
short_label = et_element.findtext("SHORT-LABEL")
|
30
29
|
description = Description.from_et(et_element.find("DESC"), doc_frags)
|
odxtools/servicebinner.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
+
from collections.abc import Iterable, Iterator
|
2
3
|
from io import StringIO
|
3
|
-
from typing import Dict, Iterable, Iterator, Optional
|
4
4
|
|
5
5
|
from . import obd, uds
|
6
6
|
from .diagservice import DiagService
|
@@ -21,7 +21,7 @@ class ServiceBinner:
|
|
21
21
|
"""
|
22
22
|
|
23
23
|
def __init__(self, services: Iterable[DiagService]):
|
24
|
-
service_groups:
|
24
|
+
service_groups: dict[int | None, NamedItemList[DiagService]] = {}
|
25
25
|
for service in services:
|
26
26
|
SID = self.__extract_sid(service)
|
27
27
|
|
@@ -32,7 +32,7 @@ class ServiceBinner:
|
|
32
32
|
|
33
33
|
self._service_groups = service_groups
|
34
34
|
|
35
|
-
def __extract_sid(self, service: DiagService) ->
|
35
|
+
def __extract_sid(self, service: DiagService) -> int | None:
|
36
36
|
# diagnostic services without requests are possible; just like
|
37
37
|
# aircraft without wings...
|
38
38
|
if service.request is None:
|
@@ -96,10 +96,10 @@ class ServiceBinner:
|
|
96
96
|
|
97
97
|
return result.getvalue()
|
98
98
|
|
99
|
-
def __iter__(self) -> Iterator[
|
99
|
+
def __iter__(self) -> Iterator[int | None]:
|
100
100
|
return iter(self._service_groups)
|
101
101
|
|
102
|
-
def __getitem__(self, sid:
|
102
|
+
def __getitem__(self, sid: int | None) -> NamedItemList[DiagService]:
|
103
103
|
if sid is None:
|
104
104
|
return self._service_groups.get(sid, NamedItemList())
|
105
105
|
|
odxtools/singleecujob.py
CHANGED
@@ -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 .diagcomm import DiagComm
|
@@ -30,13 +30,13 @@ class SingleEcuJob(DiagComm):
|
|
30
30
|
standard.
|
31
31
|
"""
|
32
32
|
|
33
|
-
prog_codes:
|
33
|
+
prog_codes: list[ProgCode]
|
34
34
|
input_params: NamedItemList[InputParam]
|
35
35
|
output_params: NamedItemList[OutputParam]
|
36
36
|
neg_output_params: NamedItemList[NegOutputParam]
|
37
37
|
|
38
38
|
@staticmethod
|
39
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
39
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "SingleEcuJob":
|
40
40
|
kwargs = dataclass_fields_asdict(DiagComm.from_et(et_element, doc_frags))
|
41
41
|
|
42
42
|
prog_codes = [
|
@@ -64,7 +64,7 @@ class SingleEcuJob(DiagComm):
|
|
64
64
|
neg_output_params=neg_output_params,
|
65
65
|
**kwargs)
|
66
66
|
|
67
|
-
def _build_odxlinks(self) ->
|
67
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
68
68
|
result = super()._build_odxlinks()
|
69
69
|
|
70
70
|
for prog_code in self.prog_codes:
|
odxtools/snrefcontext.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import TYPE_CHECKING,
|
3
|
+
from typing import TYPE_CHECKING, Optional
|
4
4
|
|
5
5
|
if TYPE_CHECKING:
|
6
6
|
from .database import Database
|
@@ -25,5 +25,5 @@ class SnRefContext:
|
|
25
25
|
single_ecu_job: Optional["SingleEcuJob"] = None
|
26
26
|
request: Optional["Request"] = None
|
27
27
|
response: Optional["Response"] = None
|
28
|
-
parameters:
|
28
|
+
parameters: list["Parameter"] | None = None
|
29
29
|
state_chart: Optional["StateChart"] = None
|
odxtools/specialdata.py
CHANGED
@@ -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 .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
|
@@ -10,12 +10,12 @@ from .snrefcontext import SnRefContext
|
|
10
10
|
@dataclass
|
11
11
|
class SpecialData:
|
12
12
|
"""This corresponds to the SD XML tag"""
|
13
|
-
semantic_info:
|
14
|
-
text_identifier:
|
13
|
+
semantic_info: str | None # the "SI" attribute
|
14
|
+
text_identifier: str | None # the "TI" attribute, specifies the language used
|
15
15
|
value: str
|
16
16
|
|
17
17
|
@staticmethod
|
18
|
-
def from_et(et_element: ElementTree.Element, doc_frags:
|
18
|
+
def from_et(et_element: ElementTree.Element, doc_frags: list[OdxDocFragment]) -> "SpecialData":
|
19
19
|
semantic_info = et_element.get("SI")
|
20
20
|
text_identifier = et_element.get("TI")
|
21
21
|
value = et_element.text or ""
|
@@ -23,7 +23,7 @@ class SpecialData:
|
|
23
23
|
return SpecialData(
|
24
24
|
semantic_info=semantic_info, text_identifier=text_identifier, value=value)
|
25
25
|
|
26
|
-
def _build_odxlinks(self) ->
|
26
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
27
27
|
return {}
|
28
28
|
|
29
29
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
odxtools/specialdatagroup.py
CHANGED
@@ -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, Union
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
@@ -12,14 +12,14 @@ from .specialdatagroupcaption import SpecialDataGroupCaption
|
|
12
12
|
@dataclass
|
13
13
|
class SpecialDataGroup:
|
14
14
|
"""This corresponds to the SDG XML tag"""
|
15
|
-
sdg_caption:
|
16
|
-
sdg_caption_ref:
|
17
|
-
values:
|
18
|
-
semantic_info:
|
15
|
+
sdg_caption: SpecialDataGroupCaption | None
|
16
|
+
sdg_caption_ref: OdxLinkRef | None
|
17
|
+
values: list[Union["SpecialDataGroup", SpecialData]]
|
18
|
+
semantic_info: str | None # the "SI" attribute
|
19
19
|
|
20
20
|
@staticmethod
|
21
21
|
def from_et(et_element: ElementTree.Element,
|
22
|
-
doc_frags:
|
22
|
+
doc_frags: list[OdxDocFragment]) -> "SpecialDataGroup":
|
23
23
|
|
24
24
|
sdg_caption = None
|
25
25
|
if caption_elem := et_element.find("SDG-CAPTION"):
|
@@ -31,9 +31,9 @@ class SpecialDataGroup:
|
|
31
31
|
|
32
32
|
semantic_info = et_element.get("SI")
|
33
33
|
|
34
|
-
values:
|
34
|
+
values: list[SpecialData | SpecialDataGroup] = []
|
35
35
|
for value_elem in et_element:
|
36
|
-
next_entry:
|
36
|
+
next_entry: SpecialData | SpecialDataGroup | None = None
|
37
37
|
if value_elem.tag == "SDG":
|
38
38
|
next_entry = SpecialDataGroup.from_et(value_elem, doc_frags)
|
39
39
|
elif value_elem.tag == "SD":
|
@@ -49,7 +49,7 @@ class SpecialDataGroup:
|
|
49
49
|
values=values,
|
50
50
|
)
|
51
51
|
|
52
|
-
def _build_odxlinks(self) ->
|
52
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
53
53
|
result = {}
|
54
54
|
|
55
55
|
if self.sdg_caption_ref is None and self.sdg_caption is not None:
|