Skip to content

Commit

Permalink
CodedConstParameters do not specify a DOP
Browse files Browse the repository at this point in the history
(only a `DiagCodedType` and the value already is specified using the
internal representation.)

Signed-off-by: Andreas Lauser <[email protected]>
  • Loading branch information
andlaus committed Jan 16, 2025
1 parent a9a791f commit ede0fed
Showing 1 changed file with 43 additions and 33 deletions.
76 changes: 43 additions & 33 deletions odxtools/environmentdatadescription.py
Original file line number Diff line number Diff line change
Expand Up @@ -217,41 +217,51 @@ def decode_from_pdu(self, decode_state: DecodeState) -> ParameterValue:

def _get_numerical_dtc_from_parameter(self, param: Parameter,
param_value: Optional[ParameterValue]) -> int:
if not isinstance(param, ParameterWithDOP):
odxraise(
f"The parameter referenced by environment data descriptions "
f"must use a parameter that specifies a DOP (encountered {type(param).__name__} "
f"for reference '{self.param_snref}' of ENV-DATA-DESC '{self.short_name}')")
return

prev_dop = param.dop
if not isinstance(prev_dop, (StandardLengthType, DtcDop)):
odxraise(f"The DOP of the parameter referenced by environment data descriptions "
f"must use either be StandardLengthType or a DtcDop (encountered "
f"{type(param).__name__} for parameter '{self.param.short_name}' "
f"of ENV-DATA-DESC '{self.short_name}')")
return
if isinstance(param, ParameterWithDOP):
dop = param.dop
if not isinstance(dop, (StandardLengthType, DtcDop)):
odxraise(f"The DOP of the parameter referenced by environment data descriptions "
f"must use either be StandardLengthType or a DtcDop (encountered "
f"{type(param).__name__} for parameter '{self.param.short_name}' "
f"of ENV-DATA-DESC '{self.short_name}')")
return

if prev_dop.diag_coded_type.base_data_type != DataType.A_UINT32:
odxraise(f"The data type used by the DOP of the parameter referenced "
f"by environment data descriptions must be A_UINT32 "
f"(encountered '{prev_dop.diag_coded_type.base_data_type.value}')")
return
if dop.diag_coded_type.base_data_type != DataType.A_UINT32:
odxraise(f"The data type used by the DOP of the parameter referenced "
f"by environment data descriptions must be A_UINT32 "
f"(encountered '{dop.diag_coded_type.base_data_type.value}')")
return

if param_value is None:
if isinstance(param, ValueParameter):
param_value = param.physical_default_value
elif isinstance(param, CodedConstParameter):
param_value = param.coded_value
elif isinstance(param, PhysicalConstantParameter):
param_value = param.physical_constant_value
else:
odxraise() # make mypy happy...
if param_value is None:
if isinstance(param, ValueParameter):
param_value = param.physical_default_value
elif isinstance(param, PhysicalConstantParameter):
param_value = param.physical_constant_value
else:
odxraise() # make mypy happy...
return

if isinstance(dop, DtcDop):
return dop.convert_to_numerical_trouble_code(odxrequire(param_value))
elif isinstance(dop, DataObjectProperty):
return dop.compu_method.convert_physical_to_internal(param_value)

odxraise() # not reachable

elif isinstance(param, CodedConstParameter):
if param.diag_coded_type.base_data_type != DataType.A_UINT32:
odxraise(f"The data type used by the parameter referenced "
f"by environment data descriptions must be A_UINT32 "
f"(encountered '{param.diag_coded_type.base_data_type.value}')")
return

if isinstance(prev_dop, DtcDop):
return prev_dop.convert_to_numerical_trouble_code(odxrequire(param_value))
elif isinstance(prev_dop, DataObjectProperty):
return prev_dop.compu_method.convert_physical_to_internal(param_value)
assert isinstance(param.coded_value, int)

return param.coded_value

odxraise() # not reachable
else:
odxraise(f"The parameter referenced by environment data descriptions "
f"must be a parameter that either specifies a DOP or a constant "
f"(encountered {type(param).__name__} for reference '{self.param_snref}' of "
f"ENV-DATA-DESC '{self.short_name}')")
return

0 comments on commit ede0fed

Please sign in to comment.