From 4974c06bfe294e84d14f3be36ef47785227a468c Mon Sep 17 00:00:00 2001 From: Thomas White Date: Wed, 26 Nov 2008 23:21:28 +0000 Subject: Use select() instead of O_NONBLOCK --- src/accelerometers.c | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/accelerometers.c b/src/accelerometers.c index 61118fc..3d8c968 100644 --- a/src/accelerometers.c +++ b/src/accelerometers.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include "types.h" @@ -66,7 +67,7 @@ AccelHandle *accelerometer_open() { accel->type = ACCEL_UNKNOWN; /* Determine accelerometer type */ - accel->fd = open("/dev/input/event3", O_RDONLY, O_NONBLOCK); + accel->fd = open("/dev/input/event3", O_RDONLY, 0); if ( accel->fd != -1 ) { accel->type = ACCEL_FREERUNNER; printf("Neo Freerunner detected\n"); @@ -80,15 +81,43 @@ AccelHandle *accelerometer_open() { } +double utils_highresms() { + + struct timeval tv; + suseconds_t us; + time_t sec; + + gettimeofday(&tv, NULL); + us = tv.tv_usec; + sec = tv.tv_sec; + + return ((double)us+1000000.0*sec)/1000.0; + +} + void accelerometer_update_freerunner(AccelHandle *accel) { struct input_event ev; size_t rval; + fd_set fds; + struct timeval t; - rval = read(accel->fd, &ev, sizeof(ev)); - if ( rval != sizeof(ev) ) { - fprintf(stderr, "Couldn't read accelerometer data"); - return; + FD_ZERO(&fds); + FD_SET(accel->fd, &fds); + t.tv_sec = 0; + t.tv_usec = 0; + select(1+accel->fd, &fds, NULL, NULL, &t); + + if ( FD_ISSET(accel->fd, &fds) ) { + + rval = read(accel->fd, &ev, sizeof(ev)); + if ( rval != sizeof(ev) ) { + fprintf(stderr, "Couldn't read accelerometer data"); + return; + } + + } else { + return; /* No data */ } if ( ev.type == EV_REL ) { -- cgit v1.2.3