aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw27@cam.ac.uk>2008-12-01 20:38:28 +0000
committerThomas White <taw27@cam.ac.uk>2008-12-01 20:38:28 +0000
commit71ba0cfa22d42746503e39cfe31e128fc3f333a8 (patch)
treee08016c93dc2ab67146684db1c514a9c24b64511
parent24be2709909e3870bfb412a123afe02519d2eaad (diff)
parentc5fce104c22dae327714559562383b3e85bb7df1 (diff)
Merge branch 'hdaps'
-rw-r--r--src/accelerometers.c97
-rw-r--r--src/types.h5
2 files changed, 74 insertions, 28 deletions
diff --git a/src/accelerometers.c b/src/accelerometers.c
index 3d8c968..14921c6 100644
--- a/src/accelerometers.c
+++ b/src/accelerometers.c
@@ -4,6 +4,7 @@
* Accelerometer stuff
*
* (c) 2008 Thomas White <taw27@srcf.ucam.org>
+ * (c) 2008 Joachim Breitner <mail@joachim-breitner.de>
*
* This file is part of OpenMooCow - accelerometer moobox simulator
*
@@ -46,6 +47,7 @@ struct input_event {
};
#define EV_SYN (0x00)
#define EV_REL (0x02)
+#define EV_ABS (0x03)
#define SYN_REPORT (0x00)
#define REL_X (0x00)
#define REL_Y (0x01)
@@ -64,9 +66,17 @@ AccelHandle *accelerometer_open() {
accel->lx = 0;
accel->ly = 0;
accel->lz = 0;
+ accel->state = 0;
accel->type = ACCEL_UNKNOWN;
/* Determine accelerometer type */
+ accel->fd = open("/dev/input/by-path/platform-hdaps-event-joystick", O_RDONLY, O_NONBLOCK);
+ if ( accel->fd != -1 ) {
+ accel->type = ACCEL_HDAPS;
+ printf("ThinkPad HDAPS detected\n");
+ return accel;
+ }
+
accel->fd = open("/dev/input/event3", O_RDONLY, 0);
if ( accel->fd != -1 ) {
accel->type = ACCEL_FREERUNNER;
@@ -81,21 +91,48 @@ AccelHandle *accelerometer_open() {
}
-double utils_highresms() {
+int accelerometer_moo_hdaps(AccelHandle *accel) {
- struct timeval tv;
- suseconds_t us;
- time_t sec;
-
- gettimeofday(&tv, NULL);
- us = tv.tv_usec;
- sec = tv.tv_sec;
+ struct input_event ev;
+ size_t rval;
- return ((double)us+1000000.0*sec)/1000.0;
+ rval = read(accel->fd, &ev, sizeof(ev));
+ if ( rval != sizeof(ev) ) {
+ fprintf(stderr, "Couldn't read accelerometer data");
+ return 0;
+ }
+ if (ev.type == EV_ABS && ev.code == REL_Y) {
+ 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;
@@ -113,11 +150,11 @@ void accelerometer_update_freerunner(AccelHandle *accel) {
rval = read(accel->fd, &ev, sizeof(ev));
if ( rval != sizeof(ev) ) {
fprintf(stderr, "Couldn't read accelerometer data");
- return;
+ return 0;
}
} else {
- return; /* No data */
+ return 0; /* No data */
}
if ( ev.type == EV_REL ) {
@@ -140,23 +177,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 : {
+ 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 */
@@ -164,22 +213,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 b864742..7870081 100644
--- a/src/types.h
+++ b/src/types.h
@@ -4,6 +4,7 @@
* Data types
*
* (c) 2008 Thomas White <taw27@srcf.ucam.org>
+ * (c) 2008 Joachim Breitner <mail@joachim-breitner.de>
*
* This file is part of OpenMooCow - accelerometer moobox simulator
*
@@ -33,6 +34,7 @@
typedef enum {
ACCEL_UNKNOWN,
ACCEL_FREERUNNER, /* Openmoko Neo Freerunner */
+ ACCEL_HDAPS, /* Thinkpad HDAPS */
} AccelType;
typedef struct {
@@ -49,6 +51,9 @@ typedef struct {
int lx;
int ly;
int lz;
+
+ /* Current state (driver dependent) */
+ int state;
} AccelHandle;