accelerometer: Don't wait for new data from the sensor

Instead of waiting for new data from the sensor, which might be
a long time coming, depending on the sensor device, ask the kernel
for the last state for that particular input device.

(cherry picked from commit a545c6e1aa)
(cherry picked from commit e27bfc22bb)
This commit is contained in:
Bastien Nocera
2014-07-19 17:24:15 -04:00
committed by Zbigniew Jędrzejewski-Szmek
parent d49a0afefd
commit 3a7dd9f82f
+6 -27
View File
@@ -179,7 +179,7 @@ get_prev_orientation(struct udev_device *dev)
return string_to_orientation(value);
}
#define SET_AXIS(axis, code_) if (ev[i].code == code_) { if (got_##axis == 0) { axis = ev[i].value; got_##axis = true; } }
#define READ_AXIS(axis, var) { memzero(&abs_info, sizeof(abs_info)); r = ioctl(fd, EVIOCGABS(axis), &abs_info); if (r < 0) return; var = abs_info.value; }
/* accelerometers */
static void test_orientation(struct udev *udev,
@@ -188,10 +188,9 @@ static void test_orientation(struct udev *udev,
{
OrientationUp old, new;
_cleanup_close_ int fd = -1;
struct input_event ev[64];
bool got_syn = false;
bool got_x = false, got_y = false, got_z = false;
struct input_absinfo abs_info;
int x = 0, y = 0, z = 0;
int r;
char text[64];
old = get_prev_orientation(dev);
@@ -200,30 +199,10 @@ static void test_orientation(struct udev *udev,
if (fd < 0)
return;
while (1) {
int i, r;
READ_AXIS(ABS_X, x);
READ_AXIS(ABS_Y, y);
READ_AXIS(ABS_Z, z);
r = read(fd, ev, sizeof(struct input_event) * 64);
if (r < (int) sizeof(struct input_event))
return;
for (i = 0; i < r / (int) sizeof(struct input_event); i++) {
if (got_syn) {
if (ev[i].type == EV_ABS) {
SET_AXIS(x, ABS_X);
SET_AXIS(y, ABS_Y);
SET_AXIS(z, ABS_Z);
}
}
if (ev[i].type == EV_SYN && ev[i].code == SYN_REPORT)
got_syn = true;
if (got_x && got_y && got_z)
goto read_dev;
}
}
read_dev:
new = orientation_calc(old, x, y, z);
snprintf(text, sizeof(text),
"ID_INPUT_ACCELEROMETER_ORIENTATION=%s", orientation_to_string(new));