aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Breitner <mail@joachim-breitner.de>2008-11-27 23:39:59 +0100
committerThomas White <taw27@cam.ac.uk>2008-11-28 00:03:37 +0000
commitcea996c922b7f9b35ebadb23296561e40991991e (patch)
tree4dea59c9f4cc4483ed4db40e9c7279138ad9695d
parent88e371c5ebffb47737a14836821498812aa3b0f0 (diff)
Move moo-detection into accel driver
Slight refactorization: The decision, whether a moo should happen, is moved to the driver-specific code (because it knows best what kind of device to expect). A member “state” is added to the accel struct which can be used to implement a state machine inside the driver (as was done before with pos).
-rw-r--r--src/accelerometers.c91
-rw-r--r--src/types.h3
2 files changed, 55 insertions, 39 deletions
diff --git a/src/accelerometers.c b/src/accelerometers.c
index deaeff1..08f141d 100644
--- a/src/accelerometers.c
+++ b/src/accelerometers.c
@@ -65,6 +65,7 @@ AccelHandle *accelerometer_open() {
accel->lx = 0;
accel->ly = 0;
accel->lz = 0;
+ accel->state = 0;
accel->type = ACCEL_UNKNOWN;
/* Determine accelerometer type */
@@ -89,7 +90,7 @@ AccelHandle *accelerometer_open() {
}
-void accelerometer_update_hdaps(AccelHandle *accel) {
+int accelerometer_moo_hdaps(AccelHandle *accel) {
struct input_event ev;
size_t rval;
@@ -97,38 +98,50 @@ void accelerometer_update_hdaps(AccelHandle *accel) {
rval = read(accel->fd, &ev, sizeof(ev));
if ( rval != sizeof(ev) ) {
fprintf(stderr, "Couldn't read accelerometer data");
- return;
+ return 0;
}
if (ev.type == EV_ABS && ev.code == REL_Y) {
- // This is the result of some experimentation
- accel->y = -600 + abs(ev.value) * 12;
+ if (accel->state == 0 && abs(ev.value)>100) {
+ // Laptop tilted far enough
+ accel->state=1;
+ return 0;
+ }
+
+ if (accel->state == 1 && abs(ev.value)<70) {
+ // Laptop tilted back, play sound
+ accel->state=2;
+ return 1;
+ }
+
+ if (accel->state == 2 && abs(ev.value)<20) {
+ // Laptop almost at center, enable another round
+ accel->state=0;
+ return 0;
+ }
}
+ return 0;
+
+ /*
+ fprintf(stderr, "Event: time %ld.%06ld, type %s, code %d, value %d\n",
+ ev.time.tv_sec, ev.time.tv_usec,
+ ev.type == EV_REL ? "REL" :
+ ev.type == EV_ABS ? "ABS" : "Other" ,
+ ev.code, ev.value);
+ */
}
-void accelerometer_update_freerunner(AccelHandle *accel) {
+int accelerometer_moo_freerunner(AccelHandle *accel) {
struct input_event ev;
size_t rval;
fd_set fds;
struct timeval t;
- 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 */
+ rval = read(accel->fd, &ev, sizeof(ev));
+ if ( rval != sizeof(ev) ) {
+ fprintf(stderr, "Couldn't read accelerometer data");
+ return 0;
}
if ( ev.type == EV_REL ) {
@@ -151,27 +164,35 @@ void accelerometer_update_freerunner(AccelHandle *accel) {
}
}
+ if ( (accel->y < -500) && (accel->state > -1000) ) {
+ accel->state = -1000;
+ return 1;
+ }
+
+ if ( (accel->y > 500) && (accel->state < 1000) ) {
+ accel->state = 1000;
+ return 1;
+ }
+
+ return 0;
}
-void accelerometer_update(AccelHandle *accel) {
+int accelerometer_moo(AccelHandle *accel) {
switch ( accel->type ) {
case ACCEL_UNKNOWN : {
- return;
+ return 0;
}
case ACCEL_FREERUNNER : {
- accelerometer_update_freerunner(accel);
- break;
+ return accelerometer_moo_freerunner(accel);
}
case ACCEL_HDAPS : {
- accelerometer_update_hdaps(accel);
- break;
+ return accelerometer_moo_hdaps(accel);
}
- /* Add other types here. You simply need to provide the "y"
- * component of acceleration in milli-g in the relevant
- * structure. */
+ /* Add other types here. */
}
+ return 0;
}
/* The accelerometer work thread */
@@ -179,22 +200,14 @@ static void *accel_work(void *data) {
AccelHandle *accel;
int *finished = data;
- int pos = 0;
accel = accelerometer_open();
audio_setup();
while ( !(*finished) ) {
- accelerometer_update(accel);
-
- if ( (accel->y < -500) && (pos > -1000) ) {
- pos = -1000;
+ if (accelerometer_moo(accel))
audio_trigger_moo();
- } else if ( (accel->y > 500) && (pos < 1000) ) {
- pos = 1000;
- audio_trigger_moo();
- }
usleep(25000);
diff --git a/src/types.h b/src/types.h
index eae97b6..cc7a227 100644
--- a/src/types.h
+++ b/src/types.h
@@ -50,6 +50,9 @@ typedef struct {
int lx;
int ly;
int lz;
+
+ /* Current state (driver dependent) */
+ int state;
} AccelHandle;