odxtools 9.7.0__py3-none-any.whl → 10.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- odxtools/additionalaudience.py +7 -7
- odxtools/admindata.py +14 -13
- odxtools/audience.py +17 -17
- odxtools/basecomparam.py +9 -8
- odxtools/basevariantpattern.py +9 -10
- odxtools/basicstructure.py +15 -15
- odxtools/cli/_print_utils.py +34 -22
- odxtools/cli/browse.py +8 -8
- odxtools/cli/compare.py +24 -24
- odxtools/cli/decode.py +3 -4
- odxtools/cli/find.py +4 -5
- odxtools/cli/list.py +6 -6
- odxtools/cli/main.py +2 -2
- odxtools/cli/snoop.py +3 -3
- odxtools/codec.py +3 -3
- odxtools/commrelation.py +18 -17
- odxtools/companydata.py +13 -13
- odxtools/companydocinfo.py +15 -17
- odxtools/companyrevisioninfo.py +9 -9
- odxtools/companyspecificinfo.py +11 -13
- odxtools/comparam.py +8 -7
- odxtools/comparaminstance.py +14 -14
- odxtools/comparamspec.py +10 -11
- odxtools/comparamsubset.py +17 -25
- odxtools/complexcomparam.py +14 -14
- odxtools/complexdop.py +1 -1
- odxtools/compositecodec.py +8 -8
- odxtools/compumethods/compucodecompumethod.py +7 -7
- odxtools/compumethods/compuconst.py +5 -6
- odxtools/compumethods/compudefaultvalue.py +2 -3
- odxtools/compumethods/compuinternaltophys.py +13 -12
- odxtools/compumethods/compumethod.py +10 -9
- odxtools/compumethods/compuphystointernal.py +13 -12
- odxtools/compumethods/compurationalcoeffs.py +7 -7
- odxtools/compumethods/compuscale.py +15 -16
- odxtools/compumethods/createanycompumethod.py +12 -13
- odxtools/compumethods/identicalcompumethod.py +4 -5
- odxtools/compumethods/limit.py +14 -14
- odxtools/compumethods/linearcompumethod.py +5 -5
- odxtools/compumethods/linearsegment.py +10 -11
- odxtools/compumethods/ratfunccompumethod.py +6 -6
- odxtools/compumethods/ratfuncsegment.py +7 -8
- odxtools/compumethods/scalelinearcompumethod.py +9 -9
- odxtools/compumethods/scaleratfunccompumethod.py +7 -7
- odxtools/compumethods/tabintpcompumethod.py +10 -13
- odxtools/compumethods/texttablecompumethod.py +6 -6
- odxtools/createanycomparam.py +5 -7
- odxtools/createanydiagcodedtype.py +7 -8
- odxtools/database.py +34 -31
- odxtools/dataobjectproperty.py +19 -20
- odxtools/decodestate.py +5 -5
- odxtools/description.py +9 -9
- odxtools/determinenumberofitems.py +8 -7
- odxtools/diagcodedtype.py +10 -10
- odxtools/diagcomm.py +29 -30
- odxtools/diagdatadictionaryspec.py +36 -36
- odxtools/diaglayercontainer.py +35 -34
- odxtools/diaglayers/basevariant.py +14 -12
- odxtools/diaglayers/basevariantraw.py +22 -23
- odxtools/diaglayers/diaglayer.py +24 -22
- odxtools/diaglayers/diaglayerraw.py +43 -52
- odxtools/diaglayers/diaglayertype.py +1 -2
- odxtools/diaglayers/ecushareddata.py +9 -9
- odxtools/diaglayers/ecushareddataraw.py +15 -16
- odxtools/diaglayers/ecuvariant.py +15 -13
- odxtools/diaglayers/ecuvariantraw.py +21 -22
- odxtools/diaglayers/functionalgroup.py +12 -11
- odxtools/diaglayers/functionalgroupraw.py +17 -18
- odxtools/diaglayers/hierarchyelement.py +48 -54
- odxtools/diaglayers/hierarchyelementraw.py +10 -11
- odxtools/diaglayers/protocol.py +7 -7
- odxtools/diaglayers/protocolraw.py +13 -14
- odxtools/diagnostictroublecode.py +15 -17
- odxtools/diagservice.py +28 -27
- odxtools/diagvariable.py +24 -25
- odxtools/docrevision.py +18 -17
- odxtools/dopbase.py +13 -14
- odxtools/dtcconnector.py +8 -7
- odxtools/dtcdop.py +24 -20
- odxtools/dynamicendmarkerfield.py +10 -9
- odxtools/dynamiclengthfield.py +10 -9
- odxtools/dyndefinedspec.py +10 -10
- odxtools/dynenddopref.py +9 -9
- odxtools/dyniddefmodeinfo.py +21 -21
- odxtools/ecuvariantpattern.py +8 -10
- odxtools/element.py +12 -13
- odxtools/encodestate.py +11 -11
- odxtools/encoding.py +2 -3
- odxtools/endofpdufield.py +9 -10
- odxtools/envdataconnector.py +8 -8
- odxtools/environmentdata.py +7 -9
- odxtools/environmentdatadescription.py +18 -17
- odxtools/exceptions.py +5 -5
- odxtools/externalaccessmethod.py +4 -6
- odxtools/externaldoc.py +6 -6
- odxtools/field.py +15 -15
- odxtools/functionalclass.py +9 -9
- odxtools/inputparam.py +11 -10
- odxtools/internalconstr.py +10 -11
- odxtools/isotp_state_machine.py +12 -11
- odxtools/leadinglengthinfotype.py +4 -6
- odxtools/library.py +9 -8
- odxtools/linkeddtcdop.py +9 -8
- odxtools/loadfile.py +5 -6
- odxtools/matchingbasevariantparameter.py +5 -6
- odxtools/matchingparameter.py +10 -10
- odxtools/message.py +1 -1
- odxtools/minmaxlengthtype.py +6 -7
- odxtools/modification.py +7 -6
- odxtools/multiplexer.py +54 -18
- odxtools/multiplexercase.py +13 -13
- odxtools/multiplexerdefaultcase.py +11 -10
- odxtools/multiplexerswitchkey.py +8 -8
- odxtools/nameditemlist.py +13 -13
- odxtools/negoutputparam.py +8 -8
- odxtools/obd.py +1 -2
- odxtools/odxcategory.py +14 -26
- odxtools/odxdoccontext.py +16 -0
- odxtools/odxlink.py +23 -25
- odxtools/odxtypes.py +18 -15
- odxtools/outputparam.py +9 -8
- odxtools/parameterinfo.py +1 -1
- odxtools/parameters/codedconstparameter.py +10 -10
- odxtools/parameters/createanyparameter.py +15 -16
- odxtools/parameters/dynamicparameter.py +5 -7
- odxtools/parameters/lengthkeyparameter.py +10 -10
- odxtools/parameters/matchingrequestparameter.py +6 -7
- odxtools/parameters/nrcconstparameter.py +13 -13
- odxtools/parameters/parameter.py +17 -18
- odxtools/parameters/parameterwithdop.py +13 -13
- odxtools/parameters/physicalconstantparameter.py +8 -7
- odxtools/parameters/reservedparameter.py +6 -8
- odxtools/parameters/systemparameter.py +5 -7
- odxtools/parameters/tableentryparameter.py +8 -8
- odxtools/parameters/tablekeyparameter.py +17 -17
- odxtools/parameters/tablestructparameter.py +11 -11
- odxtools/parameters/valueparameter.py +11 -11
- odxtools/paramlengthinfotype.py +10 -9
- odxtools/parentref.py +15 -13
- odxtools/physicaldimension.py +15 -15
- odxtools/physicaltype.py +5 -6
- odxtools/posresponsesuppressible.py +11 -12
- odxtools/preconditionstateref.py +11 -11
- odxtools/progcode.py +11 -10
- odxtools/protstack.py +10 -9
- odxtools/relateddiagcommref.py +5 -6
- odxtools/relateddoc.py +11 -10
- odxtools/request.py +18 -19
- odxtools/response.py +19 -20
- odxtools/scaleconstr.py +8 -9
- odxtools/servicebinner.py +5 -5
- odxtools/singleecujob.py +16 -15
- odxtools/snrefcontext.py +3 -3
- odxtools/specialdata.py +8 -7
- odxtools/specialdatagroup.py +17 -17
- odxtools/specialdatagroupcaption.py +7 -6
- odxtools/standardlengthtype.py +14 -22
- odxtools/state.py +7 -6
- odxtools/statechart.py +12 -11
- odxtools/statemachine.py +4 -3
- odxtools/statetransition.py +9 -9
- odxtools/statetransitionref.py +19 -19
- odxtools/staticfield.py +9 -7
- odxtools/structure.py +5 -6
- odxtools/subcomponent.py +20 -18
- odxtools/subcomponentparamconnector.py +10 -9
- odxtools/subcomponentpattern.py +9 -9
- odxtools/swvariable.py +6 -7
- odxtools/table.py +25 -26
- odxtools/tablediagcommconnector.py +9 -8
- odxtools/tablerow.py +64 -43
- odxtools/tablerowconnector.py +8 -8
- odxtools/teammember.py +16 -15
- odxtools/templates/macros/printParentRef.xml.jinja2 +3 -1
- odxtools/text.py +4 -5
- odxtools/uds.py +2 -3
- odxtools/unit.py +14 -13
- odxtools/unitgroup.py +11 -10
- odxtools/unitspec.py +18 -19
- odxtools/utils.py +3 -3
- odxtools/variablegroup.py +5 -6
- odxtools/variantmatcher.py +10 -10
- odxtools/variantpattern.py +5 -6
- odxtools/version.py +2 -2
- odxtools/writepdxfile.py +5 -24
- odxtools/xdoc.py +13 -12
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/METADATA +4 -5
- odxtools-10.1.0.dist-info/RECORD +265 -0
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/WHEEL +1 -1
- odxtools-9.7.0.dist-info/RECORD +0 -264
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/entry_points.txt +0 -0
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/licenses/LICENSE +0 -0
- {odxtools-9.7.0.dist-info → odxtools-10.1.0.dist-info}/top_level.txt +0 -0
odxtools/statechart.py
CHANGED
@@ -1,40 +1,41 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .element import IdentifiableElement
|
7
7
|
from .exceptions import odxrequire
|
8
8
|
from .nameditemlist import NamedItemList
|
9
|
-
from .
|
9
|
+
from .odxdoccontext import OdxDocContext
|
10
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, resolve_snref
|
10
11
|
from .snrefcontext import SnRefContext
|
11
12
|
from .state import State
|
12
13
|
from .statetransition import StateTransition
|
13
14
|
from .utils import dataclass_fields_asdict
|
14
15
|
|
15
16
|
|
16
|
-
@dataclass
|
17
|
+
@dataclass(kw_only=True)
|
17
18
|
class StateChart(IdentifiableElement):
|
18
19
|
"""
|
19
20
|
Corresponds to STATE-CHART.
|
20
21
|
"""
|
21
22
|
semantic: str
|
22
|
-
state_transitions:
|
23
|
+
state_transitions: list[StateTransition] = field(default_factory=list)
|
23
24
|
start_state_snref: str
|
24
|
-
states: NamedItemList[State]
|
25
|
+
states: NamedItemList[State] = field(default_factory=NamedItemList)
|
25
26
|
|
26
27
|
@property
|
27
28
|
def start_state(self) -> State:
|
28
29
|
return self._start_state
|
29
30
|
|
30
31
|
@staticmethod
|
31
|
-
def from_et(et_element: ElementTree.Element,
|
32
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element,
|
32
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "StateChart":
|
33
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
33
34
|
|
34
35
|
semantic: str = odxrequire(et_element.findtext("SEMANTIC"))
|
35
36
|
|
36
37
|
state_transitions = [
|
37
|
-
StateTransition.from_et(st_elem,
|
38
|
+
StateTransition.from_et(st_elem, context)
|
38
39
|
for st_elem in et_element.iterfind("STATE-TRANSITIONS/STATE-TRANSITION")
|
39
40
|
]
|
40
41
|
|
@@ -42,7 +43,7 @@ class StateChart(IdentifiableElement):
|
|
42
43
|
start_state_snref = start_state_snref_elem.attrib["SHORT-NAME"]
|
43
44
|
|
44
45
|
states = [
|
45
|
-
State.from_et(st_elem,
|
46
|
+
State.from_et(st_elem, context) for st_elem in et_element.iterfind("STATES/STATE")
|
46
47
|
]
|
47
48
|
|
48
49
|
return StateChart(
|
@@ -52,7 +53,7 @@ class StateChart(IdentifiableElement):
|
|
52
53
|
states=NamedItemList(states),
|
53
54
|
**kwargs)
|
54
55
|
|
55
|
-
def _build_odxlinks(self) ->
|
56
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
56
57
|
odxlinks = {self.odx_id: self}
|
57
58
|
|
58
59
|
for strans in self.state_transitions:
|
odxtools/statemachine.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
+
from collections.abc import Generator
|
2
3
|
from dataclasses import dataclass
|
3
|
-
from typing import TYPE_CHECKING, Any
|
4
|
+
from typing import TYPE_CHECKING, Any
|
4
5
|
|
5
6
|
from .exceptions import odxraise
|
6
7
|
from .odxtypes import ParameterValueDict
|
@@ -12,7 +13,7 @@ if TYPE_CHECKING:
|
|
12
13
|
from .diagservice import DiagService
|
13
14
|
|
14
15
|
|
15
|
-
@dataclass
|
16
|
+
@dataclass(kw_only=True)
|
16
17
|
class StateMachine:
|
17
18
|
"""Objects of this class represent the runtime state of a state chart
|
18
19
|
|
@@ -97,7 +98,7 @@ class StateMachine:
|
|
97
98
|
self._active_state = state_chart.start_state
|
98
99
|
|
99
100
|
def execute(self, service: "DiagService", **service_params: Any
|
100
|
-
) -> Generator[bytes,
|
101
|
+
) -> Generator[bytes, bytes | bytearray | ParameterValueDict, None]:
|
101
102
|
"""Run a diagnostic service and update the state machine
|
102
103
|
depending on the outcome.
|
103
104
|
|
odxtools/statetransition.py
CHANGED
@@ -1,25 +1,26 @@
|
|
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
|
7
7
|
from .exceptions import odxrequire
|
8
8
|
from .externalaccessmethod import ExternalAccessMethod
|
9
|
-
from .
|
9
|
+
from .odxdoccontext import OdxDocContext
|
10
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, resolve_snref
|
10
11
|
from .snrefcontext import SnRefContext
|
11
12
|
from .state import State
|
12
13
|
from .utils import dataclass_fields_asdict
|
13
14
|
|
14
15
|
|
15
|
-
@dataclass
|
16
|
+
@dataclass(kw_only=True)
|
16
17
|
class StateTransition(IdentifiableElement):
|
17
18
|
"""
|
18
19
|
Corresponds to STATE-TRANSITION.
|
19
20
|
"""
|
20
21
|
source_snref: str
|
21
22
|
target_snref: str
|
22
|
-
external_access_method:
|
23
|
+
external_access_method: ExternalAccessMethod | None = None
|
23
24
|
|
24
25
|
@property
|
25
26
|
def source_state(self) -> State:
|
@@ -30,10 +31,9 @@ class StateTransition(IdentifiableElement):
|
|
30
31
|
return self._target_state
|
31
32
|
|
32
33
|
@staticmethod
|
33
|
-
def from_et(et_element: ElementTree.Element,
|
34
|
-
doc_frags: List[OdxDocFragment]) -> "StateTransition":
|
34
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "StateTransition":
|
35
35
|
|
36
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element,
|
36
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
37
37
|
|
38
38
|
source_snref_elem = odxrequire(et_element.find("SOURCE-SNREF"))
|
39
39
|
source_snref = odxrequire(source_snref_elem.attrib["SHORT-NAME"])
|
@@ -43,14 +43,14 @@ class StateTransition(IdentifiableElement):
|
|
43
43
|
|
44
44
|
external_access_method = None
|
45
45
|
if (eam_elem := et_element.find("EXTERNAL-ACCESS-METHOD")) is not None:
|
46
|
-
external_access_method = ExternalAccessMethod.from_et(eam_elem,
|
46
|
+
external_access_method = ExternalAccessMethod.from_et(eam_elem, context)
|
47
47
|
return StateTransition(
|
48
48
|
source_snref=source_snref,
|
49
49
|
target_snref=target_snref,
|
50
50
|
external_access_method=external_access_method,
|
51
51
|
**kwargs)
|
52
52
|
|
53
|
-
def _build_odxlinks(self) ->
|
53
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
54
54
|
return {self.odx_id: self}
|
55
55
|
|
56
56
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
odxtools/statetransitionref.py
CHANGED
@@ -1,12 +1,13 @@
|
|
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, Union
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .basicstructure import BasicStructure
|
7
7
|
from .dataobjectproperty import DataObjectProperty
|
8
8
|
from .exceptions import odxassert, odxraise, odxrequire
|
9
|
-
from .
|
9
|
+
from .odxdoccontext import OdxDocContext
|
10
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
|
10
11
|
from .odxtypes import ParameterValue, ParameterValueDict
|
11
12
|
from .parameters.codedconstparameter import CodedConstParameter
|
12
13
|
from .parameters.parameter import Parameter
|
@@ -27,11 +28,11 @@ if TYPE_CHECKING:
|
|
27
28
|
|
28
29
|
|
29
30
|
def _resolve_in_param(
|
30
|
-
in_param_if_snref:
|
31
|
-
in_param_if_snpathref:
|
32
|
-
params:
|
31
|
+
in_param_if_snref: str | None,
|
32
|
+
in_param_if_snpathref: str | None,
|
33
|
+
params: list[Parameter],
|
33
34
|
param_dict: ParameterValueDict,
|
34
|
-
) ->
|
35
|
+
) -> tuple[Parameter | None, ParameterValue | None]:
|
35
36
|
|
36
37
|
if in_param_if_snref is not None:
|
37
38
|
path_chunks = [in_param_if_snref]
|
@@ -44,10 +45,10 @@ def _resolve_in_param(
|
|
44
45
|
|
45
46
|
|
46
47
|
def _resolve_in_param_helper(
|
47
|
-
params:
|
48
|
+
params: list[Parameter],
|
48
49
|
param_dict: ParameterValueDict,
|
49
|
-
path_chunks:
|
50
|
-
) ->
|
50
|
+
path_chunks: list[str],
|
51
|
+
) -> tuple[Parameter | None, ParameterValue | None]:
|
51
52
|
|
52
53
|
inner_param = resolve_snref(path_chunks[0], params, Parameter, lenient=True)
|
53
54
|
if inner_param is None:
|
@@ -90,7 +91,7 @@ def _resolve_in_param_helper(
|
|
90
91
|
|
91
92
|
def _check_applies(ref: Union["StateTransitionRef",
|
92
93
|
"PreConditionStateRef"], state_machine: "StateMachine",
|
93
|
-
params:
|
94
|
+
params: list[Parameter], param_value_dict: ParameterValueDict) -> bool:
|
94
95
|
if state_machine.active_state != ref.state:
|
95
96
|
# if the active state of the state machine is not the
|
96
97
|
# specified one, the precondition does not apply
|
@@ -146,7 +147,7 @@ def _check_applies(ref: Union["StateTransitionRef",
|
|
146
147
|
return True
|
147
148
|
|
148
149
|
|
149
|
-
@dataclass
|
150
|
+
@dataclass(kw_only=True)
|
150
151
|
class StateTransitionRef(OdxLinkRef):
|
151
152
|
"""Describes a state transition that is to be potentially taken if
|
152
153
|
a diagnostic communication is executed
|
@@ -155,10 +156,10 @@ class StateTransitionRef(OdxLinkRef):
|
|
155
156
|
may also be conditional on the observed response of the ECU.
|
156
157
|
|
157
158
|
"""
|
158
|
-
value:
|
159
|
+
value: str | None = None
|
159
160
|
|
160
|
-
in_param_if_snref:
|
161
|
-
in_param_if_snpathref:
|
161
|
+
in_param_if_snref: str | None = None
|
162
|
+
in_param_if_snpathref: str | None = None
|
162
163
|
|
163
164
|
@property
|
164
165
|
def state_transition(self) -> StateTransition:
|
@@ -170,9 +171,8 @@ class StateTransitionRef(OdxLinkRef):
|
|
170
171
|
|
171
172
|
@staticmethod
|
172
173
|
def from_et( # type: ignore[override]
|
173
|
-
et_element: ElementTree.Element,
|
174
|
-
|
175
|
-
kwargs = dataclass_fields_asdict(OdxLinkRef.from_et(et_element, doc_frags))
|
174
|
+
et_element: ElementTree.Element, context: OdxDocContext) -> "StateTransitionRef":
|
175
|
+
kwargs = dataclass_fields_asdict(OdxLinkRef.from_et(et_element, context))
|
176
176
|
|
177
177
|
value = et_element.findtext("VALUE")
|
178
178
|
|
@@ -195,7 +195,7 @@ class StateTransitionRef(OdxLinkRef):
|
|
195
195
|
odxassert(self.in_param_if_snref is not None or self.in_param_if_snref is not None,
|
196
196
|
"If VALUE is specified, a parameter must be referenced")
|
197
197
|
|
198
|
-
def _build_odxlinks(self) ->
|
198
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
199
199
|
return {}
|
200
200
|
|
201
201
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
@@ -204,7 +204,7 @@ class StateTransitionRef(OdxLinkRef):
|
|
204
204
|
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
205
205
|
pass
|
206
206
|
|
207
|
-
def execute(self, state_machine: StateMachine, params:
|
207
|
+
def execute(self, state_machine: StateMachine, params: list[Parameter],
|
208
208
|
param_value_dict: ParameterValueDict) -> bool:
|
209
209
|
"""Update a StateMachine object if the state transition ought
|
210
210
|
to be executed based on the response received after executing a
|
odxtools/staticfield.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
+
from collections.abc import Sequence
|
2
3
|
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
4
|
+
from typing import Any
|
4
5
|
from xml.etree import ElementTree
|
5
6
|
|
6
7
|
from typing_extensions import override
|
@@ -9,13 +10,14 @@ from .decodestate import DecodeState
|
|
9
10
|
from .encodestate import EncodeState
|
10
11
|
from .exceptions import odxassert, odxraise, odxrequire
|
11
12
|
from .field import Field
|
12
|
-
from .
|
13
|
+
from .odxdoccontext import OdxDocContext
|
14
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
13
15
|
from .odxtypes import ParameterValue
|
14
16
|
from .snrefcontext import SnRefContext
|
15
17
|
from .utils import dataclass_fields_asdict
|
16
18
|
|
17
19
|
|
18
|
-
@dataclass
|
20
|
+
@dataclass(kw_only=True)
|
19
21
|
class StaticField(Field):
|
20
22
|
"""Array of a fixed number of structure objects"""
|
21
23
|
fixed_number_of_items: int
|
@@ -23,8 +25,8 @@ class StaticField(Field):
|
|
23
25
|
|
24
26
|
@staticmethod
|
25
27
|
@override
|
26
|
-
def from_et(et_element: ElementTree.Element,
|
27
|
-
kwargs = dataclass_fields_asdict(Field.from_et(et_element,
|
28
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "StaticField":
|
29
|
+
kwargs = dataclass_fields_asdict(Field.from_et(et_element, context))
|
28
30
|
|
29
31
|
fixed_number_of_items = int(odxrequire(et_element.findtext('FIXED-NUMBER-OF-ITEMS')))
|
30
32
|
item_byte_size = int(odxrequire(et_element.findtext('ITEM-BYTE-SIZE')))
|
@@ -33,7 +35,7 @@ class StaticField(Field):
|
|
33
35
|
fixed_number_of_items=fixed_number_of_items, item_byte_size=item_byte_size, **kwargs)
|
34
36
|
|
35
37
|
@override
|
36
|
-
def _build_odxlinks(self) ->
|
38
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
37
39
|
odxlinks = super()._build_odxlinks()
|
38
40
|
return odxlinks
|
39
41
|
|
@@ -89,7 +91,7 @@ class StaticField(Field):
|
|
89
91
|
orig_origin = decode_state.origin_byte_position
|
90
92
|
decode_state.origin_byte_position = decode_state.cursor_byte_position
|
91
93
|
|
92
|
-
result:
|
94
|
+
result: list[ParameterValue] = []
|
93
95
|
for _ in range(self.fixed_number_of_items):
|
94
96
|
orig_cursor = decode_state.cursor_byte_position
|
95
97
|
|
odxtools/structure.py
CHANGED
@@ -1,26 +1,25 @@
|
|
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 .basicstructure import BasicStructure
|
7
|
-
from .
|
6
|
+
from .odxdoccontext import OdxDocContext
|
8
7
|
from .odxtypes import odxstr_to_bool
|
9
8
|
from .utils import dataclass_fields_asdict
|
10
9
|
|
11
10
|
|
12
|
-
@dataclass
|
11
|
+
@dataclass(kw_only=True)
|
13
12
|
class Structure(BasicStructure):
|
14
|
-
is_visible_raw:
|
13
|
+
is_visible_raw: bool | None = None
|
15
14
|
|
16
15
|
@property
|
17
16
|
def is_visible(self) -> bool:
|
18
17
|
return self.is_visible_raw in (True, None)
|
19
18
|
|
20
19
|
@staticmethod
|
21
|
-
def from_et(et_element: ElementTree.Element,
|
20
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "Structure":
|
22
21
|
"""Read a STRUCTURE element from XML."""
|
23
|
-
kwargs = dataclass_fields_asdict(BasicStructure.from_et(et_element,
|
22
|
+
kwargs = dataclass_fields_asdict(BasicStructure.from_et(et_element, context))
|
24
23
|
|
25
24
|
is_visible_raw = odxstr_to_bool(et_element.get("IS-VISIBLE"))
|
26
25
|
|
odxtools/subcomponent.py
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .dtcconnector import DtcConnector
|
7
7
|
from .element import IdentifiableElement
|
8
8
|
from .envdataconnector import EnvDataConnector
|
9
9
|
from .nameditemlist import NamedItemList
|
10
|
-
from .
|
10
|
+
from .odxdoccontext import OdxDocContext
|
11
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
11
12
|
from .snrefcontext import SnRefContext
|
12
13
|
from .subcomponentparamconnector import SubComponentParamConnector
|
13
14
|
from .subcomponentpattern import SubComponentPattern
|
@@ -15,7 +16,7 @@ from .tablerowconnector import TableRowConnector
|
|
15
16
|
from .utils import dataclass_fields_asdict
|
16
17
|
|
17
18
|
|
18
|
-
@dataclass
|
19
|
+
@dataclass(kw_only=True)
|
19
20
|
class SubComponent(IdentifiableElement):
|
20
21
|
"""Sub-components describe collections of related diagnostic variables
|
21
22
|
|
@@ -25,38 +26,39 @@ class SubComponent(IdentifiableElement):
|
|
25
26
|
|
26
27
|
"""
|
27
28
|
|
28
|
-
sub_component_patterns:
|
29
|
-
sub_component_param_connectors: NamedItemList[SubComponentParamConnector]
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
sub_component_patterns: list[SubComponentPattern] = field(default_factory=list)
|
30
|
+
sub_component_param_connectors: NamedItemList[SubComponentParamConnector] = field(
|
31
|
+
default_factory=NamedItemList)
|
32
|
+
table_row_connectors: NamedItemList[TableRowConnector] = field(default_factory=NamedItemList)
|
33
|
+
env_data_connectors: NamedItemList[EnvDataConnector] = field(default_factory=NamedItemList)
|
34
|
+
dtc_connectors: NamedItemList[DtcConnector] = field(default_factory=NamedItemList)
|
33
35
|
|
34
|
-
semantic:
|
36
|
+
semantic: str | None = None
|
35
37
|
|
36
38
|
@staticmethod
|
37
|
-
def from_et(et_element: ElementTree.Element,
|
38
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element,
|
39
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "SubComponent":
|
40
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
39
41
|
|
40
42
|
semantic = et_element.get("SEMANTIC")
|
41
43
|
|
42
44
|
sub_component_patterns = [
|
43
|
-
SubComponentPattern.from_et(el,
|
45
|
+
SubComponentPattern.from_et(el, context)
|
44
46
|
for el in et_element.iterfind("SUB-COMPONENT-PATTERNS/SUB-COMPONENT-PATTERN")
|
45
47
|
]
|
46
48
|
sub_component_param_connectors = [
|
47
|
-
SubComponentParamConnector.from_et(el,
|
49
|
+
SubComponentParamConnector.from_et(el, context) for el in et_element.iterfind(
|
48
50
|
"SUB-COMPONENT-PARAM-CONNECTORS/SUB-COMPONENT-PARAM-CONNECTOR")
|
49
51
|
]
|
50
52
|
table_row_connectors = [
|
51
|
-
TableRowConnector.from_et(el,
|
53
|
+
TableRowConnector.from_et(el, context)
|
52
54
|
for el in et_element.iterfind("TABLE-ROW-CONNECTORS/TABLE-ROW-CONNECTOR")
|
53
55
|
]
|
54
56
|
env_data_connectors = [
|
55
|
-
EnvDataConnector.from_et(el,
|
57
|
+
EnvDataConnector.from_et(el, context)
|
56
58
|
for el in et_element.iterfind("ENV-DATA-CONNECTORS/ENV-DATA-CONNECTOR")
|
57
59
|
]
|
58
60
|
dtc_connectors = [
|
59
|
-
DtcConnector.from_et(el,
|
61
|
+
DtcConnector.from_et(el, context)
|
60
62
|
for el in et_element.iterfind("DTC-CONNECTORS/DTC-CONNECTOR")
|
61
63
|
]
|
62
64
|
|
@@ -69,7 +71,7 @@ class SubComponent(IdentifiableElement):
|
|
69
71
|
dtc_connectors=NamedItemList(dtc_connectors),
|
70
72
|
**kwargs)
|
71
73
|
|
72
|
-
def _build_odxlinks(self) ->
|
74
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
73
75
|
result = {}
|
74
76
|
|
75
77
|
for scp in self.sub_component_patterns:
|
@@ -1,25 +1,26 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
3
|
-
from typing import Any
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .diagservice import DiagService
|
7
7
|
from .element import IdentifiableElement
|
8
8
|
from .exceptions import odxassert, odxraise, odxrequire
|
9
9
|
from .nameditemlist import NamedItemList
|
10
|
-
from .
|
10
|
+
from .odxdoccontext import OdxDocContext
|
11
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId, resolve_snref
|
11
12
|
from .parameters.parameter import Parameter
|
12
13
|
from .snrefcontext import SnRefContext
|
13
14
|
from .utils import dataclass_fields_asdict
|
14
15
|
|
15
16
|
|
16
|
-
@dataclass
|
17
|
+
@dataclass(kw_only=True)
|
17
18
|
class SubComponentParamConnector(IdentifiableElement):
|
18
19
|
diag_comm_snref: str
|
19
20
|
|
20
21
|
# TODO: we currently only support SNREFs, not SNPATHREFs
|
21
|
-
out_param_if_refs:
|
22
|
-
in_param_if_refs:
|
22
|
+
out_param_if_refs: list[str] = field(default_factory=list)
|
23
|
+
in_param_if_refs: list[str] = field(default_factory=list)
|
23
24
|
|
24
25
|
@property
|
25
26
|
def service(self) -> DiagService:
|
@@ -35,8 +36,8 @@ class SubComponentParamConnector(IdentifiableElement):
|
|
35
36
|
|
36
37
|
@staticmethod
|
37
38
|
def from_et(et_element: ElementTree.Element,
|
38
|
-
|
39
|
-
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element,
|
39
|
+
context: OdxDocContext) -> "SubComponentParamConnector":
|
40
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, context))
|
40
41
|
|
41
42
|
diag_comm_snref = odxrequire(
|
42
43
|
odxrequire(et_element.find("DIAG-COMM-SNREF")).get("SHORT-NAME"))
|
@@ -65,7 +66,7 @@ class SubComponentParamConnector(IdentifiableElement):
|
|
65
66
|
in_param_if_refs=in_param_if_refs,
|
66
67
|
**kwargs)
|
67
68
|
|
68
|
-
def _build_odxlinks(self) ->
|
69
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
69
70
|
return {}
|
70
71
|
|
71
72
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
odxtools/subcomponentpattern.py
CHANGED
@@ -1,32 +1,32 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
|
-
from dataclasses import dataclass
|
3
|
-
from typing import TYPE_CHECKING, Any
|
2
|
+
from dataclasses import dataclass, field
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
|
-
from .
|
6
|
+
from .odxdoccontext import OdxDocContext
|
7
|
+
from .odxlink import OdxLinkDatabase, OdxLinkId
|
7
8
|
from .snrefcontext import SnRefContext
|
8
9
|
|
9
10
|
if TYPE_CHECKING:
|
10
11
|
from .matchingparameter import MatchingParameter
|
11
12
|
|
12
13
|
|
13
|
-
@dataclass
|
14
|
+
@dataclass(kw_only=True)
|
14
15
|
class SubComponentPattern:
|
15
|
-
matching_parameters:
|
16
|
+
matching_parameters: list["MatchingParameter"] = field(default_factory=list)
|
16
17
|
|
17
18
|
@staticmethod
|
18
|
-
def from_et(et_element: ElementTree.Element,
|
19
|
-
doc_frags: List[OdxDocFragment]) -> "SubComponentPattern":
|
19
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "SubComponentPattern":
|
20
20
|
from .matchingparameter import MatchingParameter
|
21
21
|
|
22
22
|
matching_parameters = [
|
23
|
-
MatchingParameter.from_et(el,
|
23
|
+
MatchingParameter.from_et(el, context)
|
24
24
|
for el in et_element.iterfind("MATCHING-PARAMETERS/MATCHING-PARAMETER")
|
25
25
|
]
|
26
26
|
|
27
27
|
return SubComponentPattern(matching_parameters=matching_parameters)
|
28
28
|
|
29
|
-
def _build_odxlinks(self) ->
|
29
|
+
def _build_odxlinks(self) -> dict[OdxLinkId, Any]:
|
30
30
|
result = {}
|
31
31
|
for mp in self.matching_parameters:
|
32
32
|
result.update(mp._build_odxlinks())
|
odxtools/swvariable.py
CHANGED
@@ -1,21 +1,20 @@
|
|
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 .element import NamedElement
|
7
|
-
from .
|
6
|
+
from .odxdoccontext import OdxDocContext
|
8
7
|
from .utils import dataclass_fields_asdict
|
9
8
|
|
10
9
|
|
11
|
-
@dataclass
|
10
|
+
@dataclass(kw_only=True)
|
12
11
|
class SwVariable(NamedElement):
|
13
|
-
origin:
|
14
|
-
oid:
|
12
|
+
origin: str | None = None
|
13
|
+
oid: str | None = None
|
15
14
|
|
16
15
|
@staticmethod
|
17
|
-
def from_et(et_element: ElementTree.Element,
|
18
|
-
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element,
|
16
|
+
def from_et(et_element: ElementTree.Element, context: OdxDocContext) -> "SwVariable":
|
17
|
+
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, context))
|
19
18
|
|
20
19
|
origin = et_element.findtext("ORIGIN")
|
21
20
|
oid = et_element.attrib.get("OID")
|