diff options
author | Thomas White <taw27@cam.ac.uk> | 2008-12-01 20:38:28 +0000 |
---|---|---|
committer | Thomas White <taw27@cam.ac.uk> | 2008-12-01 20:38:28 +0000 |
commit | 71ba0cfa22d42746503e39cfe31e128fc3f333a8 (patch) | |
tree | e08016c93dc2ab67146684db1c514a9c24b64511 | |
parent | 24be2709909e3870bfb412a123afe02519d2eaad (diff) | |
parent | c5fce104c22dae327714559562383b3e85bb7df1 (diff) |
Merge branch 'hdaps'
-rw-r--r-- | src/accelerometers.c | 97 | ||||
-rw-r--r-- | src/types.h | 5 |
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; |