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.
@@ -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
- # sub_components: List[DiagLayer] # TODO
50
- # libraries: List[DiagLayer] # TODO
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
- # TODO: pos_response_suppressable: Optional[PosResponseSuppressable] # (sic!)
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)
@@ -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
- # TODO: Libraries are currently not internalized.
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)
@@ -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
- <ENTRY-POINT>{{pc.entry_point}}</ENTRY-POINT>
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
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '8.2.0'
16
- __version_tuple__ = version_tuple = (8, 2, 0)
15
+ __version__ = version = '8.3.1'
16
+ __version_tuple__ = version_tuple = (8, 3, 1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: odxtools
3
- Version: 8.2.0
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=ZNj7XbBPcNkrG0MLd8WoFcCneBmz9uU2Lpi8gtUF0mQ,10188
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=eF78Zb77f6Q6-JXdP3AjqmqNWo4KhGWb-_PVHT7Exmg,8906
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=ZoGf6X7qH3TT8zSr3bQAYwPb0Il4V6vSLWgdTnlj88Y,2169
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=U2ZY-8DRa3-0sBp4eiNaB9C5lBxec9hW73W6_0hd4_Q,411
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=QGRS2jeqAsR8GbNRzX5u-rzQy-pNG9l5HRMyArX3-I0,15930
142
- odxtools/diaglayers/diaglayerraw.py,sha256=dC8PvvdRCvvp-J_74sFecqBoTYaMj1E5A8b6grtlvvs,11936
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=6eW1IgjPDwtW9qvA24Tx1wFtGFfJ0k10Gne5HoQpy4U,4394
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=NKrQ9JTxxhdHTHYFo_ZzyoClJJkZC3ISObhWCJOXUq4,6449
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=SXUgO57KQFahI3fv9tRWlEyWeSr0sYXwQ8vq8lqo0eI,2645
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.2.0.dist-info/LICENSE,sha256=NeGPFQdTa6EKeON3aShVlPAIquJnbbiOfj0suz6rzyQ,1074
217
- odxtools-8.2.0.dist-info/METADATA,sha256=jp34I9k6-icmiR1fzWzxwyMO6Biyd7CA1BnvWLUelxU,44084
218
- odxtools-8.2.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
219
- odxtools-8.2.0.dist-info/entry_points.txt,sha256=_sBDzuNoT8LbbCjfc-OJiUt5WPrtOq_x-rr9txhrPjY,53
220
- odxtools-8.2.0.dist-info/top_level.txt,sha256=pdS02kE5ZdgsaBRZDpX3NBFlaSx3zotsqX4E4V6tXEI,9
221
- odxtools-8.2.0.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.1.0)
2
+ Generator: setuptools (75.2.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5