2010-08-12 17 views
0

nous avons un des pavés tactiles Cirque. http://www.cirque.com/downloads/docs/tsm9925.pdfcomment lire les positions absolues de robinet du pavé tactile Cirque dans linux

maintenant, nous voulons lire la position absolue du robinet à partir de ce pavé tactile en utilisant l'application c \ C++. Malheureusement, la société n'a développé que des pilotes Windows, mais nous devons lire les positions dans le linux. Nous avons essayé d'utiliser le sous-système/dev/input/eventN mais nous n'avons reçu que la direction du mouvement du doigt et la vitesse du mouvement du doigt.

est-ce possible et comment pouvons-nous faire cela?

+1

Les pavés tactiles indiquent rarement les positions absolues. – relet

+0

@relet. Oui, tu as raison. J'ai contacté le Cirque directement et ils ont signalé que leur pavé tactile ne pouvait que nous indiquer la direction et la vitesse et qu'il était impossible de lire les positions absolues. merci pour toutes les réponses. – OJ287

Répondre

1

De votre lien fourni:

For custom functionality at the product design stage, we offer software that 
allows OEMs to enable, disable or personalize advanced settings and/or 
reprogram the touch sensitive area. 

Je vous suggère de contacter directement Cirque

0

Touchpads rapportent rarement des positions absolues.

Juste pour que vous avez une réponse à accepter;)

1

Voilà comment cela fonctionne:

Le Cirque intelligent CAT (modèle GDU410 - c'est un ancien modèle) rapporte 8 octets paquet. Initialement, le paquet ressemble à ceci:

Byte 0, bit 0: Left button 
Byte 0, bit 1: Right button 
Byte 0, bit 2: Side buttons (they cannot be distinguished) 
Byte 1: Relative X data 
Byte 2: Relative Y data 
Bytes 3-7: 0 

Pour passer en mode absolu, vous devrez envoyer les demandes de contrôle USB suivantes à l'appareil:

unsigned char buf[8]; 
do { 
    Usb_Control_Request(Type=0xC1, Request=0x6A, Index=0, 
     Value=0, Data Length=8, Data Buffer=buf) 
} while(buf[0] & 8); 
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xBB, Value=1, No data) 
do { ... /* C1/6A, see above */ } while(buf[0] & 8); 
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xB5, Value=0x3E0, No data) 
do { ... /* C1/6A */ } while(buf[0] & 8); 
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xA2, Value=0xFEE, No data) 
do { ... /* C1/6A */ } while(buf[0] & 8); 
Usb_Control_Request(Type=0x41, Request=0x66, Index=0xB4, Value=0xE, No data) 
do { ... /* C1/6A */ } while(buf[0] & 8); 
Usb_Control_Request(Type=0x41, Request=0x64, Index=0, Value=0, No data) 
do { ... /* C1/6A */ } while(buf[0] & 8); 

Peut-être que sous Linux, cela peut être fait en utilisant "libusb". Bien que j'ai déjà fait du développement de pilotes sous Linux, je n'ai pas encore utilisé "libusb".

Après avoir fait cela, les paquets de 8 octets ressemblent à ceci:

Byte 0: Buttons, as before 
Bytes 1-3: 0 
Byte 4: low 8 bits of X finger position 
Byte 5: bits 0-2: high 3 bits of X finger position 
     bits 3-7: low 5 bits of Y finger position 
Byte 6: bits 0-5: high 6 bits of Y finger position 
Byte 7, low 7 (?) bits: non-zero if finger touches pad, 0 if not 
     some pads report the finger pressure; 
     MAYBE this is done in this field. 

Finger positions: 
X position: left ~0x790, right ~0x70 
Y position: top ~0, bottom ~0x5B0 

Le pilote de périphérique fourni par Cirque utilise le mode de position absolue pour exécuter des fonctions de défilement et similaires qui dépendent de la position du doigt absolu.