diferencia entre /dev/input/mouse0 y /dev/input/mice

diferencia entre /dev/input/mouse0 y /dev/input/mice

Estoy trabajando con un controlador USB de mouse y realmente no sé cómo diferenciar y usar la información enviada por /dev/input/mouse0y/dev/input/mice

Después de algunas búsquedas en Google, encontré este código sobre el uso/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;

Este programa funciona pero no obtuvo ninguna información sobre la rueda de desplazamiento.

Pude encontrar un programa que usa/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);are
    return -1;
}

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

close(fd);

return 0;

Pero hay un problema con el movimiento diagonal porque este archivo guarda solo 1 coordenada al mismo tiempo, y la coordenada X tiene prioridad sobre la Y, por lo que es bastante molesto cuando quieres mover el mouse en el eje Y.

No encontré ningún código para usar /dev/input/mouse0, entonces, ¿qué información se guarda en este archivo?

Mis preguntas son:

  1. ¿En qué información se guarda /dev/input/mouse0?
  2. ¿Cómo puedo leer toda la información del mouse sin abrir 2 archivos y sin un problema de prioridad (desplazamiento de la rueda + movimiento del eje X/Y)?

Respuesta1

ElDocumentación de la API del espacio de usuario del subsistema de entrada de Linuxresponde a tus preguntas. En general, todos los archivos en /dev/input/son proporcionados porcontroladores de eventosque distribuyen eventos del dispositivo al espacio de usuario.

¿Qué son /dev/input/mouse0 y /dev/input/mice?

Desde elintroducción(partes importantes resaltadas por mí)

1.3.1.3. ratóndev

mousedev es un truco para hacer que funcionen los programas heredados que utilizan la entrada del mouse. Toma eventos de ratones o digitalizadores/tabletas y pone a disposición del usuario un dispositivo de ratón estilo PS/2 (a la /dev/psaux).

Los dispositivos Mousedev en /dev/input (como se muestra arriba) son:

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

Cada dispositivo de mouse está asignado a un solo mouse o digitalizador, excepto el último: mouse. Este dispositivo de un solo carácter es compartido por todos los ratones y digitalizadores., e incluso si no hay ninguno conectado, el dispositivo está presente. Esto es útil para conectar en caliente ratones USB, de modo que los programas más antiguos que no admiten conexión en caliente puedan abrir el dispositivo incluso cuando no haya ratones presentes. [...]

Mousedev generará protocolos PS/2, ImPS/2 (Microsoft IntelliMouse) o ExplorerPS/2 (IntelliMouse Explorer), dependiendo de lo que desee el programa que lee los datos. Puede configurar GPM y X para cualquiera de estos.Necesitará ImPS/2 si desea utilizar una rueda en un mouse USBy ExplorerPS/2 si desea utilizar botones adicionales (hasta 5).

...esta también podría ser la razón por la que no ves los eventos de la rueda del mouse. Dado que es "un truco" para programas heredados, no deberías usarlo si no es necesario.

¿Cómo puedo leer toda la información del mouse [...]?

Utilice el /dev/input/eventXarchivo correspondiente proporcionado porevdev(el controlador de eventos, que no debe confundirse con el controlador xorg evdev). Eso es lo que obviamente hace su segundo fragmento de código.

...pero ¿qué pasa con el problema de prioridad?

No hay ningún problema de prioridad. De acuerdo a2.2. Códigos de eventos:

SYN_REPORT:

Se utiliza para sincronizar y separar eventos en paquetes de cambios de datos de entrada.ocurriendo en el mismo momento en el tiempo. Por ejemplo, el movimiento de un mouse puede establecer los valores REL_X y REL_Y para un movimiento y luego emitir un SYN_REPORT. El siguiente movimiento emitirá más valores REL_X y REL_Y y enviará otro SYN_REPORT.

Debido a que se puede considerar que todos los eventos consecutivos hasta un SYN_REPORTevento sucedieron al mismo tiempo, el orden en el que se informan no importa.

Por ejemplo (usandoeste programaLo encontré en 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

Como puede ver, los eventos concurrentes no sólo están separados por SYN_REPORTeventos, sino que también tienen la misma marca de tiempo.

Por cierto, también puedes utilizar evtestpara ver los eventos generados por un dispositivo. Puedes encontrar su código fuente.aquísi estás interesado en cómo funciona.

Respuesta2

En mi caso, intenté ejecutar el evento del mouse del sistema operativo. mi código app.jsfue:

var Mouse = require("./node_modules/node-mouse/mouse");
 
var m = new Mouse();
 
m.on("mousedown",function(event) {
    console.log(event);
});
 
m.on("mouseup",function(event) {
    console.log(event);
});
 
// same as mouseup, but fired after
m.on("click",function(event) {
    console.log(event);
});
 
 
m.on("mousemove", function(event) {
    console.log(event);
});

Yo estaba corriendonode app.js

entonces me está dando el siguiente error

Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:

así que simplemente corre sudo así

node app.js

no está dando el siguiente error

{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 1,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}

información relacionada