odxtools 8.2.0__py3-none-any.whl → 8.3.1__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/diaglayers/diaglayer.py +10 -0
- odxtools/diaglayers/diaglayerraw.py +27 -2
- odxtools/diagservice.py +3 -1
- odxtools/library.py +66 -0
- odxtools/minmaxlengthtype.py +1 -1
- odxtools/progcode.py +8 -4
- odxtools/subcomponent.py +288 -0
- odxtools/templates/macros/printCompuMethod.xml.jinja2 +3 -2
- odxtools/templates/macros/printDiagLayer.xml.jinja2 +16 -0
- odxtools/templates/macros/printLibrary.xml.jinja2 +21 -0
- odxtools/templates/macros/printSingleEcuJob.xml.jinja2 +2 -23
- odxtools/templates/macros/printSubComponent.xml.jinja2 +104 -0
- odxtools/version.py +2 -2
- {odxtools-8.2.0.dist-info → odxtools-8.3.1.dist-info}/METADATA +1 -1
- {odxtools-8.2.0.dist-info → odxtools-8.3.1.dist-info}/RECORD +19 -15
- {odxtools-8.2.0.dist-info → odxtools-8.3.1.dist-info}/WHEEL +1 -1
- {odxtools-8.2.0.dist-info → odxtools-8.3.1.dist-info}/LICENSE +0 -0
- {odxtools-8.2.0.dist-info → odxtools-8.3.1.dist-info}/entry_points.txt +0 -0
- {odxtools-8.2.0.dist-info → odxtools-8.3.1.dist-info}/top_level.txt +0 -0
odxtools/diaglayers/diaglayer.py
CHANGED
@@ -13,6 +13,7 @@ from ..diagcomm import DiagComm
|
|
13
13
|
from ..diagdatadictionaryspec import DiagDataDictionarySpec
|
14
14
|
from ..diagservice import DiagService
|
15
15
|
from ..exceptions import DecodeError, odxassert, odxraise
|
16
|
+
from ..library import Library
|
16
17
|
from ..message import Message
|
17
18
|
from ..nameditemlist import NamedItemList, TNamed
|
18
19
|
from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
@@ -23,6 +24,7 @@ from ..servicebinner import ServiceBinner
|
|
23
24
|
from ..singleecujob import SingleEcuJob
|
24
25
|
from ..snrefcontext import SnRefContext
|
25
26
|
from ..specialdatagroup import SpecialDataGroup
|
27
|
+
from ..subcomponent import SubComponent
|
26
28
|
from ..unitgroup import UnitGroup
|
27
29
|
from .diaglayerraw import DiagLayerRaw
|
28
30
|
from .diaglayertype import DiagLayerType
|
@@ -259,6 +261,14 @@ class DiagLayer:
|
|
259
261
|
def import_refs(self) -> List[OdxLinkRef]:
|
260
262
|
return self.diag_layer_raw.import_refs
|
261
263
|
|
264
|
+
@property
|
265
|
+
def libraries(self) -> NamedItemList[Library]:
|
266
|
+
return self.diag_layer_raw.libraries
|
267
|
+
|
268
|
+
@property
|
269
|
+
def sub_components(self) -> NamedItemList[SubComponent]:
|
270
|
+
return self.diag_layer_raw.sub_components
|
271
|
+
|
262
272
|
@property
|
263
273
|
def sdgs(self) -> List[SpecialDataGroup]:
|
264
274
|
return self.diag_layer_raw.sdgs
|
@@ -13,6 +13,7 @@ from ..diagservice import DiagService
|
|
13
13
|
from ..element import IdentifiableElement
|
14
14
|
from ..exceptions import odxassert, odxraise, odxrequire
|
15
15
|
from ..functionalclass import FunctionalClass
|
16
|
+
from ..library import Library
|
16
17
|
from ..nameditemlist import NamedItemList
|
17
18
|
from ..odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
18
19
|
from ..request import Request
|
@@ -21,6 +22,7 @@ from ..singleecujob import SingleEcuJob
|
|
21
22
|
from ..snrefcontext import SnRefContext
|
22
23
|
from ..specialdatagroup import SpecialDataGroup
|
23
24
|
from ..statechart import StateChart
|
25
|
+
from ..subcomponent import SubComponent
|
24
26
|
from ..utils import dataclass_fields_asdict
|
25
27
|
from .diaglayertype import DiagLayerType
|
26
28
|
|
@@ -46,8 +48,8 @@ class DiagLayerRaw(IdentifiableElement):
|
|
46
48
|
import_refs: List[OdxLinkRef]
|
47
49
|
state_charts: NamedItemList[StateChart]
|
48
50
|
additional_audiences: NamedItemList[AdditionalAudience]
|
49
|
-
|
50
|
-
|
51
|
+
sub_components: NamedItemList[SubComponent]
|
52
|
+
libraries: NamedItemList[Library]
|
51
53
|
sdgs: List[SpecialDataGroup]
|
52
54
|
|
53
55
|
@property
|
@@ -149,6 +151,15 @@ class DiagLayerRaw(IdentifiableElement):
|
|
149
151
|
for el in et_element.iterfind("ADDITIONAL-AUDIENCES/ADDITIONAL-AUDIENCE")
|
150
152
|
]
|
151
153
|
|
154
|
+
libraries = [
|
155
|
+
Library.from_et(el, doc_frags) for el in et_element.iterfind("LIBRARYS/LIBRARY")
|
156
|
+
]
|
157
|
+
|
158
|
+
sub_components = [
|
159
|
+
SubComponent.from_et(el, doc_frags)
|
160
|
+
for el in et_element.iterfind("SUB-COMPONENTS/SUB-COMPONENT")
|
161
|
+
]
|
162
|
+
|
152
163
|
sdgs = [
|
153
164
|
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
154
165
|
]
|
@@ -168,6 +179,8 @@ class DiagLayerRaw(IdentifiableElement):
|
|
168
179
|
import_refs=import_refs,
|
169
180
|
state_charts=NamedItemList(state_charts),
|
170
181
|
additional_audiences=NamedItemList(additional_audiences),
|
182
|
+
libraries=NamedItemList(libraries),
|
183
|
+
sub_components=NamedItemList(sub_components),
|
171
184
|
sdgs=sdgs,
|
172
185
|
**kwargs)
|
173
186
|
|
@@ -200,6 +213,10 @@ class DiagLayerRaw(IdentifiableElement):
|
|
200
213
|
odxlinks.update(state_chart._build_odxlinks())
|
201
214
|
for additional_audience in self.additional_audiences:
|
202
215
|
odxlinks.update(additional_audience._build_odxlinks())
|
216
|
+
for library in self.libraries:
|
217
|
+
odxlinks.update(library._build_odxlinks())
|
218
|
+
for sub_comp in self.sub_components:
|
219
|
+
odxlinks.update(sub_comp._build_odxlinks())
|
203
220
|
for sdg in self.sdgs:
|
204
221
|
odxlinks.update(sdg._build_odxlinks())
|
205
222
|
|
@@ -252,6 +269,10 @@ class DiagLayerRaw(IdentifiableElement):
|
|
252
269
|
state_chart._resolve_odxlinks(odxlinks)
|
253
270
|
for additional_audience in self.additional_audiences:
|
254
271
|
additional_audience._resolve_odxlinks(odxlinks)
|
272
|
+
for library in self.libraries:
|
273
|
+
library._resolve_odxlinks(odxlinks)
|
274
|
+
for sub_component in self.sub_components:
|
275
|
+
sub_component._resolve_odxlinks(odxlinks)
|
255
276
|
for sdg in self.sdgs:
|
256
277
|
sdg._resolve_odxlinks(odxlinks)
|
257
278
|
|
@@ -282,5 +303,9 @@ class DiagLayerRaw(IdentifiableElement):
|
|
282
303
|
state_chart._resolve_snrefs(context)
|
283
304
|
for additional_audience in self.additional_audiences:
|
284
305
|
additional_audience._resolve_snrefs(context)
|
306
|
+
for library in self.libraries:
|
307
|
+
library._resolve_snrefs(context)
|
308
|
+
for sub_component in self.sub_components:
|
309
|
+
sub_component._resolve_snrefs(context)
|
285
310
|
for sdg in self.sdgs:
|
286
311
|
sdg._resolve_snrefs(context)
|
odxtools/diagservice.py
CHANGED
@@ -42,7 +42,9 @@ class DiagService(DiagComm):
|
|
42
42
|
pos_response_refs: List[OdxLinkRef]
|
43
43
|
neg_response_refs: List[OdxLinkRef]
|
44
44
|
|
45
|
-
#
|
45
|
+
# note that the spec has a typo here: it calls the corresponding
|
46
|
+
# XML tag POS-RESPONSE-SUPPRESSABLE...
|
47
|
+
# TODO: pos_response_suppressible: Optional[PosResponseSuppressible]
|
46
48
|
|
47
49
|
is_cyclic_raw: Optional[bool]
|
48
50
|
is_multiple_raw: Optional[bool]
|
odxtools/library.py
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import Any, Dict, List, Optional, cast
|
4
|
+
from xml.etree import ElementTree
|
5
|
+
|
6
|
+
from .element import IdentifiableElement
|
7
|
+
from .exceptions import odxraise, odxrequire
|
8
|
+
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
|
9
|
+
from .snrefcontext import SnRefContext
|
10
|
+
from .utils import dataclass_fields_asdict
|
11
|
+
|
12
|
+
|
13
|
+
@dataclass
|
14
|
+
class Library(IdentifiableElement):
|
15
|
+
"""
|
16
|
+
A library defines a shared library used for single ECU jobs etc.
|
17
|
+
|
18
|
+
It this is basically equivalent to ProgCode.
|
19
|
+
"""
|
20
|
+
|
21
|
+
code_file: str
|
22
|
+
encryption: Optional[str]
|
23
|
+
syntax: str
|
24
|
+
revision: str
|
25
|
+
entrypoint: Optional[str]
|
26
|
+
|
27
|
+
@property
|
28
|
+
def code(self) -> bytes:
|
29
|
+
return self._code
|
30
|
+
|
31
|
+
@staticmethod
|
32
|
+
def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "Library":
|
33
|
+
|
34
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
35
|
+
|
36
|
+
code_file = odxrequire(et_element.findtext("CODE-FILE"))
|
37
|
+
encryption = et_element.findtext("ENCRYPTION")
|
38
|
+
syntax = odxrequire(et_element.findtext("SYNTAX"))
|
39
|
+
revision = odxrequire(et_element.findtext("REVISION"))
|
40
|
+
entrypoint = et_element.findtext("ENTRYPOINT")
|
41
|
+
|
42
|
+
return Library(
|
43
|
+
code_file=code_file,
|
44
|
+
encryption=encryption,
|
45
|
+
syntax=syntax,
|
46
|
+
revision=revision,
|
47
|
+
entrypoint=entrypoint,
|
48
|
+
**kwargs)
|
49
|
+
|
50
|
+
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
51
|
+
return {self.odx_id: self}
|
52
|
+
|
53
|
+
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
54
|
+
pass
|
55
|
+
|
56
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
57
|
+
aux_file = odxrequire(context.database).auxiliary_files.get(self.code_file)
|
58
|
+
|
59
|
+
if aux_file is None:
|
60
|
+
odxraise(f"Reference to auxiliary file '{self.code_file}' "
|
61
|
+
f"could not be resolved")
|
62
|
+
self._code: bytes = cast(bytes, None)
|
63
|
+
return
|
64
|
+
|
65
|
+
self._code = aux_file.read()
|
66
|
+
aux_file.seek(0)
|
odxtools/minmaxlengthtype.py
CHANGED
@@ -74,7 +74,7 @@ class MinMaxLengthType(DiagCodedType):
|
|
74
74
|
@override
|
75
75
|
def encode_into_pdu(self, internal_value: AtomicOdxType, encode_state: EncodeState) -> None:
|
76
76
|
|
77
|
-
if not isinstance(internal_value, (bytes, str)):
|
77
|
+
if not isinstance(internal_value, (bytes, str, bytearray)):
|
78
78
|
odxraise("MinMaxLengthType is currently only implemented for strings and byte arrays",
|
79
79
|
EncodeError)
|
80
80
|
|
odxtools/progcode.py
CHANGED
@@ -4,6 +4,8 @@ from typing import Any, Dict, List, Optional, cast
|
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .exceptions import odxraise, odxrequire
|
7
|
+
from .library import Library
|
8
|
+
from .nameditemlist import NamedItemList
|
7
9
|
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
8
10
|
from .snrefcontext import SnRefContext
|
9
11
|
|
@@ -12,9 +14,9 @@ from .snrefcontext import SnRefContext
|
|
12
14
|
class ProgCode:
|
13
15
|
"""A reference to code that is executed by a single ECU job"""
|
14
16
|
code_file: str
|
17
|
+
encryption: Optional[str]
|
15
18
|
syntax: str
|
16
19
|
revision: str
|
17
|
-
encryption: Optional[str]
|
18
20
|
entrypoint: Optional[str]
|
19
21
|
library_refs: List[OdxLinkRef]
|
20
22
|
|
@@ -22,6 +24,10 @@ class ProgCode:
|
|
22
24
|
def code(self) -> bytes:
|
23
25
|
return self._code
|
24
26
|
|
27
|
+
@property
|
28
|
+
def libraries(self) -> NamedItemList[Library]:
|
29
|
+
return self._libraries
|
30
|
+
|
25
31
|
@staticmethod
|
26
32
|
def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "ProgCode":
|
27
33
|
code_file = odxrequire(et_element.findtext("CODE-FILE"))
|
@@ -49,9 +55,7 @@ class ProgCode:
|
|
49
55
|
return {}
|
50
56
|
|
51
57
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
52
|
-
|
53
|
-
# Once they are internalized, resolve the `library_refs` references here.
|
54
|
-
pass
|
58
|
+
self._libraries = NamedItemList([odxlinks.resolve(x, Library) for x in self.library_refs])
|
55
59
|
|
56
60
|
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
57
61
|
aux_file = odxrequire(context.database).auxiliary_files.get(self.code_file)
|
odxtools/subcomponent.py
ADDED
@@ -0,0 +1,288 @@
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
2
|
+
from dataclasses import dataclass
|
3
|
+
from typing import Any, Dict, List, Optional
|
4
|
+
from xml.etree import ElementTree
|
5
|
+
|
6
|
+
from .diagnostictroublecode import DiagnosticTroubleCode
|
7
|
+
from .diagservice import DiagService
|
8
|
+
from .dtcdop import DtcDop
|
9
|
+
from .element import IdentifiableElement, NamedElement
|
10
|
+
from .environmentdata import EnvironmentData
|
11
|
+
from .environmentdatadescription import EnvironmentDataDescription
|
12
|
+
from .exceptions import odxraise, odxrequire
|
13
|
+
from .matchingparameter import MatchingParameter
|
14
|
+
from .nameditemlist import NamedItemList
|
15
|
+
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
|
16
|
+
from .parameters.parameter import Parameter
|
17
|
+
from .snrefcontext import SnRefContext
|
18
|
+
from .table import Table
|
19
|
+
from .tablerow import TableRow
|
20
|
+
from .utils import dataclass_fields_asdict
|
21
|
+
|
22
|
+
|
23
|
+
@dataclass
|
24
|
+
class SubComponentPattern:
|
25
|
+
matching_parameters: List[MatchingParameter]
|
26
|
+
|
27
|
+
@staticmethod
|
28
|
+
def from_et(et_element: ElementTree.Element,
|
29
|
+
doc_frags: List[OdxDocFragment]) -> "SubComponentPattern":
|
30
|
+
|
31
|
+
matching_parameters = [
|
32
|
+
MatchingParameter.from_et(el, doc_frags)
|
33
|
+
for el in et_element.iterfind("MATCHING-PARAMETERS/MATCHING-PARAMETER")
|
34
|
+
]
|
35
|
+
|
36
|
+
return SubComponentPattern(matching_parameters=matching_parameters)
|
37
|
+
|
38
|
+
|
39
|
+
@dataclass
|
40
|
+
class SubComponentParamConnector(IdentifiableElement):
|
41
|
+
diag_comm_snref: str
|
42
|
+
|
43
|
+
# TODO: we currently only support SNREFs, not SNPATHREFs
|
44
|
+
out_param_if_refs: List[str]
|
45
|
+
in_param_if_refs: List[str]
|
46
|
+
|
47
|
+
@property
|
48
|
+
def service(self) -> DiagService:
|
49
|
+
return self._service
|
50
|
+
|
51
|
+
@property
|
52
|
+
def out_param_ifs(self) -> NamedItemList[Parameter]:
|
53
|
+
return self._out_param_ifs
|
54
|
+
|
55
|
+
@property
|
56
|
+
def in_param_ifs(self) -> NamedItemList[Parameter]:
|
57
|
+
return self._in_param_ifs
|
58
|
+
|
59
|
+
@staticmethod
|
60
|
+
def from_et(et_element: ElementTree.Element,
|
61
|
+
doc_frags: List[OdxDocFragment]) -> "SubComponentParamConnector":
|
62
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
63
|
+
|
64
|
+
diag_comm_snref = odxrequire(
|
65
|
+
odxrequire(et_element.find("DIAG-COMM-SNREF")).get("SHORT-NAME"))
|
66
|
+
|
67
|
+
out_param_if_refs = []
|
68
|
+
for elem in et_element.find("OUT-PARAM-IF-REFS") or []:
|
69
|
+
if elem.tag != "OUT-PARAM-IF-SNREF":
|
70
|
+
odxraise("Currently, only SNREFS are supported for OUT-PARAM-IF-REFS")
|
71
|
+
continue
|
72
|
+
|
73
|
+
out_param_if_refs.append(odxrequire(elem.get("SHORT-NAME")))
|
74
|
+
|
75
|
+
in_param_if_refs = []
|
76
|
+
for elem in et_element.find("IN-PARAM-IF-REFS") or []:
|
77
|
+
if elem.tag != "IN-PARAM-IF-SNREF":
|
78
|
+
odxraise("Currently, only SNREFS are supported for IN-PARAM-IF-REFS")
|
79
|
+
continue
|
80
|
+
|
81
|
+
in_param_if_refs.append(odxrequire(elem.get("SHORT-NAME")))
|
82
|
+
|
83
|
+
return SubComponentParamConnector(
|
84
|
+
diag_comm_snref=diag_comm_snref,
|
85
|
+
out_param_if_refs=out_param_if_refs,
|
86
|
+
in_param_if_refs=in_param_if_refs,
|
87
|
+
**kwargs)
|
88
|
+
|
89
|
+
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
90
|
+
return {}
|
91
|
+
|
92
|
+
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
93
|
+
pass
|
94
|
+
|
95
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
96
|
+
service = resolve_snref(self.diag_comm_snref,
|
97
|
+
odxrequire(context.diag_layer).diag_comms, DiagService)
|
98
|
+
self._service = service
|
99
|
+
|
100
|
+
if self._service.request is not None:
|
101
|
+
odxraise()
|
102
|
+
return
|
103
|
+
if not self._service.positive_responses:
|
104
|
+
odxraise()
|
105
|
+
return
|
106
|
+
request = odxrequire(service.request)
|
107
|
+
response = service.positive_responses[0]
|
108
|
+
|
109
|
+
in_param_ifs = []
|
110
|
+
for x in self.in_param_if_refs:
|
111
|
+
in_param_ifs.append(resolve_snref(x, request.parameters, Parameter))
|
112
|
+
|
113
|
+
out_param_ifs = []
|
114
|
+
for x in self.out_param_if_refs:
|
115
|
+
out_param_ifs.append(resolve_snref(x, response.parameters, Parameter))
|
116
|
+
|
117
|
+
self._in_param_ifs = NamedItemList(in_param_ifs)
|
118
|
+
self._out_param_ifs = NamedItemList(out_param_ifs)
|
119
|
+
|
120
|
+
|
121
|
+
@dataclass
|
122
|
+
class TableRowConnector(NamedElement):
|
123
|
+
table_ref: OdxLinkRef
|
124
|
+
table_row_snref: str
|
125
|
+
|
126
|
+
@property
|
127
|
+
def table(self) -> Table:
|
128
|
+
return self._table
|
129
|
+
|
130
|
+
@property
|
131
|
+
def table_row(self) -> TableRow:
|
132
|
+
return self._table_row
|
133
|
+
|
134
|
+
@staticmethod
|
135
|
+
def from_et(et_element: ElementTree.Element,
|
136
|
+
doc_frags: List[OdxDocFragment]) -> "TableRowConnector":
|
137
|
+
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
|
138
|
+
|
139
|
+
table_ref = odxrequire(OdxLinkRef.from_et(et_element.find("TABLE-REF"), doc_frags))
|
140
|
+
table_row_snref_el = odxrequire(et_element.find("TABLE-ROW-SNREF"))
|
141
|
+
table_row_snref = odxrequire(table_row_snref_el.get("SHORT-NAME"))
|
142
|
+
|
143
|
+
return TableRowConnector(table_ref=table_ref, table_row_snref=table_row_snref, **kwargs)
|
144
|
+
|
145
|
+
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
146
|
+
return {}
|
147
|
+
|
148
|
+
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
149
|
+
self._table = odxlinks.resolve(self.table_ref, Table)
|
150
|
+
|
151
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
152
|
+
self._table_row = resolve_snref(self.table_row_snref, self._table.table_rows, TableRow)
|
153
|
+
|
154
|
+
|
155
|
+
@dataclass
|
156
|
+
class DtcConnector(NamedElement):
|
157
|
+
dtc_dop_ref: OdxLinkRef
|
158
|
+
dtc_snref: str
|
159
|
+
|
160
|
+
@property
|
161
|
+
def dtc_dop(self) -> DtcDop:
|
162
|
+
return self._dtc_dop
|
163
|
+
|
164
|
+
@property
|
165
|
+
def dtc(self) -> DiagnosticTroubleCode:
|
166
|
+
return self._dtc
|
167
|
+
|
168
|
+
@staticmethod
|
169
|
+
def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "DtcConnector":
|
170
|
+
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
|
171
|
+
|
172
|
+
dtc_dop_ref = odxrequire(OdxLinkRef.from_et(et_element.find("DTC-DOP-REF"), doc_frags))
|
173
|
+
dtc_snref_el = odxrequire(et_element.find("DTC-SNREF"))
|
174
|
+
dtc_snref = odxrequire(dtc_snref_el.get("SHORT-NAME"))
|
175
|
+
|
176
|
+
return DtcConnector(dtc_dop_ref=dtc_dop_ref, dtc_snref=dtc_snref, **kwargs)
|
177
|
+
|
178
|
+
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
179
|
+
return {}
|
180
|
+
|
181
|
+
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
182
|
+
self._dtc_dop = odxlinks.resolve(self.dtc_dop_ref, DtcDop)
|
183
|
+
|
184
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
185
|
+
self._dtc = resolve_snref(self.dtc_snref, self._dtc_dop.dtcs, DiagnosticTroubleCode)
|
186
|
+
|
187
|
+
|
188
|
+
@dataclass
|
189
|
+
class EnvDataConnector(NamedElement):
|
190
|
+
env_data_desc_ref: OdxLinkRef
|
191
|
+
env_data_snref: str
|
192
|
+
|
193
|
+
@property
|
194
|
+
def env_data_desc(self) -> EnvironmentDataDescription:
|
195
|
+
return self._env_data_desc
|
196
|
+
|
197
|
+
@property
|
198
|
+
def env_data(self) -> EnvironmentData:
|
199
|
+
return self._env_data
|
200
|
+
|
201
|
+
@staticmethod
|
202
|
+
def from_et(et_element: ElementTree.Element,
|
203
|
+
doc_frags: List[OdxDocFragment]) -> "EnvDataConnector":
|
204
|
+
kwargs = dataclass_fields_asdict(NamedElement.from_et(et_element, doc_frags))
|
205
|
+
|
206
|
+
env_data_desc_ref = odxrequire(
|
207
|
+
OdxLinkRef.from_et(et_element.find("ENV-DATA-DESC-REF"), doc_frags))
|
208
|
+
env_data_snref_el = odxrequire(et_element.find("ENV-DATA-SNREF"))
|
209
|
+
env_data_snref = odxrequire(env_data_snref_el.get("SHORT-NAME"))
|
210
|
+
|
211
|
+
return EnvDataConnector(
|
212
|
+
env_data_desc_ref=env_data_desc_ref, env_data_snref=env_data_snref, **kwargs)
|
213
|
+
|
214
|
+
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
215
|
+
return {}
|
216
|
+
|
217
|
+
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
218
|
+
self._env_data_desc = odxlinks.resolve(self.env_data_desc_ref, EnvironmentDataDescription)
|
219
|
+
|
220
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
221
|
+
self._env_data = resolve_snref(self.env_data_snref, self._env_data_desc.env_datas,
|
222
|
+
EnvironmentData)
|
223
|
+
|
224
|
+
|
225
|
+
@dataclass
|
226
|
+
class SubComponent(IdentifiableElement):
|
227
|
+
"""Sub-components describe collections of related diagnostic variables
|
228
|
+
|
229
|
+
Note that the communication paradigm via diagnostic variables is
|
230
|
+
somewhat uncommon. If your ECU does not define any, there's no
|
231
|
+
need for it to define sub-components.
|
232
|
+
|
233
|
+
"""
|
234
|
+
|
235
|
+
#sub_component_patterns: NamedItemList[SubComponentPattern]
|
236
|
+
sub_component_param_connectors: NamedItemList[SubComponentParamConnector]
|
237
|
+
table_row_connectors: NamedItemList[TableRowConnector]
|
238
|
+
env_data_connectors: NamedItemList[EnvDataConnector]
|
239
|
+
dtc_connectors: NamedItemList[DtcConnector]
|
240
|
+
|
241
|
+
semantic: Optional[str]
|
242
|
+
|
243
|
+
@staticmethod
|
244
|
+
def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "SubComponent":
|
245
|
+
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
246
|
+
|
247
|
+
semantic = et_element.get("SEMANTIC")
|
248
|
+
|
249
|
+
sub_component_param_connectors = [
|
250
|
+
SubComponentParamConnector.from_et(el, doc_frags) for el in et_element.iterfind(
|
251
|
+
"SUB-COMPONENT-PARAM-CONNECTORS/SUB-COMPONENT-PARAM-CONNECTOR")
|
252
|
+
]
|
253
|
+
table_row_connectors = [
|
254
|
+
TableRowConnector.from_et(el, doc_frags)
|
255
|
+
for el in et_element.iterfind("TABLE-ROW-CONNECTORS/TABLE-ROW-CONNECTOR")
|
256
|
+
]
|
257
|
+
env_data_connectors = [
|
258
|
+
EnvDataConnector.from_et(el, doc_frags)
|
259
|
+
for el in et_element.iterfind("ENV-DATA-CONNECTORS/ENV-DATA-CONNECTOR")
|
260
|
+
]
|
261
|
+
dtc_connectors = [
|
262
|
+
DtcConnector.from_et(el, doc_frags)
|
263
|
+
for el in et_element.iterfind("DTC-CONNECTORS/DTC-CONNECTOR")
|
264
|
+
]
|
265
|
+
|
266
|
+
return SubComponent(
|
267
|
+
semantic=semantic,
|
268
|
+
sub_component_param_connectors=NamedItemList(sub_component_param_connectors),
|
269
|
+
table_row_connectors=NamedItemList(table_row_connectors),
|
270
|
+
env_data_connectors=NamedItemList(env_data_connectors),
|
271
|
+
dtc_connectors=NamedItemList(dtc_connectors),
|
272
|
+
**kwargs)
|
273
|
+
|
274
|
+
def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
|
275
|
+
result = {}
|
276
|
+
|
277
|
+
for dtc_conn in self.dtc_connectors:
|
278
|
+
result.update(dtc_conn._build_odxlinks())
|
279
|
+
|
280
|
+
return result
|
281
|
+
|
282
|
+
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
283
|
+
for dtc_conn in self.dtc_connectors:
|
284
|
+
dtc_conn._resolve_odxlinks(odxlinks)
|
285
|
+
|
286
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
287
|
+
for dtc_conn in self.dtc_connectors:
|
288
|
+
dtc_conn._resolve_snrefs(context)
|
@@ -92,12 +92,13 @@
|
|
92
92
|
{%- macro printProgCode(pc) -%}
|
93
93
|
<PROG-CODE>
|
94
94
|
<CODE-FILE>{{pc.code_file}}</CODE-FILE>
|
95
|
-
<SYNTAX>{{pc.syntax}}</SYNTAX>
|
96
95
|
{%- if pc.encryption is not none %}
|
97
96
|
<ENCRYPTION>{{pc.encryption}}</ENCRYPTION>
|
98
97
|
{%- endif %}
|
98
|
+
<SYNTAX>{{pc.syntax}}</SYNTAX>
|
99
|
+
<REVISION>{{pc.revision}}</REVISION>
|
99
100
|
{%- if pc.entry_point is not none %}
|
100
|
-
<
|
101
|
+
<ENTRYPOINT>{{pc.entrypoint}}</ENTRYPOINT>
|
101
102
|
{%- endif %}
|
102
103
|
{%- if pc.library_refs %}
|
103
104
|
<LIBRARY-REFS>
|
@@ -22,6 +22,8 @@
|
|
22
22
|
{%- import('macros/printResponse.xml.jinja2') as presp %}
|
23
23
|
{%- import('macros/printStateChart.xml.jinja2') as psc %}
|
24
24
|
{%- import('macros/printAudience.xml.jinja2') as paud %}
|
25
|
+
{%- import('macros/printSubComponent.xml.jinja2') as psubcomp %}
|
26
|
+
{%- import('macros/printLibrary.xml.jinja2') as plib %}
|
25
27
|
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
|
26
28
|
{%- import('macros/printEcuVariantPattern.xml.jinja2') as pvpat %}
|
27
29
|
{%- import('macros/printAdminData.xml.jinja2') as pad %}
|
@@ -202,5 +204,19 @@
|
|
202
204
|
{%- endfor %}
|
203
205
|
</ADDITIONAL-AUDIENCES>
|
204
206
|
{%- endif %}
|
207
|
+
{%- if dlr.sub_components %}
|
208
|
+
<SUB-COMPONENTS>
|
209
|
+
{%- for sc in dlr.sub_components %}
|
210
|
+
{{ psubcomp.printSubComponent(sc)|indent(2) }}
|
211
|
+
{%- endfor %}
|
212
|
+
</SUB-COMPONENTS>
|
213
|
+
{%- endif %}
|
214
|
+
{%- if dlr.libraries %}
|
215
|
+
<LIBRARYS>
|
216
|
+
{%- for lib in dlr.libraries %}
|
217
|
+
{{ plib.printLibrary(lib)|indent(2) }}
|
218
|
+
{%- endfor %}
|
219
|
+
</LIBRARYS>
|
220
|
+
{%- endif %}
|
205
221
|
{{- psd.printSpecialDataGroups(dlr.sdgs)|indent(0, first=True) }}
|
206
222
|
{%- endmacro -%}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
{#- -*- mode: sgml; tab-width: 1; indent-tabs-mode: nil -*-
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: MIT
|
4
|
+
-#}
|
5
|
+
|
6
|
+
{%- import('macros/printElementId.xml.jinja2') as peid %}
|
7
|
+
|
8
|
+
{%- macro printLibrary(library) %}
|
9
|
+
<LIBRARY{#- #} {{-peid.printElementIdAttribs(library)}}{# -#}>
|
10
|
+
{{ peid.printElementIdSubtags(library)|indent(1) }}
|
11
|
+
<CODE-FILE>{{library.code_file}}</CODE-FILE>
|
12
|
+
{%- if library.encryption is not none %}
|
13
|
+
<ENCRYPTION>{{library.encryption}}</ENCRYPTION>
|
14
|
+
{%- endif %}
|
15
|
+
<SYNTAX>{{library.syntax}}</SYNTAX>
|
16
|
+
<REVISION>{{library.revision}}</REVISION>
|
17
|
+
{%- if library.entrypoint is not none %}
|
18
|
+
<ENTRYPOINT>{{library.entrypoint}}</ENTRYPOINT>
|
19
|
+
{%- endif %}
|
20
|
+
</LIBRARY>
|
21
|
+
{%- endmacro %}
|
@@ -5,13 +5,14 @@
|
|
5
5
|
|
6
6
|
{%- import('macros/printElementId.xml.jinja2') as peid %}
|
7
7
|
{%- import('macros/printDiagComm.xml.jinja2') as pdc %}
|
8
|
+
{%- import('macros/printCompuMethod.xml.jinja2') as pcm %}
|
8
9
|
|
9
10
|
{%- macro printSingleEcuJob(job) -%}
|
10
11
|
<SINGLE-ECU-JOB {{pdc.printDiagCommAttribs(job)|indent(1) }}>
|
11
12
|
{{pdc.printDiagCommSubtags(job) | indent(2, first=True) }}
|
12
13
|
<PROG-CODES>
|
13
14
|
{%- for prog in job.prog_codes %}
|
14
|
-
{{ printProgCode(prog)|indent(4) }}
|
15
|
+
{{ pcm.printProgCode(prog)|indent(4) }}
|
15
16
|
{%- endfor %}
|
16
17
|
</PROG-CODES>
|
17
18
|
{%- if job.input_params %}
|
@@ -39,28 +40,6 @@
|
|
39
40
|
{%- endmacro -%}
|
40
41
|
|
41
42
|
|
42
|
-
{%- macro printProgCode(prog) -%}
|
43
|
-
<PROG-CODE>
|
44
|
-
<CODE-FILE>{{prog.code_file}}</CODE-FILE>
|
45
|
-
{%- if prog.encryption %}
|
46
|
-
<ENCRYPTION>{{prog.encryption}}</ENCRYPTION>
|
47
|
-
{%- endif %}
|
48
|
-
<SYNTAX>{{prog.syntax}}</SYNTAX>
|
49
|
-
<REVISION>{{prog.revision}}</REVISION>
|
50
|
-
{%- if prog.entrypoint %}
|
51
|
-
<ENTRYPOINT>{{prog.entrypoint}}</ENTRYPOINT>
|
52
|
-
{%- endif %}
|
53
|
-
{%- if prog.library_refs %}
|
54
|
-
<LIBRARY-REFS>
|
55
|
-
{%- for ref in prog.library_refs %}
|
56
|
-
<LIBRARY-REF ID-REF="{{ref.ref_id}}" />
|
57
|
-
{%- endfor %}
|
58
|
-
</LIBRARY-REFS>
|
59
|
-
{%- endif %}
|
60
|
-
</PROG-CODE>
|
61
|
-
{%- endmacro -%}
|
62
|
-
|
63
|
-
|
64
43
|
{%- macro printInputParam(param) -%}
|
65
44
|
<INPUT-PARAM {{-make_xml_attrib("OID", param.oid)}}
|
66
45
|
{{-make_xml_attrib("SEMANTIC", param.semantic)}}>
|
@@ -0,0 +1,104 @@
|
|
1
|
+
{#- -*- mode: sgml; tab-width: 1; indent-tabs-mode: nil -*-
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: MIT
|
4
|
+
-#}
|
5
|
+
|
6
|
+
{%- import('macros/printElementId.xml.jinja2') as peid %}
|
7
|
+
{%- import('macros/printEcuVariantPattern.xml.jinja2') as pevp %}
|
8
|
+
|
9
|
+
{%- macro printSubComponentPattern(pat) %}
|
10
|
+
<SUB-COMPONENT-PATTERN>
|
11
|
+
<MATCHING-PARAMETERS>
|
12
|
+
{%- for mp in pat.matching_parameters %}
|
13
|
+
{{ pvp.printMatchingParameter(mp)|indent(4) }}
|
14
|
+
{%- endfor %}
|
15
|
+
</MATCHING-PARAMETERS>
|
16
|
+
</SUB-COMPONENT-PATTERN>
|
17
|
+
{%- endmacro %}
|
18
|
+
|
19
|
+
{%- macro printSubComponentParamConnector(conn) %}
|
20
|
+
<SUB-COMPONENT-PARAM-CONNECTOR{#- #} {{-peid.printElementIdAttribs(conn)}}>
|
21
|
+
{{ peid.printElementIdSubtags(conn)|indent(2) }}
|
22
|
+
<DIAG-COMM-SNREF {{- make_xml_attrib("SHORT-NAME", conn.diag_comm_snref ) }} />
|
23
|
+
{%- if conn.out_param_if_refs %}
|
24
|
+
<OUT-PARAM-IF-REFS>
|
25
|
+
{%- for snref in conn.out_param_if_refs %}
|
26
|
+
<OUT-PARAM-IF-SNREF SHORT-NAME="{{snref}}" />
|
27
|
+
{%- endfor %}
|
28
|
+
</OUT-PARAM-IF-REFS>
|
29
|
+
{%- endif %}
|
30
|
+
{%- if conn.in_param_if_refs %}
|
31
|
+
<IN-PARAM-IF-REFS>
|
32
|
+
{%- for snref in conn.in_param_if_refs %}
|
33
|
+
<IN-PARAM-IF-SNREF SHORT-NAME="{{snref}}" />
|
34
|
+
{%- endfor %}
|
35
|
+
</IN-PARAM-IF-REFS>
|
36
|
+
{%- endif %}
|
37
|
+
</SUB-COMPONENT-PARAM-CONNECTOR>
|
38
|
+
{%- endmacro %}
|
39
|
+
|
40
|
+
{%- macro printTableRowConnector(conn) %}
|
41
|
+
<TABLE-ROW-CONNECTOR>
|
42
|
+
{{ peid.printElementIdSubtags(conn)|indent(2) }}
|
43
|
+
<TABLE-REF ID-REF="{{ conn.table_ref.ref_id }}" />
|
44
|
+
<TABLE-ROW-SNREF {{- make_xml_attrib("SHORT-NAME", conn.table_row_snref ) }} />
|
45
|
+
</TABLE-ROW-CONNECTOR>
|
46
|
+
{%- endmacro %}
|
47
|
+
|
48
|
+
{%- macro printEnvDataConnector(conn) %}
|
49
|
+
<ENV-DATA-CONNECTOR>
|
50
|
+
{{ peid.printElementIdSubtags(conn)|indent(2) }}
|
51
|
+
<ENV-DATA-DESC-REF ID-REF="{{ conn.env_data_desc_ref.ref_id }}" />
|
52
|
+
<ENV-DATA-SNREF {{- make_xml_attrib("SHORT-NAME", conn.env_data_snref ) }} />
|
53
|
+
</ENV-DATA-CONNECTOR>
|
54
|
+
{%- endmacro %}
|
55
|
+
|
56
|
+
{%- macro printDtcConnector(conn) %}
|
57
|
+
<DTC-CONNECTOR>
|
58
|
+
{{ peid.printElementIdSubtags(conn)|indent(2) }}
|
59
|
+
<DTC-DOP-REF ID-REF="{{ conn.dtc_dop_ref.ref_id }}" />
|
60
|
+
<DOP-SNREF {{- make_xml_attrib("SHORT-NAME", conn.dtc_snref ) }} />
|
61
|
+
</DTC-CONNECTOR>
|
62
|
+
{%- endmacro %}
|
63
|
+
|
64
|
+
{%- macro printSubComponent(sc) %}
|
65
|
+
<SUB-COMPONENT{#- #} {{-peid.printElementIdAttribs(sc)}}
|
66
|
+
{{- make_xml_attrib("SEMANTIC", sc.semantic) }}>
|
67
|
+
{{ peid.printElementIdSubtags(sc)|indent(2) }}
|
68
|
+
{%- if sc.sub_component_patterns %}
|
69
|
+
<SUB-COMPONENT-PATTERNS>
|
70
|
+
{%- for scp in sc.sub_component_patterns %}
|
71
|
+
{{ printSubComponentPattern(scp)|indent(4) }}
|
72
|
+
{%- endfor %}
|
73
|
+
</SUB-COMPONENT-PATTERNS>
|
74
|
+
{%- endif %}
|
75
|
+
{%- if sc.sub_component_param_connectors %}
|
76
|
+
<SUB-COMPONENT-PARAM-CONNECTORS>
|
77
|
+
{%- for conn in sc.sub_component_param_connectors %}
|
78
|
+
{{ printSubComponentParamConnector(conn)|indent(4) }}
|
79
|
+
{%- endfor %}
|
80
|
+
</SUB-COMPONENT-PARAM-CONNECTORS>
|
81
|
+
{%- endif %}
|
82
|
+
{%- if sc.table_row_connectors %}
|
83
|
+
<TABLE-ROW-CONNECTORS>
|
84
|
+
{%- for conn in sc.table_row_connectors %}
|
85
|
+
{{ printTableRowConnector(conn)|indent(4) }}
|
86
|
+
{%- endfor %}
|
87
|
+
</TABLE-ROW-CONNECTORS>
|
88
|
+
{%- endif %}
|
89
|
+
{%- if sc.env_data_connectors %}
|
90
|
+
<ENV-DATA-CONNECTORS>
|
91
|
+
{%- for conn in sc.env_data_connectors %}
|
92
|
+
{{ printEnvDataConnector(conn)|indent(4) }}
|
93
|
+
{%- endfor %}
|
94
|
+
</ENV-DATA-CONNECTORS>
|
95
|
+
{%- endif %}
|
96
|
+
{%- if sc.dtc_connectors %}
|
97
|
+
<DTC-CONNECTORS>
|
98
|
+
{%- for conn in sc.dtc_connectors %}
|
99
|
+
{{ printDtcConnector(conn)|indent(4) }}
|
100
|
+
{%- endfor %}
|
101
|
+
</DTC-CONNECTORS>
|
102
|
+
{%- endif %}
|
103
|
+
</SUB-COMPONENT>
|
104
|
+
{%- endmacro %}
|
odxtools/version.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: odxtools
|
3
|
-
Version: 8.
|
3
|
+
Version: 8.3.1
|
4
4
|
Summary: Utilities to work with the ODX standard for automotive diagnostics
|
5
5
|
Author-email: Katrin Bauer <katrin.bauer@mbition.io>, Andreas Lauser <andreas.lauser@mbition.io>, Ayoub Kaanich <kayoub5@live.com>
|
6
6
|
Maintainer-email: Andreas Lauser <andreas.lauser@mbition.io>, Ayoub Kaanich <kayoub5@live.com>
|
@@ -29,7 +29,7 @@ odxtools/diagcomm.py,sha256=j8esUkogoxHBwIEUBkAoXe28jX3vaRnnrgCR_gdP6VY,8110
|
|
29
29
|
odxtools/diagdatadictionaryspec.py,sha256=2zy5f-xnfGI0bnjPOEwG_IJxfsHhXZoOfdIS_fOr3L0,10552
|
30
30
|
odxtools/diaglayercontainer.py,sha256=0JC6ioUGe5c8FzXRotyGEGMMDz8fzKCsK204tGN3cAo,6524
|
31
31
|
odxtools/diagnostictroublecode.py,sha256=jKtO8JqU0HRpeSyrcHn4s21N4Jj-p19WVP-qw2H98gY,2459
|
32
|
-
odxtools/diagservice.py,sha256=
|
32
|
+
odxtools/diagservice.py,sha256=y1_qKI7kJXDWpjpw91loIdf-K7Ozo45BsYiOhVYGuXg,10291
|
33
33
|
odxtools/diagvariable.py,sha256=KUyRCV-H5xKITWYk9wxDnaS_N2nwDFGQzHaQRfNndKA,3829
|
34
34
|
odxtools/docrevision.py,sha256=m57a4lCWeR6QvNNxtwUNpLXAMgSq29ks1HorxoipFVk,2698
|
35
35
|
odxtools/dopbase.py,sha256=JMqlMNKyZJlXwcBFROetCIy1RsK-V_mSCR0MDuA-G5Y,2493
|
@@ -53,10 +53,11 @@ odxtools/inputparam.py,sha256=lyffK4UBG2d_0JzIaf1QZCsPXFti6gejiIWRSdr-CYA,1841
|
|
53
53
|
odxtools/internalconstr.py,sha256=QKEkaOcrFoL9xID-oHWWkeg-vtcPV6RFOW1fX2K3pwg,1363
|
54
54
|
odxtools/isotp_state_machine.py,sha256=O6v29IK7p_4gFqrr-fahnbp9Qmo78EEQfEwRsA_Vfjw,13339
|
55
55
|
odxtools/leadinglengthinfotype.py,sha256=mtq38k74hEh_CUY7NbVwdCc_aqKr7v5ABoS_SlKVXyI,4185
|
56
|
+
odxtools/library.py,sha256=E_A6K6jcEoUdXh4h4sQILj7_JM-6X5OUUWSM47G69CU,2067
|
56
57
|
odxtools/loadfile.py,sha256=hi8jVE7B1G9gklsb7MrGrp4aOAI65j0kNwvDeEEEN2k,1744
|
57
58
|
odxtools/matchingparameter.py,sha256=2cqaxFCZ28GvvUKCIM-jas3ae4eYGbULbkBlb3aH5RY,2232
|
58
59
|
odxtools/message.py,sha256=07GekN1MbYXm7HaUITDKTj2lBmGK-LB9W8gtBmfAOew,1057
|
59
|
-
odxtools/minmaxlengthtype.py,sha256=
|
60
|
+
odxtools/minmaxlengthtype.py,sha256=FxcfbuPEmXgYava3h0EPF43I5yTZW_lUcgTqOF5mnes,8917
|
60
61
|
odxtools/modification.py,sha256=oyyFsYHixy6XHOdqqTCx3IIkTAKlSN9wxBpNpvhUaJA,838
|
61
62
|
odxtools/multiplexer.py,sha256=flHlorv9grEMj8pNAWQJNrxhptnDxSsFERO7gpKYRME,10235
|
62
63
|
odxtools/multiplexercase.py,sha256=qfxWJzfJLYAsnhFGheUWDsUaIte2dSRJ0nadiN9SXDw,3176
|
@@ -73,7 +74,7 @@ odxtools/paramlengthinfotype.py,sha256=vhgvCPIRnyCF9t8yhkYf5MsHXQhWWeEgz_kS8AbiO
|
|
73
74
|
odxtools/parentref.py,sha256=kcY3VMyVaIUWD0iVNX8sD9qeI4peU8gijboquu0zD7E,3751
|
74
75
|
odxtools/physicaldimension.py,sha256=CEH7Ura4gqsqlBUxBW08ea9Pxh_Od8JruYQ8o9qOGME,3269
|
75
76
|
odxtools/physicaltype.py,sha256=oYjOhdrTVCJcLLBYgy6pxKsZHpuwm1vZ8svwSjsUB6E,2699
|
76
|
-
odxtools/progcode.py,sha256=
|
77
|
+
odxtools/progcode.py,sha256=Cx8ziCmQm2OfhinAuRrFrMuoThU7hgA6zNQKAT-AT0A,2276
|
77
78
|
odxtools/protstack.py,sha256=nb2RR4OEaGX6lJ6drHejJU-tkB1p0Ok0KLZhNMTdsEc,2012
|
78
79
|
odxtools/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
79
80
|
odxtools/relateddoc.py,sha256=zb5Ea9vkd31kxTP4s5_PLF3LuCoUcG8rgLckStHVRDc,1301
|
@@ -92,6 +93,7 @@ odxtools/statechart.py,sha256=ZT8amPjec25pexwnOAPiifGEmKa68rliOILLnB6tNJc,2956
|
|
92
93
|
odxtools/statetransition.py,sha256=axZ1ePyyWAsxslTI5KDjZxC42uNyoPc6N7cNIhP5pxE,1860
|
93
94
|
odxtools/staticfield.py,sha256=NBZa5UZD4BD4UekpqF5bq_IzFjxUafmvpCHIEptOl-s,4434
|
94
95
|
odxtools/structure.py,sha256=W8uX1YQuJUApKfeLxYqlnU3EZ3AjTqcYpCUStR43ORI,582
|
96
|
+
odxtools/subcomponent.py,sha256=OPnpbliL7OTfYy9dR0hpQclyqQiTUEa2e2n7GmIoZVE,10401
|
95
97
|
odxtools/swvariable.py,sha256=tp8XJUokYOcAUkrQLM92IYDf7evIefwZR_DgMm33iYQ,622
|
96
98
|
odxtools/table.py,sha256=zgpVveH8neSNhdcsPp0jG4f6H00M0NKCuAME8MSrf-Q,4024
|
97
99
|
odxtools/tablerow.py,sha256=hOi7FCX7TiCRxErCD1hKU6h2hT5_8V3ghtt8dJXOiQY,6307
|
@@ -102,7 +104,7 @@ odxtools/unitgroup.py,sha256=_WNpnYFmkiHQnOY8XhIviiQLXziY3kplH--7ufAWXyI,2067
|
|
102
104
|
odxtools/unitspec.py,sha256=RMdEQoLrPhGt9vo32fkwbTqymicHFkFQnydFoi3uBog,2924
|
103
105
|
odxtools/utils.py,sha256=PJFXkG74BzoheurrDYOwHZ6EuIcr1sdxf1tQGk6zSgs,1122
|
104
106
|
odxtools/variablegroup.py,sha256=--5sMDOMUg4I3hFyoVOFcGCTOrctrrMADdmH3Mn4wHk,848
|
105
|
-
odxtools/version.py,sha256=
|
107
|
+
odxtools/version.py,sha256=j47e8zDIT9nXsPhJuJRzlh56ZyB-E1uGl-54XUFn9kk,411
|
106
108
|
odxtools/writepdxfile.py,sha256=ZEoNkSxheqnXm836-HOpd04O6ipMXYKFzXZy6PM0YLc,7813
|
107
109
|
odxtools/xdoc.py,sha256=gDq-8l8x-Tj1ZJOttPxZchcO5_jEPwcXxMgT29VgTS0,1433
|
108
110
|
odxtools/cli/__init__.py,sha256=T7ano_FIyzBASxYpmcA5VJXU5bQLIy_Qk0HE_SDKelY,106
|
@@ -138,8 +140,8 @@ odxtools/compumethods/tabintpcompumethod.py,sha256=Gyf2qV5y53SHIcum5d5HQVGszoZCd
|
|
138
140
|
odxtools/compumethods/texttablecompumethod.py,sha256=vDYafbM0YaipjfN0NSlCFMiIPvp8waMNj3thNcwuYgk,5929
|
139
141
|
odxtools/diaglayers/basevariant.py,sha256=mXS-SF-tcwtdV-rxZZCH6_yqdA-yhtMX1SGo1MS8w7k,4452
|
140
142
|
odxtools/diaglayers/basevariantraw.py,sha256=A9h6p2Ri0sPPTW217rtEdNpAt5g6t0MwP9sgXqZ8pFo,4673
|
141
|
-
odxtools/diaglayers/diaglayer.py,sha256=
|
142
|
-
odxtools/diaglayers/diaglayerraw.py,sha256=
|
143
|
+
odxtools/diaglayers/diaglayer.py,sha256=aCL4dMehy-Q4JXp7ReRYxL0RwSJk-w2V7tvX7nN4ilg,16237
|
144
|
+
odxtools/diaglayers/diaglayerraw.py,sha256=rQEH3Jzg6bzTmu0EyYhAoBlsL6qVm7Z46o2xlbL0nEo,12970
|
143
145
|
odxtools/diaglayers/diaglayertype.py,sha256=FXL-EVBdrAURuHSHo9OthFuEYEybQO66aMB1o2GxVdI,1340
|
144
146
|
odxtools/diaglayers/ecushareddata.py,sha256=QoV50wQIrJ2-faLtU1P7RrjdacbhPY2BfUtVtIyWqCM,3347
|
145
147
|
odxtools/diaglayers/ecushareddataraw.py,sha256=cvkBhqTLOAey7Pt1bjQ3Jkkenp-D3Zh5djpB4ZWWUvw,3375
|
@@ -177,11 +179,11 @@ odxtools/templates/macros/printBasicStructure.xml.jinja2,sha256=V5oWGZesU_U5pvPO
|
|
177
179
|
odxtools/templates/macros/printCompanyData.xml.jinja2,sha256=jcNmQBOGDw7wcKdam72NIJSOTxthfkPJvrmw24MBiYQ,2981
|
178
180
|
odxtools/templates/macros/printComparam.xml.jinja2,sha256=e3hPCswAymJteQIUNoc7FOwsK_FrbJOvJooWdEx_vuQ,2408
|
179
181
|
odxtools/templates/macros/printComparamRef.xml.jinja2,sha256=rBhrdUnp605fsUN9SaljpyaAojzaLBvTbkOuduKod18,1274
|
180
|
-
odxtools/templates/macros/printCompuMethod.xml.jinja2,sha256=
|
182
|
+
odxtools/templates/macros/printCompuMethod.xml.jinja2,sha256=9DilxMWnqOsXu7bNNlDqls-lEqcr_GPzhZum8rzDJP0,4430
|
181
183
|
odxtools/templates/macros/printDOP.xml.jinja2,sha256=t-6U0gZLdV2n6-YW5pkVFnHNVTAOnfqMch-mk_fGyjo,5146
|
182
184
|
odxtools/templates/macros/printDescription.xml.jinja2,sha256=7jcYEIXr7hbbKqSvIUIgXaQSXV4dKAR9UhY352BZct8,452
|
183
185
|
odxtools/templates/macros/printDiagComm.xml.jinja2,sha256=_SByYBYzPG9t7VNnAohFAXsgng9VrQcSacXH923wRzY,2239
|
184
|
-
odxtools/templates/macros/printDiagLayer.xml.jinja2,sha256=
|
186
|
+
odxtools/templates/macros/printDiagLayer.xml.jinja2,sha256=gQQhNGpVQRfVichgJdwBS6gMvoLfi-nlGat9imlW62Y,6901
|
185
187
|
odxtools/templates/macros/printDiagVariable.xml.jinja2,sha256=sQEU42Onf0WkRJZJyNUgeeGICc3MZaQJPQ0YKY6lRrU,2656
|
186
188
|
odxtools/templates/macros/printDynDefinedSpec.xml.jinja2,sha256=uX3C40VmlbH7sndlJNyTvq8upzaoq8vCk6S93gtpFIY,1742
|
187
189
|
odxtools/templates/macros/printDynamicEndmarkerField.xml.jinja2,sha256=6BmxPKesQvfy46iTiPSFu_iJffC6umZ_YRsTEd-0y5Q,587
|
@@ -196,6 +198,7 @@ odxtools/templates/macros/printEnvDataDesc.xml.jinja2,sha256=rBpPf51LFx5oNx_XjeT
|
|
196
198
|
odxtools/templates/macros/printFunctionalClass.xml.jinja2,sha256=TpOQTj-hlNLtIfcSTVzU-gRrfaWrgsTrIFMqm_1M6Qs,329
|
197
199
|
odxtools/templates/macros/printFunctionalGroup.xml.jinja2,sha256=zIeZbhf8haXhgJJUPiOnMe3lvqvfye4-zmwWDQJxFtQ,1159
|
198
200
|
odxtools/templates/macros/printHierarchyElement.xml.jinja2,sha256=GD6iNIE0Wu0QsJ8uLtwEV8N9t6mIhI00_KpCVzOVQBM,651
|
201
|
+
odxtools/templates/macros/printLibrary.xml.jinja2,sha256=wp8vZzHPLZayWZh6BOQ56kGyHSeyrlNacdlxBw9d0N0,683
|
199
202
|
odxtools/templates/macros/printMux.xml.jinja2,sha256=68IiPY_mIJQqQiqce3jUphqp3-xLfmEBL7CSb3Cz7eI,1869
|
200
203
|
odxtools/templates/macros/printParam.xml.jinja2,sha256=bdp-r1arWod-vV9ODUZn_QThtAAqkm31SqdJeGItJ1M,3183
|
201
204
|
odxtools/templates/macros/printParentRef.xml.jinja2,sha256=RllVKt2RgrMnWfsujGnBUiABwV2y4_ZfINYy7LXenPM,896
|
@@ -204,18 +207,19 @@ odxtools/templates/macros/printProtocol.xml.jinja2,sha256=1DXoRSq6z4dhpZnXWH3x9J
|
|
204
207
|
odxtools/templates/macros/printRequest.xml.jinja2,sha256=yq4xGSlQCioT7FRivyx40Cjs2CYr9EK6NLZf0W4wGW0,717
|
205
208
|
odxtools/templates/macros/printResponse.xml.jinja2,sha256=GsOYmnoh4ewhWg3FUdcovHuJxvuIjsSrXNtbcnnAQcM,683
|
206
209
|
odxtools/templates/macros/printService.xml.jinja2,sha256=zvjOCELEx4yim2FtdNKiExTsDPkAfQAP4Gf_QsondfQ,1546
|
207
|
-
odxtools/templates/macros/printSingleEcuJob.xml.jinja2,sha256=
|
210
|
+
odxtools/templates/macros/printSingleEcuJob.xml.jinja2,sha256=6phi3VxGllusm6KGgrjWiOj7g80ojHyxvesqmHvuNhs,2174
|
208
211
|
odxtools/templates/macros/printSpecialData.xml.jinja2,sha256=0eIFh9cWXfFrQN_f8G_lz3fUqmtysxY6tSN4DbuFY40,1386
|
209
212
|
odxtools/templates/macros/printState.xml.jinja2,sha256=BNnTEyczp43iP9Bn_plMLRsJsasra4sRyvmgODuZQYg,315
|
210
213
|
odxtools/templates/macros/printStateChart.xml.jinja2,sha256=XW1EhF1k8ogbEDt-QMjSOojKl4vjxXkq6BwJWR9GJsI,951
|
211
214
|
odxtools/templates/macros/printStateTransition.xml.jinja2,sha256=J2t0yU82UBegUSH9sAbnkdgEYPTUU0A7I-CokuPQxDo,510
|
212
215
|
odxtools/templates/macros/printStaticField.xml.jinja2,sha256=fkV07zrL2pTo6b5ZPD14V0uC1aEk2P4roXyDhp-ah38,521
|
213
216
|
odxtools/templates/macros/printStructure.xml.jinja2,sha256=CJUPZv_9lko63C5fNpOn5LlQqLCuS--qyhtx4NyD5Rk,567
|
217
|
+
odxtools/templates/macros/printSubComponent.xml.jinja2,sha256=ETo-k0K7px5nu9kgVjgDnjPoy8rYRfzq5ojvsZhM3Rw,3416
|
214
218
|
odxtools/templates/macros/printTable.xml.jinja2,sha256=5DQjjJ-UxQ75ntov0S0LGnm_V7YWtKadBpNbmV1aBb8,1501
|
215
219
|
odxtools/templates/macros/printUnitSpec.xml.jinja2,sha256=opS6_Gr94WlAtREEyX4sLo-D-17Gni9Wvr3y1nfVgSA,2715
|
216
|
-
odxtools-8.
|
217
|
-
odxtools-8.
|
218
|
-
odxtools-8.
|
219
|
-
odxtools-8.
|
220
|
-
odxtools-8.
|
221
|
-
odxtools-8.
|
220
|
+
odxtools-8.3.1.dist-info/LICENSE,sha256=NeGPFQdTa6EKeON3aShVlPAIquJnbbiOfj0suz6rzyQ,1074
|
221
|
+
odxtools-8.3.1.dist-info/METADATA,sha256=Ithh6Q0qSLSpzHYKciZ3NA-hZNdvaItrk4kaRL8WHXw,44084
|
222
|
+
odxtools-8.3.1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
|
223
|
+
odxtools-8.3.1.dist-info/entry_points.txt,sha256=_sBDzuNoT8LbbCjfc-OJiUt5WPrtOq_x-rr9txhrPjY,53
|
224
|
+
odxtools-8.3.1.dist-info/top_level.txt,sha256=pdS02kE5ZdgsaBRZDpX3NBFlaSx3zotsqX4E4V6tXEI,9
|
225
|
+
odxtools-8.3.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|