【转】基于Qt, TUIO和TSLIB的嵌入式Linux下的多点触摸设计

时间:2023-03-09 02:45:54
【转】基于Qt, TUIO和TSLIB的嵌入式Linux下的多点触摸设计

这个教程描述了在嵌入式linux下使用Qt如何设置一个支持多点触摸和单点触摸的输入系统。这里假定你已经有了对应的驱动程序,驱动可以从触摸屏的厂商那里获得或者使用一个linux 内核源码中已经存在的驱动。

第一要务,找到你的驱动程序(通常在/drivers/input/touchsreen/*)并且确认你已经定义好了tslib中所需要的每个事件类型。通常你需要EV-SYN, EV-ABS和EV_KEY.我自己使用的驱动中没有定义EV_KEY, 因此驱动不会发送这一个类型的事件。为了能够使tslib和这个驱动的输入系统好好工作,我需要在驱动代码中定义这个事件。
set_bit(EV_SYN, aura.input_dev->evbit);
set_bit(EV_ABS, aura.input_dev->evbit);
set_bit(EV_KEY, aura.input_dev->evbit); # I had to add this line so that tslib was happy
 
现在使用修改后的驱动源码重新构建内核,并且在开发板上运行起来。
我这里的输入设备名称是‘touchscreen’, 由于多种原因, 你们的输入设备名称可能是event1 或者event0 。
使用下面的命令查看设备
# ls -rlt /dev/input/touchscreen 
lrwxrwxrwx    1 root     root             6 Jan 17 21:06 /dev/input/touchscreen -> event1
# chmod 777 /dev/input/touchscreen 
# chmod 777 /dev/input/event1 
 
使用下面的命令,你可以看到更多的信息
# cat /sys/devices/virtual/input/input1/uevent 
PRODUCT=0/0/0/0
NAME="aura-touchscreen"
PROP=0
EV=9
ABS=650000 0
MODALIAS=input:b0000v0000p0000e0000-e0,3,kra30,32,35,36,mlsfw
 
使用下面的命令,然后再屏幕上移动你的手指以确认触摸屏驱动是否正在工作。
当你的手指在屏幕上移动时,你应该看到下面的现象。
# cat /dev/input/touchscreen  | hexdump
0000000 9011 3883 565f 0001 0003 0030 0001 0000
0000010 9011 3883 565f 0001 0003 0032 0001 0000
0000020 9011 3883 565f 0001 0003 0035 04c9 0000
0000030 9011 3883 565f 0001 0003 0036 0c3f 0000
0000040 9011 3883 565f 0001 0000 0002 0000 0000
0000050 9011 3883 565f 0001 0000 0000 0000 0000
0000060 9011 3883 90a9 0001 0003 0030 0001 0000
0000070 9011 3883 90a9 0001 0003 0032 0001 0000
 
返回你的主工作台, 从这里https://github.com/kergoth/tslib 下载tslib的源码。
进入tslib的源码目录(cd tslib/plugins)并且编辑input-raw.c 文件。
使用ABS_MT_POSITION_X / Y替换所有的 ABS_X / Y, 这些是多点触摸驱动产生的多点触摸事件变量的名称。
现在剩下的事件已经很明朗了,使用下面的命令 构建tslib并且部署到板子使用的根文件系统中。
sudo ./autogen-clean.sh
sudo ./autogen.sh
sudo export ac_cv_func_malloc_0_nonnull=yes
sudo export PATH=`pwd`:$PATH
sudo ./configure CC=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-gcc
CXX=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-g++
--host=arm-linux
--prefix=/usr/local/tslib
--enable-shared=yes
--enable-static=yes
sudo make
sudo make install
sudo cp /usr/local/tslib/bin/* /home/user/exported-nfs/usr/bin/
sudo cp /usr/local/tslib/etc/ts.conf /home/user/exported-nfs/etc/
sudo cp -r /usr/local/tslib/lib/ts /home/user/exported-nfs/usr/lib
sudo cp /usr/local/tslib/lib/* /home/user/exported-nfs/lib/
sudo vim /home/user/exported-nfs/etc/ts.conf
打开ts.conf 准备编辑,删除'input raw'这一行的注释符。
现在回到嵌入式板子上, 导出下面这些环境变量。
export TSLIB_TSEVENTTYPE=INPUT
export TSLIB_TSDEVICE=/dev/input/touchscreen
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/lib/ts
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=none
export TSTS_INFO_FILE=/sys/devices/virtual/input/input1/uevent
export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen
export PATH=$PATH:/usr/bin
现在我们准备校正,进入目录/usr/bin并且启动校正功能,你应该能成屏幕上看到一个校正图片,要求你点击一个十字。
按照屏幕上说明进行操作,直到校正结束。现在你的屏幕已经校正过了。校正的参数存储在/etc/pointercal 这个文件中。
使用下面的命令可以增加屏幕的亮度  echo 127 > /sys/class/backlight/generic-bl/brightness 。
# ts_calibrate 
xres = 640, yres = 480
Took 5 samples...
Top left : X = 3817 Y = 3912
Took 6 samples...
Top right : X =  269 Y = 3822
Took 5 samples...
Bot right : X =  356 Y =  550
Took 5 samples...
Bot left : X = 3732 Y =  614
Took 6 samples...
Center : X = 2202 Y = 2216
643.068298 -0.155621 -0.000056
491.792572 0.002567 -0.115674
Calibration constants: 42144124 -10198 -3 32230118 168 -7580 65536 
 
你也可以运行 ts_test 来测试触摸屏的鼠标输入功能。
到目前为止, 使用tslib的单点输入功能,已经可以使用了。
现在我们开始进行多点触摸的功能
下载下面的包,用来在Qt上支持多点触摸事件。
导出你的交叉编译工具和工具链
export CC=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-gcc
export CXX=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-g++
 
进入liblo的源码目录, 使用下面的命令构建和部署:
 
cd /home/user/Desktop/QTUIO/liblo-0.26
export SKIP_RMDIR_CHECK=yes
./configure --prefix=/usr/local/lib/liblo --host=arm
make clean
make
sudo make install
cd /usr/local/lib/liblo
sudo cp bin/* /home/user/exported-nfs/usr/bin/
sudo cp lib/liblo.a /home/user/exported-nfs/usr/bin/
sudo cp lib/liblo.la /home/user/exported-nfs/usr/bin/
进入mtdev的源码目录, 使用下面的命令构建和部署:
cd /home/user/Desktop/QTUIO/mtdev-1.1.2
./autogen.sh
./configure --prefix=/usr/local/lib/mtdev --host=arm
make clean
make
sudo make install
cd /usr/local/lib/mtdev
sudo cp bin/* /home/user/exported-nfs/usr/bin/
sudo cp lib/libmtdev.a /home/user/exported-nfs/usr/bin/
sudo cp lib/libmtdev.la /home/user/exported-nfs/usr/bin/
 
进入mtdev2tuio的源码目录, 使用下面的命令构建和部署:
cd /home/user/Desktop/QTUIO/mtdev2tuio
make clean
make
sudo cp mtdev2tuio /home/user/exported-nfs/usr/bin/
 
进入qTUIO的源码目录, 使用下面的命令构建和部署:
cd /home/user/Desktop/QTUIO/qTUIO
sudo rm -rf /home/user/Desktop/QTUIO/qTUIO/lib/*
cd src/
/home/user/output/buildroot/host/usr/bin/qmake
make clean
make
cd ../lib
mv libqTUIO_d.so.1.0.0 libqTUIO.so.1.0.0
sudo rm -rf *libqT*_d*so*
sudo ln -sf libqTUIO.so.1.0.0 libqTUIO.so.1.0
sudo ln -sf libqTUIO.so.1.0.0 libqTUIO.so.1
sudo ln -sf libqTUIO.so.1.0.0 libqTUIO.so
sudo mkdir -p /usr/local/lib/qTUIO
sudo cp -r ../lib/* /usr/local/lib/qTUIO
sudo cp -r /usr/local/lib/qTUIO/* /home/user/exported-nfs/usr/lib/
现在,启动服务进程,服务进程会从mtdev接收多点触摸事件,并以TUIO 包的形式转发给Qt。
# ./mtdev2tuio /dev/input/touchscreen osc.udp://127.0.0.1:3333/
Sending OSC/TUIO packets to osc.udp://127.0.0.1:3333/
当然,要保证你已经像下面那样,导出了Qt Mouse 指向的输入环境变量。
export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen
现在,可以使用QtCreator 或者其他的IDE 构建和部署qUIO examples 目录下的pinchzoom 到板子上。
在板子上(或者在QtCreator中) 像下面那样运行应用程序 
 
cd /home/test ; export QWS_MOUSE_PROTO=Tslib:/dev/input/touchscreen  ; ./pinchzoom -qws
应该得到类似下面的输出:
Connecting to device...
Killing remote process(es)...
Starting remote process ...
Remote process started.
graphicsview initialized 
listening to TUIO messages on UDP port 3333

 
应用程序将会显示在你的屏幕上,并且你可以使用你的手指作为鼠标使用及通过手势动作进行缩放的操作。
快乐编程【转】基于Qt, TUIO和TSLIB的嵌入式Linux下的多点触摸设计
原文连接:
http://www.ptrackapp.com/apclassys-notes/embedded-linux-multitouch/embedded-linux-multitouch.html