zoukankan      html  css  js  c++  java
  • ARM QT实现多点触摸【转】

    转自:http://www.cnblogs.com/sky1991/archive/2013/06/03/3114702.html

    http://www.ptrackapp.com/apclassys-notes/embedded-linux-multitouch/

    Embedded Linux Multitouch with Qt, TUIO, and TSLIB

    This tutorial describes how to set up multi-touch and single-touch touchscreen input
    for Qt for embedded Linux. I assume that you received a driver from your touchscreen
    manufacturer or there is an existing one you can use in the Kernel source.

    First things first, locate your driver ( usually /drivers/input/touchscreen/* ), and 
    ensure that you have every event type being defined that is required by tslib. So, 
    specifically you need EV_SYN, EV_ABS, and EV_KEY. My driver did not define EV_KEY, 
    and even though it does not report that event type, I still had to define it in the 
    driver source for tslib to work with the input from the driver.

    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

    Now build the Kernel with your driver ( either as module or driver ) and fire up your
    board.

    My input device is called 'touchscreen'. Yours will probably be event1 or event0 depending
    on serveral possible reasons.

    See what the device is with:

    # 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 


    You can see more information with:

    # 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


    To ensure that your driver is working do the following command and 
    then move your finger around the screen. You should see output here
    when you finger is touching the screen.
    # 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


    Go back to your host machine and download the tslib src from here 
    --> https://github.com/kergoth/tslib.

    Enter the tslib source directory ( cd tslib/plugins ) and edit the input-raw.c file.
    Replace any occurences of ABS_X / Y with ABS_MT_POSITION_X / Y. These are the names
    of the multi-touch event type variables produces by a multitouch driver.

    Now that everything is in order, build tslib and deploy using the following commands
    to your exported nfs ( root file system ) for the board:
    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


    When ts.conf opens for editing, uncomment the 'input raw' line ( the very first 
    commented out module ).

    Now log back into your embedded machine and export the following environment
    variables:

    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


    Now we are ready to calibrate. Go to /usr/bin and launch the calibration
    utility. You should now see a calibration image on the screen requesting
    you to touch a few crosshairs. Go ahead and do that until it stops. Then
    your screen is calibrated! The calibration parameters are stored in the
    /etc/pointercal file. (you may have to first increase the brightness
    of your screen with --> 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 


    You can also test the touchscreen mouse input by running:

    ts_test

    Great! Now you have single mouse input with tslib ready to go!

    Now let's move on to multi-touch.

    Download the following packages to enable multitouch events with Qt.

    https://github.com/x29a/qTUIO 
    https://github.com/olivopaolo/mtdev2tuio 
    http://bitmath.org/code/mtdev/ 
    http://liblo.sourceforge.net/ 

    Export your cross-compiler and toolchain:

    export CC=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-gcc
    export CXX=/home/user/toolchain/linaro/bin/arm-linux-gnueabi-g++


    Enter the liblo source code directory and build and deploy with:


    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/

    Enter the mtdev source code directory and build and deploy with:

    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/


    Enter the mtdev2tuio bridge source code directory and build and deploy with:

    cd /home/user/Desktop/QTUIO/mtdev2tuio
    make clean
    make
    sudo cp mtdev2tuio /home/user/exported-nfs/usr/bin/


    Enter the qTUIO source directory and build and deploy with:

    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/


    Now kick off the server that will take multi-touch events input from
    mtdev and feed that as TUIO packets to Qt:

    # ./mtdev2tuio /dev/input/touchscreen osc.udp://127.0.0.1:3333/
    Sending OSC/TUIO packets to osc.udp://127.0.0.1:3333/


    Also, ensure that you exported your Qt mouse pointer input environment
    variable as follows:

    export QWS_MOUSE_PROTO=tslib:/dev/input/touchscreen

    Now use Qt Creator or some other IDE to build and deploy the pinchzoom
    example found in the qTUIO examples directory to the board.

    On the board ( or from Qt Creator ) run the application like:

    cd /home/test ; export QWS_MOUSE_PROTO=Tslib:/dev/input/touchscreen  ; ./pinchzoom -qws

    Output should look like:

    Connecting to device...
    Killing remote process(es)...
    Starting remote process ...
    Remote process started.
    graphicsview initialized 
    listening to TUIO messages on UDP port 3333


    The application will launch on your screen and you should be able to use your finger
    as a mouse but also pinch and zoom ( gestures ) at the same time!

    Happy coding :)

    Feel free to leave feedback - happy coding

  • 相关阅读:
    Linux 笔记:文件名
    Linux 一些有用的能力
    理解Linux内核注释
    Linux 的三种软件安装包介绍
    idea 2019 激活
    wget免登陆下载jdk 8u221
    PowerDesigner每点击一次就会提示打印错误对话框
    FormData使用方法详解
    springboot:配置多个数据源
    CSS3绘制不规则图形,代码收集
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/6764339.html
Copyright © 2011-2022 走看看