Skip to content

Commit 7bd14d8

Browse files
authored
Add range constraints for applicable array parameters (#2828)
Signed-off-by: Alex Youngs <[email protected]>
1 parent e97d569 commit 7bd14d8

File tree

2 files changed

+476
-35
lines changed

2 files changed

+476
-35
lines changed

rclcpp/src/rclcpp/node_interfaces/node_parameters.cpp

Lines changed: 84 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,65 @@ format_range_reason(const std::string & name, const char * range_type)
192192
return ss.str();
193193
}
194194

195+
RCLCPP_LOCAL
196+
rcl_interfaces::msg::SetParametersResult
197+
__check_integer_range(
198+
const rcl_interfaces::msg::ParameterDescriptor & descriptor,
199+
const int64_t value)
200+
{
201+
rcl_interfaces::msg::SetParametersResult result;
202+
result.successful = true;
203+
auto integer_range = descriptor.integer_range.at(0);
204+
if (value == integer_range.from_value || value == integer_range.to_value) {
205+
return result;
206+
}
207+
if ((value < integer_range.from_value) || (value > integer_range.to_value)) {
208+
result.successful = false;
209+
result.reason = format_range_reason(descriptor.name, "integer");
210+
return result;
211+
}
212+
if (integer_range.step == 0) {
213+
return result;
214+
}
215+
if (((value - integer_range.from_value) % integer_range.step) == 0) {
216+
return result;
217+
}
218+
result.successful = false;
219+
result.reason = format_range_reason(descriptor.name, "integer");
220+
return result;
221+
}
222+
223+
RCLCPP_LOCAL
224+
rcl_interfaces::msg::SetParametersResult
225+
__check_double_range(
226+
const rcl_interfaces::msg::ParameterDescriptor & descriptor,
227+
const double value)
228+
{
229+
rcl_interfaces::msg::SetParametersResult result;
230+
result.successful = true;
231+
auto fp_range = descriptor.floating_point_range.at(0);
232+
if (__are_doubles_equal(value, fp_range.from_value) || __are_doubles_equal(value,
233+
fp_range.to_value))
234+
{
235+
return result;
236+
}
237+
if ((value < fp_range.from_value) || (value > fp_range.to_value)) {
238+
result.successful = false;
239+
result.reason = format_range_reason(descriptor.name, "floating point");
240+
return result;
241+
}
242+
if (fp_range.step == 0.0) {
243+
return result;
244+
}
245+
double rounded_div = std::round((value - fp_range.from_value) / fp_range.step);
246+
if (__are_doubles_equal(value, fp_range.from_value + rounded_div * fp_range.step)) {
247+
return result;
248+
}
249+
result.successful = false;
250+
result.reason = format_range_reason(descriptor.name, "floating point");
251+
return result;
252+
}
253+
195254
RCLCPP_LOCAL
196255
rcl_interfaces::msg::SetParametersResult
197256
__check_parameter_value_in_range(
@@ -201,49 +260,39 @@ __check_parameter_value_in_range(
201260
rcl_interfaces::msg::SetParametersResult result;
202261
result.successful = true;
203262
if (!descriptor.integer_range.empty() && value.get_type() == rclcpp::PARAMETER_INTEGER) {
204-
int64_t v = value.get<int64_t>();
205-
auto integer_range = descriptor.integer_range.at(0);
206-
if (v == integer_range.from_value || v == integer_range.to_value) {
207-
return result;
208-
}
209-
if ((v < integer_range.from_value) || (v > integer_range.to_value)) {
210-
result.successful = false;
211-
result.reason = format_range_reason(descriptor.name, "integer");
212-
return result;
213-
}
214-
if (integer_range.step == 0) {
215-
return result;
216-
}
217-
if (((v - integer_range.from_value) % integer_range.step) == 0) {
218-
return result;
263+
result = __check_integer_range(descriptor, value.get<int64_t>());
264+
return result;
265+
}
266+
267+
if (!descriptor.integer_range.empty() && value.get_type() == rclcpp::PARAMETER_INTEGER_ARRAY) {
268+
std::vector<int64_t> val_array = value.get<std::vector<int64_t>>();
269+
for (const int64_t & val : val_array) {
270+
result = __check_integer_range(descriptor, val);
271+
if (!result.successful) {
272+
return result;
273+
}
219274
}
220-
result.successful = false;
221-
result.reason = format_range_reason(descriptor.name, "integer");
222275
return result;
223276
}
224277

225278
if (!descriptor.floating_point_range.empty() && value.get_type() == rclcpp::PARAMETER_DOUBLE) {
226-
double v = value.get<double>();
227-
auto fp_range = descriptor.floating_point_range.at(0);
228-
if (__are_doubles_equal(v, fp_range.from_value) || __are_doubles_equal(v, fp_range.to_value)) {
229-
return result;
230-
}
231-
if ((v < fp_range.from_value) || (v > fp_range.to_value)) {
232-
result.successful = false;
233-
result.reason = format_range_reason(descriptor.name, "floating point");
234-
return result;
235-
}
236-
if (fp_range.step == 0.0) {
237-
return result;
238-
}
239-
double rounded_div = std::round((v - fp_range.from_value) / fp_range.step);
240-
if (__are_doubles_equal(v, fp_range.from_value + rounded_div * fp_range.step)) {
241-
return result;
279+
result = __check_double_range(descriptor, value.get<double>());
280+
return result;
281+
}
282+
283+
if (!descriptor.floating_point_range.empty() &&
284+
value.get_type() == rclcpp::PARAMETER_DOUBLE_ARRAY)
285+
{
286+
std::vector<double> val_array = value.get<std::vector<double>>();
287+
for (const double & val : val_array) {
288+
result = __check_double_range(descriptor, val);
289+
if (!result.successful) {
290+
return result;
291+
}
242292
}
243-
result.successful = false;
244-
result.reason = format_range_reason(descriptor.name, "floating point");
245293
return result;
246294
}
295+
247296
return result;
248297
}
249298

0 commit comments

Comments
 (0)