1*4882a593SmuzhiyunFrom 90a27f97bc58ff3d5cc8d603d06847194763f82d Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Tue, 4 Aug 2020 14:30:33 +0800
4*4882a593SmuzhiyunSubject: [PATCH 28/93] Support setting touch calibration through environment
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunFor example:
7*4882a593Smuzhiyun1/ Use weston-calibrator tool to get calibration data
8*4882a593Smuzhiyun[root@rk3399:/]# weston-calibrator
9*4882a593SmuzhiyunFinal calibration values: -0.846961 0.122487 0.864176 -0.110204 -0.685913 0.958219
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun2/ Export calibration data through environment:
12*4882a593Smuzhiyunexport WESTON_TOUCH_CALIBRATION="-0.846961 0.122487 0.864176 -0.110204 -0.685913 0.958219"
13*4882a593Smuzhiyun
14*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
15*4882a593Smuzhiyun---
16*4882a593Smuzhiyun clients/calibrator.c        |  9 +++++++++
17*4882a593Smuzhiyun clients/touch-calibrator.c  | 12 ++++++++----
18*4882a593Smuzhiyun libweston/libinput-device.c | 13 +++++++++++++
19*4882a593Smuzhiyun 3 files changed, 30 insertions(+), 4 deletions(-)
20*4882a593Smuzhiyun
21*4882a593Smuzhiyundiff --git a/clients/calibrator.c b/clients/calibrator.c
22*4882a593Smuzhiyunindex be65d9b..20fc1e7 100644
23*4882a593Smuzhiyun--- a/clients/calibrator.c
24*4882a593Smuzhiyun+++ b/clients/calibrator.c
25*4882a593Smuzhiyun@@ -106,6 +106,7 @@ finish_calibration (struct calibrator *calibrator)
26*4882a593Smuzhiyun 	struct weston_matrix m;
27*4882a593Smuzhiyun 	struct weston_matrix inverse;
28*4882a593Smuzhiyun 	struct weston_vector x_calib, y_calib;
29*4882a593Smuzhiyun+	struct rectangle allocation;
30*4882a593Smuzhiyun 	int i;
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun@@ -141,6 +142,14 @@ finish_calibration (struct calibrator *calibrator)
34*4882a593Smuzhiyun 		x_calib.f[0], x_calib.f[1], x_calib.f[2],
35*4882a593Smuzhiyun 		y_calib.f[0], y_calib.f[1], y_calib.f[2]);
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun+	widget_get_allocation(calibrator->widget, &allocation);
38*4882a593Smuzhiyun+	x_calib.f[2] /= allocation.width;
39*4882a593Smuzhiyun+	y_calib.f[2] /= allocation.height;
40*4882a593Smuzhiyun+
41*4882a593Smuzhiyun+	printf ("Final calibration values: %f %f %f %f %f %f\n",
42*4882a593Smuzhiyun+		x_calib.f[0], x_calib.f[1], x_calib.f[2],
43*4882a593Smuzhiyun+		y_calib.f[0], y_calib.f[1], y_calib.f[2]);
44*4882a593Smuzhiyun+
45*4882a593Smuzhiyun 	exit(0);
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun
48*4882a593Smuzhiyundiff --git a/clients/touch-calibrator.c b/clients/touch-calibrator.c
49*4882a593Smuzhiyunindex 49dd920..04a966b 100644
50*4882a593Smuzhiyun--- a/clients/touch-calibrator.c
51*4882a593Smuzhiyun+++ b/clients/touch-calibrator.c
52*4882a593Smuzhiyun@@ -772,15 +772,19 @@ touch_device_handler(void *data, struct weston_touch_calibration *c,
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun 	if (!cal->match_name) {
55*4882a593Smuzhiyun 		printf("device \"%s\" - head \"%s\"\n", device, head);
56*4882a593Smuzhiyun-		return;
57*4882a593Smuzhiyun-	}
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun-	if (cal->device_name)
60*4882a593Smuzhiyun+		if (!cal->device_name)
61*4882a593Smuzhiyun+			cal->device_name = strdup(device);
62*4882a593Smuzhiyun 		return;
63*4882a593Smuzhiyun+	}
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun 	if (strcmp(cal->match_name, device) == 0 ||
66*4882a593Smuzhiyun-	    strcmp(cal->match_name, head) == 0)
67*4882a593Smuzhiyun+	    strcmp(cal->match_name, head) == 0) {
68*4882a593Smuzhiyun+		if (cal->device_name)
69*4882a593Smuzhiyun+			free(cal->device_name);
70*4882a593Smuzhiyun+
71*4882a593Smuzhiyun 		cal->device_name = strdup(device);
72*4882a593Smuzhiyun+	}
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun struct weston_touch_calibration_listener touch_calibration_listener = {
76*4882a593Smuzhiyundiff --git a/libweston/libinput-device.c b/libweston/libinput-device.c
77*4882a593Smuzhiyunindex 4ea89de..09bd459 100644
78*4882a593Smuzhiyun--- a/libweston/libinput-device.c
79*4882a593Smuzhiyun+++ b/libweston/libinput-device.c
80*4882a593Smuzhiyun@@ -627,6 +627,19 @@ evdev_device_set_calibration(struct evdev_device *device)
81*4882a593Smuzhiyun 		return;
82*4882a593Smuzhiyun 	}
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun+	calibration_values = getenv("WESTON_TOUCH_CALIBRATION");
85*4882a593Smuzhiyun+	if (calibration_values && sscanf(calibration_values,
86*4882a593Smuzhiyun+					 "%f %f %f %f %f %f",
87*4882a593Smuzhiyun+					 &calibration.m[0],
88*4882a593Smuzhiyun+					 &calibration.m[1],
89*4882a593Smuzhiyun+					 &calibration.m[2],
90*4882a593Smuzhiyun+					 &calibration.m[3],
91*4882a593Smuzhiyun+					 &calibration.m[4],
92*4882a593Smuzhiyun+					 &calibration.m[5]) == 6) {
93*4882a593Smuzhiyun+		do_set_calibration(device, &calibration);
94*4882a593Smuzhiyun+		return;
95*4882a593Smuzhiyun+	}
96*4882a593Smuzhiyun+
97*4882a593Smuzhiyun 	width = device->output->width;
98*4882a593Smuzhiyun 	height = device->output->height;
99*4882a593Smuzhiyun 	if (width == 0 || height == 0)
100*4882a593Smuzhiyun--
101*4882a593Smuzhiyun2.20.1
102*4882a593Smuzhiyun
103