diff --git a/roseus/CMakeLists.txt b/roseus/CMakeLists.txt index e732689e3..4812d008a 100644 --- a/roseus/CMakeLists.txt +++ b/roseus/CMakeLists.txt @@ -206,4 +206,6 @@ if(CATKIN_ENABLE_TESTING) add_rostest(test/test-geneus.test) add_rostest(test/test-compile-message.test) add_rostest(test/test-print-ros-msg.test) + add_rostest(test/test-dynamic-reconfigure-server.test) + add_rostest(test/test-dynamic-reconfigure-client.test) endif() diff --git a/roseus/euslisp/dynamic-reconfigure-server.l b/roseus/euslisp/dynamic-reconfigure-server.l new file mode 100644 index 000000000..4750dac78 --- /dev/null +++ b/roseus/euslisp/dynamic-reconfigure-server.l @@ -0,0 +1,306 @@ +(ros::load-ros-manifest "dynamic_reconfigure") +;; +;; refer to dynamic_reconfigure/src/dynamic_reconfigure/encoding.py +;; +(defun encode-description (descr) ;; description -> msg + (let ((msg (instance dynamic_reconfigure::ConfigDescription :init))) + (send msg :max (encode-config (get descr :max))) + (send msg :min (encode-config (get descr :min))) + (send msg :dflt (encode-config (get descr :defaults))) + (let (lst) + (dolist (param (get descr :config_description)) + (let ((pmd (instance dynamic_reconfigure::ParamDescription :init + :name (cdr (assoc :name param)) + :type (cdr (assoc :type param)) + :level (cdr (assoc :level param)) + :description (cdr (assoc :description param)) + :edit_method (cdr (assoc :edit_method param))))) + (push pmd lst))) + ;; TODO: default group is only supported + (send msg :groups + (list (instance dynamic_reconfigure::Group :init + :name "Default" + :parameters (nreverse lst))))) + msg)) + + +(defun encode-config (config) + (let ((msg (instance dynamic_reconfigure::Config :init))) + (dolist (cf config) + (let ((k (car cf)) + (v (cdr cf))) + (cond + ((integerp v) + (send msg :ints + (append (send msg :ints) (list (instance dynamic_reconfigure::IntParameter :init + :name k :value v))))) + ((or (eq v nil) + (eq v t)) + (send msg :bools + (append (send msg :bools) (list (instance dynamic_reconfigure::BoolParameter :init + :name k :value v))))) + ((stringp v) + (send msg :strs + (append (send msg :strs) (list (instance dynamic_reconfigure::StrParameter :init + :name k :value v))))) + ((floatp v) + (send msg :doubles + (append (send msg :doubles) (list (instance dynamic_reconfigure::DoubleParameter :init + :name k :value v))))) + ))) + msg + )) +(defun decode-description (msg) ;; msg -> description + (let (descr + (mins (decode-config (send msg :min))) + (maxes (decode-config (send msg :max))) + (defaults (decode-config (send msg :dflt)))) + (dolist (pm (send msg :parameters)) + (let ((nm (send pm :name))) + (push + (list + (cons :name nm) + (cons :min (cdr (assoc nm mins :test #'equal))) + (cons :max (cdr (assoc nm maxes :test #'equal))) + (cons :default (cdr (assoc nm defaults :test #'equal))) + (cons :type (send pm :type)) + (cons :description (send pm :description)) + (cons :edit_method (send pm :edit_method))) + descr) + )) + (nreverse dscr) + )) +(defun decode-config (msg) + (let ((lst + (append (send msg :bools) + (send msg :ints) + (send msg :strs) + (send msg :doubles))) + ret) + (dolist (l lst) + (push + (cons (send l :name) + (send l :value)) ret)) + (nreverse ret))) + +;; +;; refer to dynamic_reconfigure/src/dynamic_reconfigure/server.py +;; +(defclass reconfigure_server + :super propertied-object + :slots (type + config + description + callbackfunc ;; (defun func (cfg level) (setting-parameter cfg) cfg) + param-desc-topic + param-updates-topic + service-name + ) + ) + +(defmethod reconfigure_server + (:init + (init_type cbfunc) + (setq type init_type) + (setq callbackfunc cbfunc) + (setq config (get init_type :defaults)) + (setq description (encode-description init_type)) + (send self :copy-from-parameter-server) + (send self :clamp config) + + (let ((nname (ros::get-name))) + (setq param-desc-topic (format nil "~A/parameter_descriptions" nname)) + (ros::advertise param-desc-topic + dynamic_reconfigure::ConfigDescription 1 t) + (setq param-updates-topic (format nil "~A/parameter_updates" nname)) + (ros::advertise param-updates-topic + dynamic_reconfigure::Config 1 t) + (ros::publish param-desc-topic description) + (send self :change-config config (get init_type :all_level)) + (setq service-name (format nil "~A/set_parameters" nname)) + (ros::advertise-service service-name dynamic_reconfigure::Reconfigure + #'send self :set-callback)) + ) + (:update-configuration + (changes) + (let ((new-config (copy-object config))) + (dolist (cf changes) + (let ((elm + (assoc (car cf) new-config :test #'equal))) + (setf (car elm) (car cf)) + (setf (cdr elm) (cdr cf)))) + (send self :clamp new-config) + (send self :change-config new-config + (send self :calc-level new-config config)) + )) + (:change-config + (cfg level) + (setq config (funcall callbackfunc cfg level)) + (unless config + (warn ";; callbackfunc(~A) did not return config..." callbackfunc)) + (send self :copy-to-parameter-server) + (let ((ret-cfg + (encode-config config))) + (ros::publish param-updates-topic ret-cfg) + ret-cfg)) + (:copy-from-parameter-server + () + ;; not implemented yet + ) + (:copy-to-parameter-server + () + ;; not implemented yet + ) + (:calc-level + (cfg1 cfg2) + (let ((lv 0) + (desclst (get type :config_description))) + (dolist (l desclst) + (when (not (equal (cdr (assoc (cdr (assoc :name l)) cfg1 :test #'equal)) + (cdr (assoc (cdr (assoc :name l)) cfg2 :test #'equal)))) + (setq lv (logior lv (cdr (assoc :level l)))) + )) + lv)) + (:clamp + (cfg) ;; destructive + (let ((maxlst (get type :max)) + (minlst (get type :min)) + (desclst (get type :config_description))) + (dolist (l desclst) + (let ((maxval (cdr (assoc (cdr (assoc :name l)) maxlst :test #'equal))) + (minval (cdr (assoc (cdr (assoc :name l)) minlst :test #'equal))) + (val (cdr (assoc (cdr (assoc :name l)) cfg :test #'equal)))) + (if (and (not (equal maxval "")) + (and (numberp val) + (numberp maxval) + (> val maxval))) + (setf (cdr (assoc (cdr (assoc :name l)) cfg :test #'equal)) maxval) + (if (and (not (equal minval "")) + (and (numberp val) + (numberp maxval) + (< val minval))) + (setf (cdr (assoc (cdr (assoc :name l)) cfg :test #'equal)) minval) + )))) + )) + (:set-callback + (req) + (let ((res (send req :response))) + (send res :config + (send self :update-configuration (decode-config (send req :config)))) + res)) + ) + +;; +;; dynamic_reconfigure setting for roseus +;; +;; TODO: cfg file load is not supported +(defmacro def-dynamic-reconfigure-server (descriptions callback) + `(instance + reconfigure_server :init + (make-description-obj + (list ,@(mapcar #'(lambda (x) `(make-parameter-desc ,@x)) descriptions))) + ,callback)) +(defmacro make-parameter-desc (&rest args) + (let* ((tp (elt args 1)) + (tpstr (cond + ((eq 'int_t tp) "int") + ((eq 'double_t tp) "double") + ((eq 'str_t tp) "str") + ((eq 'bool_t tp) "bool") + (t (warn ";; unknown type ~A" tp)))) + ret) + (setq ret + (list + (cons :name (elt args 0)) + (cons :type tpstr) + (cons :level (elt args 2)) + (cons :description (elt args 3)))) + (setq ret (append ret (list (cons :default + (if (> (length args) 4) + (cond + ((eq 'int_t tp) (round (elt args 4))) + ((eq 'double_t tp) (float (elt args 4))) + ((eq 'str_t tp) (string (elt args 4))) + ((eq 'bool_t tp) (if (elt args 4) t nil))) + (cond + ((eq 'int_t tp) 0) + ((eq 'double_t tp) 0.0) + ((eq 'str_t tp) "") + ((eq 'bool_t tp) nil)) + ))))) + (setq ret (append ret (list (cons :min + (if (> (length args) 5) + (cond + ((eq 'int_t tp) (round (elt args 5))) + ((eq 'double_t tp) (float (elt args 5))) + ((eq 'str_t tp) (string (elt args 5))) + ((eq 'bool_t tp) (if (elt args 5) t nil))) + (cond + ((eq 'int_t tp) lisp::most-negative-fixnum) + ((eq 'double_t tp) lisp::most-negative-float) + ((eq 'str_t tp) "") + ((eq 'bool_t tp) nil)) + ))))) + (setq ret (append ret (list (cons :max + (if (> (length args) 6) + (cond + ((eq 'int_t tp) (round (elt args 6))) + ((eq 'double_t tp) (float (elt args 6))) + ((eq 'str_t tp) (string (elt args 6))) + ((eq 'bool_t tp) (if (elt args 6) t nil))) + (cond + ((eq 'int_t tp) lisp::most-positive-fixnum) + ((eq 'double_t tp) lisp::most-positive-float) + ((eq 'str_t tp) "") + ((eq 'bool_t tp) t)) + ))))) + (setq ret (append ret (list (cons :edit_method + (if (> (length args) 7) + (elt args 7) ""))))) + `',ret + )) + + +(defun make-description-obj (lst) + (let ((obj (instance propertied-object)) + max-lst + min-lst + level-lst + type-lst + default-lst + (clevel 0)) + (setf (get obj :config_description) lst) + (dolist (l lst) + (let ((nm (cdr (assoc :name l)))) + (push (cons nm (cdr (assoc :max l))) max-lst) + (push (cons nm (cdr (assoc :min l))) min-lst) + (push (cons nm (cdr (assoc :level l))) level-lst) + (push (cons nm (cdr (assoc :type l))) type-lst) + (push (cons nm (cdr (assoc :default l))) default-lst) + (setq clevel (logior clevel (cdr (assoc :level l)))) + )) + (setf (get obj :max) (nreverse max-lst)) + (setf (get obj :min) (nreverse min-lst)) + (setf (get obj :level) (nreverse level-lst)) + (setf (get obj :type) (nreverse type-lst)) + (setf (get obj :defaults) (nreverse default-lst)) + (setf (get obj :all_level) clevel) + obj)) +#| +;; sample usage +(ros::roseus "reconfigure_server") +(setq *reconfigure-server* + (def-dynamic-reconfigure-server + ;;; ((name type level description (default) (min) (max) (edit_method)) ... ) + (("int_param" int_t 1 "Int parameter" 0 -10 10) + ("double_param" double_t 2 "double parameter" 0.0 -2.0 10.0) + ("str_param" str_t 4 "String parameter" "foo") + ("bool_param" bool_t 8 "Boolean parameter" nil)) + ;;; callbackfunc (defun func (config level) ) -> return updated-config + #'(lambda (cfg level) + (pprint cfg) + ;; have to set parameter to user application + cfg))) +(while (ros::ok) + (ros::spin-once)) +|# diff --git a/roseus/test/simple-dynamic-reconfigure-server.l b/roseus/test/simple-dynamic-reconfigure-server.l new file mode 100644 index 000000000..a4c759274 --- /dev/null +++ b/roseus/test/simple-dynamic-reconfigure-server.l @@ -0,0 +1,50 @@ +#!/usr/bin/env roseus + +(load "package://roseus/euslisp/dynamic-reconfigure-server.l") + +(ros::roseus-add-msgs "std_msgs") +(ros::roseus-add-msgs "dynamic_reconfigure") + +(ros::roseus "simple_dynamic_reconfigure_server" :anonymous nil) + +(setq *int-param* nil) +(setq *double-param* nil) +(setq *str-param* nil) +(setq *bool-param* nil) + +(setq *reconfigure-server* + (def-dynamic-reconfigure-server + ;;; ((name type level description (default) (min) (max) (edit_method)) ... ) + (("int_param" int_t 1 "Int parameter" 0 -10 10) + ("double_param" double_t 2 "double parameter" 0.0 -2.0 10.0) + ("str_param" str_t 4 "String parameter" "foo") + ("bool_param" bool_t 8 "Boolean parameter" nil)) + ;;; callbackfunc (defun func (config level) ) -> return updated-config + '(lambda-closure nil 0 0 (cfg level) + (setq *updated* t) + (setq *int-param* (cdr (assoc "int_param" cfg :test #'equal))) + (setq *double-param* (cdr (assoc "double_param" cfg :test #'equal))) + (setq *str-param* (cdr (assoc "str_param" cfg :test #'equal))) + (setq *bool-param* (cdr (assoc "bool_param" cfg :test #'equal))) + cfg))) + +(ros::advertise "~/int_param" std_msgs::Int16) +(ros::advertise "~/double_param" std_msgs::Float32) +(ros::advertise "~/str_param" std_msgs::String) +(ros::advertise "~/bool_param" std_msgs::Bool) +(ros::advertise "~/updated" std_msgs::Bool) + +(setq *updated* nil) + +(ros::rate 10) +(while (ros::ok) + (if *int-param* + (ros::publish "~/int_param" (instance std_msgs::Int16 :data (round *int-param*)))) + (if *double-param* + (ros::publish "~/double_param" (instance std_msgs::Float32 :data *double-param*))) + (if *str-param* + (ros::publish "~/str_param" (instance std_msgs::String :data *str-param*))) + (ros::publish "~/bool_param" (instance std_msgs::Bool :data *bool-param*)) + (ros::publish "~/updated" (instance std_msgs::Bool :data *updated*)) + (ros::spin-once) + ) diff --git a/roseus/test/test-dynamic-reconfigure-client.l b/roseus/test/test-dynamic-reconfigure-client.l new file mode 100644 index 000000000..8e92d2dff --- /dev/null +++ b/roseus/test/test-dynamic-reconfigure-client.l @@ -0,0 +1,121 @@ +#!/usr/bin/env roseus +;; + +(require :unittest "lib/llib/unittest.l") +(load "package://roseus/euslisp/roseus-utils.l") + +(ros::roseus-add-msgs "std_msgs") + +(ros::roseus "test_dynamic_reconfigure_client" :anonymous nil) + +(init-unit-test) + + +(deftest test-dynamic-reconfigure-client-default () + (let* ((server-name "/simple_dynamic_reconfigure_server") + (int-topic-name (format nil "~A/int_param" server-name)) + (double-topic-name (format nil "~A/double_param" server-name)) + (str-topic-name (format nil "~A/str_param" server-name)) + (bool-topic-name (format nil "~A/bool_param" server-name)) + (int-msg nil) + (double-msg nil) + (str-msg nil) + (bool-msg nil) + (cnt 0)) + (ros::subscribe int-topic-name std_msgs::Int16 + #'(lambda (m) (setq int-msg m))) + (ros::subscribe double-topic-name std_msgs::Float32 + #'(lambda (m) (setq double-msg m))) + (ros::subscribe str-topic-name std_msgs::String + #'(lambda (m) (setq str-msg m))) + (ros::subscribe bool-topic-name std_msgs::Bool + #'(lambda (m) (setq bool-msg m))) + + (while (and (ros::ok) + (< cnt 100) + (or (null int-msg) (null double-msg) + (null str-msg) (null bool-msg)) + ) + (incf cnt) + (ros::spin-once) + (ros::sleep)) + + (ros::unadvertise int-topic-name) + (ros::unadvertise double-topic-name) + (ros::unadvertise str-topic-name) + (ros::unadvertise bool-topic-name) + + (pprint double-msg) + (assert (and int-msg (equal (send int-msg :data) 0)) + (format nil "int default value is wrong: ~A" (send int-msg :data))) + (assert (and double-msg (eps= (send double-msg :data) 0.0)) + (format nil "double default value is wrong: ~A" (send double-msg :data))) + (assert (and str-msg (equal (send str-msg :data) "foo")) + (format nil "str default value is wrong: ~A" (send str-msg :data))) + (assert (and bool-msg (equal (send bool-msg :data) nil)) + (format nil "bool default value is wrong: ~A" (send bool-msg :data))) + )) + +(deftest test-dynamic-reconfigure-client-update () + (let* ((server-name "/simple_dynamic_reconfigure_server") + (int-topic-name (format nil "~A/int_param" server-name)) + (double-topic-name (format nil "~A/double_param" server-name)) + (str-topic-name (format nil "~A/str_param" server-name)) + (bool-topic-name (format nil "~A/bool_param" server-name)) + (update-topic-name (format nil "~A/updated" server-name)) + (int-msg nil) + (double-msg nil) + (str-msg nil) + (bool-msg nil) + (update-msg nil) + (cnt 0)) + (ros::set-dynamic-reconfigure-param server-name "int_param" :int 8) + (ros::set-dynamic-reconfigure-param server-name "double_param" :double 7.3) + (ros::set-dynamic-reconfigure-param server-name "str_param" :string "test") + (ros::set-dynamic-reconfigure-param server-name "bool_param" :bool t) + + (ros::subscribe update-topic-name std_msgs::Bool + #'(lambda (m) (setq update-msg m))) + (while (and (ros::ok) (or (null update-msg) (null (send update-msg :data)))) + (incf cnt) + (ros::spin-once) + (ros::sleep)) + (ros::unsubscribe update-topic-name) + + (ros::subscribe int-topic-name std_msgs::Int16 + #'(lambda (m) (setq int-msg m))) + (ros::subscribe double-topic-name std_msgs::Float32 + #'(lambda (m) (setq double-msg m))) + (ros::subscribe str-topic-name std_msgs::String + #'(lambda (m) (setq str-msg m))) + (ros::subscribe bool-topic-name std_msgs::Bool + #'(lambda (m) (setq bool-msg m))) + + (while (and (ros::ok) + (< cnt 100) + (or (null int-msg) (null double-msg) + (null str-msg) (null bool-msg)) + ) + (incf cnt) + (ros::spin-once) + (ros::sleep)) + + (ros::unsubscribe int-topic-name) + (ros::unsubscribe double-topic-name) + (ros::unsubscribe str-topic-name) + (ros::unsubscribe bool-topic-name) + + (pprint double-msg) + (assert (and int-msg (equal (send int-msg :data) 8)) + (format nil "int default value is wrong: ~A" (send int-msg :data))) + (assert (and double-msg (eps= (send double-msg :data) 7.3)) + (format nil "double default value is wrong: ~A" (send double-msg :data))) + (assert (and str-msg (equal (send str-msg :data) "test")) + (format nil "str default value is wrong: ~A" (send str-msg :data))) + (assert (and bool-msg (equal (send bool-msg :data) t)) + (format nil "bool default value is wrong: ~A" (send bool-msg :data))) + )) + +(run-all-tests) + +(exit) diff --git a/roseus/test/test-dynamic-reconfigure-client.test b/roseus/test/test-dynamic-reconfigure-client.test new file mode 100644 index 000000000..bd774bf6c --- /dev/null +++ b/roseus/test/test-dynamic-reconfigure-client.test @@ -0,0 +1,4 @@ + + + + diff --git a/roseus/test/test-dynamic-reconfigure-server.l b/roseus/test/test-dynamic-reconfigure-server.l new file mode 100644 index 000000000..31076612d --- /dev/null +++ b/roseus/test/test-dynamic-reconfigure-server.l @@ -0,0 +1,130 @@ +#!/usr/bin/env roseus +;; + +(require :unittest "lib/llib/unittest.l") +(load "package://roseus/euslisp/dynamic-reconfigure-server.l") + +(ros::roseus-add-msgs "dynamic_reconfigure") + +(ros::roseus "test_dynamic_reconfigure_server" :anonymous nil) + + +(setq *reconfigure-server* + (def-dynamic-reconfigure-server + ;;; ((name type level description (default) (min) (max) (edit_method)) ... ) + (("int_param" int_t 1 "Int parameter" 0 -10 10) + ("double_param" double_t 2 "double parameter" 0.0 -2.0 10.0) + ("str_param" str_t 4 "String parameter" "foo") + ("bool_param" bool_t 8 "Boolean parameter" nil)) + ;;; callbackfunc (defun func (config level) ) -> return updated-config + '(lambda-closure nil 0 0 (cfg level) + cfg))) + + +(init-unit-test) + +(deftest test-dynamic-reconfigure-server-publish () + (let ((dsc-topic-name "/test_dynamic_reconfigure_server/parameter_descriptions") + (upd-topic-name "/test_dynamic_reconfigure_server/parameter_updates") + (dsc-msg nil) + (upd-msg nil) + (cnt 0)) + (ros::subscribe dsc-topic-name dynamic_reconfigure::ConfigDescription + #'(lambda (m) (setq dsc-msg m))) + (ros::subscribe upd-topic-name dynamic_reconfigure::Config + #'(lambda (m) (setq upd-msg m))) + + (while (and (ros::ok) (< cnt 100) (or (null dsc-msg) (null upd-msg))) + (incf cnt) + (ros::spin-once) + (ros::sleep)) + (ros::unsubscribe dsc-topic-name) + (ros::unsubscribe upd-topic-name) + + (assert dsc-msg "~parameter_descriptions is not published.") + (assert upd-msg "~parameter_updates is not published.") + (let ((dsc-msg-max (send dsc-msg :max)) + (dsc-msg-min (send dsc-msg :min)) + (dsc-msg-dflt (send dsc-msg :dflt)) + (upd-msg-bool (car (send upd-msg :bools))) + (upd-msg-int (car (send upd-msg :ints))) + (upd-msg-str (car (send upd-msg :strs))) + (upd-msg-double (car (send upd-msg :doubles)))) + + ;; max + (assert (equal (send (car (send dsc-msg-max :bools)) :name) "bool_param") + "~parameter_descriptions/max/bools name is wrong") + (assert (equal (send (car (send dsc-msg-max :bools)) :value) t) + "~parameter_descriptions/max/bools value is wrong") + (assert (equal (send (car (send dsc-msg-max :ints)) :name) "int_param") + "~parameter_descriptions/max/ints name is wrong") + (assert (equal (send (car (send dsc-msg-max :ints)) :value) 10) + "~parameter_descriptions/max/ints value is wrong") + (assert (equal (send (car (send dsc-msg-max :strs)) :name) "str_param") + "~parameter_descriptions/max/strs name is wrong") + (assert (equal (send (car (send dsc-msg-max :strs)) :value) "") + "~parameter_descriptions/max/strs value is wrong") + (assert (equal (send (car (send dsc-msg-max :doubles)) :name) "double_param") + "~parameter_descriptions/max/doubles name is wrong") + (assert (equal (send (car (send dsc-msg-max :doubles)) :value) 10.0) + "~parameter_descriptions/max/doubles value is wrong") + + ;; min + (assert (equal (send (car (send dsc-msg-min :bools)) :name) "bool_param") + "~parameter_descriptions/min/bools name is wrong") + (assert (equal (send (car (send dsc-msg-min :bools)) :value) nil) + "~parameter_descriptions/min/bools value is wrong") + (assert (equal (send (car (send dsc-msg-min :ints)) :name) "int_param") + "~parameter_descriptions/min/ints name is wrong") + (assert (equal (send (car (send dsc-msg-min :ints)) :value) -10) + "~parameter_descriptions/min/ints value is wrong") + (assert (equal (send (car (send dsc-msg-min :strs)) :name) "str_param") + "~parameter_descriptions/min/strs name is wrong") + (assert (equal (send (car (send dsc-msg-min :strs)) :value) "") + "~parameter_descriptions/min/strs value is wrong") + (assert (equal (send (car (send dsc-msg-min :doubles)) :name) "double_param") + "~parameter_descriptions/min/doubles name is wrong") + (assert (equal (send (car (send dsc-msg-min :doubles)) :value) -2.0) + "~parameter_descriptions/min/doubles value is wrong") + + ;; dflt + (assert (equal (send (car (send dsc-msg-dflt :bools)) :name) "bool_param") + "~parameter_descriptions/dflt/bools name is wrong") + (assert (equal (send (car (send dsc-msg-dflt :bools)) :value) nil) + "~parameter_descriptions/dflt/bools value is wrong") + (assert (equal (send (car (send dsc-msg-dflt :ints)) :name) "int_param") + "~parameter_descriptions/dflt/ints name is wrong") + (assert (equal (send (car (send dsc-msg-dflt :ints)) :value) 0) + "~parameter_descriptions/dflt/ints value is wrong") + (assert (equal (send (car (send dsc-msg-dflt :strs)) :name) "str_param") + "~parameter_descriptions/dflt/strs name is wrong") + (assert (equal (send (car (send dsc-msg-dflt :strs)) :value) "foo") + "~parameter_descriptions/dflt/strs value is wrong") + (assert (equal (send (car (send dsc-msg-dflt :doubles)) :name) "double_param") + "~parameter_descriptions/dflt/doubles name is wrong") + (assert (equal (send (car (send dsc-msg-dflt :doubles)) :value) 0.0) + "~parameter_descriptions/dflt/doubles value is wrong") + + (assert (and upd-msg-bool (equal (send upd-msg-bool :name) "bool_param")) + "~parameter_updates/bools name is wrong") + (assert (and upd-msg-bool (equal (send upd-msg-bool :value) nil)) + "~parameter_updates/bools value is wrong") + (assert (and upd-msg-int (equal (send upd-msg-int :name) "int_param")) + "~parameter_updates/ints name is wrong") + (assert (and upd-msg-int (equal (send upd-msg-int :value) 0)) + "~parameter_updates/ints value is wrong") + (assert (and upd-msg-str (equal (send upd-msg-str :name) "str_param")) + "~parameter_updates/strs name is wrong") + (assert (and upd-msg-str (equal (send upd-msg-str :value) "foo")) + "~parameter_updates/strs value is wrong") + (assert (and upd-msg-double (equal (send upd-msg-double :name) "double_param")) + "~parameter_updates/doubles name is wrong") + (assert (and upd-msg-double (equal (send upd-msg-double :value) 0.0)) + "~parameter_updates/doubles value is wrong") + ) + )) + + +(run-all-tests) + +(exit) diff --git a/roseus/test/test-dynamic-reconfigure-server.test b/roseus/test/test-dynamic-reconfigure-server.test new file mode 100644 index 000000000..a00e16ee9 --- /dev/null +++ b/roseus/test/test-dynamic-reconfigure-server.test @@ -0,0 +1,3 @@ + + +