diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-11-17 23:22:27 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-11-17 23:22:27 +0000 |
commit | 09f70284f5e1d190519661166422909e69b2331b (patch) | |
tree | b968095164f6f6417386d02feda27ea7e7d434ca /nuttx/examples/poll/poll_listener.c | |
parent | 5c3162da749c8c8c1609c1ab1c85ab1961dbabde (diff) | |
download | px4-nuttx-09f70284f5e1d190519661166422909e69b2331b.tar.gz px4-nuttx-09f70284f5e1d190519661166422909e69b2331b.tar.bz2 px4-nuttx-09f70284f5e1d190519661166422909e69b2331b.zip |
Add poll method to serial drivers
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1268 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/examples/poll/poll_listener.c')
-rw-r--r-- | nuttx/examples/poll/poll_listener.c | 159 |
1 files changed, 111 insertions, 48 deletions
diff --git a/nuttx/examples/poll/poll_listener.c b/nuttx/examples/poll/poll_listener.c index 6182ca0de..c798b6e88 100644 --- a/nuttx/examples/poll/poll_listener.c +++ b/nuttx/examples/poll/poll_listener.c @@ -57,6 +57,17 @@ * Definitions ****************************************************************************/ +#if defined(CONFIG_DEV_CONSOLE) && !defined(CONFIG_DEV_LOWCONSOLE) +# define HAVE_CONSOLE +# define NPOLLFDS 2 +# define CONSNDX 0 +# define FIFONDX 1 +#else +# undef HAVE_CONSOLE +# define NPOLLFDS 1 +# define FIFONDX 0 +#endif + /**************************************************************************** * Private Types ****************************************************************************/ @@ -79,13 +90,15 @@ void *poll_listener(pthread_addr_t pvarg) { - struct pollfd fds; + struct pollfd fds[NPOLLFDS]; char buffer[64]; ssize_t nbytes; boolean timeout; boolean pollin; + int nevents; int fd; int ret; + int i; /* Open the FIFO for non-blocking read */ @@ -105,15 +118,20 @@ void *poll_listener(pthread_addr_t pvarg) { message("poll_listener: Calling poll()\n"); - memset(&fds, 0, sizeof(struct pollfd)); - fds.fd = fd; - fds.events = POLLIN; - fds.revents = 0; + memset(fds, 0, sizeof(struct pollfd)*NPOLLFDS); +#ifdef HAVE_CONSOLE + fds[CONSNDX].fd = 0; + fds[CONSNDX].events = POLLIN; + fds[CONSNDX].revents = 0; +#endif + fds[FIFONDX].fd = fd; + fds[FIFONDX].events = POLLIN; + fds[FIFONDX].revents = 0; - timeout = FALSE; - pollin = FALSE; + timeout = FALSE; + pollin = FALSE; - ret = poll(&fds, 1, POLL_LISTENER_DELAY); + ret = poll(fds, NPOLLFDS, POLL_LISTENER_DELAY); message("\npoll_listener: poll returned: %d\n", ret); if (ret < 0) @@ -122,71 +140,116 @@ void *poll_listener(pthread_addr_t pvarg) } else if (ret == 0) { - message("poll_listener: Timeout, revents=%02x\n", fds.revents); + message("poll_listener: Timeout\n"); timeout = TRUE; - if (fds.revents != 0) - { - message("poll_listener: ERROR? expected revents=00, received revents=%02x\n", - fds.revents); - } + } + else if (ret > NPOLLFDS) + { + message("poll_listener: ERROR poll reported: %d\n"); } else { - if (ret != 1) + pollin = TRUE; + } + + nevents = 0; + for (i = 0; i < NPOLLFDS; i++) + { + message("poll_listener: FIFO revents[%d]=%02x\n", i, fds[i].revents); + if (timeout) { - message("poll_listener: ERROR poll reported: %d\n"); + if (fds[i].revents != 0) + { + message("poll_listener: ERROR? expected revents=00, received revents[%d]=%02x\n", + fds[i].revents, i); + } } - else + else if (pollin) { - pollin = TRUE; + if (fds[i].revents == POLLIN) + { + nevents++; + } + else if (fds[i].revents != 0) + { + message("poll_listener: ERROR unexpected revents[i]=%02x\n", + i, fds[i].revents); + } } + } - message("poll_listener: revents=%02x\n", fds.revents); - if (fds.revents != POLLIN) - { - message("poll_listener: ERROR expected revents=%02x, received revents=%02x\n", - fds.revents); - message(" (might just be a race condition)\n"); - } + if (pollin && nevents != ret) + { + message("poll_listener: ERROR found %d events, poll reported %d\n", nevents, ret); } - /* In any event, read until the pipe is empty */ + /* In any event, read until the pipe/serial is empty */ - do + for (i = 0; i < NPOLLFDS; i++) { - nbytes = read(fd, buffer, 63); - if (nbytes <= 0) + do { - if (nbytes == 0 || errno == EAGAIN) +#ifdef HAVE_CONSOLE + /* Hack to work around the fact that the console driver on the + * simulator is always non-blocking. + */ + + if (i == CONSNDX) { - if (pollin) + if ((fds[CONSNDX].revents & POLLIN) != 0) + { + buffer[0] = getchar(); + nbytes = 1; + } + else { - message("poll_listener: ERROR no read data\n"); + nbytes = 0; } } - else if (errno != EINTR) + else +#endif { - message("poll_listener: read failed: %d\n", errno); + /* The pipe works differently, it returns whatever data + * it has available without blocking. + */ + + nbytes = read(fds[i].fd, buffer, 63); } - nbytes = 0; - } - else - { - if (timeout) + + if (nbytes <= 0) { - message("poll_listener: ERROR? Poll timeout, but data read\n"); - message(" (might just be a race condition)\n"); + if (nbytes == 0 || errno == EAGAIN) + { + if ((fds[i].revents & POLLIN) != 0) + { + message("poll_listener: ERROR no read data[%d]\n", i); + } + } + else if (errno != EINTR) + { + message("poll_listener: read[%d] failed: %d\n", i, errno); + } + nbytes = 0; } + else + { + if (timeout) + { + message("poll_listener: ERROR? Poll timeout, but data read[%d]\n", i); + message(" (might just be a race condition)\n"); + } - buffer[nbytes] = '\0'; - message("poll_listener: Read '%s' (%d bytes)\n", buffer, nbytes); - } + buffer[nbytes] = '\0'; + message("poll_listener: Read[%d] '%s' (%d bytes)\n", i, buffer, nbytes); + } - timeout = FALSE; - pollin = FALSE; - } - while (nbytes > 0); + /* Suppress error report if no read data on the next time through */ + fds[i].revents = 0; + } + while (nbytes > 0); + } + /* Make sure that everything is displayed */ msgflush(); |