@@ -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+
195254RCLCPP_LOCAL
196255rcl_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