From eb1e015e877ff5135a3371bb81904d139d623018 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sun, 23 Nov 2008 21:17:43 +0000 Subject: Attempt to use non-blocking I/O for accelerometers --- src/accelerometers.c | 57 ++++++++++++++++++++++++++-------------------------- src/types.h | 2 +- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/accelerometers.c b/src/accelerometers.c index 3440fae..c68fa57 100644 --- a/src/accelerometers.c +++ b/src/accelerometers.c @@ -30,6 +30,11 @@ #include #include #include +#include +#include +#include +#include +#include #include "types.h" #include "audio.h" @@ -63,8 +68,8 @@ AccelHandle *accelerometer_open() { accel->type = ACCEL_UNKNOWN; /* Determine accelerometer type */ - accel->fh = fopen("/dev/input/event3", "rb"); - if ( accel->fh != NULL ) { + accel->fd = open("/dev/input/event3", O_RDONLY, O_NONBLOCK); + if ( accel->fd != -1 ) { accel->type = ACCEL_FREERUNNER; printf("Neo Freerunner detected\n"); return accel; @@ -79,38 +84,34 @@ AccelHandle *accelerometer_open() { void accelerometer_update_freerunner(AccelHandle *accel) { - if ( accel->fh != NULL ) { + struct input_event ev; + size_t rval; - struct input_event ev; - size_t rval; - - rval = fread(&ev, sizeof(struct input_event), 1, accel->fh); - if ( rval != 1 ) { - fprintf(stderr, "Couldn't read accelerometer data"); - return; - } + rval = read(accel->fd, &ev, sizeof(ev)); + if ( rval != sizeof(ev) ) { + fprintf(stderr, "Couldn't read accelerometer data"); + return; + } - if ( ev.type == EV_REL ) { - if ( ev.code == REL_X ) { - accel->lx = ev.value; - } - if ( ev.code == REL_Y ) { - accel->ly = ev.value; - } - if ( ev.code == REL_Z ) { - accel->lz = ev.value; - } + if ( ev.type == EV_REL ) { + if ( ev.code == REL_X ) { + accel->lx = ev.value; } - - if ( ev.type == EV_SYN ) { - if ( ev.code == SYN_REPORT ) { - accel->x = accel->lx; - accel->y = accel->ly; - accel->z = accel->lz; - } + if ( ev.code == REL_Y ) { + accel->ly = ev.value; + } + if ( ev.code == REL_Z ) { + accel->lz = ev.value; } } + if ( ev.type == EV_SYN ) { + if ( ev.code == SYN_REPORT ) { + accel->x = accel->lx; + accel->y = accel->ly; + accel->z = accel->lz; + } + } } diff --git a/src/types.h b/src/types.h index 2ec6aac..89ff7f4 100644 --- a/src/types.h +++ b/src/types.h @@ -37,7 +37,7 @@ typedef enum { typedef struct { - FILE *fh; + int fd; AccelType type; -- cgit v1.2.3