Browse Source

uORB : Don't automatically include message name as default topic name in uORBTopics source files, to handle case where user doesn't use default messgae name for multi topic definition in .msg file

v1.13.0-BW
Junwoo Hwang 3 years ago committed by Beat Küng
parent
commit
35613df210
  1. 12
      msg/templates/uorb/uORBTopics.cpp.em
  2. 12
      msg/templates/uorb/uORBTopics.hpp.em
  3. 8
      msg/templates/uorb_microcdr/dds_topics.h.em
  4. 2
      msg/templates/uorb_microcdr/microRTPS_client.cpp.em
  5. 53
      msg/tools/px_generate_uorb_topic_files.py

12
msg/templates/uorb/uORBTopics.cpp.em

@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
@#
@# Context:
@# - msgs (List) list of all msg files
@# - multi_topics (List) list of all multi-topic names
@# - topics (List) list of all topic names
@###############################################
/****************************************************************************
*
@ -48,17 +48,17 @@ @@ -48,17 +48,17 @@
@{
msg_names = [mn.replace(".msg", "") for mn in msgs]
msgs_count = len(msg_names)
msg_names_all = list(set(msg_names + multi_topics)) # set() filters duplicates
msg_names_all.sort()
msgs_count_all = len(msg_names_all)
topics_all = topics
topics_all.sort()
topics_count_all = len(topics_all)
}@
@[for msg_name in msg_names]@
#include <uORB/topics/@(msg_name).h>
@[end for]
const constexpr struct orb_metadata *const uorb_topics_list[ORB_TOPICS_COUNT] = {
@[for idx, msg_name in enumerate(msg_names_all, 1)]@
ORB_ID(@(msg_name))@[if idx != msgs_count_all], @[end if]
@[for idx, topic_name in enumerate(topics_all, 1)]@
ORB_ID(@(topic_name))@[if idx != topics_count_all], @[end if]
@[end for]
};

12
msg/templates/uorb/uORBTopics.hpp.em

@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
@#
@# Context:
@# - msgs (List) list of all msg files
@# - multi_topics (List) list of all multi-topic names
@# - topics (List) list of all topic names
@###############################################
/****************************************************************************
*
@ -46,9 +46,9 @@ @@ -46,9 +46,9 @@
@{
msg_names = [mn.replace(".msg", "") for mn in msgs]
msgs_count = len(msg_names)
msg_names_all = list(set(msg_names + multi_topics)) # set() filters duplicates
msg_names_all.sort()
msgs_count_all = len(msg_names_all)
topics_all = topics
topics_all.sort()
topics_count_all = len(topics_all)
}@
#pragma once
@ -57,7 +57,7 @@ msgs_count_all = len(msg_names_all) @@ -57,7 +57,7 @@ msgs_count_all = len(msg_names_all)
#include <uORB/uORB.h>
static constexpr size_t ORB_TOPICS_COUNT{@(msgs_count_all)};
static constexpr size_t ORB_TOPICS_COUNT{@(topics_count_all)};
static constexpr size_t orb_topics_count() { return ORB_TOPICS_COUNT; }
/*
@ -66,7 +66,7 @@ static constexpr size_t orb_topics_count() { return ORB_TOPICS_COUNT; } @@ -66,7 +66,7 @@ static constexpr size_t orb_topics_count() { return ORB_TOPICS_COUNT; }
extern const struct orb_metadata *const *orb_get_topics() __EXPORT;
enum class ORB_ID : uint8_t {
@[for idx, msg_name in enumerate(msg_names_all)]@
@[for idx, msg_name in enumerate(topics_all)]@
@(msg_name) = @(idx),
@[end for]
INVALID

8
msg/templates/uorb_microcdr/dds_topics.h.em

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
@#
@# Context:
@# - msgs (List) list of all RTPS messages
@# - multi_topics (List) list of all multi-topic names
@# - topics (List) list of all topic names
@# - spec (msggen.MsgSpec) Parsed specification of the .msg file
@###############################################
@{
@ -43,11 +43,11 @@ struct SendTopicsSubs { @@ -43,11 +43,11 @@ struct SendTopicsSubs {
uORB::Subscription @(topic)_sub{ORB_ID(@(topic))};
uxrObjectId @(topic)_data_writer;
@[ end for]@
uxrSession* session;
uint32_t num_payload_sent{};
bool init(uxrSession* session_, uxrStreamId stream_id, uxrObjectId participant_id);
void update(uxrStreamId stream_id);
};
@ -140,7 +140,7 @@ struct RcvTopicsPubs { @@ -140,7 +140,7 @@ struct RcvTopicsPubs {
uxrSession* session;
uint32_t num_payload_received{};
bool init(uxrSession* session_, uxrStreamId stream_id, uxrStreamId input_stream, uxrObjectId participant_id);
};

2
msg/templates/uorb_microcdr/microRTPS_client.cpp.em

@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
@#
@# Context:
@# - msgs (List) list of all RTPS messages
@# - multi_topics (List) list of all multi-topic names
@# - topics (List) list of all topic names
@# - spec (msggen.MsgSpec) Parsed specification of the .msg file
@###############################################
@{

53
msg/tools/px_generate_uorb_topic_files.py

@ -98,9 +98,11 @@ class MsgScope: @@ -98,9 +98,11 @@ class MsgScope:
RECEIVE = 2
def get_multi_topics(filename):
def get_topics(filename, msg_name):
"""
Get TOPICS names from a "# TOPICS" line
Get TOPICS names from a "# TOPICS" line. If there are no multi topics defined,
set topic name same as the message name, since the user doesn't expect any new
custom topic names.
"""
ofile = open(filename, 'r')
text = ofile.read()
@ -111,6 +113,10 @@ def get_multi_topics(filename): @@ -111,6 +113,10 @@ def get_multi_topics(filename):
topic_names_str = topic_names_str.replace(TOPICS_TOKEN, "")
result.extend(topic_names_str.split(" "))
ofile.close()
if len(result) == 0:
result.append(msg_name)
return result
@ -147,15 +153,16 @@ def generate_output_from_file(format_idx, filename, outputdir, package, template @@ -147,15 +153,16 @@ def generate_output_from_file(format_idx, filename, outputdir, package, template
print("[ERROR] uORB topic files generator:\n\tgenerate_output_from_file:\t'timestamp' field in " + spec.short_name +
" msg definition is not of type uint64 but rather of type " + field_name_and_type.get('timestamp') + "!")
exit(1)
topics = get_multi_topics(filename)
# Get topics used for the message
topics = get_topics(filename, spec.short_name)
if includepath:
search_path = genmsg.command_line.includepath_to_dict(includepath)
else:
search_path = {}
genmsg.msg_loader.load_depends(msg_context, spec, search_path)
md5sum = genmsg.gentools.compute_md5(msg_context, spec)
if len(topics) == 0:
topics.append(spec.short_name)
em_globals = {
"file_name_in": filename,
"md5sum": md5sum,
@ -288,15 +295,16 @@ def get_em_globals(filename_msg, alias, package, includepath, msgs, fastrtps_ver @@ -288,15 +295,16 @@ def get_em_globals(filename_msg, alias, package, includepath, msgs, fastrtps_ver
package, os.path.basename(filename_msg))
spec = genmsg.msg_loader.load_msg_from_file(
msg_context, filename_msg, full_type_name)
topics = get_multi_topics(filename_msg)
# Get topics used for the message
topics = get_topics(filename_msg, spec.short_name)
if includepath:
search_path = genmsg.command_line.includepath_to_dict(includepath)
else:
search_path = {}
genmsg.msg_loader.load_depends(msg_context, spec, search_path)
md5sum = genmsg.gentools.compute_md5(msg_context, spec)
if len(topics) == 0:
topics.append(spec.short_name)
em_globals = {
"file_name_in": filename_msg,
"md5sum": md5sum,
@ -452,24 +460,31 @@ def convert_dir_save(format_idx, inputdir, outputdir, package, templatedir, temp @@ -452,24 +460,31 @@ def convert_dir_save(format_idx, inputdir, outputdir, package, templatedir, temp
def generate_topics_list_file(msgdir, outputdir, template_filename, templatedir):
# generate cpp file with topics list
msgs = get_msgs_list(msgdir)
multi_topics = []
topics = []
for msg in msgs:
msg_filename = os.path.join(msgdir, msg)
multi_topics.extend(get_multi_topics(msg_filename))
tl_globals = {"msgs": msgs, "multi_topics": multi_topics}
topics.extend(get_topics(msg_filename, msg))
tl_globals = {"msgs": msgs, "topics": topics}
tl_template_file = os.path.join(templatedir, template_filename)
tl_out_file = os.path.join(outputdir, template_filename.replace(".em", ""))
generate_by_template(tl_out_file, tl_template_file, tl_globals)
def generate_topics_list_file_from_files(files, outputdir, template_filename, templatedir):
# generate cpp file with topics list
filenames = [os.path.basename(
p) for p in files if os.path.basename(p).endswith(".msg")]
multi_topics = []
for msg_filename in files:
multi_topics.extend(get_multi_topics(msg_filename))
tl_globals = {"msgs": filenames, "multi_topics": multi_topics}
# Get message file names ending with .msg only
msg_filenames = [p for p in files if os.path.basename(p).endswith(".msg")]
# Get topics used in messages
topics = []
for msg_filename in msg_filenames:
msg_name = os.path.basename(msg_filename).replace('.msg', '')
topics.extend(get_topics(msg_filename, msg_name))
# Get only the message file name for "msgs" component
msg_basenames = [os.path.basename(p) for p in msg_filenames]
# Set the Template dictionary settings
tl_globals = {"msgs": msg_basenames, "topics": topics}
tl_template_file = os.path.join(templatedir, template_filename)
tl_out_file = os.path.join(outputdir, template_filename.replace(".em", ""))
generate_by_template(tl_out_file, tl_template_file, tl_globals)
@ -529,8 +544,10 @@ if __name__ == "__main__": @@ -529,8 +544,10 @@ if __name__ == "__main__":
generate_output_from_file(
generate_idx, f, args.temporarydir, args.package, args.templatedir, INCL_DEFAULT)
# Generate topics list header and source file
if os.path.isfile(os.path.join(args.templatedir, TOPICS_LIST_TEMPLATE_FILE[generate_idx])):
generate_topics_list_file_from_files(args.file, args.outputdir, TOPICS_LIST_TEMPLATE_FILE[generate_idx], args.templatedir)
copy_changed(args.temporarydir, args.outputdir, args.prefix, args.quiet)
elif args.dir is not None:
convert_dir_save(

Loading…
Cancel
Save