Skip to content

Commit 672ff47

Browse files
committed
EnvironmentDataDescription: handle default values and constant parameters for the referenced parameter
IMO both do not make any sense, but they probably are not explicitly forbidden by the spec, so let's cover our bases. thanks to [at]kayoub5 for the nudge. Signed-off-by: Andreas Lauser <[email protected]>
1 parent 41494f9 commit 672ff47

File tree

1 file changed

+30
-20
lines changed

1 file changed

+30
-20
lines changed

odxtools/environmentdatadescription.py

+30-20
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,13 @@
1515
from .nameditemlist import NamedItemList
1616
from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
1717
from .odxtypes import DataType, ParameterValue, ParameterValueDict
18+
from .parameters.codedconstparameter import CodedConstParameter
1819
from .parameters.parameter import Parameter
20+
from .parameters.parameterwithdop import ParameterWithDOP
21+
from .parameters.physicalconstantparameter import PhysicalConstantParameter
1922
from .parameters.valueparameter import ValueParameter
2023
from .snrefcontext import SnRefContext
24+
from .standardlengthtype import StandardLengthType
2125
from .utils import dataclass_fields_asdict
2226

2327

@@ -129,38 +133,44 @@ def encode_into_pdu(self, physical_value: Optional[ParameterValue],
129133
numerical_dtc_value: Optional[ParameterValue] = None
130134
for prev_param, prev_param_value in reversed(encode_state.journal):
131135
if prev_param.short_name == self.param_snref:
132-
if not isinstance(prev_param, ValueParameter):
136+
if not isinstance(prev_param, ParameterWithDOP):
133137
odxraise(
134138
f"The parameter referenced by environment data descriptions "
135-
f"must use a VALUE-PARAMETER (encountered {type(prev_param).__name__} "
139+
f"must use a parameter that specifies a DOP (encountered {type(prev_param).__name__} "
136140
f"for reference '{self.param_snref}' of ENV-DATA-DESC '{self.short_name}')")
137141
return
138142

139143
prev_dop = prev_param.dop
140-
if isinstance(prev_dop, DtcDop):
141-
if prev_dop.diag_coded_type.base_data_type != DataType.A_UINT32:
142-
odxraise(f"The data type used by the DOP of the parameter referenced "
143-
f"by environment data descriptions must be A_UINT32 "
144-
f"(encountered '{prev_dop.diag_coded_type.base_data_type.value}')")
145-
return
144+
if not isinstance(prev_dop, (StandardLengthType, DtcDop)):
145+
odxraise(
146+
f"The DOP of the parameter referenced by environment data descriptions "
147+
f"must use either be StandardLengthType or a DtcDop (encountered "
148+
f"{type(prev_param).__name__} for reference '{self.param_snref}' "
149+
f"of ENV-DATA-DESC '{self.short_name}')")
150+
return
146151

147-
if prev_param_value is None:
148-
odxraise()
152+
if prev_dop.diag_coded_type.base_data_type != DataType.A_UINT32:
153+
odxraise(f"The data type used by the DOP of the parameter referenced "
154+
f"by environment data descriptions must be A_UINT32 "
155+
f"(encountered '{prev_dop.diag_coded_type.base_data_type.value}')")
156+
return
157+
158+
if prev_param_value is None:
159+
if isinstance(prev_param, ValueParameter):
160+
prev_param_value = prev_param.physical_default_value
161+
elif isinstance(prev_param, CodedConstParameter):
162+
prev_param_value = prev_param.coded_value
163+
elif isinstance(prev_param, PhysicalConstantParameter):
164+
prev_param_value = prev_param.physical_constant_value
165+
else:
166+
odxraise() # make mypy happy...
149167
return
150168

169+
if isinstance(prev_dop, DtcDop):
170+
assert isinstance(prev_param_value, (int, str))
151171
numerical_dtc_value = prev_dop.convert_to_numerical_trouble_code(
152172
prev_param_value)
153173
elif isinstance(prev_dop, DataObjectProperty):
154-
if prev_dop.diag_coded_type.base_data_type != DataType.A_UINT32:
155-
odxraise(f"The data type used by the DOP of the parameter referenced "
156-
f"by environment data descriptions must be A_UINT32 "
157-
f"(encountered '{prev_dop.diag_coded_type.base_data_type.value}')")
158-
return
159-
160-
if not isinstance(prev_param_value, (int, str)):
161-
odxraise()
162-
return
163-
164174
numerical_dtc_value = prev_dop.compu_method.convert_physical_to_internal(
165175
prev_param_value)
166176
else:

0 commit comments

Comments
 (0)