From b9ba673009d823401156ac04265b94ada5834771 Mon Sep 17 00:00:00 2001 From: Mark Charlebois Date: Thu, 5 Jan 2017 13:11:31 -0800 Subject: [PATCH] Added wait_for_topic builtin command Signed-off-by: Mark Charlebois --- src/platforms/apps.cpp.in | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/platforms/apps.cpp.in b/src/platforms/apps.cpp.in index 495c7992ac..8ceace4aef 100644 --- a/src/platforms/apps.cpp.in +++ b/src/platforms/apps.cpp.in @@ -19,6 +19,7 @@ int list_files_main(int argc, char *argv[]); int list_devices_main(int argc, char *argv[]); int list_topics_main(int argc, char *argv[]); int sleep_main(int argc, char *argv[]); +int wait_for_topic(int argc, char *argv[]); } @@ -33,6 +34,7 @@ ${builtin_apps_string} apps["list_devices"] = list_devices_main; apps["list_topics"] = list_topics_main; apps["sleep"] = sleep_main; + apps["wait_for_topic"] = wait_for_topic; } void list_builtins(apps_map_type &apps) @@ -84,3 +86,32 @@ int sleep_main(int argc, char *argv[]) usleep(usecs); return 0; } + +#include "uORB/uORB.h" + +static int wait_for_topic(int argc, char *argv[]) +{ + if (argc < 2 || argc > 3) { + cout << "Usage: wait_for_topic [timeout_sec]" << endl; + return 1; + } + + struct orb_metadata meta = { .o_name = argv[1], + .o_size = 0, + .o_size_no_padding = 0, + .o_fields = nullptr }; + + unsigned int timeout = (argc == 3) ? (unsigned int)atoi(argv[2]) : 0; + unsigned int elapsed = 0; + + cout << "Waiting for topic " << argv[1] << " timeout " << timeout << endl; + + while (orb_exists(&meta, 0) != 0 && (timeout && (elapsed < timeout))) + { + sleep(1); + elapsed += 1; + } + + return 0; +} +