aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Breitner <mail@joachim-breitner.de>2008-11-27 22:12:21 +0100
committerThomas White <taw27@cam.ac.uk>2008-11-27 23:59:27 +0000
commit88e371c5ebffb47737a14836821498812aa3b0f0 (patch)
treec583e9bcb8c887ce6aa744cce30fca3e0c0a3b60
parent4974c06bfe294e84d14f3be36ef47785227a468c (diff)
Support for thinkpad HDAPS
-rw-r--r--src/accelerometers.c35
-rw-r--r--src/types.h1
2 files changed, 26 insertions, 10 deletions
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 {