700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > ARM QT实现多点触摸【转】

ARM QT实现多点触摸【转】

时间:2024-06-13 18:04:22

相关推荐

ARM QT实现多点触摸【转】

转自:/sky1991/archive//06/03/3114702.html

/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

-->/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.

/x29a/qTUIO

/olivopaolo/mtdev2tuio

/code/mtdev/

/

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。