aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw27@cam.ac.uk>2008-11-26 23:21:28 +0000
committerThomas White <taw27@cam.ac.uk>2008-11-26 23:21:28 +0000
commit4974c06bfe294e84d14f3be36ef47785227a468c (patch)
treee06b0e2d7e20819a0e6404563ae7ac4ec8e9b527
parent408e221b582f9db85a36ced5a9ab89a449884cdd (diff)
Use select() instead of O_NONBLOCKopenmoocow-0.2
-rw-r--r--src/accelerometers.c39
1 files 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 <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/select.h>
#include <fcntl.h>
#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 ) {