Technical report

© Sylvain Hanneton (2015)

Interactions avec un écran tactile
Table des matières
Introduction....................................................................................................................................................1
Le problème...............................................................................................................................................1
Spécifications de l'écran............................................................................................................................1
MacOsX....................................................................................................................................................3
Dans le gestionnaire de fenêtre X11..............................................................................................................3
Sortie de xinput.........................................................................................................................................3
Sortie de lsusb...........................................................................................................................................3
Détachement de la dalle tactile..................................................................................................................4
Dump des données de la dalle...................................................................................................................4
Lecture directe de l'entrée USB.....................................................................................................................5
Utiliser le module evdev avec Python............................................................................................................6
Port d'entrée des événements.....................................................................................................................6
Les événements générés par la dalle tactile..............................................................................................6
Ce que dit le kernel Linux (extrait)......................................................................................................6
Les événements générés par la dalle.....................................................................................................7
Le script.....................................................................................................................................................8
OSC output................................................................................................................................................9

Introduction
Le problème
L'objectif de ce document est de montrer comment l'on peut capturer les données d'interaction avec
l'écran tactile sans que celui-ci soit actif en tant que dispositif de pointage dans le gestionnaire de fenêtre
de l'ordinateur. En effet, si celui-ci reste actif, alors les interactions avec les fenêtres restent possibles ce
qui peut gêner la capture des données de mouvement.

Spécifications de l'écran
L'écran tactile testé ici est un iyama 24 pouces avec une résolution maximale de 1920 par 1080 pixels. La
référence du modèle est T2452MTS-B4 (http://www.iiyama.com/be_fr/produits/prolite-t2452mts-4/)

1

Technical report

© Sylvain Hanneton (2015)

Diagonale
Technologie tactile
Matrice
Surface de travail (H
x L)
Temps de réponse
Contraste
Contraste
Luminosité

23.6"; 60cm
optique, multitouch (2 contacts simultanées possibles - HID, fonctionne
seulement sous Windows® 7), activé par le doigt ou par pointeur
TN LED
293.2 x 521.3 mm; 11.54" x 20.51"

2 ms
1000 : 1 typique
5 000 000 : 1 ACR
260 cd/m² typique
horizontal/vertical: 170°/ 160°; droit/gauche : 85°/ 85°; en avant/en arrière :
Angle de vision
80/ 80°
Affichage des
16.7 million
couleurs
Taille du pixel (hor. x
0.272 x 0.272 mm
vert.)
Résolution native
Full HD 1080p, 1920 x 1080 ( 2.1 megapixel)
Fréquence horizontale
24 - 80 KHz
Fréquence verticale
55 - 75 Hz
Synchronisation
Separate Sync
Le ratio d'aspect
16 : 9
Transparence de la
88%
lumière
Les dimensions sont les suivantes :

largeur : 523.5 mm
2

Technical report

© Sylvain Hanneton (2015)

hauteur : 295 mm

Ce qui donne une résolution maximale de 523,5 /1920 = 0,273 mm et 295/1080 = 0,273 mm en largeur et
hauteur. Cela en fait un dispositif de capture de mouvement théoriquement très précis.

MacOsX
Sur ce site : http://at.or.at/hans/research/nime/hid/apis.html
Apple HID Manager
HID Manager is the standard USB HID API on Mac OS X. It also includes Apple Desktop Bus (ADB)
devices like PowerBook keyboards and trackpads. It is very close to the USB HID API and therefore also
relatively close to the Windows Driver Development Kit (DDK) HID API. Since it is quite low level,
programming with this API is relatively complicated. Understand C pointers well before diving in!
Apple HID Utilities
HID Utilities is an easy-to-use layer on top of HID Manager. It is provided as free software which can be
used or modified. Using it is much easier than HID Manager, but it is designed with a very specific
application type in mind, so it can limit flexibility. Also, building the device list can be quite heavy, which
may cause audio to skip or other undesirable effects. Internally, it uses a number of global variables,
which means that multiple instances of [hidio] connected to the same device will steal events from each
other.
Cela veut dire que si l'on veut capturer les données de l'écran tactile sous OS X, il est nécessaire d'utiliser
HID Utilities.

Dans le gestionnaire de fenêtre X11
Sortie de xinput
La commande Xinput est un outil (utilitaire) Linux qui permet de lister, de tester, de manipuler les
dispositifs d'interaction avec le gestionnaire de fenêtre X11.
$ xinput
⎡ Virtual core pointer

↳ Virtual core XTEST pointer

↳ Logitech USB Optical Mouse

↳ Quanta OpticalTouchScreen
⎣ Virtual core keyboard
↳ Virtual core XTEST keyboard
↳ Power Button
↳ Power Button
↳ DELL Dell USB Entry Keyboard

id=2
id=4
id=8
id=10
id=3
id=5
id=6
id=7
id=9

[master
[slave
[slave
[slave
[master
[slave
[slave
[slave
[slave

pointer
pointer
pointer
pointer
keyboard
keyboard
keyboard
keyboard
keyboard

(3)]
(2)]
(2)]
(2)]
(2)]
(3)]
(3)]
(3)]
(3)]

La dalle tactile apparaît comme le dispositif 10 (id=10) sous le nom de « Quanta OpticalTouchScreen ». Il
est désigné comme un pointeur esclave.
3

Technical report

© Sylvain Hanneton (2015)

Sortie de lsusb
La commande « lsusb » permet de lister les dispositifs usb connectés à l'ordinateur.
$ lsusb
Bus 002
Bus 002
Bus 002
Bus 002
Bus 002
Bus 001
Bus 001
Bus 001
Bus 001
Bus 004
Bus 003

Device
Device
Device
Device
Device
Device
Device
Device
Device
Device
Device

004:
005:
003:
002:
001:
004:
003:
002:
001:
001:
001:

ID
ID
ID
ID
ID
ID
ID
ID
ID
ID
ID

0bda:0184
0408:3008
0424:2514
8087:8000
1d6b:0002
413c:2107
046d:c077
8087:8008
1d6b:0002
1d6b:0003
1d6b:0002

Realtek Semiconductor Corp. RTS5182 Card Reader
Quanta Computer, Inc.
Standard Microsystems Corp. USB 2.0 Hub
Intel Corp.
Linux Foundation 2.0 root hub
Dell Computer Corp.
Logitech, Inc.
Intel Corp.
Linux Foundation 2.0 root hub
Linux Foundation 3.0 root hub
Linux Foundation 2.0 root hub

La dalle tactile apparaît sur la seconde ligne dispositif n°5 Quanta Computer, Inc.

Détachement de la dalle tactile
Il est possible de demander au gestionnaire de fenêtre de ne plus tenir compte des données fournies par la
dalle tactile pour piloter la souris. La dalle tactile devient alors un dispositif « flottant ». Elle reste active
mais ne sert plus à piloter la souris. Pour cela il faut entrer la commande suivante :
xinput float 10
le résultat est le suivant :
$
$



xinput float 10
xinput
Virtual core pointer
↳ Virtual core XTEST pointer
↳ Logitech USB Optical Mouse
Virtual core keyboard
↳ Virtual core XTEST keyboard
↳ Power Button
↳ Power Button
↳ DELL Dell USB Entry Keyboard
∼ Quanta OpticalTouchScreen

id=2
id=4
id=8
id=3
id=5
id=6
id=7
id=9
id=10

[master pointer
[slave pointer
[slave pointer
[master keyboard
[slave keyboard
[slave keyboard
[slave keyboard
[slave keyboard
[floating slave]

(3)]
(2)]
(2)]
(2)]
(3)]
(3)]
(3)]
(3)]

La dalle tactile apparaît maintenant avec la propriété « floating slave ». Nous pouvons essayer de lire les
données qu'elle fournie.

Dump des données de la dalle
On peut pour cela utiliser l'option « test » de la commande xinput.
xinput – test 10
Si l'on trace un petit carré sur l'écran avec le doigt on obtient la réponse suivante :
4

Technical report

motion
button
motion
motion
motion
motion
motion
motion
motion
...
motion
motion
button

a[0]=1043
press
1
a[0]=1046
a[0]=1048
a[0]=1051
a[0]=1053
a[0]=1063
a[0]=1065
a[0]=1066

© Sylvain Hanneton (2015)

a[1]=349
a[0]=1043 a[1]=349
a[1]=349
a[1]=349
a[1]=350
a[1]=350
a[1]=351
a[1]=351
a[1]=351

a[0]=1050 a[1]=344
a[0]=1050 a[1]=344
release 1 a[0]=1050 a[1]=344

La réponse de la dalle tactile donne donc trois types d'évènements :

motion : donne les coordonnées courantes du doigt

button press 1 : lorsque le doigt touche la dalle (précédé toujours d'un évènement motion)

button release 1 : lorsque le doigt quitte la dalle

Il faut noter que dans la configuration de base, X11 ne gère pas l'utilisation de plusieurs doigts en même
temps. Il est sans doute possible de changer cela en modifiant les paramètres du gestionnaire (voir les
autres options de Xinput).
En utilisant les données fournies par xinput et en les redirigeant vers un autre utilitaire, il serait déjà
possible de capturer l'activité de la dalle pour s'en servir dans une application.

Lecture directe de l'entrée USB
On peut essayer de lire directement les données qui arrivent pas le port série USB. Attention il faut le
faire en tant que superuser car le port est protégé. La dalle tactile apparaît sous la dénomination
« hidraw2 » dans le répertoire /dev.
Si l'on applique la commande « sudo cat /dev/hidraw2 » alors on obtient une sortie du type :
~$ sudo cat /dev/hidraw2
#�#-#�#####�#-#�#####�#-#�#####�#-#�#####�#-#�#####�#-#�#####�#-#�#####�#-#�#####�##�#####�#,#�#####�#,#�#####�#,#�#####�#,#�#####�#,#�#####�#,#�#####�#-#�#####�##�#####�#-#�#####�#-#�#####�#-#�#####�##�#####�#.#�#####�#.#�#####�#.#�#####�#/#�#####�#0#�#####�#2#�#####�#3#�#####�#5#�###
##y#7#�#####r#9#�#####k#;#�#####d#>#�#####]#A#�#####W#C#�#####Q#F#�#####K#I#�#####E#K
#�#####E#K#�#####@#N#�#####;#Q#�#####6#T#�#####0#X#�#####+#[#�#####'#^#�#####"#a#�###
####d#�#######g#�#######j#�#######n#�######r#�#####

Ce qui n'est pas satisfaisant du tout ! Les données sont binaires et non ASCII. Elles ne sont pas
directement compréhensibles.
La même chose peut être faite au niveau du gestionnaire d'événements de Linux . La dalle tactile y
5

Technical report

© Sylvain Hanneton (2015)

apparaît comme « mouse 1 » :
sudo cat /dev/input/mouse1
On obtient là encore des données binaires, qui sont les évènements traités par le système « input » de
Linux.
Donc on ne peut utiliser cette technique pour lire les données venant de l'écran tactile (à moins de
connaître le codage des données). En effet les données ne sont pas envoyées en code ASCII mais en
hexadécimal. Essayer de décoder ces données reviendrait à faire le travail accompli par les outils des
gestionnaires de fenêtre. Le plus simple est donc de travailler au niveau des événements gérés par le
gestionnaire de fenêtre lorsque des données sont produites par l'écran tactile.
Sous linux, il est possible de travailler avec le gestionnaire d'événements de X11. Mais une solution peutêtre plus intéressante est de travailler avec la librairie SDL qui permet de gérer un grand nombre
d'événements et surtout qui a l'avantage de fonctionner sur plusieurs types d'OS. Il existe aussi la librairie
python pygame qui gère les événements de façon similaire à la SDL.
Malheureusement :

la SDL ne peut gérer que les événement liées à une fenêtre. Or si l'on détache la dalle tactile du
gestionnaire de fenêtre, les événements de type toucher ne sont pas détectés…

pygame ne sait pas encore gérer les entrées tactiles, il y a bien une librairie « touchpy » mais qui
est encore en stade de développement (https://code.google.com/p/touchpy/wiki/About).

La solution : utiliser le module evdev de Python
Port d'entrée des événements
Le module evdev de python permet de gérer les événements issus des dispositifs HID. Il faut pour
pouvoir utiliser le dispositif connaître le port de gestion des entrées (/dev/input) auquel il est rattaché.
('/dev/input/event9',
('/dev/input/event8',
('/dev/input/event7',
('/dev/input/event6',
('/dev/input/event5',
('/dev/input/event4',
('/dev/input/event3',
('/dev/input/event2',
('/dev/input/event1',
('/dev/input/event0',

'Quanta OpticalTouchScreen', 'usb-0000:00:1d.0-1.5/input0')
'HDA ATI HDMI HDMI/DP,pcm=3', 'ALSA')
'HDA Intel PCH Front Mic', 'ALSA')
'HDA Intel PCH Rear Mic', 'ALSA')
'HDA Intel PCH Line Out', 'ALSA')
'HDA Intel PCH Front Headphone', 'ALSA')
'DELL Dell USB Entry Keyboard', 'usb-0000:00:1a.0-1.2/input0')
'Logitech USB Optical Mouse', 'usb-0000:00:1a.0-1.1/input0')
'Power Button', 'LNXPWRBN/button/input0')
'Power Button', 'PNP0C0C/button/input0')

Dans mon cas, le port est /dev/input/event9). Il a été déterminé par tâtonnements.
Important : ne pas oublier avant cela de (1) détacher l'écran tactile par un xinput float et (2) permettre
l'accès au port d'entrée par un sudo chown user « /dev/input/event9 »

6

Technical report

© Sylvain Hanneton (2015)

Les événements générés par la dalle tactile
Ce que dit le kernel Linux (extrait)
The protocol is divided into two types, depending on the capabilities of the
hardware. For devices handling anonymous contacts (type A), the protocol describes
how to send the raw data for all contacts to the receiver. For devices capable of
tracking identifiable contacts (type B), the protocol describes how to send updates
for individual contacts via event slots. Drivers for type B devices separate contact
packets by calling input_mt_slot(), with a slot as argument, at the beginning of each
packet. This generates an ABS_MT_SLOT event, which instructs the receiver to prepare
for updates of the given slot.
For type B devices, the kernel driver should associate a slot with each identified
contact, and use that slot to propagate changes for the contact. Creation,
replacement
and
destruction
of
contacts
is
achieved
by
modifying
the
ABS_MT_TRACKING_ID of the associated slot. A non-negative tracking id is interpreted
as a contact, and the value -1 denotes an unused slot. A tracking id not previously
present is considered new, and a tracking id no longer present is considered removed.
Since only changes are propagated, the full state of each initiated contact has to
reside in the receiving end.
Upon receiving an MT event, one simply updates the
appropriate attribute of the current slot.
Here is what a minimal event sequence for a two-contact touch would look like for a
type B device:
ABS_MT_SLOT 0
ABS_MT_TRACKING_ID 45
ABS_MT_POSITION_X x[0]
ABS_MT_POSITION_Y y[0]
ABS_MT_SLOT 1
ABS_MT_TRACKING_ID 46
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
SYN_REPORT
The process of finger tracking, i.e., to assign a unique trackingID to each initiated
contact on the surface, is a Euclidian Bipartite Matching problem.
At each event
synchronization, the set of actual contacts is matched to the set of contacts from
the previous synchronization. A full implementation can be found in [3].
voir : https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt

Les événements générés par la dalle
Les événements qui nous intéressent sont :

7

Technical report

© Sylvain Hanneton (2015)

Type
EV_ABS

NOM

CODE

Signification

ABS_X

0

Position horizontale (pixels)

ABS_Y

1

Position verticale (pixels)

ABS_MT_POSITION_X

53

Position horizontale (pixels)
(MT = multi-touch)

ABS_MT_POSITION_Y

54

Position verticale (pixels)
(MT = multi-touch)

ABS_MT_SLOT

47

ABS_MT_TRACKING_ID

57

EV_SYN

SYN_REPORT

0

EV_KEY

BTN_TOUCH

330

Valeur = « down » lorsque l'on touche la dalle

EV_KEY

BTN_TOUCH

330

Valeur = « up » lorsque le doigt quitte la dalle

The TRACKING_ID identifies an initiated
contact throughout its life cycle [5]. The value
range of the TRACKING_ID should be large
enough to ensure unique identification of a
contact maintained over an extended period of
time. For type B devices, this event is handled by
input core; drivers should instead use
input_mt_report_slot_state().

Le script
#
#
#
#

Processing multitouch events with evdev
and sending touch data via osc
Author : Sylvain Hanneton 2011
17 juillet 2015

import liblo
import sys
from evdev import InputDevice, categorize, list_devices, ecodes
def main():
# initializations
try :
target = liblo.Address(1234) # to be modified if non-local addressing
except liblo.AddressError, err:
print str(err)
sys.exit()
# list devices for convenience
devices = [InputDevice(fn) for fn in list_devices()]
for dev in devices:
print(dev.fn, dev.name, dev.phys)

8

Technical report

© Sylvain Hanneton (2015)

# select the concerned device
# to be changed if it is not correct
dev = InputDevice("/dev/input/event9")
print(dev)
# event processing loop
for event in dev.read_loop():
if event.type == ecodes.EV_ABS: # events of type ABS
if event.code == 0 :
liblo.send(target,"/tactile/x",event.sec,event.usec,event.value)
if event.code == 1 :
liblo.send(target,"/tactile/y",event.sec,event.usec,event.value)
if event.code == 53 :
liblo.send(target,"/tactile/mtx",event.sec,event.usec,event.value)
if event.code == 54 :
liblo.send(target,"/tactile/mty",event.sec,event.usec,event.value)
if event.code == 57 :
liblo.send(target,"/tactile/tracking_id",event.sec,event.usec,event.value)
if event.code == 47 :
liblo.send(target,"/tactile/slot",event.sec,event.usec,event.value)
if event.type == ecodes.EV_KEY: # events of type EV_KEY
if event.code == 330 :
if event.value == 1 :
liblo.send(target,"/tactile/button_down",event.sec,event.usec)
if event.value == 0 :
liblo.send(target,"/tactile/button_up",event.sec,event.usec)
if event.type == ecodes.EV_SYN: # events of type EV_SYN
if event.code == 0 : liblo.send(target,"/tactile/syn_report",event.sec,event.usec)

#Run the script if executed
if __name__ == "__main__":
main()

OSC output
On peut obtenir la liste des messages OSC en utilisant l'utilitaire oscdump. Pour un simple petit trait en
diagonale, voici les messages obtenus :
$ oscdump 1234
/tactile/tracking_id iii 1437150172 245328 182
/tactile/mtx iii 1437150172 245328 845
/tactile/mty iii 1437150172 245328 266
/tactile/button_down ii 1437150172 245328
/tactile/x iii 1437150172 245328 845
/tactile/y iii 1437150172 245328 266
/tactile/syn_report ii 1437150172 245328
/tactile/mtx iii 1437150172 349328 848
/tactile/mty iii 1437150172 349328 268
/tactile/x iii 1437150172 349328 848
/tactile/y iii 1437150172 349328 268

9

Technical report

© Sylvain Hanneton (2015)

/tactile/syn_report ii 1437150172 349328
/tactile/mtx iii 1437150172 357326 850
/tactile/mty iii 1437150172 357326 270
/tactile/x iii 1437150172 357326 850
/tactile/y iii 1437150172 357326 270
...
/tactile/syn_report ii 1437150172 581326
/tactile/mtx iii 1437150172 597280 953
/tactile/mty iii 1437150172 597280 373
/tactile/x iii 1437150172 597280 953
/tactile/y iii 1437150172 597280 373
/tactile/syn_report ii 1437150172 597280
/tactile/tracking_id iii 1437150172 669326 -1
/tactile/button_up ii 1437150172 669326
/tactile/syn_report ii 1437150172 669326

10

Sign up to vote on this title
UsefulNot useful