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