zoukankan      html  css  js  c++  java
  • 【转】基于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

     
    应用程序将会显示在你的屏幕上,并且你可以使用你的手指作为鼠标使用及通过手势动作进行缩放的操作。
    快乐编程微笑
    原文连接:
    http://www.ptrackapp.com/apclassys-notes/embedded-linux-multitouch/embedded-linux-multitouch.html
  • 相关阅读:
    SQL表连接查询inner join left join right join full join ...
    希尔伯特空间回顾(简直太好了)
    pytorch的matmul怎么广播
    pytorch怎么抽取中间的特征或者梯度
    winedt102安装
    数据挖掘 关联规则
    git 命令
    caffe: c++11支持
    匈牙利算法
    ubuntu两个conda安装和切换
  • 原文地址:https://www.cnblogs.com/cslunatic/p/4618743.html
Copyright © 2011-2022 走看看