Как решить проблему обработки событий тачскрина в Android?

Привет разработчикам!

Имеется ТВ-бокс Geniatech ATV1200 на базе Android 4.1.2, используемый как CarPC. К нему подключен самодельный USB резистивный тачскрин, описанный здесь: pccar.ru/showthread.php?t=18943. Тач этот замечательно работал на более старом ТВ-боксе (Android 2.3), а также отлично работает под Windows XP.

При подключении же к ATV1200 возникает странный эффект: обработчик координат тачскрина поворачивает их на 90 градусов каждые примерно 4 сек. Т.е., если нажимать на одну и ту же точку экрана, нажатие регистрируется последовательно в 4 точках с интервалом примерно 4 сек, затем цикл повторяется. По положению точек на экране видно, что сначала координаты меняются местами, потом изменяются зеркально, потом меняются местами + зеркально, потом отображаются верно. Т.е. тач работает правильно только 25% времени. Разумеется, пользоваться невозможно.

Через SSH запускаю getevent. Координаты в сыром виде приходят правильные (0..32767) по каждой координате, никакого вращения нет. Что происходит с координатами дальше и кто их перевирает я не знаю, и почему! При этом они корректно масштабируются исходя их текущего разрешения экрана. Всё что я смог найти в инете, что есть некий InputReader, вкомпиленный в ядро и он за это всё отвечает. Исходники ядра у меня в принципе тоже есть, но скомпилировать их -- это мне уже не под силу. :) Если использовать тестовую утилиту input tap X Y, то нажатия регистрируются в правильном месте без глюков. Т.е. кто-то глючный засел между линуксом и Андроидом. ))

Пробовал менять параметры в IDC файле (конфиг тача - /system/usr/idc). У меня touch.deviceType = touchScreen. Если поставить pointer, начинает работать корректно, но координаты не абсолютные (по экрану движется курсор, клик регистрируется не в точке нажатия, а в точке нахождения курсора, т.е. работает просто как тач-пад, оторванный от дисплея). Если поставить тип touchPad, перестаёт работать совсем, хотя эвенты поступают в /dev/input/event3 (это тач). Изменяемые параметры отражаются в команде dumpsys input.

Автор USB тача -- не я, но я немного участвовал в допиливании прошивки и хорошо в ней ориентируюсь. Могу перекомпилировать, изменить диапазон координат тача, инвертировать их итд, изменить события которые он генерирует. Но он работает совершенно правильно, впечатление, что проблема в самом Андроиде. Он у меня выдаёт ABS_X, ABS_Y, BTN_TOUCH, BTN_TOOL_FINGER. Это стандартные требования для single-touch тача.

Хотелось бы услышать любые хотя бы какие-то мысли, я уже если честно голову сломал. В принципе, я уже на кросс-компиляторе Sourcery G++ почти написал нативное приложение, к-е берёт события из /dev/input/event3, парсит их, вытаскивает координаты с нажатиями и отправляет нужные события в mouse0. Но это полная кривизна, конечно.
  • Вопрос задан
  • 6542 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы