Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Тачскрин на Линуксе

Два последних дня ковырял по работе планшет фирмы «Дигма» — это китайское го… годное вполне за свои деньги изделие поставляется с ОС «Виндоуз». А наша задача была показать на нём один из отечественных дистрибутивов Линукса.

Линукс встал довольно легко, но вот проблема — прикосновения к экрану не давали никакого эффекта. Вот этим я героически два дня и боролся.

До конца не победил — тачскрин хоть и возвращает какое-то координаты, но драйвер явно работает неправильно — при движении пальца по оси абсцисс координаты сначала уменьшаются до нуля, потом палец попадает в какое-то «слепое пятно», где цифра не меняется, потом значение снова растёт.

Зато узнал немало интересного о том как устроен опрос датчика нажатия на экран в Линуксе. Всё я ещё не переварил, поэтому описывать не буду, но один интересный факт расскажу.

Представьте, что у вас есть готовый экран, на котором что-то отображается — в неких координатах пользователь видит кнопку, на которую он хочет нажать пальцем (речь о планшете). Сверху мы накладываем полупрозрачную плёнку, которая будет считывать нажатия и закрываем всё корпусом.

Часть плёнки у нас оказалась под рамкой, так что ноль координат плёнки и экрана не совпадают, кроме того, разрешающая возможность тоже разная. Экран, например, 1366 пикселей шириной, а плёнка даёт 740. Как пересчитываются координаты нажатия на плёнку в экранные, чтобы операционная система поняла куда пользователь нажал?

Для этого в Линуксе задаётся трансформационная матрица («Coordinate Transformation Matrix»), на которую умножаются абсолютные координаты, в которых датчик экрана уловил нажатие. С её помощью можно сдвигать координаты, сжимать их и растягивать, а так же поворачивать на 90°, если датчик стоит так, что у него перепутаны оси — это вполне стандартная математика, которую многие могут помнить по школе.

Матрица эта, понятное дело, должна быть зашита внутри драйвера. Но когда у тебя Линукс, нельзя надеяться, что для всего оборудования найдётся драйвер.

Для той «Дигмы», которую мы получили, драйвера нет. В некоторых случаях есть способы, которые позволяют изготовить его на основе драйвера для «Виндоуза», но матрицу всё равно придётся вычислять самостоятельно.

Правда в нашем случае она не помогла — компенсировать «слепое пятно» она не в состоянии, для этого нужно чудо или более подходящий драйвер.