2009-08-14 24 views
3

Donc la question que j'ai aujourd'hui a à voir avec l'interfaçage avec une souris USB branchée sur une machine Linux. Cependant, je ne veux pas que la souris ait un effet traditionnel sur l'environnement X - je veux juste pouvoir utiliser les encodeurs qui y sont intégrés via une entrée brute. Alors, voici ma question.Utilisez une souris pour l'entrée non-souris

Comment puis-je obtenir des données de bas niveau mais significatives à partir d'autres dispositifs de souris dans C++ sous Linux? Plus précisément, j'aimerais connaître la position relative ou au moins les nombres de codeurs le long des axes x et y.

+0

Vous ne voulez "aucun effet traditionnel sur l'environnement X", mais vous voulez les axes x et y? Les coordonnées ne possèdent-elles pas uniquement un sens/une disponibilité dans un environnement X? –

+0

Je ne sais pas? Est-ce qu'ils? Si les données brutes ne sont pas en différenciation x-y relative, comment est-ce codé? – duckworthd

Répondre

4

Je l'ai fait quelque chose de similaire pour un lecteur de codes à barres USB qui se présente comme un clavier HID.

Dans les noyaux récents, il y aura un périphérique d'événement pour la souris dans /dev/input/event*. Si vous l'ouvrez et que vous l'attrapez avec l'ioctl EVIOCGRAB(), il n'enverra aucun événement de souris à une autre application. Vous pouvez ensuite lire les événements directement depuis la souris - voir la documentation de l'interface evdev dans Documentation/input/input.txt dans la distribution de code source Linux.

Lorsque vous lisez l'appareil d'événement, vous aurez un certain nombre d'événements d'entrée, sous la forme suivante:

struct input_event { 
    struct timeval time; 
    unsigned short type; 
    unsigned short code; 
    unsigned int value; 
}; 

(struct input_event et les macros suivantes sont toutes définies dans linux/input.h).

Les événements qui vous intéressent auront input_event.type == EV_REL (événement de mouvement relatif), le membre input_event.code sera quelque chose comme REL_X (indiquant l'axe X - voir le fichier linux/input.h pour la liste complète), et input_event.value sera le déplacement .

Il n'est pas nécessaire d'implémenter le protocole HID vous-même, comme le suggère une autre réponse.

+0

Cela fonctionnera-t-il pour plusieurs souris USB qui doivent être suivies indépendamment? – Gerharddc

+0

@Gerhman: Oui, chaque souris aura son propre périphérique '/ dev/input/event *'. – caf

Questions connexes