#c #c #linux #touchpad
#c #c #linux #сенсорная панель
Вопрос:
у нас есть одна из сенсорных панелей Cirque. http://www.cirque.com/downloads/docs/tsm9925.pdf
теперь мы хотим считывать абсолютные положения касания с этой сенсорной панели с помощью приложения c c . к сожалению, компания разработала только драйверы для Windows, но нам нужно прочитать позиции в Linux. мы попытались использовать подсистему /dev/input/eventN, но получили только направление перемещения пальца и скорость перемещения пальца.
возможно ли это и как мы можем это сделать?
Комментарии:
1. Сенсорные панели редко сообщают об абсолютных положениях.
2. @relet. да, вы правы. я напрямую связался с Cirque, и они сообщили, что их сенсорная панель может указывать нам только направление и скорость, и с нее невозможно считывать абсолютные положения. спасибо за все ответы.
Ответ №1:
По предоставленной вами ссылке:
For custom functionality at the product design stage, we offer software that
allows OEMs to enable, disable or personalize advanced settings and/or
reprogram the touch sensitive area.
Я бы посоветовал связаться с Cirque напрямую
Ответ №2:
Сенсорные панели редко сообщают об абсолютных положениях.
Просто чтобы у вас был какой-то ответ, который вы можете принять 😉
Ответ №3:
Вот как это работает:
Cirque Smart CAT (модель GDU410 — это СТАРАЯ модель!) сообщает о пакете размером 8 байт. Изначально пакет выглядит следующим образом:
Byte 0, bit 0: Left button
Byte 0, bit 1: Right button
Byte 0, bit 2: Side buttons (they cannot be distinguished)
Byte 1: Relative X data
Byte 2: Relative Y data
Bytes 3-7: 0
Чтобы переключиться в абсолютный режим, вам нужно отправить следующие запросы управления USB на устройство:
unsigned char buf[8];
do {
Usb_Control_Request(Type=0xC1, Request=0x6A, Index=0,
Value=0, Data Length=8, Data Buffer=buf)
} while(buf[0] amp; 8);
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xBB, Value=1, No data)
do { ... /* C1/6A, see above */ } while(buf[0] amp; 8);
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xB5, Value=0x3E0, No data)
do { ... /* C1/6A */ } while(buf[0] amp; 8);
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xA2, Value=0xFEE, No data)
do { ... /* C1/6A */ } while(buf[0] amp; 8);
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xB4, Value=0xE, No data)
do { ... /* C1/6A */ } while(buf[0] amp; 8);
Usb_Control_Request(Type=0x41, Request=0x64, Index=0, Value=0, No data)
do { ... /* C1/6A */ } while(buf[0] amp; 8);
Возможно, под Linux это можно сделать с помощью «libusb». Хотя я уже занимался разработкой некоторых драйверов под Linux, я пока не использовал «libusb».
После выполнения этого 8-байтовые пакеты выглядят следующим образом:
Byte 0: Buttons, as before
Bytes 1-3: 0
Byte 4: low 8 bits of X finger position
Byte 5: bits 0-2: high 3 bits of X finger position
bits 3-7: low 5 bits of Y finger position
Byte 6: bits 0-5: high 6 bits of Y finger position
Byte 7, low 7 (?) bits: non-zero if finger touches pad, 0 if not
some pads report the finger pressure;
MAYBE this is done in this field.
Finger positions:
X position: left ~0x790, right ~0x70
Y position: top ~0, bottom ~0x5B0
Драйвер устройства, предоставляемый Cirque, использует режим абсолютного положения для выполнения прокрутки и аналогичных функций, которые зависят от абсолютного положения пальца.