mirror of
https://github.com/clearlinux/systemd-stable.git
synced 2026-09-04 20:51:33 +00:00
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 commita545c6e1aa) (cherry picked from commite27bfc22bb)
This commit is contained in:
committed by
Zbigniew Jędrzejewski-Szmek
parent
d49a0afefd
commit
3a7dd9f82f
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user