Estoy trabajando con un controlador USB de mouse y realmente no sé cómo diferenciar y usar la información enviada por /dev/input/mouse0
y/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:
- ¿En qué información se guarda
/dev/input/mouse0
? - ¿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/eventX
archivo 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_REPORT
evento 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_REPORT
eventos, sino que también tienen la misma marca de tiempo.
Por cierto, también puedes utilizar evtest
para 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.js
fue:
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'
}