Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Topic_listener: allow multi-topic messages #8241

Merged
merged 2 commits into from
Nov 9, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
191 changes: 103 additions & 88 deletions src/systemcmds/topic_listener/generate_listener.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

raw_messages = glob.glob(sys.argv[1]+"/msg/*.msg")
messages = []
topics = []
message_elements = []


Expand All @@ -20,6 +21,7 @@
temp_list_bool = []
if("pwm_input" not in m and "position_setpoint" not in m):
temp_list = []
topic_list = []
f = open(m,'r')
for line in f.readlines():
items = re.split('\s+', line.strip())
Expand Down Expand Up @@ -64,14 +66,22 @@
temp_list.append(("uint8",items[1]))
elif (items[0] == "int8") and len(line.split('=')) == 1:
temp_list.append(("int8",items[1]))
elif '# TOPICS' == ' '.join(items[:2]):
for topic in items[2:]:
topic_list.append(topic)

f.close()

(m_head, m_tail) = os.path.split(m)
message = m_tail.split('.')[0]
if message != "actuator_controls":

if len(topic_list) == 0:
topic_list.append(message)

for topic in topic_list:
messages.append(message)
topics.append(topic)
message_elements.append(temp_list)
#messages.append(m.split('/')[-1].split('.')[0])

num_messages = len(messages);

Expand Down Expand Up @@ -137,124 +147,129 @@
#define PRId64 "lld"
#endif

""")
for m in set(messages):
print("#include <uORB/topics/%s.h>" % m)

print("""
extern "C" __EXPORT int listener_main(int argc, char *argv[]);

static bool check_timeout(const hrt_abstime& time) {
if (hrt_elapsed_time(&time) > 2*1000*1000) {
printf("Waited for 2 seconds without a message. Giving up.\\n");
return true;
}
return false;
}

""")
for m in messages:
print("#include <uORB/topics/%s.h>" % m)

for index, (m, t) in enumerate(zip(messages, topics)):
print("void listen_%s(unsigned num_msgs, unsigned topic_instance);" % t)

print("""
extern "C" __EXPORT int listener_main(int argc, char *argv[]);

int listener_main(int argc, char *argv[]) {
int sub = -1;
orb_id_t ID;
print ("""
\nint listener_main(int argc, char *argv[]) {
if(argc < 2) {
printf("need at least two arguments: topic name. [optional number of messages to print] [optional instance]\\n");
return 1;
}
""")
print("\tunsigned num_msgs = (argc > 2) ? atoi(argv[2]) : 1;")
print("\tunsigned topic_instance = (argc > 3) ? atoi(argv[3]) : 0;")
print("\tif (strncmp(argv[1],\"%s\",50) == 0) {" % messages[0])
print("\t\tsub = orb_subscribe_multi(ORB_ID(%s), topic_instance);" % messages[0])
print("\t\tID = ORB_ID(%s);" % messages[0])
print("\t\tstruct %s_s container;" % messages[0])
print("\t\tmemset(&container, 0, sizeof(container));")
for index,m in enumerate(messages[1:]):
print("\t} else if (strncmp(argv[1],\"%s\",50) == 0) {" % m)
print("\t\tsub = orb_subscribe_multi(ORB_ID(%s), topic_instance);" % m)
print("\t\tID = ORB_ID(%s);" % m)
print("\t\tstruct %s_s container;" % m)
print("\t\tmemset(&container, 0, sizeof(container));")
print("\t\tbool updated;")
print("\t\tunsigned i = 0;")
print("\t\thrt_abstime start_time = hrt_absolute_time();")
print("\t\twhile(i < num_msgs) {")
print("\t\t\torb_check(sub,&updated);")
print("\t\t\tif (i == 0) { updated = true; } else { usleep(500); }")
print("\t\t\tif (updated) {")
print("\t\t\tstart_time = hrt_absolute_time();")
print("\t\t\ti++;")
print("\t\t\tprintf(\"\\nTOPIC: %s instance %%d #%%d\\n\", topic_instance, i);" % m)
print("\t\t\torb_copy(ID,sub,&container);")
print("\t\t\tprintf(\"timestamp: %\" PRIu64 \"\\n\", container.timestamp);")
for item in message_elements[index+1]:
print("\tunsigned topic_instance = (argc > 3) ? atoi(argv[3]) : 0;\n")
for index, (m, t) in enumerate(zip(messages, topics)):
if index == 0:
print("\tif (strncmp(argv[1],\"%s\",50) == 0) {" % t)
else:
print("\t} else if (strncmp(argv[1],\"%s\",50) == 0) {" % t)
print("\t\tlisten_%s(num_msgs, topic_instance);" % t)

print("\t} else {")
print("\t\t printf(\" Topic did not match any known topics\\n\");")
print("\t}")
print("\t return 0;")
print("}\n")

for index, (m, t) in enumerate(zip(messages, topics)):
print("void listen_%s(unsigned num_msgs, unsigned topic_instance) {" % t)
print("\tint sub = orb_subscribe_multi(ORB_ID(%s), topic_instance);" % t)
print("\torb_id_t ID = ORB_ID(%s);" % t)
print("\tstruct %s_s container;" % m)
print("\tmemset(&container, 0, sizeof(container));")
print("\tbool updated;")
print("\tunsigned i = 0;")
print("\thrt_abstime start_time = hrt_absolute_time();")
print("\twhile(i < num_msgs) {")
print("\t\torb_check(sub,&updated);")
print("\t\tif (i == 0) { updated = true; } else { usleep(500); }")
print("\t\tif (updated) {")
print("\t\tstart_time = hrt_absolute_time();")
print("\t\ti++;")
print("\t\tprintf(\"\\nTOPIC: %s instance %%d #%%d\\n\", topic_instance, i);" % t)
print("\t\torb_copy(ID,sub,&container);")
print("\t\tprintf(\"timestamp: %\" PRIu64 \"\\n\", container.timestamp);")
for item in message_elements[index]:
if item[0] == "float":
print("\t\t\tprintf(\"%s: %%8.4f\\n\",(double)container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%8.4f\\n\",(double)container.%s);" % (item[1], item[1]))
elif item[0] == "float_array":
print("\t\t\tprintf(\"%s: \");" % item[1])
print("\t\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\t\tprintf(\"%%8.4f \",(double)container.%s[j]);" % item[1])
print("\t\t\t}")
print("\t\t\tprintf(\"\\n\");")
print("\t\tprintf(\"%s: \");" % item[1])
print("\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\tprintf(\"%%8.4f \",(double)container.%s[j]);" % item[1])
print("\t\t}")
print("\t\tprintf(\"\\n\");")
elif item[0] == "double":
print("\t\t\tprintf(\"%s: %%8.4f\\n\",(double)container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%8.4f\\n\",(double)container.%s);" % (item[1], item[1]))
elif item[0] == "double_array":
print("\t\t\tprintf(\"%s: \");" % item[1])
print("\t\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\t\tprintf(\"%%8.4f \",(double)container.%s[j]);" % item[1])
print("\t\t\t}")
print("\t\t\tprintf(\"\\n\");")
print("\t\tprintf(\"%s: \");" % item[1])
print("\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\tprintf(\"%%8.4f \",(double)container.%s[j]);" % item[1])
print("\t\t}")
print("\t\tprintf(\"\\n\");")
elif item[0] == "uint64":
print("\t\t\tprintf(\"%s: %%\" PRIu64 \"\\n\",container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%\" PRIu64 \"\\n\",container.%s);" % (item[1], item[1]))
elif item[0] == "uint64_array":
print("\t\t\tprintf(\"%s: \");" % item[1])
print("\t\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\t\tprintf(\"%%\" PRIu64 \" \",container.%s[j]);" % item[1])
print("\t\t\t}")
print("\t\t\tprintf(\"\\n\");")
print("\t\tprintf(\"%s: \");" % item[1])
print("\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\tprintf(\"%%\" PRIu64 \" \",container.%s[j]);" % item[1])
print("\t\t}")
print("\t\tprintf(\"\\n\");")
elif item[0] == "uint16_array":
print("\t\t\tprintf(\"%s: \");" % item[1])
print("\t\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\t\tprintf(\"%%u \",container.%s[j]);" % item[1])
print("\t\t\t}")
print("\t\t\tprintf(\"\\n\");")
print("\t\tprintf(\"%s: \");" % item[1])
print("\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\tprintf(\"%%u \",container.%s[j]);" % item[1])
print("\t\t}")
print("\t\tprintf(\"\\n\");")
elif item[0] == "int32_array":
print("\t\t\tprintf(\"%s: \");" % item[1])
print("\t\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\t\tprintf(\"%%d \",container.%s[j]);" % item[1])
print("\t\t\t}")
print("\t\t\tprintf(\"\\n\");")
print("\t\tprintf(\"%s: \");" % item[1])
print("\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\tprintf(\"%%d \",container.%s[j]);" % item[1])
print("\t\t}")
print("\t\tprintf(\"\\n\");")
elif item[0] == "int16_array":
print("\t\t\tprintf(\"%s: \");" % item[1])
print("\t\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\t\tprintf(\"%%d \",container.%s[j]);" % item[1])
print("\t\t\t}")
print("\t\t\tprintf(\"\\n\");")
print("\t\tprintf(\"%s: \");" % item[1])
print("\t\tfor (int j = 0; j < %d; j++) {" % item[2])
print("\t\t\tprintf(\"%%d \",container.%s[j]);" % item[1])
print("\t\t}")
print("\t\tprintf(\"\\n\");")
elif item[0] == "int64":
print("\t\t\tprintf(\"%s: %%\" PRId64 \"\\n\",container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%\" PRId64 \"\\n\",container.%s);" % (item[1], item[1]))
elif item[0] == "int32":
print("\t\t\tprintf(\"%s: %%d\\n\",container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%d\\n\",container.%s);" % (item[1], item[1]))
elif item[0] == "uint32":
print("\t\t\tprintf(\"%s: %%u\\n\",container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%u\\n\",container.%s);" % (item[1], item[1]))
elif item[0] == "int16":
print("\t\t\tprintf(\"%s: %%d\\n\",(int)container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%d\\n\",(int)container.%s);" % (item[1], item[1]))
elif item[0] == "uint16":
print("\t\t\tprintf(\"%s: %%u\\n\",(unsigned)container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%u\\n\",(unsigned)container.%s);" % (item[1], item[1]))
elif item[0] == "int8":
print("\t\t\tprintf(\"%s: %%d\\n\",(int)container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%d\\n\",(int)container.%s);" % (item[1], item[1]))
elif item[0] == "uint8":
print("\t\t\tprintf(\"%s: %%u\\n\",(unsigned)container.%s);" % (item[1], item[1]))
print("\t\tprintf(\"%s: %%u\\n\",(unsigned)container.%s);" % (item[1], item[1]))
elif item[0] == "bool":
print("\t\t\tprintf(\"%s: %%s\\n\",container.%s ? \"True\" : \"False\");" % (item[1], item[1]))
print("\t\t\t} else {")
print("\t\t\t\tif (check_timeout(start_time)) {")
print("\t\t\t\t\tbreak;")
print("\t\t\t\t}")
print("\t\tprintf(\"%s: %%s\\n\",container.%s ? \"True\" : \"False\");" % (item[1], item[1]))
print("\t\t} else {")
print("\t\t\tif (check_timeout(start_time)) {")
print("\t\t\t\tbreak;")
print("\t\t\t}")
print("\t\t}")
print("\t} else {")
print("\t\t printf(\" Topic did not match any known topics\\n\");")
print("\t}")
print("\t\torb_unsubscribe(sub);")
print("\t return 0;")

print("}")
print("\t}")
print("\torb_unsubscribe(sub);")
print("}\n")