apps/uorb: change nuttx/list to posix queue
Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
729e1cad6e
commit
fe5acd6570
@ -22,11 +22,10 @@
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/list.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <dirent.h>
|
||||
#include <inttypes.h>
|
||||
#include <poll.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
@ -34,6 +33,7 @@
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/queue.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
@ -53,31 +53,35 @@
|
||||
|
||||
struct listen_object_s
|
||||
{
|
||||
struct list_node node; /* Node of object info list */
|
||||
struct orb_object object; /* Object id */
|
||||
orb_abstime timestamp; /* Time of lastest generation */
|
||||
unsigned long generation; /* Latest generation */
|
||||
FAR FILE *file;
|
||||
SLIST_ENTRY(listen_object_s) node; /* Node of object info list */
|
||||
|
||||
struct orb_object object; /* Object id */
|
||||
orb_abstime timestamp; /* Time of lastest generation */
|
||||
unsigned long generation; /* Latest generation */
|
||||
FAR FILE *file;
|
||||
};
|
||||
|
||||
SLIST_HEAD(listen_list_s, listen_object_s);
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static int listener_get_state(FAR struct orb_object *object,
|
||||
FAR struct orb_state *state);
|
||||
static int listener_add_object(FAR struct list_node *objlist,
|
||||
static int listener_add_object(FAR struct listen_list_s *objlist,
|
||||
FAR struct orb_object *object);
|
||||
static void listener_delete_object_list(FAR struct list_node *objlist);
|
||||
static int listener_generate_object_list(FAR struct list_node *objlist,
|
||||
static void listener_delete_object_list(FAR struct listen_list_s *objlist);
|
||||
static int listener_generate_object_list(FAR struct listen_list_s *objlist,
|
||||
FAR const char *filter);
|
||||
static int listener_print(FAR const struct orb_metadata *meta, int fd);
|
||||
static void listener_monitor(FAR struct list_node *objlist, int nb_objects,
|
||||
float topic_rate, int topic_latency,
|
||||
int nb_msgs, int timeout, bool record);
|
||||
static int listener_update(FAR struct list_node *objlist,
|
||||
static void listener_monitor(FAR struct listen_list_s *objlist,
|
||||
int nb_objects, float topic_rate,
|
||||
int topic_latency, int nb_msgs,
|
||||
int timeout, bool record);
|
||||
static int listener_update(FAR struct listen_list_s *objlist,
|
||||
FAR struct orb_object *object);
|
||||
static void listener_top(FAR struct list_node *objlist,
|
||||
static void listener_top(FAR struct listen_list_s *objlist,
|
||||
FAR const char *filter,
|
||||
bool only_once);
|
||||
static int listener_create_dir(FAR char *dir, size_t size);
|
||||
@ -215,7 +219,7 @@ static int listener_get_state(FAR struct orb_object *object,
|
||||
* 0 on success, otherwise return negative errno.
|
||||
****************************************************************************/
|
||||
|
||||
static int listener_add_object(FAR struct list_node *objlist,
|
||||
static int listener_add_object(FAR struct listen_list_s *objlist,
|
||||
FAR struct orb_object *object)
|
||||
{
|
||||
FAR struct listen_object_s *tmp;
|
||||
@ -234,7 +238,7 @@ static int listener_add_object(FAR struct list_node *objlist,
|
||||
tmp->timestamp = orb_absolute_time();
|
||||
tmp->generation = ret < 0 ? 0 : state.generation;
|
||||
tmp->file = NULL;
|
||||
list_add_tail(objlist, &tmp->node);
|
||||
SLIST_INSERT_HEAD(objlist, tmp, node);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -252,7 +256,7 @@ static int listener_add_object(FAR struct list_node *objlist,
|
||||
* 0 on success.
|
||||
****************************************************************************/
|
||||
|
||||
static int listener_update(FAR struct list_node *objlist,
|
||||
static int listener_update(FAR struct listen_list_s *objlist,
|
||||
FAR struct orb_object *object)
|
||||
{
|
||||
FAR struct listen_object_s *old = NULL;
|
||||
@ -261,7 +265,7 @@ static int listener_update(FAR struct list_node *objlist,
|
||||
|
||||
/* Check wether object already exist in old list */
|
||||
|
||||
list_for_every_entry(objlist, tmp, struct listen_object_s, node)
|
||||
SLIST_FOREACH(tmp, objlist, node)
|
||||
{
|
||||
if (tmp->object.meta == object->meta &&
|
||||
tmp->object.instance == object->instance)
|
||||
@ -335,18 +339,18 @@ static int listener_update(FAR struct list_node *objlist,
|
||||
* None.
|
||||
****************************************************************************/
|
||||
|
||||
static void listener_delete_object_list(FAR struct list_node *objlist)
|
||||
static void listener_delete_object_list(FAR struct listen_list_s *objlist)
|
||||
{
|
||||
FAR struct listen_object_s *tmp;
|
||||
FAR struct listen_object_s *next;
|
||||
|
||||
list_for_every_entry_safe(objlist, tmp, next, struct listen_object_s, node)
|
||||
while (!SLIST_EMPTY(objlist))
|
||||
{
|
||||
list_delete(&tmp->node);
|
||||
tmp = SLIST_FIRST(objlist);
|
||||
SLIST_REMOVE_HEAD(objlist, node);
|
||||
free(tmp);
|
||||
}
|
||||
|
||||
list_initialize(objlist);
|
||||
SLIST_INIT(objlist);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -364,7 +368,7 @@ static void listener_delete_object_list(FAR struct list_node *objlist)
|
||||
* Negative errno on failure.
|
||||
****************************************************************************/
|
||||
|
||||
static int listener_generate_object_list(FAR struct list_node *objlist,
|
||||
static int listener_generate_object_list(FAR struct listen_list_s *objlist,
|
||||
FAR const char *filter)
|
||||
{
|
||||
FAR struct dirent *entry;
|
||||
@ -570,9 +574,10 @@ static int listener_record(FAR const struct orb_metadata *meta, int fd,
|
||||
* None
|
||||
****************************************************************************/
|
||||
|
||||
static void listener_monitor(FAR struct list_node *objlist, int nb_objects,
|
||||
float topic_rate, int topic_latency,
|
||||
int nb_msgs, int timeout, bool record)
|
||||
static void listener_monitor(FAR struct listen_list_s *objlist,
|
||||
int nb_objects, float topic_rate,
|
||||
int topic_latency, int nb_msgs,
|
||||
int timeout, bool record)
|
||||
{
|
||||
FAR struct pollfd *fds;
|
||||
char path[PATH_MAX];
|
||||
@ -599,7 +604,7 @@ static void listener_monitor(FAR struct list_node *objlist, int nb_objects,
|
||||
|
||||
/* Prepare pollfd for all objects */
|
||||
|
||||
list_for_every_entry(objlist, tmp, struct listen_object_s, node)
|
||||
SLIST_FOREACH(tmp, objlist, node)
|
||||
{
|
||||
int fd;
|
||||
|
||||
@ -634,7 +639,7 @@ static void listener_monitor(FAR struct list_node *objlist, int nb_objects,
|
||||
listener_create_dir(path, sizeof(path));
|
||||
dir = path + strlen(path);
|
||||
|
||||
list_for_every_entry(objlist, tmp, struct listen_object_s, node)
|
||||
SLIST_FOREACH(tmp, objlist, node)
|
||||
{
|
||||
sprintf(dir, "%s%d.csv", tmp->object.meta->o_name,
|
||||
tmp->object.instance);
|
||||
@ -664,7 +669,7 @@ static void listener_monitor(FAR struct list_node *objlist, int nb_objects,
|
||||
if (poll(&fds[0], nb_objects, timeout * 1000) > 0)
|
||||
{
|
||||
i = 0;
|
||||
list_for_every_entry(objlist, tmp, struct listen_object_s, node)
|
||||
SLIST_FOREACH(tmp, objlist, node)
|
||||
{
|
||||
if (fds[i].revents & POLLIN)
|
||||
{
|
||||
@ -706,7 +711,7 @@ static void listener_monitor(FAR struct list_node *objlist, int nb_objects,
|
||||
}
|
||||
|
||||
i = 0;
|
||||
list_for_every_entry(objlist, tmp, struct listen_object_s, node)
|
||||
SLIST_FOREACH(tmp, objlist, node)
|
||||
{
|
||||
if (fds[i].fd < 0)
|
||||
{
|
||||
@ -757,7 +762,20 @@ static void listener_monitor(FAR struct list_node *objlist, int nb_objects,
|
||||
* None.
|
||||
****************************************************************************/
|
||||
|
||||
static void listener_top(FAR struct list_node *objlist,
|
||||
static size_t listen_length(FAR struct listen_list_s *objlist)
|
||||
{
|
||||
struct listen_object_s *tmp;
|
||||
size_t count = 0;
|
||||
|
||||
SLIST_FOREACH(tmp, objlist, node)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static void listener_top(FAR struct listen_list_s *objlist,
|
||||
FAR const char *filter,
|
||||
bool only_once)
|
||||
{
|
||||
@ -791,7 +809,7 @@ static void listener_top(FAR struct list_node *objlist,
|
||||
uorbinfo_raw("\033[H"); /* move cursor to top left corner */
|
||||
}
|
||||
|
||||
uorbinfo_raw("\033[K" "current objects: %zu", list_length(objlist));
|
||||
uorbinfo_raw("\033[K" "current objects: %zu", listen_length(objlist));
|
||||
uorbinfo_raw("\033[K" "%-*s INST #SUB RATE #Q SIZE",
|
||||
ORB_MAX_PRINT_NAME - 2, "NAME");
|
||||
|
||||
@ -820,8 +838,8 @@ static void exit_handler(int signo)
|
||||
|
||||
int main(int argc, FAR char *argv[])
|
||||
{
|
||||
struct list_node objlist;
|
||||
FAR struct listen_object_s *tmp;
|
||||
struct listen_list_s objlist;
|
||||
float topic_rate = 0;
|
||||
int topic_latency = 0;
|
||||
int nb_msgs = 0;
|
||||
@ -904,7 +922,7 @@ int main(int argc, FAR char *argv[])
|
||||
|
||||
/* Alloc list and exec command */
|
||||
|
||||
list_initialize(&objlist);
|
||||
SLIST_INIT(&objlist);
|
||||
ret = listener_generate_object_list(&objlist, filter);
|
||||
if (ret <= 0)
|
||||
{
|
||||
@ -918,7 +936,7 @@ int main(int argc, FAR char *argv[])
|
||||
else
|
||||
{
|
||||
uorbinfo_raw("\nMointor objects num:%d", ret);
|
||||
list_for_every_entry(&objlist, tmp, struct listen_object_s, node)
|
||||
SLIST_FOREACH(tmp, &objlist, node)
|
||||
{
|
||||
uorbinfo_raw("object_name:%s, object_instance:%d",
|
||||
tmp->object.meta->o_name,
|
||||
|
Loading…
x
Reference in New Issue
Block a user