odxtools 6.7.0__py3-none-any.whl → 9.3.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/__init__.py +6 -4
- odxtools/additionalaudience.py +3 -5
- odxtools/admindata.py +5 -7
- odxtools/audience.py +10 -13
- odxtools/basecomparam.py +3 -5
- odxtools/basicstructure.py +55 -240
- odxtools/cli/_parser_utils.py +1 -1
- odxtools/cli/_print_utils.py +168 -134
- odxtools/cli/browse.py +111 -92
- odxtools/cli/compare.py +90 -71
- odxtools/cli/list.py +24 -15
- odxtools/cli/snoop.py +28 -5
- odxtools/codec.py +211 -0
- odxtools/commrelation.py +122 -0
- odxtools/companydata.py +5 -7
- odxtools/companydocinfo.py +7 -8
- odxtools/companyrevisioninfo.py +3 -5
- odxtools/companyspecificinfo.py +8 -9
- odxtools/comparam.py +4 -6
- odxtools/comparaminstance.py +7 -9
- odxtools/comparamspec.py +16 -54
- odxtools/comparamsubset.py +22 -62
- odxtools/complexcomparam.py +5 -7
- odxtools/compumethods/compucodecompumethod.py +63 -0
- odxtools/compumethods/compuconst.py +31 -0
- odxtools/compumethods/compudefaultvalue.py +27 -0
- odxtools/compumethods/compuinternaltophys.py +56 -0
- odxtools/compumethods/compuinversevalue.py +7 -0
- odxtools/compumethods/compumethod.py +93 -12
- odxtools/compumethods/compuphystointernal.py +56 -0
- odxtools/compumethods/compurationalcoeffs.py +20 -9
- odxtools/compumethods/compuscale.py +30 -35
- odxtools/compumethods/createanycompumethod.py +28 -161
- odxtools/compumethods/identicalcompumethod.py +31 -6
- odxtools/compumethods/linearcompumethod.py +69 -189
- odxtools/compumethods/linearsegment.py +190 -0
- odxtools/compumethods/ratfunccompumethod.py +106 -0
- odxtools/compumethods/ratfuncsegment.py +87 -0
- odxtools/compumethods/scalelinearcompumethod.py +132 -26
- odxtools/compumethods/scaleratfunccompumethod.py +113 -0
- odxtools/compumethods/tabintpcompumethod.py +119 -99
- odxtools/compumethods/texttablecompumethod.py +107 -43
- odxtools/createanydiagcodedtype.py +10 -67
- odxtools/database.py +167 -87
- odxtools/dataobjectproperty.py +15 -25
- odxtools/decodestate.py +9 -15
- odxtools/description.py +47 -0
- odxtools/determinenumberofitems.py +4 -5
- odxtools/diagcodedtype.py +36 -106
- odxtools/diagcomm.py +24 -12
- odxtools/diagdatadictionaryspec.py +33 -34
- odxtools/diaglayercontainer.py +46 -54
- odxtools/diaglayers/basevariant.py +128 -0
- odxtools/diaglayers/basevariantraw.py +123 -0
- odxtools/diaglayers/diaglayer.py +432 -0
- odxtools/{diaglayerraw.py → diaglayers/diaglayerraw.py} +105 -120
- odxtools/diaglayers/ecushareddata.py +96 -0
- odxtools/diaglayers/ecushareddataraw.py +87 -0
- odxtools/diaglayers/ecuvariant.py +124 -0
- odxtools/diaglayers/ecuvariantraw.py +129 -0
- odxtools/diaglayers/functionalgroup.py +110 -0
- odxtools/diaglayers/functionalgroupraw.py +106 -0
- odxtools/{diaglayer.py → diaglayers/hierarchyelement.py} +209 -448
- odxtools/diaglayers/hierarchyelementraw.py +58 -0
- odxtools/diaglayers/protocol.py +64 -0
- odxtools/diaglayers/protocolraw.py +91 -0
- odxtools/diagnostictroublecode.py +8 -9
- odxtools/diagservice.py +56 -43
- odxtools/diagvariable.py +113 -0
- odxtools/docrevision.py +5 -7
- odxtools/dopbase.py +15 -17
- odxtools/dtcdop.py +168 -50
- odxtools/dynamicendmarkerfield.py +134 -0
- odxtools/dynamiclengthfield.py +41 -37
- odxtools/dyndefinedspec.py +177 -0
- odxtools/dynenddopref.py +38 -0
- odxtools/ecuvariantmatcher.py +6 -7
- odxtools/element.py +13 -15
- odxtools/encodestate.py +199 -22
- odxtools/endofpdufield.py +31 -18
- odxtools/environmentdata.py +8 -1
- odxtools/environmentdatadescription.py +198 -38
- odxtools/exceptions.py +11 -2
- odxtools/field.py +10 -10
- odxtools/functionalclass.py +3 -5
- odxtools/inputparam.py +3 -12
- odxtools/leadinglengthinfotype.py +37 -18
- odxtools/library.py +66 -0
- odxtools/loadfile.py +64 -0
- odxtools/matchingparameter.py +3 -3
- odxtools/message.py +0 -7
- odxtools/minmaxlengthtype.py +61 -33
- odxtools/modification.py +3 -5
- odxtools/multiplexer.py +128 -73
- odxtools/multiplexercase.py +13 -14
- odxtools/multiplexerdefaultcase.py +15 -12
- odxtools/multiplexerswitchkey.py +4 -5
- odxtools/nameditemlist.py +29 -5
- odxtools/negoutputparam.py +3 -5
- odxtools/odxcategory.py +83 -0
- odxtools/odxlink.py +60 -51
- odxtools/odxtypes.py +37 -5
- odxtools/outputparam.py +4 -15
- odxtools/parameterinfo.py +218 -67
- odxtools/parameters/codedconstparameter.py +16 -24
- odxtools/parameters/dynamicparameter.py +5 -4
- odxtools/parameters/lengthkeyparameter.py +60 -26
- odxtools/parameters/matchingrequestparameter.py +23 -11
- odxtools/parameters/nrcconstparameter.py +45 -46
- odxtools/parameters/parameter.py +54 -56
- odxtools/parameters/parameterwithdop.py +15 -25
- odxtools/parameters/physicalconstantparameter.py +15 -18
- odxtools/parameters/reservedparameter.py +6 -2
- odxtools/parameters/systemparameter.py +55 -11
- odxtools/parameters/tableentryparameter.py +3 -2
- odxtools/parameters/tablekeyparameter.py +103 -49
- odxtools/parameters/tablestructparameter.py +47 -48
- odxtools/parameters/valueparameter.py +16 -20
- odxtools/paramlengthinfotype.py +52 -32
- odxtools/parentref.py +16 -2
- odxtools/physicaldimension.py +3 -8
- odxtools/progcode.py +26 -11
- odxtools/protstack.py +3 -5
- odxtools/py.typed +0 -0
- odxtools/relateddoc.py +7 -9
- odxtools/request.py +120 -10
- odxtools/response.py +123 -23
- odxtools/scaleconstr.py +3 -3
- odxtools/servicebinner.py +1 -1
- odxtools/singleecujob.py +12 -10
- odxtools/snrefcontext.py +29 -0
- odxtools/specialdata.py +3 -5
- odxtools/specialdatagroup.py +7 -9
- odxtools/specialdatagroupcaption.py +3 -6
- odxtools/standardlengthtype.py +80 -14
- odxtools/state.py +3 -5
- odxtools/statechart.py +13 -19
- odxtools/statetransition.py +7 -17
- odxtools/staticfield.py +31 -25
- odxtools/subcomponent.py +288 -0
- odxtools/swvariable.py +21 -0
- odxtools/table.py +7 -8
- odxtools/tablerow.py +19 -11
- odxtools/teammember.py +3 -5
- odxtools/templates/comparam-spec.odx-c.xml.jinja2 +4 -24
- odxtools/templates/comparam-subset.odx-cs.xml.jinja2 +5 -26
- odxtools/templates/diag_layer_container.odx-d.xml.jinja2 +15 -31
- odxtools/templates/{index.xml.xml.jinja2 → index.xml.jinja2} +1 -1
- odxtools/templates/macros/printAudience.xml.jinja2 +1 -1
- odxtools/templates/macros/printBaseVariant.xml.jinja2 +53 -0
- odxtools/templates/macros/printCompanyData.xml.jinja2 +4 -7
- odxtools/templates/macros/printComparam.xml.jinja2 +6 -4
- odxtools/templates/macros/printComparamRef.xml.jinja2 +5 -12
- odxtools/templates/macros/printCompuMethod.xml.jinja2 +147 -0
- odxtools/templates/macros/printDOP.xml.jinja2 +27 -133
- odxtools/templates/macros/printDescription.xml.jinja2 +18 -0
- odxtools/templates/macros/printDiagComm.xml.jinja2 +1 -1
- odxtools/templates/macros/printDiagLayer.xml.jinja2 +222 -0
- odxtools/templates/macros/printDiagVariable.xml.jinja2 +66 -0
- odxtools/templates/macros/printDynDefinedSpec.xml.jinja2 +48 -0
- odxtools/templates/macros/printDynamicEndmarkerField.xml.jinja2 +16 -0
- odxtools/templates/macros/printDynamicLengthField.xml.jinja2 +1 -1
- odxtools/templates/macros/printEcuSharedData.xml.jinja2 +30 -0
- odxtools/templates/macros/printEcuVariant.xml.jinja2 +53 -0
- odxtools/templates/macros/printEcuVariantPattern.xml.jinja2 +1 -1
- odxtools/templates/macros/printElementId.xml.jinja2 +8 -3
- odxtools/templates/macros/printEndOfPdu.xml.jinja2 +1 -1
- odxtools/templates/macros/printEnvDataDesc.xml.jinja2 +1 -1
- odxtools/templates/macros/printFunctionalClass.xml.jinja2 +1 -1
- odxtools/templates/macros/printFunctionalGroup.xml.jinja2 +40 -0
- odxtools/templates/macros/printHierarchyElement.xml.jinja2 +24 -0
- odxtools/templates/macros/printLibrary.xml.jinja2 +21 -0
- odxtools/templates/macros/printMux.xml.jinja2 +4 -3
- odxtools/templates/macros/printOdxCategory.xml.jinja2 +28 -0
- odxtools/templates/macros/printParam.xml.jinja2 +11 -12
- odxtools/templates/macros/printProtStack.xml.jinja2 +1 -1
- odxtools/templates/macros/printProtocol.xml.jinja2 +30 -0
- odxtools/templates/macros/printRequest.xml.jinja2 +1 -1
- odxtools/templates/macros/printResponse.xml.jinja2 +1 -1
- odxtools/templates/macros/printService.xml.jinja2 +3 -2
- odxtools/templates/macros/printSingleEcuJob.xml.jinja2 +5 -26
- odxtools/templates/macros/printSpecialData.xml.jinja2 +1 -1
- odxtools/templates/macros/printState.xml.jinja2 +1 -1
- odxtools/templates/macros/printStateChart.xml.jinja2 +1 -1
- odxtools/templates/macros/printStateTransition.xml.jinja2 +1 -1
- odxtools/templates/macros/printStaticField.xml.jinja2 +1 -1
- odxtools/templates/macros/printStructure.xml.jinja2 +1 -1
- odxtools/templates/macros/printSubComponent.xml.jinja2 +104 -0
- odxtools/templates/macros/printTable.xml.jinja2 +4 -5
- odxtools/templates/macros/printUnitSpec.xml.jinja2 +3 -5
- odxtools/uds.py +2 -10
- odxtools/unit.py +4 -8
- odxtools/unitgroup.py +3 -5
- odxtools/unitspec.py +17 -17
- odxtools/utils.py +38 -20
- odxtools/variablegroup.py +32 -0
- odxtools/version.py +2 -2
- odxtools/{write_pdx_file.py → writepdxfile.py} +20 -10
- odxtools/xdoc.py +3 -5
- {odxtools-6.7.0.dist-info → odxtools-9.3.0.dist-info}/METADATA +20 -21
- odxtools-9.3.0.dist-info/RECORD +228 -0
- {odxtools-6.7.0.dist-info → odxtools-9.3.0.dist-info}/WHEEL +1 -1
- odxtools/createcompanydatas.py +0 -17
- odxtools/createsdgs.py +0 -19
- odxtools/load_file.py +0 -13
- odxtools/load_odx_d_file.py +0 -6
- odxtools/load_pdx_file.py +0 -8
- odxtools/templates/macros/printVariant.xml.jinja2 +0 -216
- odxtools-6.7.0.dist-info/RECORD +0 -182
- /odxtools/{diaglayertype.py → diaglayers/diaglayertype.py} +0 -0
- {odxtools-6.7.0.dist-info → odxtools-9.3.0.dist-info}/LICENSE +0 -0
- {odxtools-6.7.0.dist-info → odxtools-9.3.0.dist-info}/entry_points.txt +0 -0
- {odxtools-6.7.0.dist-info → odxtools-9.3.0.dist-info}/top_level.txt +0 -0
@@ -11,8 +11,8 @@
|
|
11
11
|
{%- set semattrib = make_xml_attrib("SEMANTIC", param.semantic) -%}
|
12
12
|
{%- if param.parameter_type == "TABLE-KEY" %}
|
13
13
|
<PARAM {{ semattrib }}
|
14
|
-
|
15
|
-
|
14
|
+
{{-peid.printElementIdAttribs(param)}}
|
15
|
+
xsi:type="{{param.parameter_type}}">
|
16
16
|
{%- elif param.parameter_type == "SYSTEM" %}
|
17
17
|
<PARAM {{ semattrib }}
|
18
18
|
{{- make_xml_attrib("SYSPARAM", param.sysparam) }}
|
@@ -35,8 +35,6 @@
|
|
35
35
|
{%- endif %}
|
36
36
|
{%- if param.coded_value is defined %}
|
37
37
|
<CODED-VALUE>{{param.coded_value}}</CODED-VALUE>
|
38
|
-
{%- elif param.physical_constant_value_raw is defined %}
|
39
|
-
<PHYS-CONSTANT-VALUE>{{param.physical_constant_value_raw}}</PHYS-CONSTANT-VALUE>
|
40
38
|
{%- elif param.coded_values is defined %}
|
41
39
|
<CODED-VALUES>
|
42
40
|
{%- for coded_value in param.coded_values %}
|
@@ -44,19 +42,20 @@
|
|
44
42
|
{%- endfor %}
|
45
43
|
</CODED-VALUES>
|
46
44
|
{%- endif %}
|
47
|
-
{%- if param.
|
48
|
-
<
|
45
|
+
{%- if param.physical_constant_value_raw is defined %}
|
46
|
+
<PHYS-CONSTANT-VALUE>{{param.physical_constant_value_raw}}</PHYS-CONSTANT-VALUE>
|
47
|
+
{%- endif %}
|
48
|
+
{%- if param.physical_default_value_raw is defined and param.physical_default_value_raw is not none %}
|
49
|
+
<PHYSICAL-DEFAULT-VALUE>{{param.physical_default_value_raw | e}}</PHYSICAL-DEFAULT-VALUE>
|
49
50
|
{%- endif %}
|
50
51
|
{%- if param.dop_ref %}
|
51
52
|
<DOP-REF ID-REF="{{param.dop_ref.ref_id}}"/>
|
52
53
|
{%- elif param.dop_snref %}
|
53
|
-
<DOP-SNREF
|
54
|
+
<DOP-SNREF SHORT-NAME="{{param.dop_snref}}"/>
|
54
55
|
{%- elif param.diag_coded_type is defined %}
|
55
56
|
{{pdop.printDiagCodedType(param.diag_coded_type)|indent(2)}}
|
56
|
-
{%- elif param.
|
57
|
-
{
|
58
|
-
<BIT-LENGTH>{{param.bit_length}}</BIT-LENGTH>
|
59
|
-
{%- endif %}
|
57
|
+
{%- elif param.bit_length is defined and param.bit_length is not none %}
|
58
|
+
<BIT-LENGTH>{{param.bit_length}}</BIT-LENGTH>
|
60
59
|
{%- endif %}
|
61
60
|
{%- if param.parameter_type == "TABLE-KEY" %}
|
62
61
|
{%- if param.table_ref %}
|
@@ -77,7 +76,7 @@
|
|
77
76
|
<TABLE-KEY-REF ID-REF="{{param.table_key_ref.ref_id}}"/>
|
78
77
|
{%- endif %}
|
79
78
|
{%- if param.table_key_snref %}
|
80
|
-
<TABLE-KEY-SNREF SHORT-NAME="{{param.
|
79
|
+
<TABLE-KEY-SNREF SHORT-NAME="{{param.table_key_snref}}"/>
|
81
80
|
{%- endif %}
|
82
81
|
{%- endif %}
|
83
82
|
</PARAM>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
|
8
8
|
|
9
9
|
{%- macro printProtStack(ps) %}
|
10
|
-
<PROT-STACK
|
10
|
+
<PROT-STACK {{-peid.printElementIdAttribs(ps)}}>
|
11
11
|
{{ peid.printElementIdSubtags(ps) | indent(1) }}
|
12
12
|
<PDU-PROTOCOL-TYPE>{{ ps.pdu_protocol_type }}</PDU-PROTOCOL-TYPE>
|
13
13
|
<PHYSICAL-LINK-TYPE>{{ ps.physical_link_type }}</PHYSICAL-LINK-TYPE>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
{#- -*- mode: sgml; tab-width: 2; indent-tabs-mode: nil -*-
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: MIT
|
4
|
+
-#}
|
5
|
+
|
6
|
+
{%- import('macros/printHierarchyElement.xml.jinja2') as phe %}
|
7
|
+
{%- import('macros/printComparamRef.xml.jinja2') as pcom %}
|
8
|
+
{%- import('macros/printParentRef.xml.jinja2') as pparref %}
|
9
|
+
|
10
|
+
{%- macro printProtocol(protocol) -%}
|
11
|
+
<PROTOCOL {{- phe.printHierarchyElementAttribs(protocol) -}}>
|
12
|
+
{{ phe.printHierarchyElementSubtags(protocol) | indent(2) }}
|
13
|
+
{%- set dlr = protocol.protocol_raw %}
|
14
|
+
|
15
|
+
{%- set cps_docfrag = dlr.comparam_spec_ref.ref_docs[-1] %}
|
16
|
+
<COMPARAM-SPEC-REF ID-REF="{{dlr.comparam_spec_ref.ref_id}}" DOCREF="{{cps_docfrag.doc_name}}" DOCTYPE="{{cps_docfrag.doc_type}}" />
|
17
|
+
|
18
|
+
{%- if dlr.prot_stack_snref is not none %}
|
19
|
+
<PROT-STACK-SNREF SHORT-NAME="{{ dlr.prot_stack_snref }}" />
|
20
|
+
{%- endif %}
|
21
|
+
|
22
|
+
{%- if dlr.parent_refs %}
|
23
|
+
<PARENT-REFS>
|
24
|
+
{%- for parent in dlr.parent_refs -%}
|
25
|
+
{{ pparref.printParentRef(parent)|indent(4) }}
|
26
|
+
{%- endfor %}
|
27
|
+
</PARENT-REFS>
|
28
|
+
{%- endif %}
|
29
|
+
</PROTOCOL>
|
30
|
+
{%- endmacro %}
|
@@ -9,7 +9,7 @@
|
|
9
9
|
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
|
10
10
|
|
11
11
|
{%- macro printRequest(request) -%}
|
12
|
-
<REQUEST
|
12
|
+
<REQUEST {{-peid.printElementIdAttribs(request)}}>
|
13
13
|
{{ peid.printElementIdSubtags(request)|indent(1) }}
|
14
14
|
{%- if request.parameters %}
|
15
15
|
<PARAMS>
|
@@ -8,7 +8,7 @@
|
|
8
8
|
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
|
9
9
|
|
10
10
|
{%- macro printResponse(resp, tag_name="POS-RESPONSE") -%}
|
11
|
-
<{{tag_name}}
|
11
|
+
<{{tag_name}} {{-peid.printElementIdAttribs(resp)}}>
|
12
12
|
{{ peid.printElementIdSubtags(resp)|indent(1) }}
|
13
13
|
{%- if resp.parameters %}
|
14
14
|
<PARAMS>
|
@@ -4,6 +4,7 @@
|
|
4
4
|
-#}
|
5
5
|
|
6
6
|
{%- import('macros/printDiagComm.xml.jinja2') as pdc %}
|
7
|
+
{%- import('macros/printComparamRef.xml.jinja2') as pcom %}
|
7
8
|
|
8
9
|
{%- macro printService(service) -%}
|
9
10
|
<DIAG-SERVICE {{pdc.printDiagCommAttribs(service) | indent(1) }}
|
@@ -18,8 +19,8 @@
|
|
18
19
|
{{pdc.printDiagCommSubtags(service) | indent(1, first=True) }}
|
19
20
|
{%- if service.comparam_refs %}
|
20
21
|
<COMPARAM-REFS>
|
21
|
-
{%- for
|
22
|
-
|
22
|
+
{%- for cpref in service.comparam_refs %}
|
23
|
+
{{ pcom.printComparamRef(cpref)|indent(4) }}
|
23
24
|
{%- endfor %}
|
24
25
|
</COMPARAM-REFS>
|
25
26
|
{%- endif%}
|
@@ -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,41 +40,19 @@
|
|
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)}}>
|
67
46
|
{{ peid.printElementIdSubtags(param)|indent(1) }}
|
68
|
-
{%- if param.physical_default_value %}
|
69
|
-
<PHYSICAL-DEFAULT-VALUE>{{param.physical_default_value}}</PHYSICAL-DEFAULT-VALUE>
|
47
|
+
{%- if param.physical_default_value is not none %}
|
48
|
+
<PHYSICAL-DEFAULT-VALUE>{{param.physical_default_value | e}}</PHYSICAL-DEFAULT-VALUE>
|
70
49
|
{%- endif %}
|
71
50
|
<DOP-BASE-REF ID-REF="{{param.dop_base_ref.ref_id}}" />
|
72
51
|
</INPUT-PARAM>
|
73
52
|
{%- endmacro -%}
|
74
53
|
|
75
54
|
{%- macro printOutputParam(param) -%}
|
76
|
-
<OUTPUT-PARAM
|
55
|
+
<OUTPUT-PARAM {{-peid.printElementIdAttribs(param)}}
|
77
56
|
{{-make_xml_attrib("OID", param.oid)}}
|
78
57
|
{{-make_xml_attrib("SEMANTIC", param.semantic)}}>
|
79
58
|
{{ peid.printElementIdSubtags(param)|indent(1) }}
|
@@ -17,7 +17,7 @@
|
|
17
17
|
{%- endmacro %}
|
18
18
|
|
19
19
|
{%- macro printSdgCaption(sdg_caption) %}
|
20
|
-
<SDG-CAPTION
|
20
|
+
<SDG-CAPTION {{-peid.printElementIdAttribs(sdg_caption)}}>
|
21
21
|
{{ peid.printElementIdSubtags(sdg_caption)|indent(1) }}
|
22
22
|
</SDG-CAPTION>
|
23
23
|
{%- endmacro %}
|
@@ -6,7 +6,7 @@
|
|
6
6
|
{%- import('macros/printElementId.xml.jinja2') as peid %}
|
7
7
|
|
8
8
|
{%- macro printState(state) -%}
|
9
|
-
<STATE
|
9
|
+
<STATE {{-peid.printElementIdAttribs(state)}}>
|
10
10
|
{{ peid.printElementIdSubtags(state)|indent(1) }}
|
11
11
|
</STATE>
|
12
12
|
{%- endmacro -%}
|
@@ -8,7 +8,7 @@
|
|
8
8
|
{%- import('macros/printStateTransition.xml.jinja2') as pst %}
|
9
9
|
|
10
10
|
{%- macro printStateChart(state_chart) -%}
|
11
|
-
<STATE-CHART
|
11
|
+
<STATE-CHART {{-peid.printElementIdAttribs(state_chart)}}>
|
12
12
|
{{ peid.printElementIdSubtags(state_chart)|indent(1) }}
|
13
13
|
<SEMANTIC>{{state_chart.semantic}}</SEMANTIC>
|
14
14
|
{%- if state_chart.state_transitions %}
|
@@ -6,7 +6,7 @@
|
|
6
6
|
{%- import('macros/printElementId.xml.jinja2') as peid %}
|
7
7
|
|
8
8
|
{%- macro printStateTransition(state_transition) -%}
|
9
|
-
<STATE-TRANSITION
|
9
|
+
<STATE-TRANSITION {{-peid.printElementIdAttribs(state_transition)}}>
|
10
10
|
{{ peid.printElementIdSubtags(state_transition)|indent(1) }}
|
11
11
|
<SOURCE-SNREF SHORT-NAME="{{state_transition.source_snref}}" />
|
12
12
|
<TARGET-SNREF SHORT-NAME="{{state_transition.target_snref}}" />
|
@@ -6,7 +6,7 @@
|
|
6
6
|
{%- import('macros/printElementId.xml.jinja2') as peid %}
|
7
7
|
|
8
8
|
{%- macro printStaticField(sf) -%}
|
9
|
-
<STATIC-FIELD
|
9
|
+
<STATIC-FIELD {{-peid.printElementIdAttribs(sf)}}>
|
10
10
|
{{ peid.printElementIdSubtags(sf)|indent(1) }}
|
11
11
|
<BASIC-STRUCTURE-REF ID-REF="{{sf.structure_ref.ref_id}}" />
|
12
12
|
<FIXED-NUMBER-OF-ITEMS>{{sf.fixed_number_of_items}}</FIXED-NUMBER-OF-ITEMS>
|
@@ -7,7 +7,7 @@
|
|
7
7
|
{%- import('macros/printParam.xml.jinja2') as pp %}
|
8
8
|
|
9
9
|
{%- macro printStructure(st) -%}
|
10
|
-
<STRUCTURE
|
10
|
+
<STRUCTURE {{-peid.printElementIdAttribs(st)}}>
|
11
11
|
{{ peid.printElementIdSubtags(st)|indent(1) }}
|
12
12
|
{%- if st.byte_size is not none %}
|
13
13
|
<BYTE-SIZE>{{st.byte_size}}</BYTE-SIZE>
|
@@ -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 %}
|
@@ -5,9 +5,10 @@
|
|
5
5
|
|
6
6
|
{%- import('macros/printElementId.xml.jinja2') as peid %}
|
7
7
|
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
|
8
|
+
{%- import('macros/printDescription.xml.jinja2') as pd %}
|
8
9
|
|
9
10
|
{%- macro printTable(table) %}
|
10
|
-
<TABLE
|
11
|
+
<TABLE {{-peid.printElementIdAttribs(table)}}
|
11
12
|
{{-make_xml_attrib("SEMANTIC", table.semantic)}}>
|
12
13
|
{{ peid.printElementIdSubtags(table)|indent(1) }}
|
13
14
|
{%- if table.key_dop_ref %}
|
@@ -15,15 +16,13 @@
|
|
15
16
|
{%- endif %}
|
16
17
|
{%- for table_row in table.table_rows_raw %}
|
17
18
|
{%- if hasattr(table_row, "key") %}
|
18
|
-
<TABLE-ROW
|
19
|
+
<TABLE-ROW {{-peid.printElementIdAttribs(table_row)}}
|
19
20
|
{{-make_xml_attrib("SEMANTIC", table_row.semantic)}}>
|
20
21
|
<SHORT-NAME>{{table_row.short_name}}</SHORT-NAME>
|
21
22
|
{%- if table_row.long_name %}
|
22
23
|
<LONG-NAME>{{table_row.long_name|e}}</LONG-NAME>
|
23
24
|
{%- endif %}
|
24
|
-
{
|
25
|
-
<DESC>{{table_row.description}}</DESC>
|
26
|
-
{%- endif %}
|
25
|
+
{{ pd.printDescription(table_row.description) }}
|
27
26
|
<KEY>{{table_row.key|e}}</KEY>
|
28
27
|
{%- if table_row.dop_ref %}
|
29
28
|
<DATA-OBJECT-PROP-REF ID-REF="{{ table_row.dop_ref.ref_id }}" />
|
@@ -35,8 +35,7 @@
|
|
35
35
|
|
36
36
|
|
37
37
|
{%- macro printUnit(unit) -%}
|
38
|
-
<UNIT
|
39
|
-
{{-make_xml_attrib("OID", unit.oid)}}>
|
38
|
+
<UNIT {{-peid.printElementIdAttribs(unit)}}>
|
40
39
|
{{ peid.printElementIdSubtags(unit)|indent(1) }}
|
41
40
|
<DISPLAY-NAME>{{ unit.display_name }}</DISPLAY-NAME>
|
42
41
|
{%- if unit.factor_si_to_unit is not none %}
|
@@ -52,7 +51,7 @@
|
|
52
51
|
{%- endmacro -%}
|
53
52
|
|
54
53
|
{%- macro printUnitGroup(group) -%}
|
55
|
-
<UNIT-GROUP {
|
54
|
+
<UNIT-GROUP {{-make_xml_attrib("OID", group.oid)}}>
|
56
55
|
{{ peid.printElementIdSubtags(group)|indent(1) }}
|
57
56
|
<CATEGORY>{{ group.category.value }}</CATEGORY>
|
58
57
|
{%- if group.unit_refs %}
|
@@ -66,8 +65,7 @@
|
|
66
65
|
{%- endmacro -%}
|
67
66
|
|
68
67
|
{%- macro printPhysicalDimesion(dim) -%}
|
69
|
-
<PHYSICAL-DIMENSION
|
70
|
-
{{-make_xml_attrib("OID",dim.oid)}}>
|
68
|
+
<PHYSICAL-DIMENSION {{-peid.printElementIdAttribs(dim)}}>
|
71
69
|
{{ peid.printElementIdSubtags(dim)|indent(1) }}
|
72
70
|
{%- if dim.length_exp %}
|
73
71
|
<LENGTH-EXP>{{ dim.length_exp }}</LENGTH-EXP>
|
odxtools/uds.py
CHANGED
@@ -3,8 +3,6 @@ from enum import IntEnum
|
|
3
3
|
from itertools import chain
|
4
4
|
from typing import Optional
|
5
5
|
|
6
|
-
from deprecation import deprecated
|
7
|
-
|
8
6
|
import odxtools.obd as obd
|
9
7
|
|
10
8
|
|
@@ -62,13 +60,13 @@ _sid_to_name = {
|
|
62
60
|
0x85: "Control DTC Settings",
|
63
61
|
0x86: "Response on Event",
|
64
62
|
0x87: "Link Control",
|
65
|
-
0x22: "Read Data by Identifier
|
63
|
+
0x22: "Read Data by Identifier",
|
66
64
|
0x23: "Read Memory by Address",
|
67
65
|
0x24: "Read Scaling Data by Identifier",
|
68
66
|
0x2a: "Read Data by Periodic Identifier",
|
69
67
|
0x2c: "Dynamically Define Data Identifier",
|
70
68
|
0x2e: "Write Data by Identifier",
|
71
|
-
0x3d: "Write Memory by Address
|
69
|
+
0x3d: "Write Memory by Address",
|
72
70
|
0x14: "Clear Diagnostic Information",
|
73
71
|
0x19: "Read DTC Information",
|
74
72
|
0x2f: "Input Output Control by Identifier",
|
@@ -170,9 +168,3 @@ def is_response_pending(telegram_payload: bytes, request_sid: Optional[int] = No
|
|
170
168
|
|
171
169
|
# if all of the above applies, we received a "stay tuned" response
|
172
170
|
return True
|
173
|
-
|
174
|
-
|
175
|
-
# previous versions of odxtools had a typo here. hit happens!
|
176
|
-
@deprecated(details="use is_response_pending()") # type: ignore[misc]
|
177
|
-
def is_reponse_pending(telegram_payload: bytes, request_sid: Optional[int] = None) -> bool:
|
178
|
-
return is_response_pending(telegram_payload, request_sid)
|
odxtools/unit.py
CHANGED
@@ -1,17 +1,15 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import
|
3
|
+
from typing import Any, Dict, List, Optional
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
6
|
from .element import IdentifiableElement
|
7
7
|
from .exceptions import odxassert, odxrequire
|
8
8
|
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
9
9
|
from .physicaldimension import PhysicalDimension
|
10
|
+
from .snrefcontext import SnRefContext
|
10
11
|
from .utils import dataclass_fields_asdict
|
11
12
|
|
12
|
-
if TYPE_CHECKING:
|
13
|
-
from .diaglayer import DiagLayer
|
14
|
-
|
15
13
|
|
16
14
|
@dataclass
|
17
15
|
class Unit(IdentifiableElement):
|
@@ -55,7 +53,6 @@ class Unit(IdentifiableElement):
|
|
55
53
|
```
|
56
54
|
"""
|
57
55
|
display_name: str
|
58
|
-
oid: Optional[str]
|
59
56
|
factor_si_to_unit: Optional[float]
|
60
57
|
offset_si_to_unit: Optional[float]
|
61
58
|
physical_dimension_ref: Optional[OdxLinkRef]
|
@@ -66,7 +63,7 @@ class Unit(IdentifiableElement):
|
|
66
63
|
@staticmethod
|
67
64
|
def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "Unit":
|
68
65
|
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
|
69
|
-
|
66
|
+
|
70
67
|
display_name = odxrequire(et_element.findtext("DISPLAY-NAME"))
|
71
68
|
|
72
69
|
def read_optional_float(element: ElementTree.Element, name: str) -> Optional[float]:
|
@@ -82,7 +79,6 @@ class Unit(IdentifiableElement):
|
|
82
79
|
|
83
80
|
return Unit(
|
84
81
|
display_name=display_name,
|
85
|
-
oid=oid,
|
86
82
|
factor_si_to_unit=factor_si_to_unit,
|
87
83
|
offset_si_to_unit=offset_si_to_unit,
|
88
84
|
physical_dimension_ref=physical_dimension_ref,
|
@@ -104,5 +100,5 @@ class Unit(IdentifiableElement):
|
|
104
100
|
f"The physical_dimension_ref must be resolved to a PhysicalDimension."
|
105
101
|
f" {self.physical_dimension_ref} referenced {self._physical_dimension}")
|
106
102
|
|
107
|
-
def _resolve_snrefs(self,
|
103
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
108
104
|
pass
|
odxtools/unitgroup.py
CHANGED
@@ -1,19 +1,17 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
3
|
from enum import Enum
|
4
|
-
from typing import
|
4
|
+
from typing import Any, Dict, List, Optional, cast
|
5
5
|
from xml.etree import ElementTree
|
6
6
|
|
7
7
|
from .element import NamedElement
|
8
8
|
from .exceptions import odxraise, odxrequire
|
9
9
|
from .nameditemlist import NamedItemList
|
10
10
|
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
11
|
+
from .snrefcontext import SnRefContext
|
11
12
|
from .unit import Unit
|
12
13
|
from .utils import dataclass_fields_asdict
|
13
14
|
|
14
|
-
if TYPE_CHECKING:
|
15
|
-
from .diaglayer import DiagLayer
|
16
|
-
|
17
15
|
|
18
16
|
class UnitGroupCategory(Enum):
|
19
17
|
COUNTRY = "COUNTRY"
|
@@ -57,7 +55,7 @@ class UnitGroup(NamedElement):
|
|
57
55
|
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
|
58
56
|
self._units = NamedItemList[Unit]([odxlinks.resolve(ref) for ref in self.unit_refs])
|
59
57
|
|
60
|
-
def _resolve_snrefs(self,
|
58
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
61
59
|
pass
|
62
60
|
|
63
61
|
@property
|
odxtools/unitspec.py
CHANGED
@@ -1,19 +1,16 @@
|
|
1
1
|
# SPDX-License-Identifier: MIT
|
2
2
|
from dataclasses import dataclass
|
3
|
-
from typing import
|
3
|
+
from typing import Any, Dict, List
|
4
4
|
from xml.etree import ElementTree
|
5
5
|
|
6
|
-
from .createsdgs import create_sdgs_from_et
|
7
6
|
from .nameditemlist import NamedItemList
|
8
7
|
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId
|
9
8
|
from .physicaldimension import PhysicalDimension
|
9
|
+
from .snrefcontext import SnRefContext
|
10
10
|
from .specialdatagroup import SpecialDataGroup
|
11
11
|
from .unit import Unit
|
12
12
|
from .unitgroup import UnitGroup
|
13
13
|
|
14
|
-
if TYPE_CHECKING:
|
15
|
-
from .diaglayer import DiagLayer
|
16
|
-
|
17
14
|
|
18
15
|
@dataclass
|
19
16
|
class UnitSpec:
|
@@ -28,9 +25,9 @@ class UnitSpec:
|
|
28
25
|
"""
|
29
26
|
|
30
27
|
# TODO (?): Why are there type errors...
|
31
|
-
unit_groups:
|
32
|
-
units:
|
33
|
-
physical_dimensions:
|
28
|
+
unit_groups: NamedItemList[UnitGroup]
|
29
|
+
units: NamedItemList[Unit]
|
30
|
+
physical_dimensions: NamedItemList[PhysicalDimension]
|
34
31
|
sdgs: List[SpecialDataGroup]
|
35
32
|
|
36
33
|
def __post_init__(self) -> None:
|
@@ -41,15 +38,18 @@ class UnitSpec:
|
|
41
38
|
@staticmethod
|
42
39
|
def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) -> "UnitSpec":
|
43
40
|
|
44
|
-
unit_groups = [
|
41
|
+
unit_groups = NamedItemList([
|
45
42
|
UnitGroup.from_et(el, doc_frags) for el in et_element.iterfind("UNIT-GROUPS/UNIT-GROUP")
|
46
|
-
]
|
47
|
-
units =
|
48
|
-
|
43
|
+
])
|
44
|
+
units = NamedItemList(
|
45
|
+
[Unit.from_et(el, doc_frags) for el in et_element.iterfind("UNITS/UNIT")])
|
46
|
+
physical_dimensions = NamedItemList([
|
49
47
|
PhysicalDimension.from_et(el, doc_frags)
|
50
48
|
for el in et_element.iterfind("PHYSICAL-DIMENSIONS/PHYSICAL-DIMENSION")
|
49
|
+
])
|
50
|
+
sdgs = [
|
51
|
+
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
|
51
52
|
]
|
52
|
-
sdgs = create_sdgs_from_et(et_element.find("SDGS"), doc_frags)
|
53
53
|
|
54
54
|
return UnitSpec(
|
55
55
|
unit_groups=unit_groups,
|
@@ -76,10 +76,10 @@ class UnitSpec:
|
|
76
76
|
for sdg in self.sdgs:
|
77
77
|
sdg._resolve_odxlinks(odxlinks)
|
78
78
|
|
79
|
-
def _resolve_snrefs(self,
|
79
|
+
def _resolve_snrefs(self, context: SnRefContext) -> None:
|
80
80
|
for unit in self.units:
|
81
|
-
unit._resolve_snrefs(
|
81
|
+
unit._resolve_snrefs(context)
|
82
82
|
for group in self.unit_groups:
|
83
|
-
group._resolve_snrefs(
|
83
|
+
group._resolve_snrefs(context)
|
84
84
|
for sdg in self.sdgs:
|
85
|
-
sdg._resolve_snrefs(
|
85
|
+
sdg._resolve_snrefs(context)
|