From 88e371c5ebffb47737a14836821498812aa3b0f0 Mon Sep 17 00:00:00 2001 From: Joachim Breitner Date: Thu, 27 Nov 2008 22:12:21 +0100 Subject: Support for thinkpad HDAPS --- src/accelerometers.c | 35 +++++++++++++++++++++++++---------- src/types.h | 1 + 2 files changed, 26 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/accelerometers.c b/src/accelerometers.c index 3d8c968..deaeff1 100644 --- a/src/accelerometers.c +++ b/src/accelerometers.c @@ -46,6 +46,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) @@ -67,7 +68,14 @@ AccelHandle *accelerometer_open() { accel->type = ACCEL_UNKNOWN; /* Determine accelerometer type */ - accel->fd = open("/dev/input/event3", O_RDONLY, 0); + 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, O_NONBLOCK); if ( accel->fd != -1 ) { accel->type = ACCEL_FREERUNNER; printf("Neo Freerunner detected\n"); @@ -81,17 +89,20 @@ AccelHandle *accelerometer_open() { } -double utils_highresms() { +void accelerometer_update_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; + } + if (ev.type == EV_ABS && ev.code == REL_Y) { + // This is the result of some experimentation + accel->y = -600 + abs(ev.value) * 12; + } } @@ -152,6 +163,10 @@ void accelerometer_update(AccelHandle *accel) { accelerometer_update_freerunner(accel); break; } + case ACCEL_HDAPS : { + accelerometer_update_hdaps(accel); + break; + } /* Add other types here. You simply need to provide the "y" * component of acceleration in milli-g in the relevant * structure. */ diff --git a/src/types.h b/src/types.h index b864742..eae97b6 100644 --- a/src/types.h +++ b/src/types.h @@ -33,6 +33,7 @@ typedef enum { ACCEL_UNKNOWN, ACCEL_FREERUNNER, /* Openmoko Neo Freerunner */ + ACCEL_HDAPS, /* Thinkpad HDAPS */ } AccelType; typedef struct { -- cgit v1.2.3