Skip to content

Commit 808a2fa

Browse files
authored
Merge pull request #387 from andlaus/complete_diag_variable
DiagVariable: internalize remaining functionality
2 parents 8410ced + b234a5a commit 808a2fa

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

odxtools/diagvariable.py

+45-7
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
from .element import IdentifiableElement
1010
from .exceptions import odxrequire
1111
from .nameditemlist import NamedItemList
12-
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
12+
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef, resolve_snref
1313
from .odxtypes import odxstr_to_bool
1414
from .snrefcontext import SnRefContext
1515
from .specialdatagroup import SpecialDataGroup
1616
from .swvariable import SwVariable
17+
from .table import Table
18+
from .tablerow import TableRow
1719
from .utils import dataclass_fields_asdict
1820
from .variablegroup import VariableGroup
1921

@@ -32,15 +34,30 @@ class DiagVariable(IdentifiableElement):
3234
"""
3335

3436
admin_data: Optional[AdminData]
35-
variable_group_ref: OdxLinkRef
37+
variable_group_ref: Optional[OdxLinkRef]
3638
sw_variables: List[SwVariable]
39+
40+
# a diag variable must specify either COMM-RELATIONS or a
41+
# reference to a table row
3742
comm_relations: List[CommRelation]
38-
#snref_to_tablerow: Optional[SnrefToTableRow] # TODO
43+
44+
# these are nested inside the SNREF-TO-TABLEROW tag
45+
table_snref: Optional[str]
46+
table_row_snref: Optional[str]
47+
3948
sdgs: List[SpecialDataGroup]
4049
is_read_before_write_raw: Optional[bool]
4150

4251
@property
43-
def variable_group(self) -> VariableGroup:
52+
def table(self) -> Optional[Table]:
53+
return self._table
54+
55+
@property
56+
def table_row(self) -> Optional[TableRow]:
57+
return self._table_row
58+
59+
@property
60+
def variable_group(self) -> Optional[VariableGroup]:
4461
return self._variable_group
4562

4663
@property
@@ -52,8 +69,7 @@ def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) ->
5269
kwargs = dataclass_fields_asdict(IdentifiableElement.from_et(et_element, doc_frags))
5370

5471
admin_data = AdminData.from_et(et_element.find("ADMIN-DATA"), doc_frags)
55-
variable_group_ref = odxrequire(
56-
OdxLinkRef.from_et(et_element.find("VARIABLE-GROUP-REF"), doc_frags))
72+
variable_group_ref = OdxLinkRef.from_et(et_element.find("VARIABLE-GROUP-REF"), doc_frags)
5773
sw_variables = NamedItemList([
5874
SwVariable.from_et(swv_elem, doc_frags)
5975
for swv_elem in et_element.iterfind("SW-VARIABLES/SW-VARIABLE")
@@ -62,6 +78,16 @@ def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) ->
6278
CommRelation.from_et(cr_elem, doc_frags)
6379
for cr_elem in et_element.iterfind("COMM-RELATIONS/COMM-RELATION")
6480
]
81+
82+
table_snref = None
83+
table_row_snref = None
84+
if (snref_to_tablerow_elem := et_element.find("SNREF-TO-TABLEROW")) is not None:
85+
table_snref_elem = odxrequire(snref_to_tablerow_elem.find("TABLE-SNREF"))
86+
table_snref = odxrequire(table_snref_elem.attrib.get("SHORT-NAME"))
87+
88+
table_row_snref_elem = odxrequire(snref_to_tablerow_elem.find("TABLE-ROW-SNREF"))
89+
table_row_snref = odxrequire(table_row_snref_elem.attrib.get("SHORT-NAME"))
90+
6591
sdgs = [
6692
SpecialDataGroup.from_et(sdge, doc_frags) for sdge in et_element.iterfind("SDGS/SDG")
6793
]
@@ -72,6 +98,8 @@ def from_et(et_element: ElementTree.Element, doc_frags: List[OdxDocFragment]) ->
7298
variable_group_ref=variable_group_ref,
7399
sw_variables=sw_variables,
74100
comm_relations=comm_relations,
101+
table_snref=table_snref,
102+
table_row_snref=table_row_snref,
75103
sdgs=sdgs,
76104
is_read_before_write_raw=is_read_before_write_raw,
77105
**kwargs)
@@ -91,7 +119,9 @@ def _build_odxlinks(self) -> Dict[OdxLinkId, Any]:
91119
return result
92120

93121
def _resolve_odxlinks(self, odxlinks: OdxLinkDatabase) -> None:
94-
self._variable_group = odxlinks.resolve(self.variable_group_ref, VariableGroup)
122+
self._variable_group = None
123+
if self.variable_group_ref is not None:
124+
self._variable_group = odxlinks.resolve(self.variable_group_ref, VariableGroup)
95125

96126
if self.admin_data is not None:
97127
self.admin_data._resolve_odxlinks(odxlinks)
@@ -111,3 +141,11 @@ def _resolve_snrefs(self, context: SnRefContext) -> None:
111141

112142
for cr in self.comm_relations:
113143
cr._resolve_snrefs(context)
144+
145+
self._table = None
146+
self._table_row = None
147+
if self.table_snref is not None:
148+
ddds = odxrequire(context.diag_layer).diag_data_dictionary_spec
149+
self._table = resolve_snref(self.table_snref, ddds.tables, Table)
150+
self._table_row = resolve_snref(
151+
odxrequire(self.table_row_snref), self._table.table_rows, TableRow)

odxtools/templates/macros/printDiagVariable.xml.jinja2

+11-2
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@
55
{%- import('macros/printElementId.xml.jinja2') as peid %}
66
{%- import('macros/printAdminData.xml.jinja2') as pad %}
77
{%- import('macros/printDescription.xml.jinja2') as pd %}
8+
{%- import('macros/printSpecialData.xml.jinja2') as psd %}
89

910
{%- macro printDiagVariable(diag_var) -%}
10-
<DIAG-VARIABLE {{-peid.printElementIdAttribs(diag_var)}}>
11+
<DIAG-VARIABLE {{-peid.printElementIdAttribs(diag_var)}}
12+
{{-make_bool_xml_attrib("IS-READ-BEFORE-WRITE", diag_var.is_read_before_write_raw}}>
1113
{{ peid.printElementIdSubtags(diag_variable)|indent(2) }}
1214
{%- if diag_variable.admin_data is not none %}
1315
{{ pad.printAdminData(diag_variable.admin_data)|indent(2) }}
1416
{%- endif %}
1517
<VARIABLE-GROUP-REF ID-REF="{{ diag_var.ref_id }}" />
1618
{%- if diag_variable.sw_variables %}
17-
<SW-VARIABLES>
19+
<SW-VARIABLES>
1820
{%- for sw_var in diag_variable.sw_variables %}
1921
<SW-VARIABLE {{-peid.printElementIdAttribs(sw_var)}}>
2022
{{ peid.printElementIdSubtags(sw_var)|indent(6) }}
@@ -56,6 +58,13 @@
5658
{%- endfor %}
5759
</COMM-RELATIONS>
5860
{%- endif %}
61+
{%- if diag_variable.table_snref is not none %}
62+
<SNREF-TO-TABLE-ROW>
63+
<TABLE-SNREF SHORT-NAME="{{diag_variable.table_snref}}" />
64+
<TABLE-ROW-SNREF SHORT-NAME="{{diag_variable.table_row_snref}}" />
65+
</SNREF-TO-TABLE-ROW>
66+
{%- endif %}
67+
{{- psd.printSpecialDataGroups(ddds.sdgs)|indent(2, first=True) }}
5968
</DIAG-VARIABLE>
6069
{%- endmacro -%}
6170

0 commit comments

Comments
 (0)