[PATCH libinput 09/11] test: add tests for touch calibration

Peter Hutterer peter.hutterer at who-t.net
Tue Aug 26 21:31:40 PDT 2014


Basic tests for rotation, translation and scaling events.

Note that tests need to be added separately for single-touch and touch
devices, this is a restriction of the litest framework.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 test/touch.c | 192 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 192 insertions(+)

diff --git a/test/touch.c b/test/touch.c
index fee05f1..0aab5c8 100644
--- a/test/touch.c
+++ b/test/touch.c
@@ -26,6 +26,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <libinput.h>
+#include <libevdev/libevdev.h>
 #include <unistd.h>
 
 #include "libinput-util.h"
@@ -212,6 +213,191 @@ START_TEST(touch_double_touch_down_up)
 }
 END_TEST
 
+START_TEST(touch_calibration_scale)
+{
+	struct libinput *li;
+	struct litest_device *dev;
+	struct libinput_event *ev;
+	struct libinput_event_touch *tev;
+	float matrix[6] = {
+		1, 0, 0,
+		0, 1, 0
+	};
+
+	float calibration;
+	double x, y;
+	const int width = 640, height = 480;
+
+	dev = litest_current_device();
+	li = dev->libinput;
+
+	for (calibration = 0.1; calibration < 1; calibration += 0.1) {
+		libinput_device_calibrate(dev->libinput_device, matrix);
+		litest_drain_events(li);
+
+		litest_touch_down(dev, 0, 100, 100);
+		litest_touch_up(dev, 0);
+
+		litest_wait_for_event(li);
+		ev = libinput_get_event(li);
+		ck_assert_int_eq(libinput_event_get_type(ev),
+				 LIBINPUT_EVENT_TOUCH_DOWN);
+		tev = libinput_event_get_touch_event(ev);
+
+		x = libinput_event_touch_get_x_transformed(tev, width);
+		y = libinput_event_touch_get_y_transformed(tev, height);
+
+		ck_assert_int_eq(round(x), round(width * matrix[0]));
+		ck_assert_int_eq(round(y), round(height * matrix[4]));
+
+		libinput_event_destroy(ev);
+		litest_drain_events(li);
+
+		matrix[0] = calibration;
+		matrix[4] = 1 - calibration;
+	}
+}
+END_TEST
+
+START_TEST(touch_calibration_rotation)
+{
+	struct libinput *li;
+	struct litest_device *dev;
+	struct libinput_event *ev;
+	struct libinput_event_touch *tev;
+	float matrix[6];
+	int i;
+	double x, y;
+	int width = 1024, height = 480;
+
+	dev = litest_current_device();
+	li = dev->libinput;
+
+	for (i = 0; i < 4; i++) {
+		float angle = i * M_PI/2;
+
+		/* [ cos -sin  tx ]
+		   [ sin  cos  ty ]
+		   [  0    0   1  ] */
+		matrix[0] = cos(angle);
+		matrix[1] = -sin(angle);
+		matrix[3] = sin(angle);
+		matrix[4] = cos(angle);
+
+		switch(i) {
+		case 0: /* 0 deg */
+			matrix[2] = 0;
+			matrix[5] = 0;
+			break;
+		case 1: /* 90 deg cw */
+			matrix[2] = 1;
+			matrix[5] = 0;
+			break;
+		case 2: /* 180 deg cw */
+			matrix[2] = 1;
+			matrix[5] = 1;
+			break;
+		case 3: /* 270 deg cw */
+			matrix[2] = 0;
+			matrix[5] = 1;
+			break;
+		}
+
+		libinput_device_calibrate(dev->libinput_device, matrix);
+		litest_drain_events(li);
+
+		litest_touch_down(dev, 0, 80, 20);
+		litest_touch_up(dev, 0);
+		litest_wait_for_event(li);
+		ev = libinput_get_event(li);
+		ck_assert_int_eq(libinput_event_get_type(ev),
+				 LIBINPUT_EVENT_TOUCH_DOWN);
+		tev = libinput_event_get_touch_event(ev);
+
+		x = libinput_event_touch_get_x_transformed(tev, width);
+		y = libinput_event_touch_get_y_transformed(tev, height);
+
+		/* rounding errors... */
+#define almost_equal(a_, b_) \
+		{ ck_assert_int_ge((a_) + 0.5, (b_) - 1); \
+		  ck_assert_int_le((a_) + 0.5, (b_) + 1); }
+		switch(i) {
+		case 0: /* 0 deg */
+			almost_equal(x, width * 0.8);
+			almost_equal(y, height * 0.2);
+			break;
+		case 1: /* 90 deg cw */
+			almost_equal(x, width * 0.8);
+			almost_equal(y, height * 0.8);
+			break;
+		case 2: /* 180 deg cw */
+			almost_equal(x, width * 0.2);
+			almost_equal(y, height * 0.8);
+			break;
+		case 3: /* 270 deg cw */
+			almost_equal(x, width * 0.2);
+			almost_equal(y, height * 0.2);
+			break;
+		}
+#undef almost_equal
+
+
+		libinput_event_destroy(ev);
+		litest_drain_events(li);
+	}
+}
+END_TEST
+
+START_TEST(touch_calibration_translation)
+{
+	struct libinput *li;
+	struct litest_device *dev;
+	struct libinput_event *ev;
+	struct libinput_event_touch *tev;
+	float matrix[6] = {
+		1, 0, 0,
+		0, 1, 0
+	};
+
+	float translate;
+	double x, y;
+	const int width = 640, height = 480;
+
+	dev = litest_current_device();
+	li = dev->libinput;
+
+	/* translating from 0 up to 1 device width/height */
+	for (translate = 0.1; translate <= 1; translate += 0.1) {
+		libinput_device_calibrate(dev->libinput_device, matrix);
+		litest_drain_events(li);
+
+		litest_touch_down(dev, 0, 100, 100);
+		litest_touch_up(dev, 0);
+
+		litest_wait_for_event(li);
+		ev = libinput_get_event(li);
+		ck_assert_int_eq(libinput_event_get_type(ev),
+				 LIBINPUT_EVENT_TOUCH_DOWN);
+		tev = libinput_event_get_touch_event(ev);
+
+		x = libinput_event_touch_get_x_transformed(tev, width);
+		y = libinput_event_touch_get_y_transformed(tev, height);
+
+		/* sigh. rounding errors */
+		ck_assert_int_ge(round(x), width + round(width * matrix[2]) - 1);
+		ck_assert_int_ge(round(y), height + round(height * matrix[5]) - 1);
+		ck_assert_int_le(round(x), width + round(width * matrix[2]) + 1);
+		ck_assert_int_le(round(y), height + round(height * matrix[5]) + 1);
+
+		libinput_event_destroy(ev);
+		litest_drain_events(li);
+
+		matrix[2] = translate;
+		matrix[5] = 1 - translate;
+	}
+}
+END_TEST
+
 int
 main(int argc, char **argv)
 {
@@ -219,6 +405,12 @@ main(int argc, char **argv)
 	litest_add_no_device("touch:abs-transform", touch_abs_transform);
 	litest_add_no_device("touch:many-slots", touch_many_slots);
 	litest_add("touch:double-touch-down-up", touch_double_touch_down_up, LITEST_TOUCH, LITEST_ANY);
+	litest_add("touch:calibration", touch_calibration_scale, LITEST_TOUCH, LITEST_TOUCHPAD);
+	litest_add("touch:calibration", touch_calibration_scale, LITEST_SINGLE_TOUCH, LITEST_TOUCHPAD);
+	litest_add("touch:calibration", touch_calibration_rotation, LITEST_TOUCH, LITEST_TOUCHPAD);
+	litest_add("touch:calibration", touch_calibration_rotation, LITEST_SINGLE_TOUCH, LITEST_TOUCHPAD);
+	litest_add("touch:calibration", touch_calibration_translation, LITEST_TOUCH, LITEST_TOUCHPAD);
+	litest_add("touch:calibration", touch_calibration_translation, LITEST_SINGLE_TOUCH, LITEST_TOUCHPAD);
 
 	return litest_run(argc, argv);
 }
-- 
1.9.3



More information about the wayland-devel mailing list