|
15 | 15 | from .nameditemlist import NamedItemList
|
16 | 16 | from .odxlink import OdxDocFragment, OdxLinkDatabase, OdxLinkId, OdxLinkRef
|
17 | 17 | from .odxtypes import DataType, ParameterValue, ParameterValueDict
|
| 18 | +from .parameters.codedconstparameter import CodedConstParameter |
18 | 19 | from .parameters.parameter import Parameter
|
| 20 | +from .parameters.parameterwithdop import ParameterWithDOP |
| 21 | +from .parameters.physicalconstantparameter import PhysicalConstantParameter |
19 | 22 | from .parameters.valueparameter import ValueParameter
|
20 | 23 | from .snrefcontext import SnRefContext
|
| 24 | +from .standardlengthtype import StandardLengthType |
21 | 25 | from .utils import dataclass_fields_asdict
|
22 | 26 |
|
23 | 27 |
|
@@ -129,38 +133,44 @@ def encode_into_pdu(self, physical_value: Optional[ParameterValue],
|
129 | 133 | numerical_dtc_value: Optional[ParameterValue] = None
|
130 | 134 | for prev_param, prev_param_value in reversed(encode_state.journal):
|
131 | 135 | if prev_param.short_name == self.param_snref:
|
132 |
| - if not isinstance(prev_param, ValueParameter): |
| 136 | + if not isinstance(prev_param, ParameterWithDOP): |
133 | 137 | odxraise(
|
134 | 138 | 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__} " |
136 | 140 | f"for reference '{self.param_snref}' of ENV-DATA-DESC '{self.short_name}')")
|
137 | 141 | return
|
138 | 142 |
|
139 | 143 | 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 |
146 | 151 |
|
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... |
149 | 167 | return
|
150 | 168 |
|
| 169 | + if isinstance(prev_dop, DtcDop): |
| 170 | + assert isinstance(prev_param_value, (int, str)) |
151 | 171 | numerical_dtc_value = prev_dop.convert_to_numerical_trouble_code(
|
152 | 172 | prev_param_value)
|
153 | 173 | 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 |
| - |
164 | 174 | numerical_dtc_value = prev_dop.compu_method.convert_physical_to_internal(
|
165 | 175 | prev_param_value)
|
166 | 176 | else:
|
|
0 commit comments