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

Hans de Goede hdegoede at redhat.com
Thu Aug 28 06:13:21 PDT 2014


Hi,

On 08/27/2014 06:31 AM, Peter Hutterer wrote:
> 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>

Looks good:

Reviewed-by: Hans de Goede <hdegoede at redhat.com>

Regards,

Hans


> ---
>  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);
>  }
> 


More information about the wayland-devel mailing list