From aed4afa3a500b929c29386f5441317f63f571db7 Mon Sep 17 00:00:00 2001 From: Kentaro Wada Date: Fri, 30 Sep 2016 06:45:06 +0900 Subject: [PATCH 1/4] Fix rostopic echo for non rosmsg field Close https://github.com/ros/ros_comm/issues/908 --- tools/rostopic/src/rostopic/__init__.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/rostopic/src/rostopic/__init__.py b/tools/rostopic/src/rostopic/__init__.py index d956518755..f2422d5805 100644 --- a/tools/rostopic/src/rostopic/__init__.py +++ b/tools/rostopic/src/rostopic/__init__.py @@ -1389,6 +1389,12 @@ def eval_fn(m): def create_value_transform(echo_nostr, echo_noarr): def value_transform(val): + if not isinstance(val, genpy.Message): + if echo_nostr and isinstance(val, str): + return None + elif echo_noarr and isinstance(val, list): + return None + return val class TransformedMessage(genpy.Message): # These should be copy because changing these variables From 47adb6d0591d1b2940afe1b4aded7afe6e5ce061 Mon Sep 17 00:00:00 2001 From: Kentaro Wada Date: Fri, 30 Sep 2016 07:10:35 +0900 Subject: [PATCH 2/4] Show stat for echoing non ROS message --- tools/rostopic/src/rostopic/__init__.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tools/rostopic/src/rostopic/__init__.py b/tools/rostopic/src/rostopic/__init__.py index f2422d5805..831ba41d89 100644 --- a/tools/rostopic/src/rostopic/__init__.py +++ b/tools/rostopic/src/rostopic/__init__.py @@ -873,7 +873,7 @@ def custom_strify_message(self, val, indent='', time_offset=None, current_time=N if type_information and type_information.startswith('uint8['): val = [ord(x) for x in val] if value_transform is not None: - val = value_transform(val) + val = value_transform(val, type_information) return genpy.message.strify_message(val, indent=indent, time_offset=time_offset, current_time=current_time, field_filter=field_filter, fixed_numeric_width=fixed_numeric_width) def callback(self, data, callback_args, current_time=None): @@ -1388,12 +1388,15 @@ def eval_fn(m): sys.stderr.write("Network communication failed. Most likely failed to communicate with master.\n") def create_value_transform(echo_nostr, echo_noarr): - def value_transform(val): + def value_transform(val, type_information=None): if not isinstance(val, genpy.Message): - if echo_nostr and isinstance(val, str): - return None - elif echo_noarr and isinstance(val, list): - return None + if type_information is None: + return val + if echo_noarr and '[' in type_information: + return ('' % + (type_information.rstrip('[]'), len(val))) + elif echo_nostr and 'string' in type_information: + return '' % len(val) return val class TransformedMessage(genpy.Message): From 9dd94cfd697e48bd7ec585ce2c2fbd2d8d727b12 Mon Sep 17 00:00:00 2001 From: Kentaro Wada Date: Fri, 30 Sep 2016 07:15:17 +0900 Subject: [PATCH 3/4] Fix field stat information with --nostr for string[] --- tools/rostopic/src/rostopic/__init__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/rostopic/src/rostopic/__init__.py b/tools/rostopic/src/rostopic/__init__.py index 831ba41d89..de981b9b19 100644 --- a/tools/rostopic/src/rostopic/__init__.py +++ b/tools/rostopic/src/rostopic/__init__.py @@ -1395,8 +1395,10 @@ def value_transform(val, type_information=None): if echo_noarr and '[' in type_information: return ('' % (type_information.rstrip('[]'), len(val))) - elif echo_nostr and 'string' in type_information: + elif echo_nostr and type_information == 'string': return '' % len(val) + elif echo_nostr and type_information == 'string[]': + return '' % len(val) return val class TransformedMessage(genpy.Message): @@ -1415,8 +1417,12 @@ class TransformedMessage(genpy.Message): setattr(val_trans, f, '' % (t.rstrip('[]'), len(f_val))) val_trans._slot_types[index] = 'string' - elif echo_nostr and 'string' in t: + elif echo_nostr and t == 'string': setattr(val_trans, f, '' % len(f_val)) + elif echo_nostr and t == 'string[]': + setattr(val_trans, f, '' % + len(f_val)) + val_trans._slot_types[index] = 'string' else: try: msg_class = genpy.message.get_message_class(t) From 2c7b3e1f219bf3a2cf9b7b5177a96007ea95eb5d Mon Sep 17 00:00:00 2001 From: Kentaro Wada Date: Fri, 30 Sep 2016 08:50:41 +0900 Subject: [PATCH 4/4] Add function of field value transformation --- tools/rostopic/src/rostopic/__init__.py | 33 ++++++++++++------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/tools/rostopic/src/rostopic/__init__.py b/tools/rostopic/src/rostopic/__init__.py index de981b9b19..abc41fd202 100644 --- a/tools/rostopic/src/rostopic/__init__.py +++ b/tools/rostopic/src/rostopic/__init__.py @@ -1389,17 +1389,21 @@ def eval_fn(m): def create_value_transform(echo_nostr, echo_noarr): def value_transform(val, type_information=None): + def transform_field_value(value, value_type, echo_nostr, echo_noarr): + if echo_noarr and '[' in value_type: + return '' % \ + (value_type.rstrip('[]'), len(value)) + elif echo_nostr and value_type == 'string': + return '' % len(value) + elif echo_nostr and value_type == 'string[]': + return '' % len(value) + return value + if not isinstance(val, genpy.Message): if type_information is None: return val - if echo_noarr and '[' in type_information: - return ('' % - (type_information.rstrip('[]'), len(val))) - elif echo_nostr and type_information == 'string': - return '' % len(val) - elif echo_nostr and type_information == 'string[]': - return '' % len(val) - return val + return transform_field_value(val, type_information, + echo_nostr, echo_noarr) class TransformedMessage(genpy.Message): # These should be copy because changing these variables @@ -1413,15 +1417,10 @@ class TransformedMessage(genpy.Message): field_types = val._slot_types for index, (f, t) in enumerate(zip(fields, field_types)): f_val = getattr(val, f) - if echo_noarr and '[' in t: - setattr(val_trans, f, '' % - (t.rstrip('[]'), len(f_val))) - val_trans._slot_types[index] = 'string' - elif echo_nostr and t == 'string': - setattr(val_trans, f, '' % len(f_val)) - elif echo_nostr and t == 'string[]': - setattr(val_trans, f, '' % - len(f_val)) + f_val_trans = transform_field_value(f_val, t, + echo_nostr, echo_noarr) + if f_val_trans != f_val: + setattr(val_trans, f, f_val_trans) val_trans._slot_types[index] = 'string' else: try: