web-dev-qa-db-fra.com

différence entre / dev / input / mouse0 et / dev / input / mice

Je travaille avec un pilote USB de souris et je ne sais vraiment pas comment différencier et utiliser les informations envoyées par /dev/input/mouse0 et /dev/input/mice

Après quelques recherches sur Google, j'ai trouvé quelques codes d'utilisation de /dev/input/mice

int fd, bytes;
unsigned char data[4];

const char *pDevice = "/dev/input/mice";

// Open Mouse
fd = open(pDevice, O_RDWR);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pDevice);
    return -1;
}

int left, middle, right;
signed char x, y;

// Read Mouse
bytes = read(fd, data, sizeof(data));

if(bytes > 0)
{
    left = data[0] & 0x1;
    right = data[0] & 0x2;
    middle = data[0] & 0x4;

    x = data[1];
    y = data[2];
    printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);

    if(left)
        return left;
    if(right)
        return right;
    if(middle)
        return middle;
}

return 0;

Ce programme fonctionne mais n'a obtenu aucune information sur le défilement de la roue

J'ai pu fonder un programme qui utilise /dev/input/event0

int fd;
struct input_event ev
const char* pFile = "/dev/input/event0";

fd = open(pFile, O_RDONLY);
if(fd == -1)
{
    printf("ERROR Opening %s\n", pFile);
    return -1;
}

read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << "  code : " << ev.code << "  value : " << ev.value << std::endl;

close(fd);

return 0;

Mais il y a un problème pour le mouvement en diagonale car ce fichier n'a enregistré qu'une coordonnée en même temps, et la coordonnée X a la priorité sur Y; il est donc très gênant de déplacer votre souris sur l'axe des ordonnées

Cependant, je ne trouve aucun code pour utiliser /dev/input/mouse0, alors quelles informations sont enregistrées dans ce fichier?

Mes questions sont donc les suivantes: 1. Quelles informations sont enregistrées dans /dev/input/mouse0? 2. Comment puis-je lire toutes les informations de la souris sans ouvrir 2 fichiers et sans problème de priorité (défilement horizontal + mouvement des axes X/Y)?

1
damadam

Le documentation de l'API sur l'espace utilisateur du sous-système d'entrée Linux répond à vos questions. En général, tous les fichiers de /dev/input/ sont fournis par des gestionnaires d'événements qui distribuent des événements de périphérique à l'espace utilisateur.

Que sont/dev/input/mouse0 et/dev/input/mice?

De la introduction (parties importantes soulignées par moi)

1.3.1.3. mousedev

mousedev est un hack permettant de faire fonctionner les anciens programmes utilisant l’entrée de la souris. Il prend des événements sur des souris ou des numériseurs/tablettes et met un périphérique de souris de style PS/2 (à la/dev/psaux) à la disposition de l'utilisateur.

Les périphériques Mousedev dans/dev/input (comme indiqué ci-dessus) sont les suivants:

crw-r--r--   1 root     root      13,  32 Mar 28 22:45 mouse0
crw-r--r--   1 root     root      13,  33 Mar 29 00:41 mouse1
crw-r--r--   1 root     root      13,  34 Mar 29 00:41 mouse2
crw-r--r--   1 root     root      13,  35 Apr  1 10:50 mouse3 ... 
...
crw-r--r--   1 root     root      13,  62 Apr  1 10:50 mouse30
crw-r--r--   1 root     root      13,  63 Apr  1 10:50 mice

Chaque souris est assignée à une souris ou à un numériseur, à l'exception du dernier, souris. Ce périphérique à un seul caractère est partagé par toutes les souris et les numériseurs , et même si aucun n'est connecté, le périphérique est présent. Ceci est utile pour le branchement à chaud de souris USB, afin que les anciens programmes qui ne gèrent pas hotplug puissent ouvrir le périphérique même en l'absence de souris. [...]

Mousedev générera les protocoles PS/2, ImPS/2 (Microsoft IntelliMouse) ou ExplorerPS/2 (IntelliMouse Explorer), en fonction de la volonté du programme de lecture des données. Vous pouvez définir GPM et X sur n’importe lequel de ces paramètres. Vous aurez besoin de ImPS/2 si vous souhaitez utiliser une molette sur une souris USB et ExplorerPS/2 si vous souhaitez utiliser des à 5) boutons.

... cela pourrait également être la raison pour laquelle vous ne voyez pas les événements de molette de la souris. Puisqu'il s'agit d'un "hack" pour les programmes existants, vous ne devriez pas l'utiliser si vous n'y êtes pas obligé.

Comment puis-je lire toutes les informations de la souris [...]?

Utilisez le fichier /dev/input/eventX correspondant fourni par evdev (le gestionnaire d'événements, à ne pas confondre avec le pilote xorg-driver evdev). C'est ce que votre deuxième extrait de code fait évidemment.

... mais qu'en est-il du problème de priorité?

Il n'y a pas de problème de priorité. Selon 2.2. Codes d’événement :

SYN_REPORT:

Utilisé pour synchroniser et séparer les événements en paquets de modifications de données d'entrée se produisant au même moment . Par exemple, le mouvement d'une souris peut définir les valeurs REL_X et REL_Y pour un seul mouvement, puis émettre un SYN_REPORT. Le mouvement suivant émettra plus de valeurs REL_X et REL_Y et enverra un autre SYN_REPORT.

Étant donné que tous les événements consécutifs jusqu'à un événement SYN_REPORT peuvent être considérés comme ayant eu lieu en même temps, l'ordre dans lequel ils sont rapportés n'a pas d'importance.

Par exemple (en utilisant ce programme j'ai trouvé sur github):

time:1528290186.256449  type:EV_REL     code:REL_X      value:-1
time:1528290186.256449  type:EV_REL     code:REL_Y      value:1
time:1528290186.256449  type:EV_SYN     code:SYN_REPORT value:0
time:1528290186.264460  type:EV_REL     code:REL_Y      value:1
time:1528290186.264460  type:EV_REL     code:REL_WHEEL  value:-1
time:1528290186.264460  type:EV_SYN     code:SYN_REPORT value:0

Comme vous pouvez le constater, non seulement les événements simultanés sont séparés par les événements SYN_REPORT, mais ils ont également le même horodatage.

Vous pouvez également utiliser evtest pour afficher les événements générés par un périphérique. Vous pouvez trouver son code source ici si cela vous intéresse.

3
danzel