aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw27@cam.ac.uk>2008-11-23 21:17:43 +0000
committerThomas White <taw27@cam.ac.uk>2008-11-23 21:17:43 +0000
commiteb1e015e877ff5135a3371bb81904d139d623018 (patch)
tree36fb8232fd392c107b6a102f1310ab921bfe2e43
parentf87c1e7e4064474803a7725f4c4c0b653dab0521 (diff)
Attempt to use non-blocking I/O for accelerometers
-rw-r--r--src/accelerometers.c57
-rw-r--r--src/types.h2
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 <stdlib.h>
#include <stdint.h>
#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <time.h>
#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;