Comment distinguer l'entrée de différents claviers?

14

Je veux écrire une application en Python que vous pouvez utiliser avec votre clavier par défaut et une spécialement conçue pour l'application. Je vais le concevoir simplement en utilisant un petit clavier numérique avec des autocollants pour donner des actions aux différentes touches. Les deux claviers seront connectés par USB.

Cependant, lorsque ces touches sont enfoncées, seuls leurs signaux réguliers (nombres, opérateurs et entrées) seront envoyés à Python et il ne pourra pas faire la distinction entre les signaux du clavier principal et du clavier spécial.

Parce que Python n'a (pour autant que je puisse trouver) aucune méthode pour faire cette distinction, je veux le faire sur le système d'exploitation lui-même. Je vais le programmer pour le Raspberry Pi, donc ce sera Linux.

Donc, la question principale: comment puis-je remapper les touches d'un clavier spécifique à d'autres codes clés. J'ai pensé à utiliser les touches F que je n'utiliserai pas à d'autres fins; ou juste quelques caractères qui ne sont présents sur aucun clavier (en supposant qu'il y en ait).

Est-ce possible sous Linux / Unix? Et si oui, comment faire?

Steven Roose
la source
Comment le clavier va-t-il être fixé? Vous voudrez peut-être lire directement à partir de l'appareil. C'est le moyen le plus évident pour moi, bien que je suppose qu'il existe un meilleur moyen.
TNW
J'ai ajouté qu'ils se connecteront par USB. Comment puis-je lire directement depuis l'appareil en utilisant Python?
Steven Roose
Il semble que la réponse non acceptée soit beaucoup plus simple que la réponse acceptée.
Nikana Reklawyks

Réponses:

12

Si vous utilisez Linux, la meilleure façon de distinguer les périphériques d'entrée est d'utiliser l' interface d'événement Linux . Une fois l'entrée spécifique au matériel d'un périphérique décodée, il est converti en une structure d'événements spécifique à Linux intermédiaire et rendu disponible en lisant un ou plusieurs des périphériques de caractères sous /dev/input/. Soit dit en passant, cela est complètement indépendant du langage de programmation que vous utilisez.

Chaque périphérique matériel obtient son propre /dev/input/eventXpériphérique, et il existe également des agrégats (par exemple, /dev/input/micequi représentent le mouvement de toutes les souris dans le système). Votre système peut également avoir /dev/input/by-pathet /dev/input/by-id.

Il y a un ioctlappelé EVIOCGNAMEqui renvoie le nom de l'appareil sous forme de chaîne lisible par l'homme, ou vous pouvez utiliser quelque chose comme /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse.

Vous ouvrez l'appareil, et chaque fois qu'un événement arrive du matériel d'entrée, vous obtenez un paquet de données. Si vous pouvez lire C, vous pouvez étudier le fichier /usr/include/linux/input.hqui montre exactement comment cela fonctionne. Si vous ne le faites pas, vous pouvez lire cette question qui fournit toutes les informations dont vous avez besoin.

La bonne chose à propos de l'interface d'événement est que vous découvrez simplement de quel périphérique vous avez besoin et que vous pouvez lire les entrées de ce périphérique d'entrée uniquement , en ignorant tous les autres. Vous recevrez également des notifications sur les touches, les boutons et les commandes que vous n'auriez pas normalement en lisant simplement le flux de caractères `` cuit '' d'un terminal: même les touches mortes comme Shift, etc.

La mauvaise chose est que l'interface d'événement ne renvoie pas de caractères `` cuits '', elle utilise simplement des codes numériques pour les clés (les codes correspondant à chaque clé se trouvent dans le fichier d'en-tête susmentionné - mais aussi dans la source Python de event.py . Si votre périphérique d'entrée a des touches / boutons inhabituels, vous devrez peut-être expérimenter un peu jusqu'à ce que vous obteniez les bons chiffres.

Alexios
la source
2

Une approche alternative (si votre "clavier" n'a pas beaucoup de touches - de nombreux appareils prétendent être des claviers) consiste à appliquer un mappage de touches à chaque clavier spécifiquement et à garantir la distinction des touches.

Ceci est décrit ici: /superuser/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only . Le point principal étant l' setxkbmapargument prend un périphérique.

Si vous utilisez l'approche d'entrée brute, lsinput trouvera votre périphérique brut pour vous.

Att Righ
la source